<Swing Dev> [13] RFR JDK-8214702:Wrong text position for whitespaced string in printing Swing text

Prasanta Sadhukhan prasanta.sadhukhan at oracle.com
Mon Feb 25 08:05:11 UTC 2019



On 21-Feb-19 4:50 AM, Sergey Bylokhov wrote:
> On 13/02/2019 22:53, Prasanta Sadhukhan wrote:
>> Hi Sergey,
>>
>> I believe drawChars() also has same printing issue [and should be 
>> changed like modified drawString()] but I am not able to test it as 
>> reproducer testcase uses JLabel whose constructor can only accept 
>> "String" and not char[] so I can only test drawString(). Using 
>> drawChars() implementation in drawString() still reproduces the issue.
>
> Is it possible temporary replace the call to drawString() by the 
> drawChars(), to check how drawChars() will work?
As I told, it behaves similarly to unmodified drawString and the issue 
can still be seen. I think we should commit this drawString() change in 
this fix and I can open another bug to investigate drawChars() impl and 
reproducer. Will that be fine?

Regards
Prasanta
> or probably we can implement drawChars() on top of drawString()?
>
>>
>> Regards
>> Prasanta
>> On 14-Feb-19 4:12 AM, Sergey Bylokhov wrote:
>>> Hi, Prasanta.
>>>
>>>> I modified the fix to use deviceFRC if not compatible and in sync 
>>>> with the comment which says "obtain a TextLayout with advances for 
>>>> the printer graphics FRC"
>>>> I used SwingUtilies2.getStringWidth() which calculates the advances 
>>>> of the string if text layouting is used.
>>>>
>>>> http://cr.openjdk.java.net/~psadhukhan/8214702/webrev.2/
>>>
>>> Can you please take a look to the existed drawChars() method, which 
>>> is implemented in the similar way as drawStringImpl() and new 
>>> version of drawString(), but they have some small difference. Why we 
>>> cannot use the same logic?
>>>
>>> For example in the drawChars:
>>> =========
>>>             FontRenderContext deviceFontRenderContext = g2d.
>>>                 getFontRenderContext();
>>>             FontRenderContext frc = getFontRenderContext(c);
>>>             if (frc != null &&
>>>                 !isFontRenderContextPrintCompatible
>>>                 (deviceFontRenderContext, frc)) {
>>>                  String text = new String(data, offset, length);
>>>                  TextLayout layout = new TextLayout(text, 
>>> g2d.getFont(),
>>>                                deviceFontRenderContext);
>>>                  String trimmedText = trimTrailingSpaces(text);
>>>                  if (!trimmedText.isEmpty()) {
>>>                      float screenWidth = (float)g2d.getFont().
>>>                          getStringBounds(trimmedText, frc).getWidth();
>>>                      layout = layout.getJustifiedLayout(screenWidth);
>>>
>>> ==========
>>> Similar but not the same logic in the fix:
>>>
>>>  524                 FontRenderContext frc = getFontRenderContext(c);
>>>  525                 if (frc.isAntiAliased() || 
>>> frc.usesFractionalMetrics()) {
>>>  526                     frc = new 
>>> FontRenderContext(frc.getTransform(), false, false);
>>>  527                 }
>>>  528                 FontRenderContext deviceFRC = 
>>> g2d.getFontRenderContext();
>>>  529                 String trimmedText = trimTrailingSpaces(text);
>>>  530                 if (!trimmedText.isEmpty()) {
>>>  531                     FontMetrics fm = g2d.getFontMetrics();
>>>  532                     float screenWidth = 
>>> SwingUtilities2.stringWidth(c, fm ,trimmedText);
>>>  533                     TextLayout layout;
>>>  534                     if 
>>> (!isFontRenderContextPrintCompatible(frc, deviceFRC)) {
>>>  535                         layout = createTextLayout(c, text, 
>>> g2d.getFont(), deviceFRC);
>>>  536                     } else {
>>>  537                         layout = createTextLayout(c, text, 
>>> g2d.getFont(), frc);
>>>  538                     }
>>>  540                     layout = 
>>> layout.getJustifiedLayout(screenWidth);
>>>
>>>
>>>
>>
>
>



More information about the swing-dev mailing list