From 32cce5faa6722b0d9fb5cd263b4f208528dfda7b Mon Sep 17 00:00:00 2001 From: prr Date: Tue, 13 May 2008 16:56:22 -0700 Subject: [PATCH] 6697721: OpenJDK: rotated text baseline different between TextLayout and drawString Reviewed-by: prr, igor Contributed-by: dougfelt@yahoo.com --- src/share/native/sun/font/freetypeScaler.c | 23 ++++++++++++++----- .../Graphics2D/DrawString/RotTransText.java | 12 ++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/share/native/sun/font/freetypeScaler.c b/src/share/native/sun/font/freetypeScaler.c index 1ce56123d..051e7c4c4 100644 --- a/src/share/native/sun/font/freetypeScaler.c +++ b/src/share/native/sun/font/freetypeScaler.c @@ -368,7 +368,7 @@ Java_sun_font_FreetypeFontScaler_createScalerContextNative( //text can not be smaller than 1 point ptsz = 1.0; } - context->ptsz = (((int) ptsz) << 6); + context->ptsz = (int)(ptsz * 64); context->transform.xx = FloatToFTFixed((float)dmat[0]/ptsz); context->transform.yx = -FloatToFTFixed((float)dmat[1]/ptsz); context->transform.xy = -FloatToFTFixed((float)dmat[2]/ptsz); @@ -779,13 +779,24 @@ Java_sun_font_FreetypeFontScaler_getGlyphImageNative( } if (context->fmType == TEXT_FM_ON) { - glyphInfo->advanceX = FT26Dot6ToFloat(ftglyph->advance.x); - glyphInfo->advanceY = FT26Dot6ToFloat(-ftglyph->advance.y); - } else { + double advh = FTFixedToFloat(ftglyph->linearHoriAdvance); glyphInfo->advanceX = - (float) ROUND(FT26Dot6ToFloat(ftglyph->advance.x)); + (float) (advh * FTFixedToFloat(context->transform.xx)); glyphInfo->advanceY = - (float) ROUND(FT26Dot6ToFloat(-ftglyph->advance.y)); + (float) (advh * FTFixedToFloat(context->transform.xy)); + } else { + if (!ftglyph->advance.y) { + glyphInfo->advanceX = + (float) ROUND(FT26Dot6ToFloat(ftglyph->advance.x)); + glyphInfo->advanceY = 0; + } else if (!ftglyph->advance.x) { + glyphInfo->advanceX = 0; + glyphInfo->advanceY = + (float) ROUND(FT26Dot6ToFloat(-ftglyph->advance.y)); + } else { + glyphInfo->advanceX = FT26Dot6ToFloat(ftglyph->advance.x); + glyphInfo->advanceY = FT26Dot6ToFloat(-ftglyph->advance.y); + } } if (imageSize == 0) { diff --git a/test/java/awt/Graphics2D/DrawString/RotTransText.java b/test/java/awt/Graphics2D/DrawString/RotTransText.java index 9f38fa113..87b822907 100644 --- a/test/java/awt/Graphics2D/DrawString/RotTransText.java +++ b/test/java/awt/Graphics2D/DrawString/RotTransText.java @@ -38,12 +38,24 @@ public class RotTransText { public static void main(String[] args) { + testIt(false); + testIt(true); + + } + + public static void testIt(boolean fmOn) { + int wid=400, hgt=400; BufferedImage bi = new BufferedImage(wid, hgt, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bi.createGraphics(); + if (fmOn) { + g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON); + } + int x=130, y=130; String s = "Text"; -- GitLab