<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