xref: /aosp_15_r20/external/skia/modules/canvaskit/npm_build/node.example.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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