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

Alexandr Scherbatiy alexandr.scherbatiy at oracle.com
Mon Nov 21 13:59:02 UTC 2016


Hello,

Could you review the updated fix:
   http://cr.openjdk.java.net/~alexsch/8162350/webrev.04

  - isFloatingPointScale(AffineTransform) is moved from the 
SunGraphics2D to the SwingUtilities2 class.

   Thanks,
   Alexandr.

On 11/18/2016 11:23 PM, Jim Graham wrote:
> Hi ALexandr,
>
> This looks great.
>
> BTW, when I suggested moving the FPscale test into SG2D I was 
> suggesting that to avoid having to copy the transform out of it via 
> getTransform(), but you've found a different solution to that issue 
> (i.e. the new getTransform(g) method) so it no longer matters where 
> that utility static function is located.  You can move it back to one 
> of the Swing classes.
>
> In terms of the logic of choosing which repaint function to use, it 
> looks like you use the old-style function if the scales don't match, 
> but won't that cause rendering anomalies?  The new code is still an 
> improvement for the standard HiDPI case, and I'm guessing that 
> mismatched scales probably never tends to happen, but we might want to 
> flag it for further investigation.
>
> +1 relative to whether you want to move the FPscale test back out of 
> SG2D or not...
>
>             ...jim
>
> On 11/18/16 1:44 AM, Alexandr Scherbatiy wrote:
>>
>> Thank you. I see that using the integer device-pixel translations 
>> preserves the component painting in the same way for
>> floating point scales.
>>
>> Could you review the updated fix:
>>   http://cr.openjdk.java.net/~alexsch/8162350/webrev.03
>>
>>   - translation adjustment is removed
>>   - Region.clipRound() is used for pixels coordinates rounding.
>>
>>   Thanks,
>>   Alexandr.
>>
>> On 11/16/2016 1:52 AM, Jim Graham wrote:
>>> Let me clarify something...
>>>
>>> On 11/15/16 2:49 AM, Alexandr Scherbatiy wrote:
>>>>   Let's consider the following use case:
>>>>   scale = 1.5
>>>>   A component calls fillRect(1, 1, 1, 1).
>>>>   This is (1.5, 1.5, 3.0, 3.0) in the device space
>>>>   which fills  (1, 1, 3, 3) and covers 2x2 pixels
>>>
>>> Agreed.
>>>
>>>>   Now the area (1, 1, 1, 1) needs to be repainted
>>>>     create a backbuffer
>>>>     translate(-1, -1) // move the top left corner of the area to 
>>>> the zero point
>>>>     draw the component into the backbuffer:
>>>>       fillRect(1, 1, 1, 1) -> after translation fillRect(0, 0, 1, 
>>>> 1) -> after scaling  (0.0, 0.0, 1.5, 1.5 ) in the
>>>> device space
>>>>       which fills (0, 0, 1, 1) and covers 1x1 pixels
>>>
>>> If you did g.setTransform(identity), g.translate(-1, -1), (then 
>>> restore the scale) then the analysis is as follows:
>>>
>>> g.setTransform(identity) => [1 0 0] [0 1 0]
>>> g.translate(-1, -1) => [1 0 -1] [0 1 -1]
>>> g.scale(1.5, 1.5) => [1.5 0 -1] [0 1.5 -1]
>>> g.fillRect(1, 1, 1, 1)
>>>     => coordinates are (1.5-1, 1.5-1, 3-1, 3-1)
>>>     => (.5, .5, 2, 2)
>>>     => fills (0, 0, 2, 2)
>>>     => which covers 2x2 pixels
>>>
>>> If you did g.translate(-1, -1) on the scaled transform then the 
>>> analysis is as follows:
>>>
>>> g.transform is [1.5 0 0] [0 1.5 0]
>>> g.translate(-1, -1) is [1.5 0 -1.5] [0 1.5 -1.5]
>>> g.fillRect(1, 1, 1, 1)
>>>     => coordinates are (1.5-1.5, 1.5-1.5, 3-1.5, 3-1.5)
>>>     => (0, 0, 1.5, 1.5)
>>>     => fill (0, 0, 1, 1)
>>>     => covers 1x1 pixels
>>>
>>> The second operation is what you are describing above and that would 
>>> be an inappropriate way to perform damage repair
>>> because you used a scaled translation which did not result in an 
>>> integer coordinate translation.
>>>
>>> Please re-read my previous analysis that shows what happens when you 
>>> use integer device-pixel translations which are
>>> translations that happen using integers on a non-scaled transform.  
>>> Note that you can add a scale *AFTER* you apply
>>> the integer device pixel translation and it will not affect the 
>>> integer-ness of the translation.  You can see above
>>> that the difference in how the translate command is issues affects 
>>> where the translation components of the matrix end
>>> up being -1,-1 or -1.5,-1.5...
>>>
>>>             ...jim
>>




More information about the swing-dev mailing list