[OpenJDK 2D-Dev] [9] Review request for 8142966 Wrong cursor position in text components on HiDPI display

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Tue Feb 9 14:56:39 UTC 2016


Also probably it will be possible to test this via the public api 
only(using the mix of the graphics transform + font transform).

On 09.02.16 17:47, Sergey Bylokhov wrote:
> Some additional information.
>   The Swing calculates the size of the components and location of the
> cursor based on the text metrics. And these text metrics based on
> advance. The Swing do not know to what destination it will be painted,
> it calculates the size based on the non-scaled(non-retina) destination.
> The problem occurs when we paint such component to the hidpi screen,
> because we get small round errors per glyph -> this causes a visible
> issueы when the text string is long. As a solution on the macosx the
> round operation was done in the users space instead of dev space.
>
> For example before the fix the size 1.4px was rounded to 3 (1.4 * 2 =
> 2.8 -> 3), but after the fix it will be 2 (1.4-> 1 * 2 = 2). So the
> Swing will be able to calculate correct size/location without
> information of the device scale. Note that the 3px(in dev space) is a
> kind of fractional coordinate in the user space(1.5). And the Swing does
> not work properly when fractional metrics are used, because it use ints
> as a coordinates.
>
> Note that the fix should be applied only when fractional metrics is off,
> otherwise we should not use any rounding. I am not sure that the current
> fix take it into account.
>
>
> On 08.02.16 22:14, Jim Graham wrote:
>> Isn't the problem there that we are returning an integer as the advance?
>>   Why aren't we returning 7.35 as a value instead of 8?
>>
>> Also, shouldn't 7.35 round to 7 and 14.7 round to 15?
>>
>>                  ...jim
>>
>> On 2/6/2016 7:28 AM, Alexander Scherbatiy wrote:
>>> On 05/02/16 23:39, Phil Race wrote:
>>>> Two things strike me when I read this
>>>>
>>>> 1) Initial surprise at how deep into the font code it goes.
>>>> Perhaps there are alternatives.
>>>>
>>>> 2) That it changes to using the linear metrics for measuring advance.
>>>> Regardless of (1) I do not think (2) is correct. I am fairly sure this
>>>> will lead to changes in text advance. It seems like it must throw
>>>> away adjusted metrics as a result of glyph hinting.
>>>>
>>>> I don't know what the fix should be, since I have not looked at the
>>>> problem top-down, I am just seeing the bottom-up proposed solution.
>>>> So all I can say for now is that it needs to be at least somewhat
>>>> different.
>>>
>>>    There was the same issue on Mac OS X which has been fixed in the
>>> similar way:
>>>    8013569 [macosx] JLabel preferred size incorrect on retina displays
>>> with non-default font size
>>>      https://bugs.openjdk.java.net/browse/JDK-8013569
>>>      http://cr.openjdk.java.net/~serb/7190349/webrev.04/
>>>
>>>    The problem is that in many case for UI scale 2 we return to a user
>>> an unscaled value.
>>>    But a value for transformed glyph advance, rounded and descaled can
>>> differ from just rounded glyph advance.
>>>
>>>   For example, font[dialog, plain, 12] char 'a':
>>>   transform: 12, advance: 7.35,  rounded advance: 8
>>>   transform: 24, advance: 14.70 round advance: 14
>>>
>>>   and 8 does not equal 14 / 2.
>>>
>>>    The solution for Mac OS X was to get the glyph advance using only
>>> font transform, round it and then apply the dev transform:
>>>
>>> CGGlyphImages.m:
>>>   481     advance = CGSizeApplyAffineTransform(advance,
>>> strike->fFontTx);
>>>   482     if (!JRSFontStyleUsesFractionalMetrics(strike->fStyle)) {
>>>   483         advance.width = round(advance.width);
>>>   484         advance.height = round(advance.height);
>>>   485     }
>>>   486     advance = CGSizeApplyAffineTransform(advance, strike->fDevTx);
>>>
>>>    Thanks,
>>>    Alexandr.
>>>>
>>>> -phil.
>>>>
>>>> On 01/27/2016 01:26 PM, Alexander Scherbatiy wrote:
>>>>>
>>>>> Hello,
>>>>>
>>>>> Could you review the fix:
>>>>>   bug: https://bugs.openjdk.java.net/browse/JDK-8142966
>>>>>   webrev: http://cr.openjdk.java.net/~alexsch/8142966/webev.00/
>>>>>
>>>>>  The proposed fix rounds a glyph advance first and then scales it if
>>>>> UI scales do not equal to one.
>>>>>
>>>>>  Thanks,
>>>>>  Alexandr.
>>>>>
>>>>
>>>
>
>


-- 
Best regards, Sergey.



More information about the 2d-dev mailing list