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/18 23:40:13 UTC

svn commit: r1618754 - in /pdfbox/branches/no-awt: fontbox/src/main/java/org/apache/fontbox/cff/ fontbox/src/main/java/org/apache/fontbox/cmap/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ pdfbox/src/main/java/org/apache/pdfbox/rendering/font/

Author: jahewson
Date: Mon Aug 18 21:40:13 2014
New Revision: 1618754

URL: http://svn.apache.org/r1618754
Log:
PDFBOX-2262: Implement FDSelect for CIDFonts

Added:
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/FDSelect.java
      - copied, changed from r1618534, pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CIDKeyedFDSelect.java
Removed:
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CIDKeyedFDSelect.java
Modified:
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
    pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
    pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/CIDGlyph2D.java

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java?rev=1618754&r1=1618753&r2=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java Mon Aug 18 21:40:13 2014
@@ -39,7 +39,7 @@ public class CFFCIDFont extends CFFFont
 
     private List<Map<String, Object>> fontDictionaries = new LinkedList<Map<String,Object>>();
     private List<Map<String, Object>> privateDictionaries = new LinkedList<Map<String,Object>>();
-    private CIDKeyedFDSelect fdSelect;
+    private FDSelect fdSelect;
 
     private final Map<Integer, CIDKeyedType2CharString> charStringCache =
             new HashMap<Integer, CIDKeyedType2CharString>();
@@ -110,7 +110,7 @@ public class CFFCIDFont extends CFFFont
      *
      * @return the fontDict
      */
-    public List<Map<String, Object>> getFontDict() 
+    public List<Map<String, Object>> getFontDicts()
     {
         return fontDictionaries;
     }
@@ -130,7 +130,7 @@ public class CFFCIDFont extends CFFFont
      *
      * @return the privDict
      */
-    public List<Map<String, Object>> getPrivDict() 
+    public List<Map<String, Object>> getPrivDicts()
     {
         return privateDictionaries;
     }
@@ -150,7 +150,7 @@ public class CFFCIDFont extends CFFFont
      *
      * @return the fdSelect
      */
-    public CIDKeyedFDSelect getFdSelect() 
+    public FDSelect getFdSelect()
     {
         return fdSelect;
     }
@@ -160,7 +160,7 @@ public class CFFCIDFont extends CFFFont
      *
      * @param fdSelect the fdSelect to set
      */
-    void setFdSelect(CIDKeyedFDSelect fdSelect)
+    void setFdSelect(FDSelect fdSelect)
     {
         this.fdSelect = fdSelect;
     }
@@ -173,7 +173,7 @@ public class CFFCIDFont extends CFFFont
      */
     private int getDefaultWidthX(int cid)
     {
-        int fdArrayIndex = this.fdSelect.getFd(cid);
+        int fdArrayIndex = this.fdSelect.getFDIndex(cid);
         if (fdArrayIndex == -1)
         {
             return 1000;
@@ -190,7 +190,7 @@ public class CFFCIDFont extends CFFFont
      */
     private int getNominalWidthX(int cid)
     {
-        int fdArrayIndex = this.fdSelect.getFd(cid);
+        int fdArrayIndex = this.fdSelect.getFDIndex(cid);
         if (fdArrayIndex == -1)
         {
             return 0;
@@ -201,7 +201,7 @@ public class CFFCIDFont extends CFFFont
 
     private IndexData getLocalSubrIndex(int cid)
     {
-        int fdArrayIndex = this.fdSelect.getFd(cid);
+        int fdArrayIndex = this.fdSelect.getFDIndex(cid);
         if (fdArrayIndex == -1)
         {
             return new IndexData(0);

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=1618754&r1=1618753&r2=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java Mon Aug 18 21:40:13 2014
@@ -509,7 +509,7 @@ public class CFFParser
         DictData.Entry fdSelectEntry = topDict.getEntry("FDSelect");
         int fdSelectPos = fdSelectEntry.getNumber(0).intValue();
         input.setPosition(fdSelectPos);
-        CIDKeyedFDSelect fdSelect = readFDSelect(input, charStringsIndex.getCount(), font);
+        FDSelect fdSelect = readFDSelect(input, charStringsIndex.getCount(), font);
 
         // todo: almost certainly erroneous - CIDFonts do not have a top-level private dict
         //font.addValueToPrivateDict("defaultWidthX", 1000);
@@ -727,7 +727,7 @@ public class CFFParser
      * @return the FDSelect data
      * @throws IOException
      */
-    private CIDKeyedFDSelect readFDSelect(CFFDataInput dataInput, int nGlyphs, CFFCIDFont ros) throws IOException
+    private FDSelect readFDSelect(CFFDataInput dataInput, int nGlyphs, CFFCIDFont ros) throws IOException
     {
         int format = dataInput.readCard8();
         if (format == 0)
@@ -799,9 +799,9 @@ public class CFFParser
     }
 
     /**
-     *  Container of a Format 3 FDSelect data (see "The Compact Font Format Specification" chapter "FDSelect" ).
+     *  Format 3 FDSelect data.
      */
-    private static class Format3FDSelect extends CIDKeyedFDSelect
+    private static class Format3FDSelect extends FDSelect
     {
         private int format;
         private int nbRanges;
@@ -813,21 +813,16 @@ public class CFFParser
             super(owner);
         }
 
-        /*
-         * (non-Javadoc)
-         * 
-         * @see org.apache.fontbox.cff.CIDKeyedFDSelect#getFd(int)
-         */
         @Override
-        public int getFd(int glyph)
+        public int getFDIndex(int gid)
         {
             for (int i = 0; i < nbRanges; ++i)
             {
-                if (range3[i].first >= glyph)
+                if (range3[i].first >= gid)
                 {
                     if (i + 1 < nbRanges)
                     {
-                        if (range3[i + 1].first > glyph)
+                        if (range3[i + 1].first > gid)
                         {
                             return range3[i].fd;
                         }
@@ -838,8 +833,8 @@ public class CFFParser
                     }
                     else
                     {
-                        // last range reach, the sentinel must be greater than sid
-                        if (sentinel > glyph)
+                        // last range reach, the sentinel must be greater than gid
+                        if (sentinel > gid)
                         {
                             return range3[i].fd;
                         }
@@ -877,9 +872,9 @@ public class CFFParser
     }
 
     /**
-     *  Container of a Format 0 FDSelect data (see "The Compact Font Format Specification" chapter "FDSelect" ).
+     *  Format 0 FDSelect.
      */
-    private static class Format0FDSelect extends CIDKeyedFDSelect
+    private static class Format0FDSelect extends FDSelect
     {
         private int format;
         private int[] fds;
@@ -890,36 +885,15 @@ public class CFFParser
         }
 
         @Override
-        public int getFd(int glyph)
+        public int getFDIndex(int gid)
         {
-            // todo: needs to be re-implemented
-            throw new UnsupportedOperationException("not implemented: FDSelect");
-
-            /*Map<String, byte[]> charStrings = null;// owner.getCharStringsDict();
-            Set<String> keys = charStrings.keySet();
-            // search the position of the given sid
-            for (Mapping mapping : owner.getMappings())
-            {
-                if (mapping.getSID() == glyph && charStrings.containsKey(mapping.getName()))
-                {
-                    int index = 0;
-                    for (String str : keys)
-                    {
-                        if (mapping.getName().equals(str))
-                        {
-                            return fds[index];
-                        }
-                        ++index;
-                    }
-                }
-            }
-            return -1;*/
+            return fds[gid];
         }
 
         @Override
         public String toString()
         {
-            return getClass().getName() + "[format=" + format + ", fds=" + Arrays.toString(fds) + "]";
+            return getClass().getName() + "[fds=" + Arrays.toString(fds) + "]";
         }
     }
 

Copied: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/FDSelect.java (from r1618534, pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CIDKeyedFDSelect.java)
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/FDSelect.java?p2=pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/FDSelect.java&p1=pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CIDKeyedFDSelect.java&r1=1618534&r2=1618754&rev=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CIDKeyedFDSelect.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/FDSelect.java Mon Aug 18 21:40:13 2014
@@ -17,22 +17,24 @@
 
 package org.apache.fontbox.cff;
 
-public abstract class CIDKeyedFDSelect {
-	
-	protected CFFCIDFont owner = null;
+public abstract class FDSelect
+{
+	protected final CFFCIDFont owner;
 	
 	/**
 	 * Constructor.
+     *
 	 * @param owner the owner of the FDSelect data.
 	 */
-	public CIDKeyedFDSelect(CFFCIDFont owner) {
+	public FDSelect(CFFCIDFont owner)
+    {
 		this.owner = owner;
 	}
+
 	/**
-	 * Returns the Font DICT index for the given glyph identifier
+	 * Returns the Font DICT index for the given GID.
 	 *  
-	 * @param glyph
-	 * @return -1 if the glyph isn't define, otherwise the FD index value
+	 * @param gid GID
 	 */
-	public abstract int getFd(int glyph);
+	public abstract int getFDIndex(int gid);
 }

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java?rev=1618754&r1=1618753&r2=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java Mon Aug 18 21:40:13 2014
@@ -186,10 +186,10 @@ public class CMap
                         return ch;
                     }
                 }
-                return -1;
+                return 0;
             }
         }
-        return -1;
+        return 0;
     }
     
     /**

Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java?rev=1618754&r1=1618753&r2=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java (original)
+++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java Mon Aug 18 21:40:13 2014
@@ -110,7 +110,7 @@ public class PDCIDFontType0 extends PDCI
 
         if (character == null)
         {
-            LOG.error("No character for code " + (bytes[offset] & 0xff) + " in " + fontname);
+            LOG.warn("No character for code " + (bytes[offset] & 0xff) + " in " + fontname);
             return null;
         }
         return character;
@@ -137,7 +137,8 @@ public class PDCIDFontType0 extends PDCI
         int cid = codeToCID(bytes, offset, length);
         if (cid == 0 && !Arrays.equals(SPACE_BYTES, bytes))
         {
-            LOG.error("No name for code " + (bytes[offset] & 0xff) + " in " + fontname);
+            // todo: for debugging only
+            LOG.warn("No name for code " + (bytes[offset] & 0xff) + " in " + fontname);
             return 0;
         }
 
@@ -157,7 +158,8 @@ public class PDCIDFontType0 extends PDCI
         int cid = codeToCID(bytes, offset, length);
         if (cid == 0)
         {
-            LOG.error("No CID for code " + (bytes[offset] & 0xff) + " in " + fontname);
+            // todo: for debugging only
+            LOG.warn("No CID for code " + (bytes[offset] & 0xff) + " in " + fontname);
             return 0;
         }
 

Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/CIDGlyph2D.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/CIDGlyph2D.java?rev=1618754&r1=1618753&r2=1618754&view=diff
==============================================================================
--- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/CIDGlyph2D.java (original)
+++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/CIDGlyph2D.java Mon Aug 18 21:40:13 2014
@@ -59,6 +59,15 @@ public class CIDGlyph2D implements Glyph
             return cache.get(cid);
         }
 
+        // don't draw CID 0
+        if (cid == 0)
+        {
+            LOG.warn("No glyph for " + code + " (CID 0000) in font " + fontName);
+            GeneralPath path = new GeneralPath();
+            cache.put(cid, path);
+            return path;
+        }
+
         try
         {
             CFFCIDFont cidFont = font.getCFFCIDFont();