aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/lottiecap/driver.html
blob: 38e4dfbbbc92725c4eb2475aa71f1ec5de2c875d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<!DOCTYPE html>
<html>
<head>
    <title>Lottie Filmstrip Capture</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="/lottie.js" type="text/javascript" charset="utf-8"></script>
    <style type="text/css" media="screen">
      body,
      main,
      .anim {
        margin: 0;
        padding: 0;
      }

      main {
        display: flex;
        width: 1000px;
        height: 1000px;
        flex-flow: row wrap;
      }
    </style>
</head>
<body>
  <main>
    <div class=anim></div>
  </main>
  <script type="text/javascript" charset="utf-8">
    (function () {
      const TILE_COUNT = 5; // Number of tiles in x or y direction.
      const TARGET_SIZE = 1000; // Image size in pixels both x and y direction.
      const PATH = '/lottie.json';

      // This global is used by puppeteer to determine if all tiles have finished drawing.
      window._tileCount = 0;

      // First load the animation for just a single tile
      // so we can read out some values and calculate what
      // the filmstrip should look like.
      let anim = lottie.loadAnimation({
        container: document.querySelector('.anim'),
        renderer: 'svg',
        loop: false,
        autoplay: true,
        path: PATH,
        rendererSettings: {
          preserveAspectRatio:'xMidYMid meet'
        },
      });

      anim.addEventListener('data_ready', e => {
        // Once the first tile is loaded, calculate what
        // the filmstrip should look like.
        let width = anim.animationData.w;
        let height = anim.animationData.h;
        let scale = TARGET_SIZE / (TILE_COUNT * Math.max(width, height));
        let tileWidth = Math.ceil(scale * width);
        let tileHeight = Math.ceil(scale * height);

        let inPoint = anim.animationData.ip || 0;
        let outPoint = anim.animationData.op || anim.animationData.totalFrames - 1;
        let frameStep = (outPoint - inPoint) / (TILE_COUNT * TILE_COUNT - 1);

        let main = document.querySelector('main');

        let renderer = 'svg';
        let hash = window.location.hash;
        if (hash) {
          renderer = hash.slice(1);
        }

        // Clear out the first div now that our measurements are done.
        main.firstElementChild.remove();

        // Add in the 5x5 tiled divs.
        for (let i = 0; i < (TILE_COUNT*TILE_COUNT); i++) {
          let div = document.createElement('div');
          div.classList.add('anim');
          div.style.width = tileWidth + 'px';
          div.style.height = tileHeight + 'px';
          main.appendChild(div);

          let frameStop = i * frameStep;

          let anim = lottie.loadAnimation({
            container: div,
            renderer: renderer,
            loop: false,
            autoplay: true,
            path: PATH,
            rendererSettings: {
              preserveAspectRatio:'xMidYMid meet'
            },
          });
          anim.addEventListener('enterFrame', (e) => {
            if (Math.round(anim.currentFrame) >= frameStop) {
              anim.pause();
              window._tileCount += 1;
            }
          });
        }
      });
    })();
  </script>
</body>
</html>