in fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java [161:326]
private void handleType1Command(List<Number> numbers, CharStringCommand command)
{
commandCount++;
Type1KeyWord type1KeyWord = command.getType1KeyWord();
if (type1KeyWord == null)
{
// indicates an invalid charstring
LOG.warn("Unknown charstring command in glyph {} of font {}", glyphName, fontName);
numbers.clear();
return;
}
switch(type1KeyWord)
{
case RMOVETO:
if (numbers.size() >= 2)
{
if (isFlex)
{
flexPoints.add(new Point2D.Float(numbers.get(0).floatValue(), numbers.get(1).floatValue()));
}
else
{
rmoveTo(numbers.get(0), numbers.get(1));
}
}
break;
case VMOVETO:
if (!numbers.isEmpty())
{
if (isFlex)
{
// not in the Type 1 spec, but exists in some fonts
flexPoints.add(new Point2D.Float(0f, numbers.get(0).floatValue()));
}
else
{
rmoveTo(0, numbers.get(0));
}
}
break;
case HMOVETO:
if (!numbers.isEmpty())
{
if (isFlex)
{
// not in the Type 1 spec, but exists in some fonts
flexPoints.add(new Point2D.Float(numbers.get(0).floatValue(), 0f));
}
else
{
rmoveTo(numbers.get(0), 0);
}
}
break;
case RLINETO:
if (numbers.size() >= 2)
{
rlineTo(numbers.get(0), numbers.get(1));
}
break;
case HLINETO:
if (!numbers.isEmpty())
{
rlineTo(numbers.get(0), 0);
}
break;
case VLINETO:
if (!numbers.isEmpty())
{
rlineTo(0, numbers.get(0));
}
break;
case RRCURVETO:
if (numbers.size() >= 6)
{
rrcurveTo(numbers.get(0), numbers.get(1), numbers.get(2),
numbers.get(3), numbers.get(4), numbers.get(5));
}
break;
case CLOSEPATH:
closeCharString1Path();
break;
case SBW:
if (numbers.size() >= 3)
{
leftSideBearing = new Point2D.Float(numbers.get(0).floatValue(), numbers.get(1).floatValue());
width = numbers.get(2).intValue();
current.setLocation(leftSideBearing);
}
break;
case HSBW:
if (numbers.size() >= 2)
{
leftSideBearing = new Point2D.Float(numbers.get(0).floatValue(), 0);
width = numbers.get(1).intValue();
current.setLocation(leftSideBearing);
}
break;
case VHCURVETO:
if (numbers.size() >= 4)
{
rrcurveTo(0, numbers.get(0), numbers.get(1),
numbers.get(2), numbers.get(3), 0);
}
break;
case HVCURVETO:
if (numbers.size() >= 4)
{
rrcurveTo(numbers.get(0), 0, numbers.get(1),
numbers.get(2), 0, numbers.get(3));
}
break;
case SEAC:
if (numbers.size() >= 5)
{
seac(numbers.get(0), numbers.get(1), numbers.get(2), numbers.get(3), numbers.get(4));
}
break;
case SETCURRENTPOINT:
if (numbers.size() >= 2)
{
setcurrentpoint(numbers.get(0), numbers.get(1));
}
break;
case CALLOTHERSUBR:
if (!numbers.isEmpty())
{
callothersubr(numbers.get(0).intValue());
}
break;
case DIV:
if (numbers.size() >= 2)
{
float b = numbers.get(numbers.size() - 1).floatValue();
float a = numbers.get(numbers.size() - 2).floatValue();
float result = a / b;
numbers.remove(numbers.size() - 1);
numbers.remove(numbers.size() - 1);
numbers.add(result);
return;
}
break;
case HSTEM:
case VSTEM:
case HSTEM3:
case VSTEM3:
case DOTSECTION:
// ignore hints
break;
case ENDCHAR:
// end
break;
case RET:
case CALLSUBR:
// indicates an invalid charstring
LOG.warn("Unexpected charstring command: {} in glyph {} of font {}", type1KeyWord,
glyphName, fontName);
break;
default:
// indicates a PDFBox bug
throw new IllegalArgumentException("Unhandled command: " + type1KeyWord);
}
numbers.clear();
}