<!DOCTYPE html>
<title>PathKit (Skia's Geometry + asm.js)</title>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<style>
  svg, canvas {
    border: 1px dashed #AAA;
  }

  canvas {
    width: 200px;
    height: 200px;
  }

  canvas.big {
    width: 300px;
    height: 300px;
  }

</style>

<h2> Can output to an SVG Path, a Canvas, or a Path2D object </h2>
<svg id=svg1 xmlns='http://www.w3.org/2000/svg' width=200 height=200></svg>
<canvas id=canvas1></canvas>
<canvas id=canvas2></canvas>

<h2> Interact with NewPath() just like a Path2D Object </h2>
<canvas class=big id=canvas3></canvas>
<canvas class=big id=canvas4></canvas>

<h2> Has various Path Effects </h2>
<canvas class=big id=canvas5></canvas>
<canvas class=big id=canvas6></canvas>
<canvas class=big id=canvas7></canvas>
<canvas class=big id=canvas8></canvas>
<canvas class=big id=canvas9></canvas>
<canvas class=big id=canvas10></canvas>
<canvas class=big id=canvas11></canvas>
<canvas class=big id=canvasTransform></canvas>

<h2> Supports fill-rules of nonzero and evenodd </h2>
<svg id=svg2 xmlns='http://www.w3.org/2000/svg' width=200 height=200></svg>
<svg id=svg3 xmlns='http://www.w3.org/2000/svg' width=200 height=200></svg>

<h2> Solves Cubics for Y given X </h2>
<canvas class=big id=cubics></canvas>

<script type="text/javascript" src="/node_modules/pathkit-asmjs/bin/pathkit.js"></script>

<script type="text/javascript" charset="utf-8">

  PathKitInit({
    locateFile: (file) => '/node_modules/pathkit-asmjs/bin/'+file,
  }).then((PathKit) => {
    window.PathKit = PathKit;
    OutputsExample(PathKit);
    Path2DExample(PathKit);
    PathEffectsExample(PathKit);
    MatrixTransformExample(PathKit);
    FilledSVGExample(PathKit);
    CubicSolverExample(PathKit);
  });

  function setCanvasSize(ctx, width, height) {
    ctx.canvas.width = width;
    ctx.canvas.height = height;
  }

  function OutputsExample(PathKit) {
    let firstPath = PathKit.FromSVGString('M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z');

    let secondPath = PathKit.NewPath();
    // Acts somewhat like the Canvas API, except can be chained
    secondPath.moveTo(1, 1)
              .lineTo(20, 1)
              .lineTo(10, 30)
              .closePath();

    // Join the two paths together (mutating firstPath in the process)
    firstPath.op(secondPath, PathKit.PathOp.INTERSECT);

    let simpleStr = firstPath.toSVGString();

    let newSVG = document.createElementNS('http://www.w3.org/2000/svg', 'path');
    newSVG.setAttribute('stroke', 'rgb(0,0,200)');
    newSVG.setAttribute('fill', 'white');
    newSVG.setAttribute('transform', 'scale(8,8)');
    newSVG.setAttribute('d', simpleStr);
    document.getElementById('svg1').appendChild(newSVG);

    // Draw directly to Canvas
    let ctx = document.getElementById('canvas1').getContext('2d');
    setCanvasSize(ctx, 200, 200);
    ctx.strokeStyle = 'green';
    ctx.fillStyle = 'white';
    ctx.scale(8, 8);
    ctx.beginPath();
    firstPath.toCanvas(ctx);
    ctx.stroke();

    // create Path2D object and use it in a Canvas.
    let path2D = firstPath.toPath2D();
    ctx = document.getElementById('canvas2').getContext('2d');
    setCanvasSize(ctx, 200, 200);
    ctx.canvas.width = 200
    ctx.scale(8, 8);
    ctx.fillStyle = 'purple';
    ctx.strokeStyle = 'orange';
    ctx.fill(path2D);
    ctx.stroke(path2D);

    // clean up memory and call destructors in the c++ code (if any).
    // See http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html?highlight=memory#memory-management
    firstPath.delete();
    secondPath.delete();
  }

  function Path2DExample(PathKit) {
    let objs = [new Path2D(), PathKit.NewPath(), new Path2D(), PathKit.NewPath()];
    let canvases = [
      document.getElementById('canvas3').getContext('2d'),
      document.getElementById('canvas4').getContext('2d')
    ];

    for (i = 0; i <= 1; i++) {
      let path = objs[i];

      path.moveTo(20, 5);
      path.lineTo(30, 20);
      path.lineTo(40, 10);
      path.lineTo(50, 20);
      path.lineTo(60, 0);
      path.lineTo(20, 5);

      path.moveTo(20, 80);
      path.bezierCurveTo(90, 10, 160, 150, 190, 10);

      path.moveTo(36, 148);
      path.quadraticCurveTo(66, 188, 120, 136);
      path.lineTo(36, 148);

      path.rect(5, 170, 20, 20);

      path.moveTo(150, 180);
      path.arcTo(150, 100, 50, 200, 20);
      path.lineTo(160, 160);

      path.moveTo(20, 120);
      path.arc(20, 120, 18, 0, 1.75 * Math.PI);
      path.lineTo(20, 120);

      let secondPath = objs[i+2];
      secondPath.ellipse(130, 25, 30, 10, -1*Math.PI/8, Math.PI/6, 1.5*Math.PI, false);

      path.addPath(secondPath);

      let m = document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGMatrix();
      m.a = 1; m.b = 0;
      m.c = 0; m.d = 1;
      m.e = 0; m.f = 20.5;

      path.addPath(secondPath, m);
      // With PathKit, one can also just provide the 6 params as floats, to avoid
      // the overhead of making an SVGMatrix
      // path.addPath(secondPath, 1, 0, 0, 1, 0, 20.5);

      canvasCtx = canvases[i];
      canvasCtx.fillStyle = 'blue';
      setCanvasSize(canvasCtx, 300, 300);
      canvasCtx.scale(1.5, 1.5);
      if (path.toPath2D) {
        canvasCtx.stroke(path.toPath2D());
      } else {
        canvasCtx.stroke(path);
      }
    }


    objs[1].delete();
  }

  // see https://fiddle.skia.org/c/@discrete_path
  function drawStar(path) {
    let R = 115.2, C = 128.0;
    path.moveTo(C + R + 22, C);
    for (let i = 1; i < 8; i++) {
      let a = 2.6927937 * i;
      path.lineTo(C + R * Math.cos(a) + 22, C + R * Math.sin(a));
    }
    path.closePath();
    return path;
  }

  function PathEffectsExample(PathKit) {
    let effects = [
      // no-op
      (path) => path,
      // dash
      (path, counter) => path.dash(10, 3, counter/5),
      // trim (takes optional 3rd param for returning the trimmed part
      // or the complement)
      (path, counter) => path.trim((counter/100) % 1, 0.8, false),
      // simplify
      (path) => path.simplify(),
      // stroke
      (path, counter) => path.stroke({
        width: 10 * (Math.sin(counter/30) + 1),
        join: PathKit.StrokeJoin.BEVEL,
        cap: PathKit.StrokeCap.BUTT,
        miter_limit: 1,
      }),
      // "offset effect", that is, making a border around the shape.
      (path, counter) => {
        let orig = path.copy();
        path.stroke({
          width: 10 + (counter / 4) % 50,
          join: PathKit.StrokeJoin.ROUND,
          cap: PathKit.StrokeCap.SQUARE,
        })
          .op(orig, PathKit.PathOp.DIFFERENCE);
        orig.delete();
      },
      (path, counter) => {
        let simplified = path.simplify().copy();
        path.stroke({
          width: 2 + (counter / 2) % 100,
          join: PathKit.StrokeJoin.BEVEL,
          cap: PathKit.StrokeCap.BUTT,
        })
          .op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);
        simplified.delete();
      }
    ];

    let names = ["(plain)", "Dash", "Trim", "Simplify", "Stroke", "Grow", "Shrink"];

    let counter = 0;
    function frame() {
      counter++;
      for (let i = 0; i < effects.length; i++) {
        let path = PathKit.NewPath();
        drawStar(path);

        // The transforms apply directly to the path.
        effects[i](path, counter);

        let ctx = document.getElementById(`canvas${i+5}`).getContext('2d');
        setCanvasSize(ctx, 300, 300);
        ctx.strokeStyle = '#3c597a';
        ctx.fillStyle = '#3c597a';
        if (i >=4 ) {
          ctx.fill(path.toPath2D(), path.getFillTypeString());
        } else {
          ctx.stroke(path.toPath2D());
        }

        ctx.font = '42px monospace';

        let x = 150-ctx.measureText(names[i]).width/2;
        ctx.strokeText(names[i], x, 290);

        path.delete();
      }
      window.requestAnimationFrame(frame);
    }
    window.requestAnimationFrame(frame);
  }

  function MatrixTransformExample(PathKit) {
    // Creates an animated star that twists and moves.
    let ctx = document.getElementById('canvasTransform').getContext('2d');
    setCanvasSize(ctx, 300, 300);
    ctx.strokeStyle = '#3c597a';

    let path = drawStar(PathKit.NewPath());
    // TODO(kjlubick): Perhaps expose some matrix helper functions to allow
    // clients to build their own matrices like this?
    // These matrices represent a 2 degree rotation and a 1% scale factor.
    let scaleUp = [1.0094, -0.0352,  3.1041,
                   0.0352,  1.0094, -6.4885,
                   0     ,  0      , 1];

    let scaleDown = [ 0.9895, 0.0346, -2.8473,
                     -0.0346, 0.9895,  6.5276,
                      0     , 0     ,  1];

    let i = 0;
    function frame(){
      i++;
      if (Math.round(i/100) % 2) {
        path.transform(scaleDown);
      } else {
        path.transform(scaleUp);
      }

      ctx.clearRect(0, 0, 300, 300);
      ctx.stroke(path.toPath2D());

      ctx.font = '42px monospace';
      let x = 150-ctx.measureText('Transform').width/2;
      ctx.strokeText('Transform', x, 290);

      window.requestAnimationFrame(frame);
    }
    window.requestAnimationFrame(frame);
  }

  function FilledSVGExample(PathKit) {
    let innerRect = PathKit.NewPath();
    innerRect.rect(80, 100, 40, 40);

    let outerRect = PathKit.NewPath();
    outerRect.rect(50, 10, 100, 100)
             .op(innerRect, PathKit.PathOp.XOR);

    let str = outerRect.toSVGString();

    let diffSVG = document.createElementNS('http://www.w3.org/2000/svg', 'path');
    diffSVG.setAttribute('stroke', 'red');
    diffSVG.setAttribute('fill', 'black');
    // force fill-rule to nonzero to demonstrate difference
    diffSVG.setAttribute('fill-rule', 'nonzero');
    diffSVG.setAttribute('d', str);
    document.getElementById('svg2').appendChild(diffSVG);

    let unionSVG = document.createElementNS('http://www.w3.org/2000/svg', 'path');
    unionSVG.setAttribute('stroke', 'red');
    unionSVG.setAttribute('fill', 'black');
    // ask what the path thinks fill-rule should be ('evenodd')
    // SVG and Canvas both use the same keys ('nonzero' and 'evenodd') and both
    // default to 'nonzero', so one call supports both.
    unionSVG.setAttribute('fill-rule', outerRect.getFillTypeString());
    unionSVG.setAttribute('d', str);
    document.getElementById('svg3').appendChild(unionSVG);

    outerRect.delete();
    innerRect.delete();
  }

  function CubicSolverExample(PathKit) {
    let ctx = document.getElementById('cubics').getContext('2d');
    setCanvasSize(ctx, 300, 300);
    // Draw lines between cp0 (0, 0) and cp1 and then cp2 and cp3 (1, 1)
    // scaled up to be on a 300x300 grid instead of unit square
    ctx.strokeStyle = 'black';
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(0.1 * 300, 0.5*300);

    ctx.moveTo(0.5 * 300, 0.1*300);
    ctx.lineTo(300, 300);
    ctx.stroke();


    ctx.strokeStyle = 'green';
    ctx.beginPath();

    for (let x = 0; x < 300; x++) {
      // scale X into unit square
      let y = PathKit.cubicYFromX(0.1, 0.5, 0.5, 0.1, x/300);
      ctx.arc(x, y*300, 2, 0, 2*Math.PI);
    }
    ctx.stroke();
  }

</script>
