You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2010/03/10 17:57:29 UTC

svn commit: r921450 - in /pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff: CFFFont.java CFFParser.java charset/CFFCharset.java encoding/CFFEncoding.java

Author: lehmi
Date: Wed Mar 10 16:57:29 2010
New Revision: 921450

URL: http://svn.apache.org/viewvc?rev=921450&view=rev
Log:
PDFBOX-619: added some CFF/Type2 font encoding enhancements. Patch by Villu Russmann (villu dot ruusmann at gmail dot com)

Modified:
    pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java
    pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java
    pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java
    pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java

Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java Wed Mar 10 16:57:29 2010
@@ -133,12 +133,9 @@ public class CFFFont
     {
         List<Mapping> mappings = new ArrayList<Mapping>();
         Set<String> mappedNames = new HashSet<String>();
-        Iterator<Integer> codes = fontEncoding.getCodes();
-        while (codes.hasNext())
+        for (CFFEncoding.Entry entry : fontEncoding.getEntries())
         {
-            int code = codes.next();
-            int sid = fontEncoding.getSID(code);
-            String charName = fontCharset.getName(sid);
+            String charName = fontCharset.getName(entry.getSID());
             // Predefined encoding
             if (charName == null)
             {
@@ -150,13 +147,38 @@ public class CFFFont
                 continue;
             }
             Mapping mapping = new Mapping();
-            mapping.setCode(code);
-            mapping.setSID(sid);
+            mapping.setCode(entry.getCode());
+            mapping.setSID(entry.getSID());
             mapping.setName(charName);
             mapping.setBytes(bytes);
             mappings.add(mapping);
             mappedNames.add(charName);
         }
+        if (fontEncoding instanceof CFFParser.EmbeddedEncoding)
+        {
+            CFFParser.EmbeddedEncoding embeddedEncoding = (CFFParser.EmbeddedEncoding)fontEncoding;
+
+            for (CFFParser.EmbeddedEncoding.Supplement supplement : embeddedEncoding.getSupplements())
+            {
+                String charName = fontCharset.getName(supplement.getGlyph());
+                if (charName == null)
+                {
+                    continue;
+                }
+                byte[] bytes = charStringsDict.get(charName);
+                if (bytes == null)
+                {
+                    continue;
+                }
+                Mapping mapping = new Mapping();
+                mapping.setCode(supplement.getCode());
+                mapping.setSID(supplement.getGlyph());
+                mapping.setName(charName);
+                mapping.setBytes(bytes);
+                mappings.add(mapping);
+                mappedNames.add(charName);
+            }
+        }
         // XXX
         int code = 256;
         for (CFFCharset.Entry entry : fontCharset.getEntries())

Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java Wed Mar 10 16:57:29 2010
@@ -19,6 +19,7 @@ package org.apache.fontbox.cff;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.fontbox.cff.charset.CFFCharset;
@@ -704,7 +705,7 @@ public class CFFParser
     /**
      * Inner class representing an embedded CFF encoding. 
      */
-    private abstract static class EmbeddedEncoding extends CFFEncoding
+    abstract static class EmbeddedEncoding extends CFFEncoding
     {
 
         private int nSups;
@@ -716,14 +717,30 @@ public class CFFParser
             return true;
         }
 
+        List<Supplement> getSupplements()
+        {
+            if(supplement == null){
+                return Collections.<Supplement>emptyList();
+            }
+            return Arrays.asList(supplement);
+        }
+
         /**
          * Inner class representing a supplement for an encoding. 
          */
-        private static class Supplement
+        static class Supplement
         {
             private int code;
             private int glyph;
 
+            int getCode(){
+                return code;
+            }
+
+            int getGlyph(){
+                return glyph;
+            }
+
             @Override
             public String toString()
             {
@@ -788,7 +805,7 @@ public class CFFParser
     /**
      * Inner class representing an embedded CFF charset. 
      */
-    private abstract static class EmbeddedCharset extends CFFCharset
+    abstract static class EmbeddedCharset extends CFFCharset
     {
         @Override
         public boolean isFontSpecific()

Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java Wed Mar 10 16:57:29 2010
@@ -92,7 +92,7 @@ public abstract class CFFCharset
     }
 
     /**
-     * This class represents a single name/SID mapping of the charset.
+     * This class represents a single SID/name mapping of the charset.
      *
      */
     public static class Entry

Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java Wed Mar 10 16:57:29 2010
@@ -16,8 +16,8 @@
  */
 package org.apache.fontbox.cff.encoding;
 
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * This is the superclass for all CFFFont encodings.
@@ -28,8 +28,7 @@ import java.util.Iterator;
 public abstract class CFFEncoding
 {
 
-    private static HashMap<Integer,Integer> code2sid = new HashMap<Integer,Integer>();
-    private static HashMap<Integer,Integer> sid2code = new HashMap<Integer,Integer>();
+    private List<Entry> entries = new ArrayList<Entry>();
 
     /**
      * Determines if the encoding is font specific or not.
@@ -47,9 +46,12 @@ public abstract class CFFEncoding
      */
     public int getCode(int sid)
     {
-        if (sid2code.containsKey(sid)) 
+        for(Entry entry : entries)
         {
-            return sid2code.get(sid);
+            if(entry.entrySID == sid)
+            {
+                return entry.entryCode;
+            }
         }
         return -1;
     }
@@ -61,9 +63,12 @@ public abstract class CFFEncoding
      */
     public int getSID(int code)
     {
-        if (code2sid.containsKey(code)) 
+        for(Entry entry : entries)
         {
-            return code2sid.get(code);
+            if(entry.entryCode == code)
+            {
+                return entry.entrySID;
+            }
         }
         return -1;
     }
@@ -75,18 +80,62 @@ public abstract class CFFEncoding
      */
     public void register(int code, int sid)
     {
-        // TODO check if mapping already exists
-        sid2code.put(sid,code);
-        code2sid.put(code,sid);
+        entries.add(new Entry(code, sid));
     }
 
     /**
-     * Returns an iterator for all codes of this encoding.
-     * 
-     * @return the iterator for all codes of this encoding
+     * A list of all entries within this encoding.
+     * @return a list of all entries
      */
-    public Iterator<Integer> getCodes() 
+    public List<Entry> getEntries()
     {
-        return code2sid.keySet().iterator();
+        return entries;
+    }
+
+    /**
+     * This class represents a single code/SID mapping of the encoding.
+     *
+     */
+    public static class Entry
+    {
+        private int entryCode;
+        private int entrySID;
+
+        /**
+         * Create a new instance of Entry with the given values.
+         * @param code the code
+         * @param sid the SID
+         */
+        protected Entry(int code, int sid)
+        {
+            this.entryCode = code;
+            this.entrySID = sid;
+        }
+
+        /**
+         * The code of the entry.
+         * @return the code
+         */
+        public int getCode()
+        {
+            return this.entryCode;
+        }
+
+        /**
+         * The SID of the entry.
+         * @return the SID
+         */
+        public int getSID()
+        {
+            return this.entrySID;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String toString()
+        {
+            return "[code=" + entryCode + ", sid=" + entrySID + "]";
+        }
     }
 }
\ No newline at end of file