You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/08/26 19:21:43 UTC

svn commit: r1620665 - /pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java

Author: jahewson
Date: Tue Aug 26 17:21:43 2014
New Revision: 1620665

URL: http://svn.apache.org/r1620665
Log:
PDFBOX-2262: Clean up TTFGlyph2D

Modified:
    pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java

Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java?rev=1620665&r1=1620664&r2=1620665&view=diff
==============================================================================
--- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java (original)
+++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java Tue Aug 26 17:21:43 2014
@@ -41,13 +41,12 @@ public class TTFGlyph2D implements Glyph
 {
     private static final Log LOG = LogFactory.getLog(TTFGlyph2D.class);
 
-    private PDFont pdFont;
-    private TrueTypeFont ttf;
-    private String name;
+    private final PDFont font;
+    private final TrueTypeFont ttf;
     private float scale = 1.0f;
-    private boolean hasScaling = false;
-    private Map<Integer, GeneralPath> glyphs = new HashMap<Integer, GeneralPath>();
-    private boolean isCIDFont = false;
+    private boolean hasScaling;
+    private final Map<Integer, GeneralPath> glyphs = new HashMap<Integer, GeneralPath>();
+    private final boolean isCIDFont;
 
     /**
      * Constructor.
@@ -69,11 +68,12 @@ public class TTFGlyph2D implements Glyph
         this(((PDCIDFontType2)type0Font.getDescendantFont()).getTrueTypeFont(), type0Font, true);
     }
 
-    public TTFGlyph2D(TrueTypeFont ttf, PDFont pdFont, boolean isCIDFont)
+    public TTFGlyph2D(TrueTypeFont ttf, PDFont font, boolean isCIDFont)
             throws IOException
     {
-        this.pdFont = pdFont;
+        this.font = font;
         this.ttf = ttf;
+        this.isCIDFont = isCIDFont;
         // get units per em, which is used as scaling factor
         HeaderTable header = this.ttf.getHeader();
         if (header != null && header.getUnitsPerEm() != 1000)
@@ -83,25 +83,13 @@ public class TTFGlyph2D implements Glyph
             scale = 1000f / header.getUnitsPerEm();
             hasScaling = true;
         }
-        extractFontSpecifics(pdFont, isCIDFont);
-    }
-
-    /**
-     * Extract all font specific information.
-     * 
-     * @param pdFont the given PDFont
-     */
-    private void extractFontSpecifics(PDFont pdFont, boolean isCIDFont)
-    {
-        name = pdFont.getBaseFont();
-        this.isCIDFont = isCIDFont;
     }
 
     @Override
     public GeneralPath getPathForCharacterCode(int code) throws IOException
     {
         int gid = getGIDForCharacterCode(code);
-        return getPathForGlyphId(gid);
+        return getPathForGID(gid, code);
     }
 
     // Try to map the given code to the corresponding glyph-ID
@@ -109,65 +97,71 @@ public class TTFGlyph2D implements Glyph
     {
         if (isCIDFont)
         {
-            return ((PDType0Font)pdFont).codeToGID(code);
+            return ((PDType0Font)font).codeToGID(code);
         }
         else
         {
-            return ((PDTrueTypeFont)pdFont).codeToGID(code);
+            return ((PDTrueTypeFont)font).codeToGID(code);
         }
     }
 
     /**
      * Returns the path describing the glyph for the given glyphId.
      *
-     * @param glyphId the glyphId
+     * @param gid the GID
+     * @param code the character code
      *
      * @return the GeneralPath for the given glyphId
      */
-    public GeneralPath getPathForGlyphId(int glyphId) throws IOException
+    public GeneralPath getPathForGID(int gid, int code) throws IOException
     {
         GeneralPath glyphPath;
-        if (glyphs.containsKey(glyphId))
+        if (glyphs.containsKey(gid))
         {
-            glyphPath = glyphs.get(glyphId);
+            glyphPath = glyphs.get(gid);
         }
-        else
+        else if (gid == 0)
         {
-            // fixme: TrueTypeFont is buggy so we have to catch RuntimeException for debugging
-            GlyphData[] glyphData;
-            try
+            if (isCIDFont)
             {
-                glyphData = ttf.getGlyph().getGlyphs();
+                int cid = ((PDType0Font) font).codeToCID(code);
+                String cidHex = String.format("%04x", cid);
+                LOG.warn("No glyph for " + code + " (CID " + cidHex + ") in font " + font.getName());
             }
-            catch (RuntimeException e)
+            else
             {
-                LOG.error("Error in TTF: " + pdFont.getBaseFont() + " -> " +
-                        ttf.getNaming().getPostScriptName());
-                throw e;
+                LOG.warn("No glyph for " + code + " in font " + font.getName());
             }
 
-            if (glyphId >= glyphData.length)
+            // GID 0 is not drawn, see PDFBOX-1735
+            glyphPath = new GeneralPath();
+            glyphs.put(gid, glyphPath);
+        }
+        else
+        {
+            GlyphData[] glyphData = ttf.getGlyph().getGlyphs();
+            if (gid >= glyphData.length)
             {
-                LOG.warn(name + ": Glyph not found: " + glyphId);
+                LOG.warn(font.getName() + ": Glyph not found: " + gid);
                 glyphPath = new GeneralPath();
-                glyphs.put(glyphId, glyphPath);
+                glyphs.put(gid, glyphPath);
             }
-            else if (glyphData[glyphId] == null)
+            else if (glyphData[gid] == null)
             {
                 // empty glyph (e.g. space, newline)
                 glyphPath = new GeneralPath();
-                glyphs.put(glyphId, glyphPath);
+                glyphs.put(gid, glyphPath);
             }
             else
             {
-                GlyphData glyph = glyphData[glyphId];
+                GlyphData glyph = glyphData[gid];
                 glyphPath = glyph.getPath();
                 if (hasScaling)
                 {
                     AffineTransform atScale = AffineTransform.getScaleInstance(scale, scale);
                     glyphPath.transform(atScale);
                 }
-                glyphs.put(glyphId, glyphPath);
+                glyphs.put(gid, glyphPath);
             }
         }
         return glyphPath != null ? (GeneralPath) glyphPath.clone() : null; // todo: expensive
@@ -176,10 +170,6 @@ public class TTFGlyph2D implements Glyph
     @Override
     public void dispose()
     {
-        ttf = null;
-        if (glyphs != null)
-        {
-            glyphs.clear();
-        }
+        glyphs.clear();
     }
 }