[PathKit] Add asm.js build and test jobs
Consolidates the karma files into one for docker/asmjs/wasm and all
combinations.
The asm.js build seems to have some small imprecisions that we didn't
see as much as with WASM, probably due to JS limitations/differences
to c++'s floats.
To address these, I've marked some (5) tests in PathOps* as flaky
because they fail on Release, Debug or Test versions of the asm.js build.
Other then that, asm.js seems basically identical to the WASM.
WASM is much smaller, 416k vs 877k and seems to load faster (not
measured).
Note to reviewers:
example.html was copied from npm-wasm version, so doesn't need
further review.
Bug: skia:8216
Change-Id: Ib92b90fa6c598de85a0be319d46b25693ae5aaa4
Reviewed-on: https://skia-review.googlesource.com/148396
Reviewed-by: Stephan Altmueller <stephana@google.com>
diff --git a/experimental/pathkit/npm-asmjs/README.md b/experimental/pathkit/npm-asmjs/README.md
new file mode 100644
index 0000000..5db2096
--- /dev/null
+++ b/experimental/pathkit/npm-asmjs/README.md
@@ -0,0 +1,56 @@
+An asm.js version of Skia's PathOps toolkit.
+
+To use the library, run `npm install experimental-pathkit-asmjs` and then simply include it:
+
+ <script src="/node_modules/experimental-pathkit-asmjs/bin/pathkit.js"></script>
+ PathKitInit({
+ locateFile: (file) => '/node_modules/experimental-pathkit-asmjs/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 .js.mem file. By default, it will
+look for /pathkit.js.mem, 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 the [API page](https://skia.org/user/modules/pathkit) and
+[example.html](https://github.com/google/skia/blob/master/experimental/pathkit/npm-asmjs/example.html)
+for details on how to use the library.
+
+Using PathKit and WebPack
+-------------------------
+
+WebPack's support for asm.js should be straight-forward, since it's just another JS library. PathKit can be
+used with just a few configuration changes.
+
+In the JS code, use require():
+
+ const PathKitInit = require('experimental-pathkit-asmjs/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.mem into the build directory.
+One such solution is to use [CopyWebpackPlugin](https://github.com/webpack-contrib/copy-webpack-plugin).
+For example, add the following plugin:
+
+ config.plugins.push(
+ new CopyWebpackPlugin([
+ { from: 'node_modules/experimental-pathkit-asmjs/bin/pathkit.js.mem' }
+ ])
+ );
+
+If webpack gives an error similar to:
+
+ ERROR in ./node_modules/experimental-pathkit-asmjs/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'
+ };