<Swing Dev> [9] Review request for 8162350 RepaintManager shifts repainted region when the floating point UI scale is used

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Thu Oct 6 20:42:47 UTC 2016


Hi, Alexandr.
Can you please provide some standalone small example, which emulates 
this artifacts via java2d API. (The pattern which we use in 
RepainManager). It will help to understand the problem.

On 06.10.16 20:07, Alexandr Scherbatiy wrote:
> Hello,
>
> Could you review the fix:
>   bug: https://bugs.openjdk.java.net/browse/JDK-8162350
>   webrev: http://cr.openjdk.java.net/~alexsch/8162350/webrev.00
>
>   The fix uses the solution suggest by Jim in the email:
> http://mail.openjdk.java.net/pipermail/2d-dev/2016-October/007737.html
>
>   To draw to a VolatileImage backbuffer its graphics transform is set to
> identity and device coordinates are used to set the buffer clip.
>   Copying the backbuffer image to the graphics has some problems.
>   -------------
>     // Since there is no drawImage(img, float x, float y)...
>     destination.translate(pixelx1 / scaleX, pixely1 / scaleY)
>     destination.drawImage(img, 0, 0)
>   -------------
>   This code solves the problem for the top left corner of the region.
> All Graphics.drawImage(...) methods scales the image size and it looks
> like ceil(img.getWidth() * scaleX) can be differ from the ceil(pixelx1 +
> img.getWidth() * scaleX) - pixelx1 so the right bottom corner of the
> image does not fit the required point.
>   There is also a question could a line drawn from one point and then
> from another has a different width in pixels because the graphics scale
> is not integer.
>
>   The proposed fix prepares a backbuffer with size [x + w, y + h] in a
> user space and a component is drawn in to the region [pixelx1, pixely1,
> pixely2, pixely2] in the device space.
>   After that the necessary clip is set to the graphics and whole image
> is just drawn into it.
>
>   The new logic is used only the component graphics configuration is
> scaled the graphics configuration has the same scales. So it possible
> just to copy the backbuffer surface data to the graphics surface data.
>   For other cases like for rotated graphics transform it seems it is
> necessary to have more complicated algorithm.
>
>   This solves problems with repainted region but there are still
> artifacts with JInternalFrame moving or a component scrolling, This can
> be related to the RepaintManager.copyArea() method which needs to be
> updated in the similar way. I have created an issue on it:
>    JDK-8167305 RepaintManager.copyArea() method should be updated for
> floating point UI scale
>      https://bugs.openjdk.java.net/browse/JDK-8167305
>
>  Thanks,
>  Alexandr.
>


-- 
Best regards, Sergey.



More information about the swing-dev mailing list