xref: /aosp_15_r20/external/skia/modules/canvaskit/npm_build/multicanvas.html (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1<!DOCTYPE html>
2<title>CanvasKit (Skia via Web Assembly)</title>
3<meta charset="utf-8" />
4<meta http-equiv="X-UA-Compatible" content="IE=edge">
5<meta name="viewport" content="width=device-width, initial-scale=1.0">
6
7<style>
8  canvas, img {
9    border: 1px dashed #AAA;
10  }
11
12</style>
13
14<canvas id=api1 width=300 height=300></canvas>
15<canvas id=api2 width=300 height=300></canvas>
16<canvas id=api3 width=300 height=300></canvas>
17
18<br>
19
20<img id="src" src="https://storage.googleapis.com/skia-cdn/misc/test.png"
21  width=40 height=40 crossorigin="anonymous">
22
23<canvas id=api4 width=300 height=300></canvas>
24<canvas id=api5 width=300 height=300></canvas>
25<canvas id=api6 width=300 height=300></canvas>
26
27<script type="text/javascript" src="/build/canvaskit.js"></script>
28<script type="text/javascript" charset="utf-8">
29  const cdn = 'https://storage.googleapis.com/skia-cdn/misc/';
30
31  const ckLoaded = CanvasKitInit({locateFile: (file) => '/build/'+file});
32  const loadTestImage = fetch(cdn + 'test.png').then((response) => response.arrayBuffer());
33  const imageEle = document.getElementById("src");
34
35  Promise.all([ckLoaded, loadTestImage, imageEle.decode()]).then((results) => {
36    ContextSharingExample(results[0]);
37    MultiCanvasExample(...results);
38  });
39
40  // This example shows how CanvasKit can automatically switch between multiple canvases
41  // with different WebGL contexts.
42  function MultiCanvasExample(CanvasKit, imgBytes) {
43    const paint = new CanvasKit.Paint();
44
45    const surfOne = CanvasKit.MakeWebGLCanvasSurface("api1");
46    const canvasOne = surfOne.getCanvas();
47    const surfTwo = CanvasKit.MakeWebGLCanvasSurface("api2");
48    const canvasTwo = surfTwo.getCanvas();
49    const surfThree = CanvasKit.MakeWebGLCanvasSurface("api3");
50    const canvasThree = surfThree.getCanvas();
51
52    function firstFrame() {
53      paint.setColor(CanvasKit.Color4f(1, 0, 0, 1)); // red
54      canvasOne.drawRect(CanvasKit.LTRBRect(0, 0, 300, 300), paint);
55      surfOne.flush();
56
57      paint.setColor(CanvasKit.Color4f(0, 1, 0, 1)); // green
58      canvasTwo.drawRect(CanvasKit.LTRBRect(0, 0, 300, 300), paint);
59      surfTwo.flush();
60
61      paint.setColor(CanvasKit.Color4f(0, 0, 1, 1)); // blue
62      canvasThree.drawRect(CanvasKit.LTRBRect(0, 0, 300, 300), paint);
63      surfThree.flush();
64
65      window.requestAnimationFrame(secondFrame);
66    }
67
68    let img;
69    function secondFrame() {
70      img = CanvasKit.MakeImageFromEncoded(imgBytes);
71
72      canvasOne.drawImageCubic(img, 10, 10, 0.3, 0.3, null);
73      surfOne.flush();
74
75      canvasTwo.drawImageCubic(img, 10, 10, 0.3, 0.3, null);
76      surfTwo.flush();
77
78      canvasThree.drawImageCubic(img, 10, 10, 0.3, 0.3, null);
79      surfThree.flush();
80
81      window.requestAnimationFrame(thirdFrame);
82    }
83
84    function thirdFrame() {
85      canvasOne.drawImageCubic(img, 100, 100, 0.3, 0.3, null);
86      surfOne.flush();
87
88      canvasTwo.drawImageCubic(img, 100, 100, 0.3, 0.3, null);
89      surfTwo.flush();
90
91      canvasThree.drawImageCubic(img, 100, 100, 0.3, 0.3, null);
92      surfThree.flush();
93      img.delete();
94    }
95
96    window.requestAnimationFrame(firstFrame);
97  }
98
99  function ContextSharingExample(CanvasKit) {
100    const img = CanvasKit.MakeLazyImageFromTextureSource(imageEle);
101
102    const surfOne = CanvasKit.MakeWebGLCanvasSurface("api4");
103    const surfTwo = CanvasKit.MakeWebGLCanvasSurface("api5");
104    const surfThree = CanvasKit.MakeWebGLCanvasSurface("api6");
105
106    let i = 0;
107    function drawFrame(canvas) {
108      canvas.drawImageCubic(img, 5+i, 5+i, 0.3, 0.3, null);
109      i += 1
110      if (i >= 3) {
111        if (i > 60) {
112          img.delete();
113          return;
114        }
115        if (i % 2) {
116          surfOne.requestAnimationFrame(drawFrame);
117        } else {
118          surfTwo.requestAnimationFrame(drawFrame);
119        }
120
121      }
122    }
123
124    surfOne.requestAnimationFrame(drawFrame);
125    surfTwo.requestAnimationFrame(drawFrame);
126    surfThree.requestAnimationFrame(drawFrame);
127  }
128
129
130</script>