skia2/experimental/pathkit/npm-wasm
Kevin Lubick 644d8e7175 [PathKit] Add PathOps Op and Simplify tests imported from the C++ tests.
Because of https://skia-review.googlesource.com/c/skia/+/146165 and
https://skia-review.googlesource.com/c/skia/+/146100 we have a way
to turn PathOps tests into JSON, which has input paths (as Cmd arrays),
combination verb and expected output.

In this CL, we make tests from the JSON, compare them to the expected
output and, optionally, create SVGs to visualize the difference if any.

API changes (nothing breaking on release builds):
 - Exposes SkRect as a JS Object.  No need to call delete() on this.
 - expose path.getBounds() and path.computeTightBounds()
 - Remove SkRegion exposure (debug/test only), which was going to be
used for this purpose, but the approach in this CL works fine.
 - Add loadCmdsTypedArray(cmd) helper function to JS [see helper.js].
This was previously known as `floatTypedArrayFrom2D` in the
old shell.html, and is now exposed to avoid clients having to
implement this boilerplate by themselves.
 - Add set/getFillType - mostly for testing the difference between
a Winding and an EvenOdd path.

Bug: skia:8216
Change-Id: I2cd25ce2e1e7f285c79c596678678e62135963f0
Reviewed-on: https://skia-review.googlesource.com/146524
Reviewed-by: Cary Clark <caryclark@google.com>
2018-08-09 18:13:48 +00:00
..
example.html [PathKit] Add more Path2D functionality and move some methods to be members 2018-08-06 19:07:12 +00:00
LICENSE Make flutter roll happy 2018-08-02 18:22:00 +00:00
package.json [PathKit] Add PathOps Op and Simplify tests imported from the C++ tests. 2018-08-09 18:13:48 +00:00
README.md Add Debug version of PathKit 2018-08-03 16:54:20 +00:00

A WASM version of Skia's PathOps toolkit.

To use the library, run npm install experimental-pathkit-wasm and then simply include it:

<script src="/node_modules/experimental-pathkit-wasm/bin/pathkit.js"></script>
PathKitInit({
    locateFile: (file) => '/node_modules/experimental-pathkit-wasm/bin/'+file,
}).then((PathKit) => {
    // Code goes here using PathKit
});

PathKit comes in two parts, a JS loader and the actual WASM code. The JS loader creates a global PathKitInit that can be called to load the WASM code. The locateFile function is used to tell the JS loader where to find the .wasm file. By default, it will look for /pathkit.wasm, so if this is not the case, use locateFile to configure this properly. The PathKit object returned through the .then() callback is fully loaded and ready to use.

See example.html for a fuller example of how to use the library.

Using PathKit and WebPack

WebPack's support for WASM is still somewhat experimental, but PathKit can be used with a few configuration changes.

In the JS code, use require():

const PathKitInit = require('experimental-pathkit-wasm/bin/pathkit.js')
PathKitInit().then((PathKit) => {
    // Code goes here using PathKit
})

Since WebPack does not expose the entire /node_modules/ directory, but instead packages only the needed pieces, we have to copy pathkit.wasm into the build directory. One such solution is to use CopyWebpackPlugin. For example, add the following plugin:

config.plugins.push(
    new CopyWebpackPlugin([
        { from: 'node_modules/experimental-pathkit-wasm/bin/pathkit.wasm' }
    ])
);

If webpack gives an error similar to:

ERROR in ./node_modules/experimental-pathkit-wasm/bin/pathkit.js
Module not found: Error: Can't resolve 'fs' in '...'

Then, add the following configuration change to the node section of the config:

config.node = {
    fs: 'empty'
};