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