Author: lehmi
Date: Sun Mar 10 10:41:32 2024
New Revision: 1916209

URL: http://svn.apache.org/viewvc?rev=1916209&view=rev
Log:
PDFBOX-5725: simply the implementation of CharStringCommand as proposed by Axel 
Howind

Modified:
    
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
    
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java
    
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
    
pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java

Modified: 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java?rev=1916209&r1=1916208&r2=1916209&view=diff
==============================================================================
--- 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
 (original)
+++ 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
 Sun Mar 10 10:41:32 2024
@@ -16,193 +16,151 @@
  */
 package org.apache.fontbox.cff;
 
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.Arrays;
 
 /**
  * This class represents a CharStringCommand.
  * 
  * @author Villu Ruusmann
  */
-public class CharStringCommand
+public enum CharStringCommand
 {
+    HSTEM(Type1KeyWord.HSTEM, Type2KeyWord.HSTEM, 1),
+    VSTEM(Type1KeyWord.VSTEM, Type2KeyWord.VSTEM, 3),
+    VMOVETO(Type1KeyWord.VMOVETO, Type2KeyWord.VMOVETO,4),
+    RLINETO(Type1KeyWord.RLINETO, Type2KeyWord.RLINETO,5),
+    HLINETO(Type1KeyWord.HLINETO, Type2KeyWord.HLINETO,6),
+    VLINETO(Type1KeyWord.VLINETO, Type2KeyWord.VLINETO,7),
+    RRCURVETO(Type1KeyWord.RRCURVETO, Type2KeyWord.RRCURVETO,8),
+    CLOSEPATH(Type1KeyWord.CLOSEPATH, null,9),
+    CALLSUBR(Type1KeyWord.CALLSUBR, Type2KeyWord.CALLSUBR,10),
+    RET(Type1KeyWord.RET, Type2KeyWord.RET,11),
+    ESCAPE(Type1KeyWord.ESCAPE, Type2KeyWord.ESCAPE,12),
+    HSBW(Type1KeyWord.HSBW, null,13),
+    ENDCHAR(Type1KeyWord.ENDCHAR, Type2KeyWord.ENDCHAR,14),
+    HSTEMHM(null, Type2KeyWord.HSTEMHM,18),
+    HINTMASK(null, Type2KeyWord.HINTMASK,19),
+    CNTRMASK(null, Type2KeyWord.CNTRMASK,20),
+    RMOVETO(Type1KeyWord.RMOVETO, Type2KeyWord.RMOVETO,21),
+    HMOVETO(Type1KeyWord.HMOVETO, Type2KeyWord.HMOVETO,22),
+    VSTEMHM(null, Type2KeyWord.VSTEMHM,23),
+    RCURVELINE(null, Type2KeyWord.RCURVELINE,24),
+    RLINECURVE(null, Type2KeyWord.RLINECURVE,25),
+    VVCURVETO(null, Type2KeyWord.VVCURVETO,26),
+    HHCURVETO(null, Type2KeyWord.HHCURVETO,27),
+    SHORTINT(null, Type2KeyWord.SHORTINT,28),
+    CALLGSUBR(null, Type2KeyWord.CALLGSUBR,29),
+    VHCURVETO(Type1KeyWord.VHCURVETO, Type2KeyWord.VHCURVETO,30),
+    HVCURVETO(Type1KeyWord.HVCURVETO, Type2KeyWord.HVCURVETO,31),
+    DOTSECTION(Type1KeyWord.DOTSECTION, null,192),
+    VSTEM3(Type1KeyWord.VSTEM3, null,193),
+    HSTEM3(Type1KeyWord.HSTEM3, null,194),
+    AND(null, Type2KeyWord.AND,195),
+    OR(null, Type2KeyWord.OR,196),
+    NOT(null, Type2KeyWord.NOT,197),
+    SEAC(Type1KeyWord.SEAC, null,198),
+    SBW(Type1KeyWord.SBW, null,199),
+    ABS(null, Type2KeyWord.ABS,201),
+    ADD(null, Type2KeyWord.ADD,202),
+    SUB(null, Type2KeyWord.SUB,203),
+    DIV(Type1KeyWord.DIV, Type2KeyWord.DIV,204),
+    NEG(null, Type2KeyWord.NEG,206),
+    EQ(null, Type2KeyWord.EQ,207),
+    CALLOTHERSUBR(Type1KeyWord.CALLOTHERSUBR, null,208),
+    POP(Type1KeyWord.POP, null,209),
+    DROP(null, Type2KeyWord.DROP,210),
+    PUT(null, Type2KeyWord.PUT,212),
+    GET(null, Type2KeyWord.GET,213),
+    IFELSE(null, Type2KeyWord.IFELSE,214),
+    RANDOM(null, Type2KeyWord.RANDOM,215),
+    MUL(null, Type2KeyWord.MUL,216),
+    SQRT(null, Type2KeyWord.SQRT,218),
+    DUP(null, Type2KeyWord.DUP,219),
+    EXCH(null, Type2KeyWord.EXCH,220),
+    INDEX(null, Type2KeyWord.INDEX,221),
+    ROLL(null, Type2KeyWord.ROLL,222),
+    SETCURRENTPOINT(Type1KeyWord.SETCURRENTPOINT, null,225),
+    HFLEX(null, Type2KeyWord.HFLEX,226),
+    FLEX(null, Type2KeyWord.FLEX,227),
+    HFLEX1(null, Type2KeyWord.HFLEX1,228),
+    FLEX1(null, Type2KeyWord.FLEX1,229),
+    UNKNOWN(null, null, 99);
+
+    private static final CharStringCommand[] COMMANDS_BY_VALUE;
+
+    static
+    {
+        int max = 
Arrays.stream(CharStringCommand.values()).mapToInt(CharStringCommand::getValue)
+                .max().orElseThrow();
+        COMMANDS_BY_VALUE = new CharStringCommand[max + 1];
+        Arrays.stream(CharStringCommand.values()).forEach(c -> 
COMMANDS_BY_VALUE[c.getValue()] = c);
+    }
+
     private final Type1KeyWord type1KeyWord;
     private final Type2KeyWord type2KeyWord;
+    private final int value;
+    private final String stringValue;
 
-    private static final Map<Integer, CharStringCommand> CHAR_STRING_COMMANDS 
= createMap();
-
-    public static final CharStringCommand COMMAND_CLOSEPATH = CharStringCommand
-            .getInstance(Key.CLOSEPATH.hashValue);
-    public static final CharStringCommand COMMAND_RLINETO = CharStringCommand
-            .getInstance(Key.RLINETO.hashValue);
-    public static final CharStringCommand COMMAND_HLINETO = CharStringCommand
-            .getInstance(Key.HLINETO.hashValue);
-    public static final CharStringCommand COMMAND_VLINETO = CharStringCommand
-            .getInstance(Key.VLINETO.hashValue);
-    public static final CharStringCommand COMMAND_RRCURVETO = CharStringCommand
-            .getInstance(Key.RRCURVETO.hashValue);
-    public static final CharStringCommand COMMAND_HSBW = CharStringCommand
-            .getInstance(Key.HSBW.hashValue);
-    public static final CharStringCommand COMMAND_CALLOTHERSUBR = 
CharStringCommand
-            .getInstance(Key.CALLOTHERSUBR.hashValue);
-
-    private static final int KEY_UNKNOWN = 99;
-    private static final CharStringCommand COMMAND_UNKNOWN = new 
CharStringCommand(KEY_UNKNOWN, 0);
-
-    private static Map<Integer, CharStringCommand> createMap()
-    {
-        Map<Integer, CharStringCommand> charStringCommandMap = new HashMap<>();
-        // one byte commands
-        charStringCommandMap.put(Key.HSTEM.hashValue, new 
CharStringCommand(Key.HSTEM));
-        charStringCommandMap.put(Key.VSTEM.hashValue, new 
CharStringCommand(Key.VSTEM));
-        charStringCommandMap.put(Key.VMOVETO.hashValue, new 
CharStringCommand(Key.VMOVETO));
-        charStringCommandMap.put(Key.RLINETO.hashValue, new 
CharStringCommand(Key.RLINETO));
-        charStringCommandMap.put(Key.HLINETO.hashValue, new 
CharStringCommand(Key.HLINETO));
-        charStringCommandMap.put(Key.VLINETO.hashValue, new 
CharStringCommand(Key.VLINETO));
-        charStringCommandMap.put(Key.RRCURVETO.hashValue, new 
CharStringCommand(Key.RRCURVETO));
-        charStringCommandMap.put(Key.CLOSEPATH.hashValue, new 
CharStringCommand(Key.CLOSEPATH));
-        charStringCommandMap.put(Key.CALLSUBR.hashValue, new 
CharStringCommand(Key.CALLSUBR));
-        charStringCommandMap.put(Key.RET.hashValue, new 
CharStringCommand(Key.RET));
-        charStringCommandMap.put(Key.ESCAPE.hashValue, new 
CharStringCommand(Key.ESCAPE));
-
-        charStringCommandMap.put(Key.HSBW.hashValue, new 
CharStringCommand(Key.HSBW));
-        charStringCommandMap.put(Key.ENDCHAR.hashValue, new 
CharStringCommand(Key.ENDCHAR));
-        charStringCommandMap.put(Key.HSTEMHM.hashValue, new 
CharStringCommand(Key.HSTEMHM));
-        charStringCommandMap.put(Key.HINTMASK.hashValue, new 
CharStringCommand(Key.HINTMASK));
-        charStringCommandMap.put(Key.CNTRMASK.hashValue, new 
CharStringCommand(Key.CNTRMASK));
-        charStringCommandMap.put(Key.RMOVETO.hashValue, new 
CharStringCommand(Key.RMOVETO));
-        charStringCommandMap.put(Key.HMOVETO.hashValue, new 
CharStringCommand(Key.HMOVETO));
-        charStringCommandMap.put(Key.VSTEMHM.hashValue, new 
CharStringCommand(Key.VSTEMHM));
-        charStringCommandMap.put(Key.RCURVELINE.hashValue, new 
CharStringCommand(Key.RCURVELINE));
-        charStringCommandMap.put(Key.RLINECURVE.hashValue, new 
CharStringCommand(Key.RLINECURVE));
-        charStringCommandMap.put(Key.VVCURVETO.hashValue, new 
CharStringCommand(Key.VVCURVETO));
-        charStringCommandMap.put(Key.HHCURVETO.hashValue, new 
CharStringCommand(Key.HHCURVETO));
-        charStringCommandMap.put(Key.SHORTINT.hashValue, new 
CharStringCommand(Key.SHORTINT));
-        charStringCommandMap.put(Key.CALLGSUBR.hashValue, new 
CharStringCommand(Key.CALLGSUBR));
-        charStringCommandMap.put(Key.VHCURVETO.hashValue, new 
CharStringCommand(Key.VHCURVETO));
-        charStringCommandMap.put(Key.HVCURVETO.hashValue, new 
CharStringCommand(Key.HVCURVETO));
-
-        // two byte commands
-        charStringCommandMap.put(Key.DOTSECTION.hashValue, new 
CharStringCommand(12, 0));
-        charStringCommandMap.put(Key.VSTEM3.hashValue, new 
CharStringCommand(12, 1));
-        charStringCommandMap.put(Key.HSTEM3.hashValue, new 
CharStringCommand(12, 2));
-        charStringCommandMap.put(Key.AND.hashValue, new CharStringCommand(12, 
3));
-        charStringCommandMap.put(Key.OR.hashValue, new CharStringCommand(12, 
4));
-        charStringCommandMap.put(Key.NOT.hashValue, new CharStringCommand(12, 
5));
-        charStringCommandMap.put(Key.SEAC.hashValue, new CharStringCommand(12, 
6));
-        charStringCommandMap.put(Key.SBW.hashValue, new CharStringCommand(12, 
7));
-        charStringCommandMap.put(Key.ABS.hashValue, new CharStringCommand(12, 
9));
-        charStringCommandMap.put(Key.ADD.hashValue, new CharStringCommand(12, 
10));
-        charStringCommandMap.put(Key.SUB.hashValue, new CharStringCommand(12, 
11));
-        charStringCommandMap.put(Key.DIV.hashValue, new CharStringCommand(12, 
12));
-        charStringCommandMap.put(Key.NEG.hashValue, new CharStringCommand(12, 
14));
-        charStringCommandMap.put(Key.EQ.hashValue, new CharStringCommand(12, 
15));
-        charStringCommandMap.put(Key.CALLOTHERSUBR.hashValue, new 
CharStringCommand(12, 16));
-        charStringCommandMap.put(Key.POP.hashValue, new CharStringCommand(12, 
17));
-        charStringCommandMap.put(Key.DROP.hashValue, new CharStringCommand(12, 
18));
-        charStringCommandMap.put(Key.PUT.hashValue, new CharStringCommand(12, 
20));
-        charStringCommandMap.put(Key.GET.hashValue, new CharStringCommand(12, 
21));
-        charStringCommandMap.put(Key.IFELSE.hashValue, new 
CharStringCommand(12, 22));
-        charStringCommandMap.put(Key.RANDOM.hashValue, new 
CharStringCommand(12, 23));
-        charStringCommandMap.put(Key.MUL.hashValue, new CharStringCommand(12, 
24));
-        charStringCommandMap.put(Key.SQRT.hashValue, new CharStringCommand(12, 
26));
-        charStringCommandMap.put(Key.DUP.hashValue, new CharStringCommand(12, 
27));
-        charStringCommandMap.put(Key.EXCH.hashValue, new CharStringCommand(12, 
28));
-        charStringCommandMap.put(Key.INDEX.hashValue, new 
CharStringCommand(12, 29));
-        charStringCommandMap.put(Key.ROLL.hashValue, new CharStringCommand(12, 
30));
-        charStringCommandMap.put(Key.SETCURRENTPOINT.hashValue, new 
CharStringCommand(12, 33));
-        charStringCommandMap.put(Key.HFLEX.hashValue, new 
CharStringCommand(12, 34));
-        charStringCommandMap.put(Key.FLEX.hashValue, new CharStringCommand(12, 
35));
-        charStringCommandMap.put(Key.HFLEX1.hashValue, new 
CharStringCommand(12, 36));
-        charStringCommandMap.put(Key.FLEX1.hashValue, new 
CharStringCommand(12, 37));
-        return charStringCommandMap;
-    }
-
-    /**
-     * Constructor with the CharStringCommand key as value.
-     * 
-     * @param key the key of the char string command
-     */
-    private CharStringCommand(CharStringCommand.Key key)
+    CharStringCommand(Type1KeyWord type1KeyWord, Type2KeyWord type2KeyWord, 
int value)
     {
-        type1KeyWord = Type1KeyWord.valueOfKey(key.hashValue);
-        type2KeyWord = Type2KeyWord.valueOfKey(key.hashValue);
+        this.type1KeyWord = type1KeyWord;
+        this.type2KeyWord = type2KeyWord;
+        this.value = value;
+        this.stringValue = value == 99 ? "unknown command|" : name() + "|";
     }
 
-    /**
-     * Constructor with two values.
-     * 
-     * @param b0 value1
-     * @param b1 value2
-     */
-    private CharStringCommand(int b0, int b1)
+    public int getValue()
     {
-        type1KeyWord = Type1KeyWord.valueOfKey(b0, b1);
-        type2KeyWord = Type2KeyWord.valueOfKey(b0, b1);
+        return value;
     }
 
-
     /**
      * Get an instance of the CharStringCommand represented by the given value.
-     * 
+     *
      * @param b0 value
      * @return CharStringCommand represented by the given value
      */
     public static CharStringCommand getInstance(int b0)
     {
-        CharStringCommand command = CHAR_STRING_COMMANDS.get(b0);
-        return command != null ? command : COMMAND_UNKNOWN;
+        CharStringCommand c = null;
+        if (b0 >= 0 && b0 < COMMANDS_BY_VALUE.length)
+        {
+            c = COMMANDS_BY_VALUE[b0];
+        }
+        return c != null ? c : UNKNOWN;
     }
 
     /**
      * Get an instance of the CharStringCommand represented by the given two 
values.
-     * 
+     *
      * @param b0 value1
      * @param b1 value2
-     * 
+     *
      * @return CharStringCommand represented by the given two values
      */
     public static CharStringCommand getInstance(int b0, int b1)
     {
-        CharStringCommand command = 
CHAR_STRING_COMMANDS.get(getKeyHashValue(b0, b1));
-        return command != null ? command : COMMAND_UNKNOWN;
+        return getInstance((b0 << 4) + b1);
     }
 
     /**
      * Get an instance of the CharStringCommand represented by the given array.
-     * 
+     *
      * @param values array of values
-     * 
+     *
      * @return CharStringCommand represented by the given values
      */
     public static CharStringCommand getInstance(int[] values)
     {
-        if (values.length == 1)
+        switch (values.length)
         {
+        case 1:
             return getInstance(values[0]);
-        }
-        else if (values.length == 2)
-        {
+        case 2:
             return getInstance(values[0], values[1]);
+        default:
+            return UNKNOWN;
         }
-        return COMMAND_UNKNOWN;
-    }
-
-    private static int getKeyHashValue(int b0, int b1)
-    {
-        Type1KeyWord type1Key = Type1KeyWord.valueOfKey(b0, b1);
-        if (type1Key != null)
-        {
-            return type1Key.key.hashValue;
-        }
-        Type2KeyWord type2Key = Type2KeyWord.valueOfKey(b0, b1);
-        if (type2Key != null)
-        {
-            return type2Key.key.hashValue;
-        }
-        return KEY_UNKNOWN;
     }
 
     /**
@@ -225,50 +183,10 @@ public class CharStringCommand
         return type2KeyWord;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public String toString()
     {
-        String str;
-        if (type2KeyWord != null)
-        {
-            str = type2KeyWord.toString();
-        }
-        else if (type1KeyWord != null)
-        {
-            str = type1KeyWord.toString();
-        }
-        else
-        {
-            str = "unknown command";
-        }
-        return str + '|';
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode()
-    {
-        return Objects.hash(type1KeyWord, type2KeyWord);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object object)
-    {
-        if (object == null || object.getClass() != this.getClass())
-        {
-            return false;
-        }
-
-        CharStringCommand that = (CharStringCommand) object;
-        return that.type1KeyWord == type1KeyWord && that.type2KeyWord == 
type2KeyWord;
+        return stringValue;
     }
 
     /**
@@ -276,48 +194,32 @@ public class CharStringCommand
      */
     public enum Type1KeyWord
     {
-        HSTEM(Key.HSTEM), VSTEM(Key.VSTEM), VMOVETO(Key.VMOVETO), 
RLINETO(Key.RLINETO), //
-        HLINETO(Key.HLINETO), VLINETO(Key.VLINETO), RRCURVETO(Key.RRCURVETO), 
//
-        CLOSEPATH(Key.CLOSEPATH), CALLSUBR(Key.CALLSUBR), RET(Key.RET), //
-        ESCAPE(Key.ESCAPE), DOTSECTION(Key.DOTSECTION), //
-        VSTEM3(Key.VSTEM3), HSTEM3(Key.HSTEM3), SEAC(Key.SEAC), SBW(Key.SBW), 
//
-        DIV(Key.DIV), CALLOTHERSUBR(Key.CALLOTHERSUBR), POP(Key.POP), //
-        SETCURRENTPOINT(Key.SETCURRENTPOINT), HSBW(Key.HSBW), 
ENDCHAR(Key.ENDCHAR), //
-        RMOVETO(Key.RMOVETO), HMOVETO(Key.HMOVETO), VHCURVETO(Key.VHCURVETO), 
//
-        HVCURVETO(Key.HVCURVETO);
-
-        final Key key;
-
-        private Type1KeyWord(Key key)
-        {
-            this.key = key;
-        }
-
-        private static final Map<Key, Type1KeyWord> BY_KEY = new 
EnumMap<>(Key.class);
-            
-        static
-        {
-            for (Type1KeyWord e : values())
-            {
-                 BY_KEY.put(e.key, e);
-            }
-        }
-
-        public static Type1KeyWord valueOfKey(int b0)
-        {
-            return BY_KEY.get(Key.valueOfKey(b0));
-        }
-
-        public static Type1KeyWord valueOfKey(int b0, int b1)
-        {
-            return BY_KEY.get(Key.valueOfKey(b0, b1));
-        }
-
-        public static Type1KeyWord valueOfKey(Key key)
-        {
-            return BY_KEY.get(key);
-        }
-
+        HSTEM,
+        VSTEM,
+        VMOVETO,
+        RLINETO,
+        HLINETO,
+        VLINETO,
+        RRCURVETO,
+        CLOSEPATH,
+        CALLSUBR,
+        RET,
+        ESCAPE,
+        HSBW,
+        ENDCHAR,
+        RMOVETO,
+        HMOVETO,
+        VHCURVETO,
+        HVCURVETO,
+        DOTSECTION,
+        VSTEM3,
+        HSTEM3,
+        SEAC,
+        SBW,
+        DIV,
+        CALLOTHERSUBR,
+        POP,
+        SETCURRENTPOINT;
     }
 
     /**
@@ -325,102 +227,54 @@ public class CharStringCommand
      */
     public enum Type2KeyWord
     {
-        HSTEM(Key.HSTEM), VSTEM(Key.VSTEM), VMOVETO(Key.VMOVETO), 
RLINETO(Key.RLINETO), //
-        HLINETO(Key.HLINETO), VLINETO(Key.VLINETO), RRCURVETO(Key.RRCURVETO), 
CALLSUBR(Key.CALLSUBR), //
-        RET(Key.RET), ESCAPE(Key.ESCAPE), AND(Key.AND), OR(Key.OR), //
-        NOT(Key.NOT), ABS(Key.ABS), ADD(Key.ADD), SUB(Key.SUB), //
-        DIV(Key.DIV), NEG(Key.NEG), EQ(Key.EQ), DROP(Key.DROP), //
-        PUT(Key.PUT), GET(Key.GET), IFELSE(Key.IFELSE), //
-        RANDOM(Key.RANDOM), MUL(Key.MUL), SQRT(Key.SQRT), DUP(Key.DUP), //
-        EXCH(Key.EXCH), INDEX(Key.INDEX), ROLL(Key.ROLL), //
-        HFLEX(Key.HFLEX), FLEX(Key.FLEX), HFLEX1(Key.HFLEX1), //
-        FLEX1(Key.FLEX1), ENDCHAR(Key.ENDCHAR), HSTEMHM(Key.HSTEMHM), 
HINTMASK(Key.HINTMASK), //
-        CNTRMASK(Key.CNTRMASK), RMOVETO(Key.RMOVETO), HMOVETO(Key.HMOVETO), 
VSTEMHM(Key.VSTEMHM), //
-        RCURVELINE(Key.RCURVELINE), RLINECURVE(Key.RLINECURVE), 
VVCURVETO(Key.VVCURVETO), //
-        HHCURVETO(Key.HHCURVETO), SHORTINT(Key.SHORTINT), 
CALLGSUBR(Key.CALLGSUBR), //
-        VHCURVETO(Key.VHCURVETO), HVCURVETO(Key.HVCURVETO);
-
-        final Key key;
-
-        private Type2KeyWord(Key key)
-        {
-            this.key = key;
-        }
-
-        private static final Map<Key, Type2KeyWord> BY_KEY = new 
EnumMap<>(Key.class);
-            
-        static
-        {
-            for (Type2KeyWord e : values())
-            {
-                 BY_KEY.put(e.key, e);
-            }
-        }
-
-        public static Type2KeyWord valueOfKey(int b0)
-        {
-            return BY_KEY.get(Key.valueOfKey(b0));
-        }
-
-        public static Type2KeyWord valueOfKey(int b0, int b1)
-        {
-            return BY_KEY.get(Key.valueOfKey(b0, b1));
-        }
-
-        public static Type2KeyWord valueOfKey(Key key)
-        {
-            return BY_KEY.get(key);
-        }
-    }
-
-    public enum Key
-    {
-        HSTEM(1), VSTEM(3), VMOVETO(4), RLINETO(5), //
-        HLINETO(6), VLINETO(7), RRCURVETO(8), CLOSEPATH(9), CALLSUBR(10), //
-        RET(11), ESCAPE(12), DOTSECTION(12, 0), VSTEM3(12, 1), HSTEM3(12, 2), 
//
-        AND(12, 3), OR(12, 4), NOT(12, 5), SEAC(12, 6), SBW(12, 7), //
-        ABS(12, 9), ADD(12, 10), SUB(12, 11), DIV(12, 12), NEG(12, 14), EQ(12, 
15), //
-        CALLOTHERSUBR(12, 16), POP(12, 17), DROP(12, 18), //
-        PUT(12, 20), GET(12, 21), IFELSE(12, 22), //
-        RANDOM(12, 23), MUL(12, 24), SQRT(12, 26), DUP(12, 27), //
-        EXCH(12, 28), INDEX(12, 29), ROLL(12, 30), SETCURRENTPOINT(12, 33), //
-        HFLEX(12, 34), FLEX(12, 35), HFLEX1(12, 36), FLEX1(12, 37), //
-        HSBW(13), ENDCHAR(14), HSTEMHM(18), HINTMASK(19), //
-        CNTRMASK(20), RMOVETO(21), HMOVETO(22), VSTEMHM(23), //
-        RCURVELINE(24), RLINECURVE(25), VVCURVETO(26), //
-        HHCURVETO(27), SHORTINT(28), CALLGSUBR(29), //
-        VHCURVETO(30), HVCURVETO(31);
-
-        private final int hashValue;
-
-        private Key(int b0)
-        {
-            hashValue = b0;
-        }
-
-        private Key(int b0, int b1)
-        {
-            hashValue = (b0 << 4) + b1;
-        }
-
-        private static final Map<Integer, Key> BY_KEY = new HashMap<>();
-        
-        static
-        {
-            for (Key e : values())
-            {
-                BY_KEY.put(e.hashValue, e);
-            }
-        }
-
-        public static Key valueOfKey(int b0)
-        {
-            return BY_KEY.get(b0);
-        }
-
-        public static Key valueOfKey(int b0, int b1)
-        {
-            return BY_KEY.get((b0 << 4) + b1);
-        }
+        HSTEM,
+        VSTEM,
+        VMOVETO,
+        RLINETO,
+        HLINETO,
+        VLINETO,
+        RRCURVETO,
+        CALLSUBR,
+        RET,
+        ESCAPE,
+        ENDCHAR,
+        HSTEMHM,
+        HINTMASK,
+        CNTRMASK,
+        RMOVETO,
+        HMOVETO,
+        VSTEMHM,
+        RCURVELINE,
+        RLINECURVE,
+        VVCURVETO,
+        HHCURVETO,
+        SHORTINT,
+        CALLGSUBR,
+        VHCURVETO,
+        HVCURVETO,
+        AND,
+        OR,
+        NOT,
+        ABS,
+        ADD,
+        SUB,
+        DIV,
+        NEG,
+        EQ,
+        DROP,
+        PUT,
+        GET,
+        IFELSE,
+        RANDOM,
+        MUL,
+        SQRT,
+        DUP,
+        EXCH,
+        INDEX,
+        ROLL,
+        HFLEX,
+        FLEX,
+        HFLEX1,
+        FLEX1;
     }
 }

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=1916209&r1=1916208&r2=1916209&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 Mar 10 10:41:32 2024
@@ -160,12 +160,12 @@ public class Type1CharStringParser
             sequence.remove(sequence.size() - 1);
             // end flex
             sequence.add(0);
-            sequence.add(CharStringCommand.COMMAND_CALLOTHERSUBR);
+            sequence.add(CharStringCommand.CALLOTHERSUBR);
             break;
         case 1:
             // begin flex
             sequence.add(1);
-            sequence.add(CharStringCommand.COMMAND_CALLOTHERSUBR);
+            sequence.add(CharStringCommand.CALLOTHERSUBR);
             break;
         case 3:
             // allows hint replacement

Modified: 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java?rev=1916209&r1=1916208&r2=1916209&view=diff
==============================================================================
--- 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java 
(original)
+++ 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java 
Sun Mar 10 10:41:32 2024
@@ -156,14 +156,14 @@ public class Type2CharString extends Typ
                         numbers.get(3), 0);
                 List<Number> second = Arrays.asList(numbers.get(4), 0, 
numbers.get(5),
                         -(numbers.get(2).floatValue()), numbers.get(6), 0);
-                addCommandList(Arrays.asList(first, second), 
CharStringCommand.COMMAND_RRCURVETO);
+                addCommandList(Arrays.asList(first, second), 
CharStringCommand.RRCURVETO);
             }
             break;
         case FLEX:
         {
             List<Number> first = numbers.subList(0, 6);
             List<Number> second = numbers.subList(6, 12);
-            addCommandList(Arrays.asList(first, second), 
CharStringCommand.COMMAND_RRCURVETO);
+            addCommandList(Arrays.asList(first, second), 
CharStringCommand.RRCURVETO);
             break;
         }
         case HFLEX1:
@@ -173,7 +173,7 @@ public class Type2CharString extends Typ
                         numbers.get(3), numbers.get(4), 0);
                 List<Number> second = Arrays.asList(numbers.get(5), 0, 
numbers.get(6), numbers.get(7),
                         numbers.get(8), 0);
-                addCommandList(Arrays.asList(first, second), 
CharStringCommand.COMMAND_RRCURVETO);
+                addCommandList(Arrays.asList(first, second), 
CharStringCommand.RRCURVETO);
             }
             break;
         case FLEX1:
@@ -195,25 +195,25 @@ public class Type2CharString extends Typ
                     (dxIsBigger ? numbers.get(10) : -dx),
                     (dxIsBigger ? -dy : numbers.get(10)));
             addCommandList(Arrays.asList(first, second),
-                    CharStringCommand.COMMAND_RRCURVETO);
+                    CharStringCommand.RRCURVETO);
             break;
         }
         case RCURVELINE:
             if (numbers.size() >= 2)
             {
                 addCommandList(split(numbers.subList(0, numbers.size() - 2), 
6),
-                        CharStringCommand.COMMAND_RRCURVETO);
+                        CharStringCommand.RRCURVETO);
                 addCommand(numbers.subList(numbers.size() - 2, numbers.size()),
-                        CharStringCommand.COMMAND_RLINETO);
+                        CharStringCommand.RLINETO);
             }
             break;
         case RLINECURVE:
             if (numbers.size() >= 6)
             {
                 addCommandList(split(numbers.subList(0, numbers.size() - 6), 
2),
-                        CharStringCommand.COMMAND_RLINETO);
+                        CharStringCommand.RLINETO);
                 addCommand(numbers.subList(numbers.size() - 6, numbers.size()),
-                        CharStringCommand.COMMAND_RRCURVETO);
+                        CharStringCommand.RRCURVETO);
             }
             break;
         case HHCURVETO:
@@ -234,12 +234,12 @@ public class Type2CharString extends Typ
             if (flag)
             {
                 addCommand(Arrays.asList(0, numbers.get(0).floatValue() + 
nominalWidthX),
-                        CharStringCommand.COMMAND_HSBW);
+                        CharStringCommand.HSBW);
                 numbers = numbers.subList(1, numbers.size());
             }
             else
             {
-                addCommand(Arrays.asList(0, defWidthX), 
CharStringCommand.COMMAND_HSBW);
+                addCommand(Arrays.asList(0, defWidthX), 
CharStringCommand.HSBW);
             }
         }
         return numbers;
@@ -269,7 +269,7 @@ public class Type2CharString extends Typ
                 : null;
         if (command != null && command.getType1KeyWord() != 
Type1KeyWord.CLOSEPATH)
         {
-            addCommand(Collections.emptyList(), 
CharStringCommand.COMMAND_CLOSEPATH);
+            addCommand(Collections.emptyList(), CharStringCommand.CLOSEPATH);
         }
     }
 
@@ -277,8 +277,8 @@ public class Type2CharString extends Typ
     {
         while (!numbers.isEmpty())
         {
-            addCommand(numbers.subList(0, 1), horizontal ? 
CharStringCommand.COMMAND_HLINETO
-                    : CharStringCommand.COMMAND_VLINETO);
+            addCommand(numbers.subList(0, 1), horizontal ? 
CharStringCommand.HLINETO
+                    : CharStringCommand.VLINETO);
             numbers = numbers.subList(1, numbers.size());
             horizontal = !horizontal;
         }
@@ -294,14 +294,14 @@ public class Type2CharString extends Typ
                 addCommand(Arrays.asList(numbers.get(0), 0,
                         numbers.get(1), numbers.get(2), last ? numbers.get(4)
                                 : 0, numbers.get(3)),
-                        CharStringCommand.COMMAND_RRCURVETO);
+                        CharStringCommand.RRCURVETO);
             } 
             else
             {
                 addCommand(Arrays.asList(0, numbers.get(0),
                         numbers.get(1), numbers.get(2), numbers.get(3),
                         last ? numbers.get(4) : 0),
-                        CharStringCommand.COMMAND_RRCURVETO);
+                        CharStringCommand.RRCURVETO);
             }
             numbers = numbers.subList(last ? 5 : 4, numbers.size());
             horizontal = !horizontal;
@@ -320,14 +320,14 @@ public class Type2CharString extends Typ
                         first ? numbers.get(0) : 0, numbers
                                 .get(first ? 2 : 1),
                         numbers.get(first ? 3 : 2), numbers.get(first ? 4 : 3),
-                        0), CharStringCommand.COMMAND_RRCURVETO);
+                        0), CharStringCommand.RRCURVETO);
             } 
             else
             {
                 addCommand(Arrays.asList(first ? numbers.get(0) : 0, 
numbers.get(first ? 1 : 0), numbers
                         .get(first ? 2 : 1), numbers.get(first ? 3 : 2),
                         0, numbers.get(first ? 4 : 3)),
-                        CharStringCommand.COMMAND_RRCURVETO);
+                        CharStringCommand.RRCURVETO);
             }
             numbers = numbers.subList(first ? 5 : 4, numbers.size());
         }

Modified: 
pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java?rev=1916209&r1=1916208&r2=1916209&view=diff
==============================================================================
--- 
pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java
 (original)
+++ 
pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java
 Sun Mar 10 10:41:32 2024
@@ -20,7 +20,6 @@ package org.apache.fontbox.cff;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
-import org.apache.fontbox.cff.CharStringCommand.Key;
 import org.apache.fontbox.cff.CharStringCommand.Type1KeyWord;
 import org.apache.fontbox.cff.CharStringCommand.Type2KeyWord;
 import org.junit.jupiter.api.Test;
@@ -29,13 +28,13 @@ class CharStringCommandTest
 {
 
     @Test
-    void testKey()
+    void testValue()
     {
-        assertEquals(Key.HSTEM, Key.valueOfKey(1));
-        assertEquals(Key.ESCAPE, Key.valueOfKey(12));
-        assertEquals(Key.DOTSECTION, Key.valueOfKey(12, 0));
-        assertEquals(Key.AND, Key.valueOfKey(12, 3));
-        assertEquals(Key.HSBW, Key.valueOfKey(13));
+        assertEquals(CharStringCommand.HSTEM.getValue(), 1);
+        assertEquals(CharStringCommand.ESCAPE.getValue(), 12);
+        assertEquals(CharStringCommand.DOTSECTION.getValue(), (12 << 4) + 0);
+        assertEquals(CharStringCommand.AND.getValue(), (12 << 4) + 3);
+        assertEquals(CharStringCommand.HSBW.getValue(), 13);
     }
 
     @Test


Reply via email to