1cb93a386Sopenharmony_ci<!DOCTYPE html> 2cb93a386Sopenharmony_ci<title>Texture demos</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<script type="text/javascript" src="https://particles.skia.org/dist/canvaskit.js"></script> 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci<style> 9cb93a386Sopenharmony_ci canvas { 10cb93a386Sopenharmony_ci border: 1px dashed grey; 11cb93a386Sopenharmony_ci } 12cb93a386Sopenharmony_ci #sourceImage, #sourceVideo { 13cb93a386Sopenharmony_ci width: 100px; 14cb93a386Sopenharmony_ci height: 100px; 15cb93a386Sopenharmony_ci border: 1px solid red; 16cb93a386Sopenharmony_ci cursor: pointer; 17cb93a386Sopenharmony_ci } 18cb93a386Sopenharmony_ci</style> 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci<body> 21cb93a386Sopenharmony_ci <h1>User Defined Textures</h1> 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci <p>Tap on one of the texture sources to switch to it.</p> 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci <canvas id=draw width=500 height=500></canvas> 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci <img id="sourceImage" src="/demo/textures/testimg.png"> 28cb93a386Sopenharmony_ci <video id="sourceVideo" autoplay muted></video> 29cb93a386Sopenharmony_ci</body> 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci<script type="text/javascript" charset="utf-8"> 32cb93a386Sopenharmony_ci const ckLoaded = CanvasKitInit({ locateFile: (file) => 'https://particles.skia.org/dist/' + file }); 33cb93a386Sopenharmony_ci const canvasEle = document.getElementById('draw'); 34cb93a386Sopenharmony_ci const imgEle = document.getElementById('sourceImage'); 35cb93a386Sopenharmony_ci const videoEle = document.getElementById('sourceVideo'); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci // Links the web cam to the video element. 38cb93a386Sopenharmony_ci navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { 39cb93a386Sopenharmony_ci videoEle.srcObject = stream; 40cb93a386Sopenharmony_ci }).catch((err) => { 41cb93a386Sopenharmony_ci console.error("Could not set up video", err); 42cb93a386Sopenharmony_ci }); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci // Enables switching between texture sources. 45cb93a386Sopenharmony_ci let srcEle = imgEle; 46cb93a386Sopenharmony_ci imgEle.addEventListener('click', () => { 47cb93a386Sopenharmony_ci srcEle = imgEle; 48cb93a386Sopenharmony_ci }); 49cb93a386Sopenharmony_ci videoEle.addEventListener('click', () => { 50cb93a386Sopenharmony_ci srcEle = videoEle; 51cb93a386Sopenharmony_ci }); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci Promise.all([ 54cb93a386Sopenharmony_ci ckLoaded, 55cb93a386Sopenharmony_ci imgEle.decode(), 56cb93a386Sopenharmony_ci]).then(([ 57cb93a386Sopenharmony_ci CanvasKit, 58cb93a386Sopenharmony_ci shouldBeNull, 59cb93a386Sopenharmony_ci]) => { 60cb93a386Sopenharmony_ci const surface = CanvasKit.MakeCanvasSurface('draw'); 61cb93a386Sopenharmony_ci if (!surface) { 62cb93a386Sopenharmony_ci throw 'Could not make surface'; 63cb93a386Sopenharmony_ci } 64cb93a386Sopenharmony_ci const paint = new CanvasKit.Paint(); 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci // This example creates a new texture, loads it into an image, and then deletes the image 67cb93a386Sopenharmony_ci // (which should delete the texture automatically). 68cb93a386Sopenharmony_ci let lastTS = Date.now(); 69cb93a386Sopenharmony_ci function drawFrame(canvas) { 70cb93a386Sopenharmony_ci const now = Date.now(); 71cb93a386Sopenharmony_ci canvas.rotate(10 * (now - lastTS) / 1000, 250, 250); 72cb93a386Sopenharmony_ci lastTS = now; 73cb93a386Sopenharmony_ci const img = surface.makeImageFromTextureSource(srcEle); 74cb93a386Sopenharmony_ci canvas.clear(CanvasKit.Color(200, 200, 200)); 75cb93a386Sopenharmony_ci canvas.drawImage(img, 5, 5, paint); 76cb93a386Sopenharmony_ci img && img.delete(); 77cb93a386Sopenharmony_ci surface.requestAnimationFrame(drawFrame); 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci surface.requestAnimationFrame(drawFrame); 80cb93a386Sopenharmony_ci }); 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci</script>