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 2021/09/05 16:12:37 UTC

svn commit: r1892946 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox: cff/Type1CharStringParser.java type1/Type1Font.java

Author: lehmi
Date: Sun Sep  5 16:12:37 2021
New Revision: 1892946

URL: http://svn.apache.org/viewvc?rev=1892946&view=rev
Log:
PDFBOX-5143: reuse Type1CharStringParser instead of recreating it for every char

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Font.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java?rev=1892946&r1=1892945&r2=1892946&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java Sun Sep  5 16:12:37 2021
@@ -47,18 +47,16 @@ public class Type1CharStringParser
     private static final int POP = 17;
 
     private final String fontName;
-    private final String glyphName;
+    private String currentGlyph;
 
     /**
      * Constructs a new Type1CharStringParser object.
      *
      * @param fontName font name
-     * @param glyphName glyph name
      */
-    public Type1CharStringParser(String fontName, String glyphName)
+    public Type1CharStringParser(String fontName)
     {
         this.fontName = fontName;
-        this.glyphName = glyphName;
     }
 
     /**
@@ -69,12 +67,14 @@ public class Type1CharStringParser
      * @return the Type1 sequence
      * @throws IOException if an error occurs during reading
      */
-    public List<Object> parse(byte[] bytes, List<byte[]> subrs) throws IOException
+    public List<Object> parse(byte[] bytes, List<byte[]> subrs, String glyphName) throws IOException
     {
+        currentGlyph = glyphName;
         return parse(bytes, subrs, new ArrayList<>());
     }
 
-    private List<Object> parse(byte[] bytes, List<byte[]> subrs, List<Object> sequence) throws IOException
+    private List<Object> parse(byte[] bytes, List<byte[]> subrs, List<Object> sequence)
+            throws IOException
     {
         DataInput input = new DataInput(bytes);
         while (input.hasRemaining())
@@ -111,7 +111,7 @@ public class Type1CharStringParser
         if (!(obj instanceof Integer))
         {
             LOG.warn("Parameter " + obj + " for CALLSUBR is ignored, integer expected in glyph '"
-                    + glyphName + "' of font " + fontName);
+                    + currentGlyph + "' of font " + fontName);
             return;
         }
         Integer operand = (Integer) obj;
@@ -130,7 +130,7 @@ public class Type1CharStringParser
         else
         {
             LOG.warn("CALLSUBR is ignored, operand: " + operand + ", subrs.size(): " + subrs.size()
-                    + " in glyph '" + glyphName + "' of font " + fontName);
+                    + " in glyph '" + currentGlyph + "' of font " + fontName);
             // remove all parameters (there can be more than one)
             while (sequence.get(sequence.size() - 1) instanceof Integer)
             {
@@ -187,7 +187,7 @@ public class Type1CharStringParser
 
         if (!results.isEmpty())
         {
-            LOG.warn("Value left on the PostScript stack in glyph " + glyphName + " of font "
+            LOG.warn("Value left on the PostScript stack in glyph " + currentGlyph + " of font "
                     + fontName);
         }
     }

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Font.java?rev=1892946&r1=1892945&r2=1892946&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Font.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Font.java Sun Sep  5 16:12:37 2021
@@ -129,6 +129,8 @@ public final class Type1Font implements
     // private caches
     private final Map<String, Type1CharString> charStringCache = new ConcurrentHashMap<>();
 
+    private Type1CharStringParser charStringParser = null;
+
     // raw data
     private final byte[] segment1;
     private final byte[] segment2;
@@ -197,14 +199,22 @@ public final class Type1Font implements
             {
                 bytes = charstrings.get(".notdef");
             }
-            Type1CharStringParser parser = new Type1CharStringParser(fontName, name);
-            List<Object> sequence = parser.parse(bytes, subrs);
+            List<Object> sequence = getParser().parse(bytes, subrs, name);
             type1 = new Type1CharString(this, fontName, name, sequence);
             charStringCache.put(name, type1);
         }
         return type1;
     }
 
+    private Type1CharStringParser getParser()
+    {
+        if (charStringParser == null)
+        {
+            charStringParser = new Type1CharStringParser(fontName);
+        }
+        return charStringParser;
+    }
+
     // font dictionary
 
     /**