You can post a link to
 https://mail.openjdk.java.net/pipermail/2d-dev/2019-January/009805.html

Just to be clear, using
-Dsun.java2d.uiScale=1

means that on hi-dpi devices such as a Surface Pro or many laptops
the JDK window will likely be too small to read the text .. which was
of course the motivation for implementing the feature.

-phil.

On 1/8/19 12:24 PM, Michał Błaszak wrote:

Hi Phil,

Thank you for the very comprehensive answer.

I was suspecting this must be something with trying to fit into the device DPI but the hint about -Dsun.java2d.uiScale=1 helps when you really want to hit the pixel.

With your permission I’d like to share your answer on StackOverflow so others could read it too.

Best regards

*Michał Błaszak*

Section Manager, Research & Development

*From:*Phil Race <philip.r...@oracle.com>
*Sent:* wtorek, 8 stycznia 2019 20:48
*To:* Michał Błaszak <m...@stibosystems.com>; 2d-dev@openjdk.java.net
*Subject:* Re: [OpenJDK 2D-Dev] Pixel-perfect drawing on JPanel

This is a known problem of sorts. It is called the Raster Problem.

JDK 9 and later support windows hi-dpi mode so you now have a scaled JPanel. Something like 1.33 scale, the exact value depending on your windows DPI setting.

The lines are all drawn independently, and the "y" is mapped to the closest device pixel and the height of all of these rather than being the impossible "1.33" device pixels wide
is 1 device pixel wide. So you end up with gaps.

The fillRect case (so far as I can see)  handles this better because it
will occasionally fill 2 pixels wide rather than leaving a gap.

I am not sure why (what should be) the wide line code, filling spans, isn't doing that too. So there is likely a bug here, but a fix for that can't solve the raster problem.
At best you'd get what is happening with fillRect.

Turning on anti-aliased rendering may be the easiest option for you.
You'll then get blended rendering of course.

Or you will need to be more conscious of the effects of fractional scaling
on lo-res devices.

Another workaround is
-Dsun.java2d.uiScale=1

-phil.

On 12/20/18 3:11 AM, Michał Błaszak wrote:

    Hi All,

    I hope this is a known problem but just in case it’s not.

    Trying to make an app drawing something on JPanel I noticed some
    annoying inaccuracies.

    The attached piece of code is supposed to draw a series of lines
    one below the other (swapping colors are to demonstrate what's
    happening).

    The result is presented in the following picture:

    That means that some pixels are unreachable.

    I tested it on several jdk releases. Results are:

    OpenJDK Runtime Environment (build 1.8.0_40-b25): Works correctly

    OpenJDK Runtime Environment (build 9+181): Wrong behavior

    OpenJDK Runtime Environment 18.3 (build 10.0.2+13): Wrong behavior

    OpenJDK Runtime Environment 18.9 (build 11.0.1+13): Wrong behavior

    The same inaccuracies are observable when using drawRect() or
    fillRect().

    I wanted to report is a bug but I do not know how to do it.

    Thank you for looking at it.

    Best regards

    *Michał Błaszak*

    Section Manager, Research & Development


Reply via email to