<html>
  <head>
    <title>Javascript Clipper Library / Boolean operations / Canvas example</title>
    <script src="clipper.js"></script>
    <style>
      h3{ margin-bottom:2px}
      body,th,td,input,legend,fieldset,p,b,button,select,textarea {
        font-size: 14px;
        font-family: Arial, Helvetica, sans-serif;
      }
    </style>
    <script>
function draw() {
  var subj_paths = [[{X:10,Y:10},{X:110,Y:10},{X:110,Y:110},{X:10,Y:110}],
                      [{X:20,Y:20},{X:20,Y:100},{X:100,Y:100},{X:100,Y:20}]]; 
  var clip_paths = [[{X:50,Y:50},{X:150,Y:50},{X:150,Y:150},{X:50,Y:150}],
                      [{X:60,Y:60},{X:60,Y:140},{X:140,Y:140},{X:140,Y:60}]];
  var scale = 100;
  ClipperLib.JS.ScaleUpPaths(subj_paths, scale);
  ClipperLib.JS.ScaleUpPaths(clip_paths, scale);
  var cpr = new ClipperLib.Clipper();
  cpr.AddPaths(subj_paths, ClipperLib.PolyType.ptSubject, true);
  cpr.AddPaths(clip_paths, ClipperLib.PolyType.ptClip, true);
  var subject_fillType = ClipperLib.PolyFillType.pftNonZero;
  var clip_fillType = ClipperLib.PolyFillType.pftNonZero;
  var clipTypes = [ClipperLib.ClipType.ctUnion, ClipperLib.ClipType.ctDifference, ClipperLib.ClipType.ctXor, ClipperLib.ClipType.ctIntersection];
  var clipTypesTexts = "Union, Difference, Xor, Intersection";
  var solution_paths, canvas_str, canvas, ctx, desc = document.getElementById('desc'), i, i2, j, x, y;
  for(i = 0; i < clipTypes.length; i++) {
    solution_paths = new ClipperLib.Paths();
    cpr.Execute(clipTypes[i], solution_paths, subject_fillType, clip_fillType);
    //console.log(JSON.stringify(solution_paths));
    canvas = document.getElementById("canvas"+i);
    canvas.width = canvas.height = 160;
    ctx = canvas.getContext("2d");
    ctx.fillStyle = "red";
    ctx.strokeStyle = "black";
    ctx.lineWidth = 2;
    ctx.beginPath();
    for(i2 = 0; i2 < solution_paths.length; i2++) {
      for(j = 0; j < solution_paths[i2].length; j++) {
        x = solution_paths[i2][j].X / scale;
        y = solution_paths[i2][j].Y / scale;
        if (!j) ctx.moveTo(x, y);
        else ctx.lineTo(x, y);
      }
      ctx.closePath();
    }
    ctx.fill();
    ctx.stroke();
  }
  desc.innerHTML = clipTypesTexts;
}
    </script>
  </head>
  <style>
    canvas { background-color:#dddddd; margin:0px; margin-right:10px; margin-bottom:10px; }
  </style>
  <body onload="draw()">
    <h2>Javascript Clipper Library / Boolean operations / Canvas example</h2>
    This page shows an example of boolean operations on polygons and drawing them on html5 canvas as bitmap images.
    <br><br>
    <div id="canvascontainer">
      <canvas id="canvas0"></canvas>
      <canvas id="canvas1"></canvas>
      <canvas id="canvas2"></canvas>
      <canvas id="canvas3"></canvas>
    </div>
    <div id="desc"></div>
  </body>
</html>