CharStringCommand.java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.fontbox.cff;
import java.util.Arrays;
/**
* This class represents a CharStringCommand.
*
* @author Villu Ruusmann
*/
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;
CharStringCommand(Type1KeyWord type1KeyWord, Type2KeyWord type2KeyWord, int value)
{
this.type1KeyWord = type1KeyWord;
this.type2KeyWord = type2KeyWord;
this.value = value;
this.stringValue = value == 99 ? "unknown command|" : name() + "|";
}
public int getValue()
{
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 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)
{
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)
{
switch (values.length)
{
case 1:
return getInstance(values[0]);
case 2:
return getInstance(values[0], values[1]);
default:
return UNKNOWN;
}
}
/**
* Return the underlying type1 key word.
*
* @return the type1 key word
*/
public Type1KeyWord getType1KeyWord()
{
return type1KeyWord;
}
/**
* Return the underlying type2 key word.
*
* @return the type2 key word
*/
public Type2KeyWord getType2KeyWord()
{
return type2KeyWord;
}
@Override
public String toString()
{
return stringValue;
}
/**
* Enum of all valid type1 key words
*/
public enum Type1KeyWord
{
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;
}
/**
* Enum of all valid type2 key words
*/
public enum Type2KeyWord
{
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;
}
}