Author: lehmi
Date: Thu May  9 11:44:16 2024
New Revision: 1917614

URL: http://svn.apache.org/viewvc?rev=1917614&view=rev
Log:
PDFBOX-5469: use inner wrapper class to transfer values

Modified:
    
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java

Modified: 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java?rev=1917614&r1=1917613&r2=1917614&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java
 (original)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharStringParser.java
 Thu May  9 11:44:16 2024
@@ -58,11 +58,13 @@ public class Type2CharStringParser
     public List<Object> parse(byte[] bytes, byte[][] globalSubrIndex, byte[][] 
localSubrIndex,
             String glyphName) throws IOException
     {
-        return parseSequence(bytes, globalSubrIndex, localSubrIndex, new 
ArrayList<>(), 0, 0);
+        GlyphData glyphData = new GlyphData();
+        parseSequence(bytes, globalSubrIndex, localSubrIndex, glyphData);
+        return glyphData.sequence;
     }
 
-    private List<Object> parseSequence(byte[] bytes, byte[][] globalSubrIndex,
-            byte[][] localSubrIndex, List<Object> sequence, int hstemCount, 
int vstemCount)
+    private void parseSequence(byte[] bytes, byte[][] globalSubrIndex, 
byte[][] localSubrIndex,
+            GlyphData glyphData)
             throws IOException
     {
         DataInput input = new DataInputByteArray(bytes);
@@ -74,48 +76,44 @@ public class Type2CharStringParser
             int b0 = input.readUnsignedByte();
             if (b0 == CALLSUBR && localSubroutineIndexProvided)
             {
-                processCallSubr(globalSubrIndex, localSubrIndex, 
localSubrIndex, sequence,
-                        hstemCount, vstemCount);
+                processCallSubr(globalSubrIndex, localSubrIndex, 
localSubrIndex, glyphData);
             }
             else if (b0 == CALLGSUBR && globalSubroutineIndexProvided)
             {
-                processCallSubr(globalSubrIndex, localSubrIndex, 
globalSubrIndex, sequence,
-                        hstemCount, vstemCount);
+                processCallSubr(globalSubrIndex, localSubrIndex, 
globalSubrIndex, glyphData);
             }
             else if ( (b0 >= 0 && b0 <= 27) || (b0 >= 29 && b0 <= 31))
             {
-                sequence.add(
-                        readCommand(b0, input, countNumbers(sequence), 
hstemCount, vstemCount));
+                glyphData.sequence.add(readCommand(b0, input, glyphData));
             } 
             else if (b0 == 28 || (b0 >= 32 && b0 <= 255))
             {
-                sequence.add(readNumber(b0, input));
+                glyphData.sequence.add(readNumber(b0, input));
             } 
             else
             {
                 throw new IllegalArgumentException();
             }
         }
-        return sequence;
     }
 
     private void processCallSubr(byte[][] globalSubrIndex, byte[][] 
localSubrIndex,
-            byte[][] subrIndex, List<Object> sequence, int hstemCount, int 
vstemCount)
+            byte[][] subrIndex, GlyphData glyphData)
             throws IOException
     {
-        int subrNumber = calculateSubrNumber((Integer) 
sequence.remove(sequence.size() - 1),
+        int subrNumber = calculateSubrNumber(
+                (Integer) glyphData.sequence.remove(glyphData.sequence.size() 
- 1),
                 subrIndex.length);
         if (subrNumber < subrIndex.length)
         {
             byte[] subrBytes = subrIndex[subrNumber];
-            parseSequence(subrBytes, globalSubrIndex, localSubrIndex, 
sequence, hstemCount,
-                    vstemCount);
-            Object lastItem = sequence.get(sequence.size() - 1);
+            parseSequence(subrBytes, globalSubrIndex, localSubrIndex, 
glyphData);
+            Object lastItem = glyphData.sequence.get(glyphData.sequence.size() 
- 1);
             if (lastItem instanceof CharStringCommand
                     && Type2KeyWord.RET == ((CharStringCommand) 
lastItem).getType2KeyWord())
             {
                 // remove "return" command
-                sequence.remove(sequence.size() - 1);
+                glyphData.sequence.remove(glyphData.sequence.size() - 1);
             }
         }
     }
@@ -133,26 +131,25 @@ public class Type2CharStringParser
         return 32768 + operand;
     }
 
-    private CharStringCommand readCommand(int b0, DataInput input, int 
numberCount, int hstemCount,
-            int vstemCount)
+    private CharStringCommand readCommand(int b0, DataInput input, GlyphData 
glyphData)
             throws IOException
     {
         switch (b0)
         {
         case 1:
         case 18:
-            hstemCount += numberCount / 2;
+            glyphData.hstemCount += countNumbers(glyphData.sequence) / 2;
             return CharStringCommand.getInstance(b0);
         case 3:
         case 23:
-            vstemCount += numberCount / 2;
+            glyphData.vstemCount += countNumbers(glyphData.sequence) / 2;
             return CharStringCommand.getInstance(b0);
         case 12:
             return CharStringCommand.getInstance(b0, input.readUnsignedByte());
         case 19:
         case 20:
-            vstemCount += numberCount / 2;
-            int[] value = new int[1 + getMaskLength(hstemCount, vstemCount)];
+            glyphData.vstemCount += countNumbers(glyphData.sequence) / 2;
+            int[] value = new int[1 + getMaskLength(glyphData.hstemCount, 
glyphData.vstemCount)];
             value[0] = b0;
 
             for (int i = 1; i < value.length; i++)
@@ -231,4 +228,16 @@ public class Type2CharStringParser
     {
         return fontName;
     }
+
+    private class GlyphData
+    {
+        final List<Object> sequence = new ArrayList<>();
+        int hstemCount = 0;
+        int vstemCount = 0;;
+
+        private GlyphData()
+        {
+        }
+    }
+
 }


Reply via email to