<!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>
    <div style="width:1000px;height:1000px" class=anim></div>
  </main>
  <script type="text/javascript" charset="utf-8">
    (function () {
      const PATH = '/res/lottie.json';
      const RENDERER = 'svg';
      const MAX_FRAMES = 25;
      const MAX_LOOPS = 5;

      // 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: {
          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>
