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
/**