<Swing Dev> [13] RFR JDK-8214702:Wrong text position for whitespaced string in printing Swing text
Prasanta Sadhukhan
prasanta.sadhukhan at oracle.com
Thu Feb 14 06:53:38 UTC 2019
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.
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