<!DOCTYPE html>
<html>
<head>
    <title>Lottie-Web Perf</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script>
    <style type="text/css" media="screen">
      body {
        margin: 0;
        padding: 0;
      }
    </style>
</head>
<body>
  <main>
    <canvas id=canvas width=1000 height=1000 style="height: 1000px; width: 1000px;"></canvas>
  </main>
  <script type="text/javascript" charset="utf-8">
    (function () {
      const PATH = '/res/lottie.json';
      const RENDERER = 'canvas';
      const MAX_FRAMES = 25;
      const MAX_LOOPS = 3;

      const cvs = document.getElementById("canvas");
      const canvasContext = cvs.getContext('2d');

      // Get total number of frames of the animation from the hash.
      const hash = window.location.hash;
      const totalFrames = hash.slice(1);
      console.log("Lottie has " + totalFrames + "total frames");

      // Load the animation with autoplay false. We will control which
      // frame to seek to and then will measure performance.
      let anim = lottie.loadAnimation({
        container: document.querySelector('.anim'),
        renderer: RENDERER,
        loop: false,
        autoplay: false,
        path: PATH,
        rendererSettings: {
          context: canvasContext,
          scaleMode: 'noScale',
          clearCanvas: true,
          preserveAspectRatio:'xMidYMid meet',
        },
      });

      const t_rate = 1.0 / (MAX_FRAMES - 1);
      let frame = 0;
      let loop = 0;
      const drawFrame = () => {
        if (frame >= MAX_FRAMES) {
          // Reached the end of one loop.
          loop++;
          if (loop == MAX_LOOPS) {
            // These are global variables to talk with puppeteer.
            window._lottieWebDone = true;
            return;
          }
          // Reset frame to restart the loop.
          frame = 0;
        }

        let t1 = Math.max(Math.min(t_rate * frame, 1.0), 0.0);
        let seekToFrame = totalFrames * t1;
        if (seekToFrame >= totalFrames-1) {
          // bodymovin player sometimes draws blank when requesting
          // to draw the very last frame.  Subtracting a small value
          // seems to fix this and make it draw the last frame.
          seekToFrame -= .001;
        }

        anim.goToAndStop(seekToFrame, true /* isFrame */);
        console.log("Used seek: " + (seekToFrame/totalFrames));
        frame++;
        window.requestAnimationFrame(drawFrame);
      };
      window.requestAnimationFrame(drawFrame);
    })();
  </script>
</body>
</html>
