private void handleType1Command()

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();
    }