static simplify()

in packages/core/src/utils/path.ts [79:234]


  static simplify(path: Directive[]) {
    let x = 0
    let y = 0
    const n = path.length
    let x1 = 0
    let y1 = 0
    let current: Directive | undefined
    let converted = false
    let result: Directive[] = []
    let previous: string | undefined
    let controlX = 0
    let controlY = 0
    for (let i = 0; i < n; ++i) {
      converted = false
      current = path[i].slice(0) as Directive
      switch (current[0]) {
        case 'l':
          current[0] = 'L'
          current[1] += x
          current[2] += y
        // falls through
        case 'L':
          x = current[1]
          y = current[2]
          break
        case 'h':
          current[1] += x
        // falls through
        case 'H':
          current[0] = 'L'
          current[2] = y
          x = current[1]
          break
        case 'v':
          current[1] += y
        // falls through
        case 'V':
          current[0] = 'L'
          y = current[1]
          current[1] = x
          current[2] = y
          break
        case 'm':
          current[0] = 'M'
          current[1] += x
          current[2] += y
        // falls through
        case 'M':
          x = current[1]
          y = current[2]
          x1 = current[1]
          y1 = current[2]
          break
        case 'c':
          current[0] = 'C'
          current[1] += x
          current[2] += y
          current[3] += x
          current[4] += y
          current[5] += x
          current[6] += y
        // falls through
        case 'C':
          controlX = current[3]
          controlY = current[4]
          x = current[5]
          y = current[6]
          break
        case 's':
          current[0] = 'S'
          current[1] += x
          current[2] += y
          current[3] += x
          current[4] += y
        // falls through
        case 'S':
          if (previous === 'C') {
            controlX = 2 * x - controlX
            controlY = 2 * y - controlY
          }
          else {
            controlX = x
            controlY = y
          }
          x = current[3]
          y = current[4]
          current[0] = 'C'
          current[5] = current[3]
          current[6] = current[4]
          current[3] = current[1]
          current[4] = current[2]
          current[1] = controlX
          current[2] = controlY
          controlX = current[3]
          controlY = current[4]
          break
        case 'q':
          current[0] = 'Q'
          current[1] += x
          current[2] += y
          current[3] += x
          current[4] += y
        // falls through
        case 'Q':
          controlX = current[1]
          controlY = current[2]
          x = current[3]
          y = current[4]
          break
        case 't':
          current[0] = 'T'
          current[1] += x
          current[2] += y
        // falls through
        case 'T':
          if (previous === 'Q') {
            controlX = 2 * x - controlX
            controlY = 2 * y - controlY
          }
          else {
            controlX = x
            controlY = y
          }
          current[0] = 'Q'
          x = current[1]
          y = current[2]
          current[1] = controlX
          current[2] = controlY
          current[3] = x
          current[4] = y
          break
        case 'a':
          current[0] = 'A'
          current[6] += x
          current[7] += y
        // falls through
        case 'A':
          converted = true
          result = result.concat(fromArcToBeziers(x, y, current))
          x = current[6]
          y = current[7]
          break
        case 'z':
        case 'Z':
          x = x1
          y = y1
          break
        default:
      }
      if (!converted) {
        result.push(current)
      }
      previous = current[0]
    }
    return result
  }