1*c8dee2aaSAndroid Build Coastguard Workerconst CanvasKitInit = require('./bin/canvaskit.js'); 2*c8dee2aaSAndroid Build Coastguard Workerconst fs = require('fs'); 3*c8dee2aaSAndroid Build Coastguard Workerconst path = require('path'); 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Workerconst assetPath = path.join(__dirname, '..', 'tests', 'assets'); 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard WorkerCanvasKitInit({ 8*c8dee2aaSAndroid Build Coastguard Worker locateFile: (file) => __dirname + '/bin/'+file, 9*c8dee2aaSAndroid Build Coastguard Worker}).then((CanvasKit) => { 10*c8dee2aaSAndroid Build Coastguard Worker let canvas = CanvasKit.MakeCanvas(300, 300); 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker let img = fs.readFileSync(path.join(assetPath, 'mandrill_512.png')); 14*c8dee2aaSAndroid Build Coastguard Worker img = canvas.decodeImage(img); 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker let fontData = fs.readFileSync(path.join(assetPath, 'Roboto-Regular.woff')); 17*c8dee2aaSAndroid Build Coastguard Worker canvas.loadFont(fontData, { 18*c8dee2aaSAndroid Build Coastguard Worker 'family': 'Roboto', 19*c8dee2aaSAndroid Build Coastguard Worker 'style': 'normal', 20*c8dee2aaSAndroid Build Coastguard Worker 'weight': '400', 21*c8dee2aaSAndroid Build Coastguard Worker }); 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker let ctx = canvas.getContext('2d'); 24*c8dee2aaSAndroid Build Coastguard Worker ctx.font = '30px Roboto'; 25*c8dee2aaSAndroid Build Coastguard Worker ctx.rotate(.1); 26*c8dee2aaSAndroid Build Coastguard Worker ctx.fillText('Awesome ', 50, 100); 27*c8dee2aaSAndroid Build Coastguard Worker ctx.strokeText('Groovy!', 250, 100); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker // Draw line under Awesome 30*c8dee2aaSAndroid Build Coastguard Worker ctx.strokeStyle = 'rgba(125,0,0,0.5)'; 31*c8dee2aaSAndroid Build Coastguard Worker ctx.beginPath(); 32*c8dee2aaSAndroid Build Coastguard Worker ctx.lineWidth = 6; 33*c8dee2aaSAndroid Build Coastguard Worker ctx.lineTo(50, 102); 34*c8dee2aaSAndroid Build Coastguard Worker ctx.lineTo(250, 102); 35*c8dee2aaSAndroid Build Coastguard Worker ctx.stroke(); 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker // squished vertically 38*c8dee2aaSAndroid Build Coastguard Worker ctx.globalAlpha = 0.7 39*c8dee2aaSAndroid Build Coastguard Worker ctx.imageSmoothingQuality = 'medium'; 40*c8dee2aaSAndroid Build Coastguard Worker ctx.drawImage(img, 150, 150, 150, 100); 41*c8dee2aaSAndroid Build Coastguard Worker ctx.rotate(-.2); 42*c8dee2aaSAndroid Build Coastguard Worker ctx.imageSmoothingEnabled = false; 43*c8dee2aaSAndroid Build Coastguard Worker ctx.drawImage(img, 100, 150, 400, 350, 10, 200, 150, 100); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker console.log('drop in Canvas2D replacement'); 46*c8dee2aaSAndroid Build Coastguard Worker console.log('<img src="' + canvas.toDataURL() + '" />'); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker fancyAPI(CanvasKit); 49*c8dee2aaSAndroid Build Coastguard Worker}); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Workerfunction fancyAPI(CanvasKit) { 52*c8dee2aaSAndroid Build Coastguard Worker let surface = CanvasKit.MakeSurface(300, 300); 53*c8dee2aaSAndroid Build Coastguard Worker const canvas = surface.getCanvas(); 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker const paint = new CanvasKit.Paint(); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker let robotoData = fs.readFileSync(path.join(assetPath, 'Roboto-Regular.woff')); 58*c8dee2aaSAndroid Build Coastguard Worker const roboto = CanvasKit.Typeface.MakeTypefaceFromData(robotoData); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker const textPaint = new CanvasKit.Paint(); 61*c8dee2aaSAndroid Build Coastguard Worker textPaint.setColor(CanvasKit.Color(40, 0, 0)); 62*c8dee2aaSAndroid Build Coastguard Worker textPaint.setAntiAlias(true); 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker const textFont = new CanvasKit.Font(roboto, 30); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker const skpath = starPath(CanvasKit); 67*c8dee2aaSAndroid Build Coastguard Worker const dpe = CanvasKit.PathEffect.MakeDash([15, 5, 5, 10], 1); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker paint.setPathEffect(dpe); 70*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(CanvasKit.PaintStyle.Stroke); 71*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(5.0); 72*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 73*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(CanvasKit.Color(66, 129, 164, 1.0)); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker canvas.clear(CanvasKit.Color(255, 255, 255, 1.0)); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker canvas.drawPath(skpath, paint); 78*c8dee2aaSAndroid Build Coastguard Worker canvas.drawText('Try Clicking!', 10, 280, textPaint, textFont); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker surface.flush(); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker const img = surface.makeImageSnapshot(); 83*c8dee2aaSAndroid Build Coastguard Worker if (!img) { 84*c8dee2aaSAndroid Build Coastguard Worker console.error('no snapshot'); 85*c8dee2aaSAndroid Build Coastguard Worker return; 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker const pngBytes = img.encodeToBytes(); 88*c8dee2aaSAndroid Build Coastguard Worker if (!pngBytes) { 89*c8dee2aaSAndroid Build Coastguard Worker console.error('encoding failure'); 90*c8dee2aaSAndroid Build Coastguard Worker return; 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker // See https://stackoverflow.com/a/12713326 93*c8dee2aaSAndroid Build Coastguard Worker let b64encoded = Buffer.from(pngBytes).toString('base64'); 94*c8dee2aaSAndroid Build Coastguard Worker console.log('Other APIs too!'); 95*c8dee2aaSAndroid Build Coastguard Worker console.log(`<img src="data:image/png;base64,${b64encoded}" />`); 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker // These delete calls free up memeory in the C++ WASM memory block. 98*c8dee2aaSAndroid Build Coastguard Worker dpe.delete(); 99*c8dee2aaSAndroid Build Coastguard Worker skpath.delete(); 100*c8dee2aaSAndroid Build Coastguard Worker textPaint.delete(); 101*c8dee2aaSAndroid Build Coastguard Worker paint.delete(); 102*c8dee2aaSAndroid Build Coastguard Worker roboto.delete(); 103*c8dee2aaSAndroid Build Coastguard Worker textFont.delete(); 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker surface.dispose(); 106*c8dee2aaSAndroid Build Coastguard Worker} 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Workerfunction starPath(CanvasKit, X=128, Y=128, R=116) { 109*c8dee2aaSAndroid Build Coastguard Worker let p = new CanvasKit.Path(); 110*c8dee2aaSAndroid Build Coastguard Worker p.moveTo(X + R, Y); 111*c8dee2aaSAndroid Build Coastguard Worker for (let i = 1; i < 8; i++) { 112*c8dee2aaSAndroid Build Coastguard Worker let a = 2.6927937 * i; 113*c8dee2aaSAndroid Build Coastguard Worker p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a)); 114*c8dee2aaSAndroid Build Coastguard Worker } 115*c8dee2aaSAndroid Build Coastguard Worker return p; 116*c8dee2aaSAndroid Build Coastguard Worker} 117