[OpenJDK 2D-Dev] Pixel-perfect drawing on JPanel
Phil Race
philip.race at oracle.com
Tue Jan 8 21:22:54 UTC 2019
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.race at oracle.com>
> *Sent:* wtorek, 8 stycznia 2019 20:48
> *To:* Michał Błaszak <mibl at stibosystems.com>; 2d-dev at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/2d-dev/attachments/20190108/1bc4185e/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image002.jpg
Type: image/jpeg
Size: 16063 bytes
Desc: not available
URL: <https://mail.openjdk.java.net/pipermail/2d-dev/attachments/20190108/1bc4185e/image002-0001.jpg>
More information about the 2d-dev
mailing list