Suppose an application is only partially fixed to use/override the floating 
point methods. Perhaps it uses a library that has not been fixed.

Is there a more fine grained way to detect programmer awareness or lack of 
awareness of the new methods?

  Alan


> On Jun 28, 2016, at 9:59 AM, Alexandr Scherbatiy 
> <alexandr.scherba...@oracle.com> wrote:
> 
> 
>   Hello,
> 
>   I tried to merge this fix with the 8132119 Provide public API for text 
> related methods in SwingUtilities2
>   and found a flow in the used algorithm.
> 
>  For each method that uses integer coordinates the fix adds a pair with 
> floating point arguments.
>  The fix 8156217 uses only methods with floating point values to correctly 
> handle a selected text.
>  This leads that overridden method with integer arguments in user code is not 
> called anymore.
> 
>  I think that this can be handled in the following way:
>  - Add a property that enables to use methods with floating point arguments 
> in Swing.
>    By default it is false and all work as before. The issue with selected 
> text is reproduced.
>    An application with enabled property does not have issue with the selected 
> text but a user should override
>    all methods with floating point values if he uses corresponding methods 
> with integer values.
>  
>   Here is a proposed solution where new public system property 
> "javax.swing.floatingPoints.enabled" is added:
>     http://cr.openjdk.java.net/~alexsch/8156217/webrev.01 
> <http://cr.openjdk.java.net/~alexsch/8156217/webrev.01> 
>  
> - Fix the enhancement JDK-8157461 Glyph image rendering for HiDPI displays
>   
>   Thanks,
>   Alexandr. 
> 
> On 6/16/2016 6:07 PM, Alexandr Scherbatiy wrote:
>> On 6/16/2016 4:47 PM, Alexandr Scherbatiy wrote:
>>> 
>>> I tried to look deeper in the code and it seems there is a rounding issue 
>>> when float values are summed up.
>>> 
>>> Suppose a transform with scale 1.5 is used and the 'a' char advance is 10 
>>> in a dev space.
>>> The 'a' char has advance 10 / 1.5 = 6.666666666666667 as double value and 
>>> 6.6666665 when it is cast to float in user space.
>>> The width of a string which consists of 15 'a' chars is 15 * 6.6666665 =  
>>> 100.000000.
>>> But the same width calculated as sum of each glyph advance in 
>>> StandardGlyphVector.initPositions() method is 99.999992. 
>>> --------------
>>>        double scale = 1.5;
>>>         float advance = (float) (10 / scale);
>>>         int N = 15;
>>>         System.out.printf("%d * %f = %f\n", N, advance, N * advance);
>>>         float sum = 0;
>>>         for (int i = 0; i < N; i++) {
>>>             sum += advance;
>>>         }
>>>         System.out.printf("sum: %f\n", sum);
>>> --------------
>>> 
>>> Because of this a string drawn from float position 99.999998 is shifted one 
>>> pixel left which affects the text selection code in Swing:
>>> ------------------------ 
>>>         g.scale(1.5, 1.5); 
>>>         String TEXT = "aaaaaaaaaaaaaaaa";
>>>         Rectangle2D rect = font.getStringBounds(TEXT, 0, index, 
>>> g.getFontMetrics().getFontRenderContext()); 
>>>         float selectedTextPosition = (float) rect.getWidth();  //   
>>> 99.999992
>>>         g.drawString(TEXT.substring(0, index), x, y); // non-selected text
>>>         g.drawString(TEXT.substring(index, TEXT.length()), x + 
>>> selectedTextPosition, y); // selected text is shifted to one pixel left 
>>> ------------------------ 
>>    The last step is how coordinates are scaled in Graphics2D.drawString() 
>> method.
>>    If the graphics has scale 1.5 and zero translate the transformed 
>> coordinates are:    
>>     (99.999992 + 0) * 1.5 = 149.999985
>>     (100.000000 + 0) * 1.5 = 150.000000
>> 
>>   Both of them are rounded to the same value.
>> 
>>   If the translate is set to integer 1 value:
>>     (99.999992 + 1) * 1.5 = 151.499989  // shifted to one pixel left
>>     (100.000000 + 1) * 1.5 = 151.500000 
>> 
>>  A position 99.999992 in user space is rounded to 151 in dev space.
>>  A position 100.000000 in user space is rounded to 152 in dev space.
>> 
>>  And this difference can depend on the translate even it has integer value 
>> in user space because it is multiplied on the graphics scale.
>> 
>> Thanks,
>> Alexandr.
>> 
>>> 
>>> Thanks,
>>> Alexandr.
>>> 
>>> On 6/2/2016 11:41 PM, Alexandr Scherbatiy wrote:
>>>> On 5/31/2016 10:40 PM, Phil Race wrote:
>>>>> 
>>>>> I applied this and it is *much* better but there still seem to be some 
>>>>> tiny quirks. 
>>>>> When I drag the mouse to select text down and then up again, as I pass 
>>>>> the 
>>>>> original mouse click point vertically, repaint seem to jiggle vertically 
>>>>> by a pixel. 
>>>>> Perhaps a rounding issue in the repaint code's calculation of the 
>>>>> location of 
>>>>> the target y. I think I may see the same in left/right dragging along a 
>>>>> line too. 
>>>>> So I think this is repaint and not text related. Can you take a look. 
>>>> 
>>>>     I am able to reproduce this only using a floating point scale.
>>>>     It looks like 2d issue. I used a test which draws a text in two 
>>>> pieces. The second piece of the text is shifted from the first piece by 
>>>> the floating point size of the the first piece of the text.
>>>>   -----------
>>>>     Rectangle2D rect = font.getStringBounds(TEXT, 0, index, 
>>>> g.getFontMetrics().getFontRenderContext()); 
>>>>     float selectedTextPosition = (float) rect.getWidth();
>>>>     g.drawString(TEXT.substring(0, index), x, y); 
>>>>     g.drawString(TEXT.substring(index, TEXT.length()), x + 
>>>> selectedTextPosition, y); 
>>>>   -----------
>>>>   
>>>>   The second piece of the text can be shifted in the 2 cases:
>>>>   a) graphics scale is 1.5 and translation is 1. 
>>>>   b) graphics scale is 2.25 without applied translation 
>>>> 
>>>>   I have filed an issue on it: 
>>>>     JDK-8158370 Text drawn from float pointing position and with float 
>>>> pointing scale is shifted
>>>>       https://bugs.openjdk.java.net/browse/JDK-8158370 
>>>> <https://bugs.openjdk.java.net/browse/JDK-8158370>
>>>> 
>>>>   Thanks,
>>>>   Alexandr.
>>>> 
>>>>> 
>>>>> -phil.
>>>>> 
>>>>> 
>>>>> On 05/06/2016 12:31 PM, Alexandr Scherbatiy wrote:
>>>>>> Hello, 
>>>>>> 
>>>>>> Could you review the fix: 
>>>>>>   bug: https://bugs.openjdk.java.net/browse/JDK-8156217 
>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8156217> 
>>>>>>   webrev: http://cr.openjdk.java.net/~alexsch/8156217/webrev.00 
>>>>>> <http://cr.openjdk.java.net/%7Ealexsch/8156217/webrev.00> 
>>>>>> 
>>>>>>   This is the second part of the fix related to the fact that char width 
>>>>>> can be fractional in user space. 
>>>>>> http://mail.openjdk.java.net/pipermail/swing-dev/2016-May/005814.html 
>>>>>> <http://mail.openjdk.java.net/pipermail/swing-dev/2016-May/005814.html> 
>>>>>> 
>>>>>>   The Font.getStringBounds(...) method is used for the fractional string 
>>>>>> width calculation by Swing in user space. 
>>>>>> 
>>>>>>  Thanks, 
>>>>>>  Alexandr. 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to