<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Debugger Demo</title>
  <script src="bin/debugger.js"></script>
  <script>
let index = 0;
let surface;

DebuggerInit({
  locateFile: (file) => '/node_modules/debugger/bin/'+file,
}).ready().then((Debugger) => {
  const player = new Debugger.SkpDebugPlayer();

  // Define an event handler for the file input dialog
  function readSkpFile(e){
    // Did the change event result in the file-input element specifing a file? (user might have cancelled the dialog)
    const file = e.target.files[0];
    if (!file) {
      return;
    }
    // create a callback for when the file finishes being read.
    const reader = new FileReader();
    reader.onload = function(e) {
      // Convert e.target.result (an ArrayBuffer) into a typedarray,
      // otherwise fileMem.set() below seems to have no effect.
      const fileContents = new Uint8Array(e.target.result);
      const size = fileContents.byteLength;
      // Allocate memory in wasm to hold the skp file selected by the user.
      const fileMemPtr = Debugger._malloc(size);
      // Make a typed array view of that memory
      let fileMem = new Uint8Array(Debugger.HEAPU8.buffer, fileMemPtr, size);
      // Copy the file into it
      fileMem.set(fileContents);
      // Hand off pointer to wasm
      player.loadSkp(fileMemPtr, size);
      // From the loaded commands, Debugger now knows the bounds.
      let bounds = player.getBounds();
      // Resize our canvas to match
      canvas = document.getElementById('debugger_view');
      canvas.width = bounds.fRight - bounds.fLeft;
      canvas.height = bounds.fBottom - bounds.fTop;
      //Assume GPU selected initially
      surface = Debugger.MakeWebGLCanvasSurface(canvas);

      document.getElementById('command-count').innerHTML = player.getSize();
      player.setClipVizColor(0);
    };
    reader.readAsArrayBuffer(file);
  }

  function playFile() {
    interval = parseFloat(document.getElementById('interval').value);
    let intervalID = setInterval(function() {
        if (index < 789){
          player.drawTo(surface, index);
          surface.flush();
          index++;
        }
    }, interval);
  }

  // Discard canvas when switching between cpu/gpu backend because it's bound to a context.
  function replaceCanvas() {
      canvas = document.getElementById('debugger_view');
      let newCanvas = canvas.cloneNode(true);
      let parent = canvas.parentNode;
      parent.replaceChild(newCanvas, canvas);
  }

  document.getElementById('file-input')
    .addEventListener('change', readSkpFile);

  document.getElementById('play_button')
    .addEventListener('click', playFile);

  document.getElementById('overdraw')
    .addEventListener('change', function(e) {
      player.setOverdrawVis(e.target.checked);
    });

  document.getElementById('gpu_op_bounds')
    .addEventListener('change', function(e) {
      player.setGpuOpBounds(e.target.checked);
    });

  document.getElementById('clip_viz_color')
    .addEventListener('change', function(e) {
      // Remove the '#' from the hex color string.
      // prepend an alpha value (0x50 or about 30%)
      // then convert to an integer.
      colorInt = parseInt("50"+e.target.value.substring(1),16);
      player.setClipVizColor(colorInt);
    });

  document.getElementById('disable_clip_viz')
    .addEventListener('click', function(e) {
      // Setting the clip viz to transparent black makes it invisible.
      player.setClipVizColor(0);
    });

  document.getElementById('get_json_command_list')
    .addEventListener('click', function(e) {
      result = player.jsonCommandList(surface);
      console.log('getjsoncommandlist result '+result.substring(0,100)+'...');
      commands = JSON.parse(result);
      console.log('parsed json');
    });

  document.getElementById('backend_gpu')
    .addEventListener('change', function(e) {
      if (e.target.checked) {
        replaceCanvas();
        surface = Debugger.MakeWebGLCanvasSurface(document.getElementById('debugger_view'));
      }
    });

  document.getElementById('backend_cpu')
    .addEventListener('change', function(e) {
      if (e.target.checked) {
        replaceCanvas();
        surface = Debugger.MakeSWCanvasSurface(document.getElementById('debugger_view'));
      }
    });

});
  </script>
  </head>
  <body>
    <canvas id=debugger_view width=400 height=400></canvas>
    <div style="float:right">
      <input type="radio" name="backend" value="CPU" id="backend_cpu"> CPU
      <input type="radio" name="backend" value="WebGL" id="backend_gpu" checked> WebGL<br>
      <input type="file" id="file-input" /> | <span id="command-count">0</span> commands<br>
      <input type="button" id="play_button" value="Play" />
      command interval in ms
      <input type="text" id="interval" value="20" /><br>
      <input type="checkbox" id="overdraw" /> Overdraw vis<br>
      <input type="checkbox" id="gpu_op_bounds" /> GPU Op bounds<br>
      <input type="color" id="clip_viz_color" />Clip visualization color
      <input type="button" id="disable_clip_viz" value="Disable" /><br>
      <input type="button" id="get_json_command_list" value="Get JSON Command List" /><br>
    <div>
    <div style="float:clear"></div>
  </body>
</html>
