1cb93a386Sopenharmony_ciA WASM version of Skia's Canvas API.
2cb93a386Sopenharmony_ci
3cb93a386Sopenharmony_ciSee https://skia.org/user/modules/canvaskit for more background information.
4cb93a386Sopenharmony_ci
5cb93a386Sopenharmony_ci# Getting Started
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci## Browser
8cb93a386Sopenharmony_ciTo use the library, run `npm install canvaskit-wasm` and then simply include it:
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci    <script src="/node_modules/canvaskit-wasm/bin/canvaskit.js"></script>
11cb93a386Sopenharmony_ci    CanvasKitInit({
12cb93a386Sopenharmony_ci        locateFile: (file) => '/node_modules/canvaskit-wasm/bin/'+file,
13cb93a386Sopenharmony_ci    }).then((CanvasKit) => {
14cb93a386Sopenharmony_ci        // Code goes here using CanvasKit
15cb93a386Sopenharmony_ci    });
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ciAs with all npm packages, there's a freely available CDN via unpkg.com:
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ci    <script src="https://unpkg.com/canvaskit-wasm@0.18.1/bin/canvaskit.js"></script>
20cb93a386Sopenharmony_ci    CanvasKitInit({
21cb93a386Sopenharmony_ci         locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.18.1/bin/'+file,
22cb93a386Sopenharmony_ci    }).then(...)
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_ci## Node
25cb93a386Sopenharmony_ciTo use CanvasKit in Node, it's similar to the browser:
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ci    const CanvasKitInit = require('/node_modules/canvaskit-wasm/bin/canvaskit.js');
28cb93a386Sopenharmony_ci    CanvasKitInit({
29cb93a386Sopenharmony_ci        locateFile: (file) => __dirname + '/bin/'+file,
30cb93a386Sopenharmony_ci    }).then((CanvasKit) => {
31cb93a386Sopenharmony_ci        // Code goes here using CanvasKit
32cb93a386Sopenharmony_ci    });
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ciWith node, you also need to supply the `--expose-wasm` flag.
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci## WebPack
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ciWebPack's support for WASM is still somewhat experimental, but CanvasKit can be
39cb93a386Sopenharmony_ciused with a few configuration changes.
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ciIn the JS code, use require():
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    const CanvasKitInit = require('canvaskit-wasm/bin/canvaskit.js')
44cb93a386Sopenharmony_ci    CanvasKitInit().then((CanvasKit) => {
45cb93a386Sopenharmony_ci        // Code goes here using CanvasKit
46cb93a386Sopenharmony_ci    });
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ciSince WebPack does not expose the entire `/node_modules/` directory, but instead
49cb93a386Sopenharmony_cipackages only the needed pieces, we have to copy canvaskit.wasm into the build directory.
50cb93a386Sopenharmony_ciOne such solution is to use [CopyWebpackPlugin](https://github.com/webpack-contrib/copy-webpack-plugin).
51cb93a386Sopenharmony_ciFor example, add the following plugin:
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    config.plugins.push(
54cb93a386Sopenharmony_ci        new CopyWebpackPlugin([
55cb93a386Sopenharmony_ci            { from: 'node_modules/canvaskit-wasm/bin/canvaskit.wasm' }
56cb93a386Sopenharmony_ci        ])
57cb93a386Sopenharmony_ci    );
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ciIf webpack gives an error similar to:
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci    ERROR in ./node_modules/canvaskit-wasm/bin/canvaskit.js
62cb93a386Sopenharmony_ci    Module not found: Error: Can't resolve 'fs' in '...'
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ciThen, add the following configuration change to the node section of the config:
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ci    config.node = {
67cb93a386Sopenharmony_ci        fs: 'empty'
68cb93a386Sopenharmony_ci    };
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci
71cb93a386Sopenharmony_ci# Using the CanvasKit API
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ciSee `example.html` and `node.example.js` for demos of how to use the core API.
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ciSee `extra.html` for some optional add-ins like an animation player (Skottie)
76cb93a386Sopenharmony_ciand a particles system.
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ciSee `types/index.d.ts` for a typescript definition file that contains all the
79cb93a386Sopenharmony_ciAPIs and some documentation about them.
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci## Drop-in Canvas2D replacement
82cb93a386Sopenharmony_ciFor environments where an HTML canvas is not available (e.g. Node, headless servers),
83cb93a386Sopenharmony_ciCanvasKit has an optional API (included by default) that mirrors the HTML canvas.
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_ci    let skcanvas = CanvasKit.MakeCanvas(600, 600);
86cb93a386Sopenharmony_ci
87cb93a386Sopenharmony_ci    let ctx = skcanvas.getContext('2d');
88cb93a386Sopenharmony_ci    let rgradient = ctx.createRadialGradient(200, 300, 10, 100, 100, 300);
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci    // Add three color stops
91cb93a386Sopenharmony_ci    rgradient.addColorStop(0, 'red');
92cb93a386Sopenharmony_ci    rgradient.addColorStop(0.7, 'white');
93cb93a386Sopenharmony_ci    rgradient.addColorStop(1, 'blue');
94cb93a386Sopenharmony_ci
95cb93a386Sopenharmony_ci    ctx.fillStyle = rgradient;
96cb93a386Sopenharmony_ci    ctx.globalAlpha = 0.7;
97cb93a386Sopenharmony_ci    ctx.fillRect(0, 0, 600, 600);
98cb93a386Sopenharmony_ci
99cb93a386Sopenharmony_ci    let imgData = skcanvas.toDataURL();
100cb93a386Sopenharmony_ci    // imgData is now a base64 encoded image.
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_ciSee more examples in `example.html` and `node.example.js`.
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci
105cb93a386Sopenharmony_ci# Filing bugs
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ciPlease file bugs at [skbug.com](skbug.com).
108cb93a386Sopenharmony_ciIt may be convenient to use [our online fiddle](jsfiddle.skia.org/canvaskit) to demonstrate any issues encountered.
109cb93a386Sopenharmony_ci
110cb93a386Sopenharmony_ciSee CONTRIBUTING.md for more information on sending pull requests.
111cb93a386Sopenharmony_ci
112cb93a386Sopenharmony_ci# Types and Documentation
113cb93a386Sopenharmony_ci
114cb93a386Sopenharmony_ciThere are Typescript types and associated API docs in types/.
115