private List convertType2Command()

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