in fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java [128:263]
private List<Number> convertType2Command(List<Number> numbers, CharStringCommand command)
{
Type2KeyWord type2KeyWord = command.getType2KeyWord();
if (type2KeyWord == null)
{
addCommand(numbers, command);
return Collections.emptyList();
}
switch (type2KeyWord)
{
case HSTEM:
case HSTEMHM:
case VSTEM:
case VSTEMHM:
case HINTMASK:
case CNTRMASK:
numbers = clearStack(numbers, numbers.size() % 2 != 0);
expandStemHints(numbers,
type2KeyWord == Type2KeyWord.HSTEM || type2KeyWord == Type2KeyWord.HSTEMHM);
break;
case HMOVETO:
case VMOVETO:
numbers = clearStack(numbers, numbers.size() > 1);
markPath();
addCommand(numbers, command);
break;
case RLINETO:
addCommandList(split(numbers, 2), command);
break;
case HLINETO:
case VLINETO:
addAlternatingLine(numbers, type2KeyWord == Type2KeyWord.HLINETO);
break;
case RRCURVETO:
addCommandList(split(numbers, 6), command);
break;
case ENDCHAR:
numbers = clearStack(numbers, numbers.size() == 5 || numbers.size() == 1);
closeCharString2Path();
if (numbers.size() == 4)
{
// deprecated "seac" operator
numbers.add(0, 0);
addCommand(numbers, CharStringCommand.getInstance(12, 6));
}
else
{
addCommand(numbers, command);
}
break;
case RMOVETO:
numbers = clearStack(numbers, numbers.size() > 2);
markPath();
addCommand(numbers, command);
break;
case HVCURVETO:
case VHCURVETO:
addAlternatingCurve(numbers, type2KeyWord == Type2KeyWord.HVCURVETO);
break;
case HFLEX:
if (numbers.size() >= 7)
{
List<Number> first = Arrays.asList(numbers.get(0), 0, numbers.get(1), numbers.get(2),
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.RRCURVETO);
}
break;
case FLEX:
{
List<Number> first = numbers.subList(0, 6);
List<Number> second = numbers.subList(6, 12);
addCommandList(Arrays.asList(first, second), CharStringCommand.RRCURVETO);
break;
}
case HFLEX1:
if (numbers.size() >= 9)
{
List<Number> first = Arrays.asList(numbers.get(0), numbers.get(1), numbers.get(2),
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.RRCURVETO);
}
break;
case FLEX1:
{
int dx = 0;
int dy = 0;
for (int i = 0; i < 5; i++)
{
dx += numbers.get(i * 2).intValue();
dy += numbers.get(i * 2 + 1).intValue();
}
List<Number> first = numbers.subList(0, 6);
boolean dxIsBigger = Math.abs(dx) > Math.abs(dy);
List<Number> second = Arrays.asList(
numbers.get(6),
numbers.get(7),
numbers.get(8),
numbers.get(9),
(dxIsBigger ? numbers.get(10) : -dx),
(dxIsBigger ? -dy : numbers.get(10)));
addCommandList(Arrays.asList(first, second),
CharStringCommand.RRCURVETO);
break;
}
case RCURVELINE:
if (numbers.size() >= 2)
{
addCommandList(split(numbers.subList(0, numbers.size() - 2), 6),
CharStringCommand.RRCURVETO);
addCommand(numbers.subList(numbers.size() - 2, numbers.size()),
CharStringCommand.RLINETO);
}
break;
case RLINECURVE:
if (numbers.size() >= 6)
{
addCommandList(split(numbers.subList(0, numbers.size() - 6), 2),
CharStringCommand.RLINETO);
addCommand(numbers.subList(numbers.size() - 6, numbers.size()),
CharStringCommand.RRCURVETO);
}
break;
case HHCURVETO:
case VVCURVETO:
addCurve(numbers, type2KeyWord == Type2KeyWord.HHCURVETO);
break;
default:
addCommand(numbers, command);
break;
}
return Collections.emptyList();
}