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 2015/12/26 13:47:52 UTC

svn commit: r1721729 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff: CFFCIDFont.java CFFFont.java CFFParser.java CFFType1Font.java Type2CharStringParser.java

Author: lehmi
Date: Sat Dec 26 12:47:51 2015
New Revision: 1721729

URL: http://svn.apache.org/viewvc?rev=1721729&view=rev
Log:
PDFBOX-3131: use arrays instead if lists

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java?rev=1721729&r1=1721728&r2=1721729&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java Sat Dec 26 12:47:51 2015
@@ -203,15 +203,15 @@ public class CFFCIDFont extends CFFFont
      *
      * @param gid GID
      */
-    private List<byte[]> getLocalSubrIndex(int gid)
+    private byte[][] getLocalSubrIndex(int gid)
     {
         int fdArrayIndex = this.fdSelect.getFDIndex(gid);
         if (fdArrayIndex == -1)
         {
-            return new ArrayList<byte[]>();
+            return null;
         }
         Map<String, Object> privDict = this.privateDictionaries.get(fdArrayIndex);
-        return (List<byte[]>)privDict.get("Subrs");
+        return (byte[][])privDict.get("Subrs");
     }
 
     /**
@@ -228,10 +228,10 @@ public class CFFCIDFont extends CFFFont
         {
             int gid = charset.getGIDForCID(cid);
 
-            byte[] bytes = charStrings.get(gid);
+            byte[] bytes = charStrings[gid];
             if (bytes == null)
             {
-                bytes = charStrings.get(0); // .notdef
+                bytes = charStrings[0]; // .notdef
             }
             Type2CharStringParser parser = new Type2CharStringParser(fontName, cid);
             List<Object> type2seq = parser.parse(bytes, globalSubrIndex, getLocalSubrIndex(gid));

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java?rev=1721729&r1=1721728&r2=1721729&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java Sat Dec 26 12:47:51 2015
@@ -18,6 +18,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.LinkedHashMap;
 import java.util.List;
@@ -37,8 +38,8 @@ public abstract class CFFFont implements
     protected String fontName;
     protected final Map<String, Object> topDict = new LinkedHashMap<String, Object>();
     protected CFFCharset charset;
-    protected final List<byte[]> charStrings = new ArrayList<byte[]>();
-    protected List<byte[]> globalSubrIndex;
+    protected byte[][] charStrings;
+    protected byte[][] globalSubrIndex;
     private CFFParser.ByteSource source;
 
     /**
@@ -129,7 +130,7 @@ public abstract class CFFFont implements
      */
     public final List<byte[]> getCharStringBytes()
     {
-        return Collections.unmodifiableList(charStrings);
+        return Arrays.asList(charStrings);
     }
 
     /**
@@ -153,7 +154,7 @@ public abstract class CFFFont implements
      */
     public int getNumCharStrings()
     {
-        return charStrings.size();
+        return charStrings.length;
     }
 
     /**
@@ -161,7 +162,7 @@ public abstract class CFFFont implements
      * 
      * @param globalSubrIndexValue an list containing the global subroutines
      */
-    void setGlobalSubrIndex(List<byte[]> globalSubrIndexValue)
+    void setGlobalSubrIndex(byte[][] globalSubrIndexValue)
     {
         globalSubrIndex = globalSubrIndexValue;
     }
@@ -173,7 +174,7 @@ public abstract class CFFFont implements
      */
     public List<byte[]> getGlobalSubrIndex()
     {
-        return Collections.unmodifiableList(globalSubrIndex);
+        return Arrays.asList(globalSubrIndex);
     }
 
     /**

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=1721729&r1=1721728&r2=1721729&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java Sat Dec 26 12:47:51 2015
@@ -131,9 +131,9 @@ public class CFFParser
         @SuppressWarnings("unused")
         Header header = readHeader(input);
         String[] nameIndex = readStringIndexData(input);
-        byte[][] topDictIndex = readIndexDataAsArray(input);
+        byte[][] topDictIndex = readIndexData(input);
         stringIndex = readStringIndexData(input);
-        List<byte[]> globalSubrIndex = readIndexData(input);
+        byte[][] globalSubrIndex = readIndexData(input);
 
         List<CFFFont> fonts = new ArrayList<CFFFont>();
         for (int i = 0; i < nameIndex.length; i++)
@@ -188,7 +188,7 @@ public class CFFParser
         return offsets;
     }
 
-    private static byte[][] readIndexDataAsArray(CFFDataInput input) throws IOException
+    private static byte[][] readIndexData(CFFDataInput input) throws IOException
     {
         int[] offsets = readIndexDataOffsets(input);
         if (offsets == null)
@@ -205,16 +205,6 @@ public class CFFParser
         return indexDataValues;
     }
 
-    private static List<byte[]> readIndexData(CFFDataInput input) throws IOException
-    {
-        byte[][] indexDataValuesAsArray = readIndexDataAsArray(input);
-        if (indexDataValuesAsArray == null)
-        {
-            return new ArrayList<byte[]>(0);
-        }
-        return Arrays.asList(indexDataValuesAsArray);
-    }
-
     private static String[] readStringIndexData(CFFDataInput input) throws IOException
     {
         int[] offsets = readIndexDataOffsets(input);
@@ -453,7 +443,7 @@ public class CFFParser
         DictData.Entry charStringsEntry = topDict.getEntry("CharStrings");
         int charStringsOffset = charStringsEntry.getNumber(0).intValue();
         input.setPosition(charStringsOffset);
-        List<byte[]> charStringsIndex = readIndexData(input);
+        byte[][] charStringsIndex = readIndexData(input);
         
         // charset
         DictData.Entry charsetEntry = topDict.getEntry("charset");
@@ -476,7 +466,7 @@ public class CFFParser
             else
             {
                 input.setPosition(charsetId);
-                charset = readCharset(input, charStringsIndex.size(), isCIDFont);
+                charset = readCharset(input, charStringsIndex.length, isCIDFont);
             }
         }
         else
@@ -484,7 +474,7 @@ public class CFFParser
             if (isCIDFont)
             {
                 // a CID font with no charset does not default to any predefined charset
-                charset = new EmptyCharset(charStringsIndex.size());
+                charset = new EmptyCharset(charStringsIndex.length);
             }
             else
             {
@@ -494,12 +484,12 @@ public class CFFParser
         font.setCharset(charset);
 
         // charstrings dict
-        font.charStrings.addAll(charStringsIndex);
+        font.charStrings = charStringsIndex;
 
         // format-specific dictionaries
         if (isCIDFont)
         {
-            parseCIDFontDicts(input, topDict, (CFFCIDFont) font, charStringsIndex.size());
+            parseCIDFontDicts(input, topDict, (CFFCIDFont) font, charStringsIndex.length);
 
             // some malformed fonts have FontMatrix in their Font DICT, see PDFBOX-2495
             if (topDict.getEntry("FontMatrix") == null)
@@ -544,7 +534,7 @@ public class CFFParser
         // font dict index
         int fontDictOffset = fdArrayEntry.getNumber(0).intValue();
         input.setPosition(fontDictOffset);
-        byte[][] fdIndex = readIndexDataAsArray(input);
+        byte[][] fdIndex = readIndexData(input);
 
         List<Map<String, Object>> privateDictionaries = new LinkedList<Map<String, Object>>();
         List<Map<String, Object>> fontDictionaries = new LinkedList<Map<String, Object>>();
@@ -582,11 +572,7 @@ public class CFFParser
 
             // local subrs
             int localSubrOffset = (Integer) privateDict.getNumber("Subrs", 0);
-            if (localSubrOffset == 0)
-            {
-                privDict.put("Subrs", new ArrayList<byte[]>());
-            }
-            else
+            if (localSubrOffset > 0)
             {
                 input.setPosition(privateOffset + localSubrOffset);
                 privDict.put("Subrs", readIndexData(input));
@@ -676,11 +662,7 @@ public class CFFParser
 
         // local subrs
         int localSubrOffset = (Integer) privateDict.getNumber("Subrs", 0);
-        if (localSubrOffset == 0)
-        {
-            font.addToPrivateDict("Subrs", new ArrayList<byte[]>());
-        }
-        else
+        if (localSubrOffset > 0)
         {
             input.setPosition(privateOffset + localSubrOffset);
             font.addToPrivateDict("Subrs", readIndexData(input));

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java?rev=1721729&r1=1721728&r2=1721729&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java Sat Dec 26 12:47:51 2015
@@ -128,14 +128,14 @@ public class CFFType1Font extends CFFFon
         if (type2 == null)
         {
             byte[] bytes = null;
-            if (gid < charStrings.size())
+            if (gid < charStrings.length)
             {
-                bytes = charStrings.get(gid);
+                bytes = charStrings[gid];
             }
             if (bytes == null)
             {
                 // .notdef
-                bytes = charStrings.get(0);
+                bytes = charStrings[0];
             }
             Type2CharStringParser parser = new Type2CharStringParser(fontName, name);
             List<Object> type2seq = parser.parse(bytes, globalSubrIndex, getLocalSubrIndex());
@@ -192,9 +192,9 @@ public class CFFType1Font extends CFFFon
         this.encoding = encoding;
     }
 
-    private List<byte[]> getLocalSubrIndex()
+    private byte[][] getLocalSubrIndex()
     {
-        return (List<byte[]>)privateDict.get("Subrs");
+        return (byte[][])privateDict.get("Subrs");
     }
 
     // helper for looking up keys/values

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java?rev=1721729&r1=1721728&r2=1721729&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java Sat Dec 26 12:47:51 2015
@@ -29,6 +29,7 @@ public class Type2CharStringParser
     private int hstemCount = 0;
     private int vstemCount = 0;
     private List<Object> sequence = null;
+    @SuppressWarnings("unused")
     private final String fontName, glyphName;
 
     /**
@@ -58,18 +59,18 @@ public class Type2CharStringParser
     /**
      * The given byte array will be parsed and converted to a Type2 sequence.
      * @param bytes the given mapping as byte array
-     * @param globalSubrIndex list containing all global subroutines
-     * @param localSubrIndex list containing all local subroutines
+     * @param globalSubrIndex array containing all global subroutines
+     * @param localSubrIndex array containing all local subroutines
      * 
      * @return the Type2 sequence
      * @throws IOException if an error occurs during reading
      */
-    public List<Object> parse(byte[] bytes, List<byte[]> globalSubrIndex, List<byte[]> localSubrIndex) throws IOException
+    public List<Object> parse(byte[] bytes, byte[][] globalSubrIndex, byte[][] localSubrIndex) throws IOException
     {
         return parse(bytes, globalSubrIndex, localSubrIndex, true);
     }
     
-    private List<Object> parse(byte[] bytes, List<byte[]> globalSubrIndex, List<byte[]> localSubrIndex, boolean init) throws IOException
+    private List<Object> parse(byte[] bytes, byte[][] globalSubrIndex, byte[][] localSubrIndex, boolean init) throws IOException
     {
         if (init) 
         {
@@ -78,8 +79,8 @@ public class Type2CharStringParser
             sequence = new ArrayList<Object>();
         }
         DataInput input = new DataInput(bytes);
-        boolean localSubroutineIndexProvided = localSubrIndex != null && localSubrIndex.size() > 0;
-        boolean globalSubroutineIndexProvided = globalSubrIndex != null && globalSubrIndex.size() > 0;
+        boolean localSubroutineIndexProvided = localSubrIndex != null && localSubrIndex.length > 0;
+        boolean globalSubroutineIndexProvided = globalSubrIndex != null && globalSubrIndex.length > 0;
 
         while (input.hasRemaining())
         {
@@ -89,7 +90,7 @@ public class Type2CharStringParser
                 Integer operand=(Integer)sequence.remove(sequence.size()-1);
                 //get subrbias
                 int bias = 0;
-                int nSubrs = localSubrIndex.size();
+                int nSubrs = localSubrIndex.length;
                 
                 if (nSubrs < 1240)
                 {
@@ -104,9 +105,9 @@ public class Type2CharStringParser
                     bias = 32768;
                 }
                 int subrNumber = bias+operand;
-                if (subrNumber < localSubrIndex.size())
+                if (subrNumber < localSubrIndex.length)
                 {
-                    byte[] subrBytes = localSubrIndex.get(subrNumber);
+                    byte[] subrBytes = localSubrIndex[subrNumber];
                     parse(subrBytes, globalSubrIndex, localSubrIndex, false);
                     Object lastItem=sequence.get(sequence.size()-1);
                     if (lastItem instanceof CharStringCommand && ((CharStringCommand)lastItem).getKey().getValue()[0] == 11)
@@ -121,7 +122,7 @@ public class Type2CharStringParser
                 Integer operand=(Integer)sequence.remove(sequence.size()-1);
                 //get subrbias
                 int bias = 0;
-                int nSubrs = globalSubrIndex.size();
+                int nSubrs = globalSubrIndex.length;
                 
                 if (nSubrs < 1240)
                 {
@@ -137,9 +138,9 @@ public class Type2CharStringParser
                 }
                 
                 int subrNumber = bias+operand;
-                if (subrNumber < globalSubrIndex.size())
+                if (subrNumber < globalSubrIndex.length)
                 {
-                    byte[] subrBytes = globalSubrIndex.get(subrNumber);
+                    byte[] subrBytes = globalSubrIndex[subrNumber];
                     parse(subrBytes, globalSubrIndex, localSubrIndex, false);
                     Object lastItem=sequence.get(sequence.size()-1);
                     if (lastItem instanceof CharStringCommand && ((CharStringCommand)lastItem).getKey().getValue()[0]==11)