private static void addCommand()

in shadows/framework/src/main/java/org/robolectric/shadows/ShadowPathParser.java [200:436]


    private static void addCommand(
        Path path, float[] current, char previousCmd, char cmd, float[] val) {

      int incr = 2;
      float currentX = current[0];
      float currentY = current[1];
      float ctrlPointX = current[2];
      float ctrlPointY = current[3];
      float reflectiveCtrlPointX;
      float reflectiveCtrlPointY;

      switch (cmd) {
        case 'z':
        case 'Z':
          path.close();
          return;
        case 'm':
        case 'M':
        case 'l':
        case 'L':
        case 't':
        case 'T':
          incr = 2;
          break;
        case 'h':
        case 'H':
        case 'v':
        case 'V':
          incr = 1;
          break;
        case 'c':
        case 'C':
          incr = 6;
          break;
        case 's':
        case 'S':
        case 'q':
        case 'Q':
          incr = 4;
          break;
        case 'a':
        case 'A':
          incr = 7;
          break;
      }
      for (int k = 0; k < val.length; k += incr) {
        switch (cmd) {
          case 'm': // moveto - Start a new sub-path (relative)
            path.rMoveTo(val[k + 0], val[k + 1]);
            currentX += val[k + 0];
            currentY += val[k + 1];
            break;
          case 'M': // moveto - Start a new sub-path
            path.moveTo(val[k + 0], val[k + 1]);
            currentX = val[k + 0];
            currentY = val[k + 1];
            break;
          case 'l': // lineto - Draw a line from the current point (relative)
            path.rLineTo(val[k + 0], val[k + 1]);
            currentX += val[k + 0];
            currentY += val[k + 1];
            break;
          case 'L': // lineto - Draw a line from the current point
            path.lineTo(val[k + 0], val[k + 1]);
            currentX = val[k + 0];
            currentY = val[k + 1];
            break;
          case 'z': // closepath - Close the current subpath
          case 'Z': // closepath - Close the current subpath
            path.close();
            break;
          case 'h': // horizontal lineto - Draws a horizontal line (relative)
            path.rLineTo(val[k + 0], 0);
            currentX += val[k + 0];
            break;
          case 'H': // horizontal lineto - Draws a horizontal line
            path.lineTo(val[k + 0], currentY);
            currentX = val[k + 0];
            break;
          case 'v': // vertical lineto - Draws a vertical line from the current point (r)
            path.rLineTo(0, val[k + 0]);
            currentY += val[k + 0];
            break;
          case 'V': // vertical lineto - Draws a vertical line from the current point
            path.lineTo(currentX, val[k + 0]);
            currentY = val[k + 0];
            break;
          case 'c': // curveto - Draws a cubic Bézier curve (relative)
            path.rCubicTo(val[k + 0], val[k + 1], val[k + 2], val[k + 3], val[k + 4], val[k + 5]);

            ctrlPointX = currentX + val[k + 2];
            ctrlPointY = currentY + val[k + 3];
            currentX += val[k + 4];
            currentY += val[k + 5];

            break;
          case 'C': // curveto - Draws a cubic Bézier curve
            path.cubicTo(val[k + 0], val[k + 1], val[k + 2], val[k + 3], val[k + 4], val[k + 5]);
            currentX = val[k + 4];
            currentY = val[k + 5];
            ctrlPointX = val[k + 2];
            ctrlPointY = val[k + 3];
            break;
          case 's': // smooth curveto - Draws a cubic Bézier curve (reflective cp)
            reflectiveCtrlPointX = 0;
            reflectiveCtrlPointY = 0;
            if (previousCmd == 'c'
                || previousCmd == 's'
                || previousCmd == 'C'
                || previousCmd == 'S') {
              reflectiveCtrlPointX = currentX - ctrlPointX;
              reflectiveCtrlPointY = currentY - ctrlPointY;
            }
            path.rCubicTo(
                reflectiveCtrlPointX,
                reflectiveCtrlPointY,
                val[k + 0],
                val[k + 1],
                val[k + 2],
                val[k + 3]);

            ctrlPointX = currentX + val[k + 0];
            ctrlPointY = currentY + val[k + 1];
            currentX += val[k + 2];
            currentY += val[k + 3];
            break;
          case 'S': // shorthand/smooth curveto Draws a cubic Bézier curve(reflective cp)
            reflectiveCtrlPointX = currentX;
            reflectiveCtrlPointY = currentY;
            if (previousCmd == 'c'
                || previousCmd == 's'
                || previousCmd == 'C'
                || previousCmd == 'S') {
              reflectiveCtrlPointX = 2 * currentX - ctrlPointX;
              reflectiveCtrlPointY = 2 * currentY - ctrlPointY;
            }
            path.cubicTo(
                reflectiveCtrlPointX,
                reflectiveCtrlPointY,
                val[k + 0],
                val[k + 1],
                val[k + 2],
                val[k + 3]);
            ctrlPointX = val[k + 0];
            ctrlPointY = val[k + 1];
            currentX = val[k + 2];
            currentY = val[k + 3];
            break;
          case 'q': // Draws a quadratic Bézier (relative)
            path.rQuadTo(val[k + 0], val[k + 1], val[k + 2], val[k + 3]);
            ctrlPointX = currentX + val[k + 0];
            ctrlPointY = currentY + val[k + 1];
            currentX += val[k + 2];
            currentY += val[k + 3];
            break;
          case 'Q': // Draws a quadratic Bézier
            path.quadTo(val[k + 0], val[k + 1], val[k + 2], val[k + 3]);
            ctrlPointX = val[k + 0];
            ctrlPointY = val[k + 1];
            currentX = val[k + 2];
            currentY = val[k + 3];
            break;
          case 't': // Draws a quadratic Bézier curve(reflective control point)(relative)
            reflectiveCtrlPointX = 0;
            reflectiveCtrlPointY = 0;
            if (previousCmd == 'q'
                || previousCmd == 't'
                || previousCmd == 'Q'
                || previousCmd == 'T') {
              reflectiveCtrlPointX = currentX - ctrlPointX;
              reflectiveCtrlPointY = currentY - ctrlPointY;
            }
            path.rQuadTo(reflectiveCtrlPointX, reflectiveCtrlPointY, val[k + 0], val[k + 1]);
            ctrlPointX = currentX + reflectiveCtrlPointX;
            ctrlPointY = currentY + reflectiveCtrlPointY;
            currentX += val[k + 0];
            currentY += val[k + 1];
            break;
          case 'T': // Draws a quadratic Bézier curve (reflective control point)
            reflectiveCtrlPointX = currentX;
            reflectiveCtrlPointY = currentY;
            if (previousCmd == 'q'
                || previousCmd == 't'
                || previousCmd == 'Q'
                || previousCmd == 'T') {
              reflectiveCtrlPointX = 2 * currentX - ctrlPointX;
              reflectiveCtrlPointY = 2 * currentY - ctrlPointY;
            }
            path.quadTo(reflectiveCtrlPointX, reflectiveCtrlPointY, val[k + 0], val[k + 1]);
            ctrlPointX = reflectiveCtrlPointX;
            ctrlPointY = reflectiveCtrlPointY;
            currentX = val[k + 0];
            currentY = val[k + 1];
            break;
          case 'a': // Draws an elliptical arc
            // (rx ry x-axis-rotation large-arc-flag sweep-flag x y)
            drawArc(
                path,
                currentX,
                currentY,
                val[k + 5] + currentX,
                val[k + 6] + currentY,
                val[k + 0],
                val[k + 1],
                val[k + 2],
                val[k + 3] != 0,
                val[k + 4] != 0);
            currentX += val[k + 5];
            currentY += val[k + 6];
            ctrlPointX = currentX;
            ctrlPointY = currentY;
            break;
          case 'A': // Draws an elliptical arc
            drawArc(
                path,
                currentX,
                currentY,
                val[k + 5],
                val[k + 6],
                val[k + 0],
                val[k + 1],
                val[k + 2],
                val[k + 3] != 0,
                val[k + 4] != 0);
            currentX = val[k + 5];
            currentY = val[k + 6];
            ctrlPointX = currentX;
            ctrlPointY = currentY;
            break;
        }
        previousCmd = cmd;
      }
      current[0] = currentX;
      current[1] = currentY;
      current[2] = ctrlPointX;
      current[3] = ctrlPointY;
    }