src/windows/classes/sun/awt/windows/WPathGraphics.java

Print this page
rev 1297 : [mq]: fontmanager.patch

@@ -63,10 +63,12 @@
 
 import sun.font.CharToGlyphMapper;
 import sun.font.CompositeFont;
 import sun.font.Font2D;
 import sun.font.FontManager;
+import sun.font.FontManagerFactory;
+import sun.font.FontUtilities;
 import sun.font.PhysicalFont;
 import sun.font.TrueTypeFont;
 
 import sun.print.PathGraphics;
 import sun.print.ProxyGraphics2D;

@@ -292,11 +294,11 @@
          * unknown to GDI. Those can be registered too, although that
          * code does not exist yet, it can be added too, so we should not
          * fail that case. Just do a quick check whether its a TrueTypeFont
          * - ie not a Type1 font etc, and let drawString() resolve the rest.
          */
-        Font2D font2D = FontManager.getFont2D(font);
+        Font2D font2D = FontUtilities.getFont2D(font);
         if (font2D instanceof CompositeFont ||
             font2D instanceof TrueTypeFont) {
             return 1;
         } else {
             return 0;

@@ -318,25 +320,45 @@
      * be drawn via TextLayout, which in is rendered as runs of
      * GlyphVectors, to which we can assign positions for each glyph.
      */
     private boolean strNeedsTextLayout(String str, Font font) {
         char[] chars = str.toCharArray();
-        boolean isComplex = FontManager.isComplexText(chars, 0, chars.length);
+        boolean isComplex = FontUtilities.isComplexText(chars, 0, chars.length);
         if (!isComplex) {
             return false;
         } else if (!useGDITextLayout) {
             return true;
         } else {
             if (preferGDITextLayout ||
-                (isXP() && FontManager.textLayoutIsCompatible(font))) {
+                (isXP() && textLayoutIsCompatible(font))) {
                 return false;
             } else {
                 return true;
             }
         }
     }
 
+    /**
+     * Used by windows printing to assess if a font is likely to
+     * be layout compatible with JDK
+     * TrueType fonts should be, but if they have no GPOS table,
+     * but do have a GSUB table, then they are probably older
+     * fonts GDI handles differently.
+     */
+    private boolean textLayoutIsCompatible(Font font) {
+
+        Font2D font2D = FontUtilities.getFont2D(font);
+        if (font2D instanceof TrueTypeFont) {
+            TrueTypeFont ttf = (TrueTypeFont)font2D;
+            return
+                ttf.getDirectoryEntry(TrueTypeFont.GSUBTag) == null ||
+                ttf.getDirectoryEntry(TrueTypeFont.GPOSTag) != null;
+        } else {
+            return false;
+        }
+    }
+
     private int getAngle(Point2D.Double pt) {
         /* Get the rotation in 1/10'ths degree (as needed by Windows)
          * so that GDI can draw the text rotated.
          * This calculation is only valid for a uniform scale, no shearing.
          */

@@ -496,11 +518,11 @@
         float scaledFontSizeX = (float)(fontSize * scaleFactorX);
 
         float awScale = getAwScale(scaleFactorX, scaleFactorY);
         int iangle = getAngle(ptx);
 
-        Font2D font2D = FontManager.getFont2D(font);
+        Font2D font2D = FontUtilities.getFont2D(font);
         if (font2D instanceof TrueTypeFont) {
             textOut(str, font, (TrueTypeFont)font2D, frc,
                     scaledFontSizeY, iangle, awScale,
                     deviceTransform, scaleFactorX,
                     x, y, devpos.x, devpos.y, targetW);

@@ -691,11 +713,11 @@
 
         advanceTransform.transform(glyphPos, 0,         //source
                                    glyphAdvPos, 0,      //destination
                                    glyphPos.length/2);  //num points
 
-        Font2D font2D = FontManager.getFont2D(font);
+        Font2D font2D = FontUtilities.getFont2D(font);
         if (font2D instanceof TrueTypeFont) {
             String family = font2D.getFamilyName(null);
             int style = font.getStyle() | font2D.getStyle();
             if (!wPrinterJob.setFont(family, scaledFontSizeY, style,
                                      iangle, awScale)) {

@@ -790,11 +812,11 @@
               */
              str = wPrinterJob.removeControlChars(str);
              char[] chars = str.toCharArray();
              int len = chars.length;
              GlyphVector gv = null;
-             if (!FontManager.isComplexText(chars, 0, len)) {
+             if (!FontUtilities.isComplexText(chars, 0, len)) {
                  gv = font.createGlyphVector(frc, str);
              }
              if (gv == null) {
                  super.drawString(str, userx, usery, font, frc, targetW);
                  return;