3088c69b5f
The goal is to see how small this can be w/o disrupting CanvasKit. Change-Id: Ia96ebf94dbe335d9db481d9264279163f8c37e16 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/285012 Reviewed-by: Florin Malita <fmalita@chromium.org>
114 lines
4.1 KiB
JavaScript
114 lines
4.1 KiB
JavaScript
// Adds JS functions to augment the SkottieKit interface.
|
|
// For example, if there is a wrapper around the C++ call or logic to allow
|
|
// chaining, it should go here.
|
|
|
|
// SkottieKit.onRuntimeInitialized is called after the WASM library has loaded.
|
|
// Anything that modifies an exposed class (e.g. SkPath) should be set
|
|
// after onRuntimeInitialized, otherwise, it can happen outside of that scope.
|
|
SkottieKit.onRuntimeInitialized = function() {
|
|
// All calls to 'this' need to go in externs.js so closure doesn't minify them away.
|
|
|
|
SkottieKit.SkCanvas.prototype.clear = function (color4f) {
|
|
var cPtr = copy1dArray(color4f, SkottieKit.HEAPF32);
|
|
this._clear(cPtr);
|
|
SkottieKit._free(cPtr);
|
|
}
|
|
|
|
SkottieKit.SkSurface.prototype.requestAnimationFrame = function(callback, dirtyRect) {
|
|
if (!this._cached_canvas) {
|
|
this._cached_canvas = this.getCanvas();
|
|
}
|
|
window.requestAnimationFrame(function() {
|
|
if (this._context !== undefined) {
|
|
SkottieKit.setCurrentContext(this._context);
|
|
}
|
|
|
|
callback(this._cached_canvas);
|
|
|
|
// We do not dispose() of the SkSurface here, as the client will typically
|
|
// call requestAnimationFrame again from within the supplied callback.
|
|
// For drawing a single frame, prefer drawOnce().
|
|
this.flush();
|
|
}.bind(this));
|
|
}
|
|
|
|
// Run through the JS files that are added at compile time.
|
|
if (SkottieKit._extraInitializations) {
|
|
SkottieKit._extraInitializations.forEach(function(init) {
|
|
init();
|
|
});
|
|
}
|
|
}; // end SkottieKit.onRuntimeInitialized, that is, anything changing prototypes or dynamic.
|
|
|
|
// Construct a 4-float color.
|
|
// Opaque if opacity is omitted.
|
|
SkottieKit.Color4f = function(r, g, b, a) {
|
|
if (a === undefined) {
|
|
a = 1;
|
|
}
|
|
return Float32Array.of(r, g, b, a);
|
|
}
|
|
|
|
// Color constants use property getters to prevent other code from accidentally
|
|
// changing them.
|
|
Object.defineProperty(SkottieKit, "TRANSPARENT", {
|
|
get: function() { return SkottieKit.Color4f(0, 0, 0, 0); }
|
|
});
|
|
Object.defineProperty(SkottieKit, "BLACK", {
|
|
get: function() { return SkottieKit.Color4f(0, 0, 0, 1); }
|
|
});
|
|
Object.defineProperty(SkottieKit, "WHITE", {
|
|
get: function() { return SkottieKit.Color4f(1, 1, 1, 1); }
|
|
});
|
|
// assets is a dictionary of named blobs: { key: ArrayBuffer, ... }
|
|
// The keys should be well-behaved strings - they're turned into null-terminated
|
|
// strings for the native side.
|
|
SkottieKit.MakeManagedAnimation = function(json, assets) {
|
|
if (!SkottieKit.managed_skottie) {
|
|
throw 'Not compiled with MakeManagedAnimation';
|
|
}
|
|
if (!assets) {
|
|
return SkottieKit._MakeManagedAnimation(json, 0, nullptr, nullptr, nullptr);
|
|
}
|
|
var assetNamePtrs = [];
|
|
var assetDataPtrs = [];
|
|
var assetSizes = [];
|
|
|
|
var assetKeys = Object.keys(assets || {});
|
|
for (var i = 0; i < assetKeys.length; i++) {
|
|
var key = assetKeys[i];
|
|
var buffer = assets[key];
|
|
var data = new Uint8Array(buffer);
|
|
|
|
var iptr = SkottieKit._malloc(data.byteLength);
|
|
SkottieKit.HEAPU8.set(data, iptr);
|
|
assetDataPtrs.push(iptr);
|
|
assetSizes.push(data.byteLength);
|
|
|
|
// lengthBytesUTF8 and stringToUTF8Array are defined in the emscripten
|
|
// JS. See https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#stringToUTF8
|
|
// Add 1 for null terminator
|
|
var strLen = lengthBytesUTF8(key) + 1;
|
|
var strPtr = SkottieKit._malloc(strLen);
|
|
|
|
stringToUTF8(key, strPtr, strLen);
|
|
assetNamePtrs.push(strPtr);
|
|
}
|
|
|
|
// Not entirely sure if it matters, but the uintptr_t are 32 bits
|
|
// we want to copy our array of uintptr_t into the right size memory.
|
|
var namesPtr = copy1dArray(assetNamePtrs, SkottieKit.HEAPU32);
|
|
var assetsPtr = copy1dArray(assetDataPtrs, SkottieKit.HEAPU32);
|
|
var assetSizesPtr = copy1dArray(assetSizes, SkottieKit.HEAPU32);
|
|
|
|
var anim = SkottieKit._MakeManagedAnimation(json, assetKeys.length, namesPtr,
|
|
assetsPtr, assetSizesPtr);
|
|
|
|
// The C++ code has made copies of the asset and string data, so free our copies.
|
|
SkottieKit._free(namesPtr);
|
|
SkottieKit._free(assetsPtr);
|
|
SkottieKit._free(assetSizesPtr);
|
|
|
|
return anim;
|
|
};
|