// Adds JS functions to allow for chaining w/o leaking by re-using 'this' path. (function(PathKit){ // PathKit.onRuntimeInitialized is called after the WASM library has loaded. // when onRuntimeInitialized is called, PathKit.SkPath is defined with many // functions on it (see pathkit_wasm_bindings.cpp@EMSCRIPTEN_BINDINGS) PathKit.onRuntimeInitialized = function() { // All calls to 'this' need to go in externs.js so closure doesn't minify them away. PathKit.SkPath.prototype.addPath = function() { // Takes 1, 2, 7 or 10 args, where the first arg is always the path. // The options for the remaining args are: // - an SVGMatrix // - the 6 parameters of an SVG Matrix // - the 9 parameters of a full Matrix var path = arguments[0]; if (arguments.length === 1) { // Add path, unchanged. Use identity matrix this._addPath(path, 1, 0, 0, 0, 1, 0, 0, 0, 1); } else if (arguments.length === 2) { // Takes SVGMatrix, which has its args in a counter-intuitive order // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#Transform_functions /** * @type {SVGMatrix} */ var sm = arguments[1]; this._addPath(path, sm.a, sm.c, sm.e, sm.b, sm.d, sm.f, 0, 0, 1); } else if (arguments.length === 7) { // User provided the 6 params for an SVGMatrix directly. var a = arguments; this._addPath(path, a[1], a[3], a[5], a[2], a[4], a[6], 0 , 0 , 1 ); } else if (arguments.length === 10) { // User provided the 9 params of a (full) matrix directly. // These are in the same order as what Skia expects. var a = arguments; this._addPath(path, a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]); } else { console.err('addPath expected to take 1, 2, 7, or 10 args. Got ' + arguments.length); return null; } return this; }; // ccw (counter clock wise) is optional and defaults to false. PathKit.SkPath.prototype.arc = function(x, y, radius, startAngle, endAngle, ccw) { this._arc(x, y, radius, startAngle, endAngle, !!ccw); return this; }; PathKit.SkPath.prototype.arcTo = function(x1, y1, x2, y2, radius) { this._arcTo(x1, y1, x2, y2, radius); return this; }; PathKit.SkPath.prototype.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) { this._cubicTo(cp1x, cp1y, cp2x, cp2y, x, y); return this; }; PathKit.SkPath.prototype.close = function() { this._close(); return this; }; // Reminder, we have some duplicate definitions because we want to be a // superset of Path2D and also work like the original SkPath C++ object. PathKit.SkPath.prototype.closePath = function() { this._close(); return this; }; PathKit.SkPath.prototype.conicTo = function(x1, y1, x2, y2, w) { this._conicTo(x1, y1, x2, y2, w); return this; }; PathKit.SkPath.prototype.cubicTo = function(cp1x, cp1y, cp2x, cp2y, x, y) { this._cubicTo(cp1x, cp1y, cp2x, cp2y, x, y); return this; }; PathKit.SkPath.prototype.dash = function(on, off, phase) { if (this._dash(on, off, phase)) { return this; } return null; }; // ccw (counter clock wise) is optional and defaults to false. PathKit.SkPath.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle, ccw) { this._ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, !!ccw); return this; }; PathKit.SkPath.prototype.lineTo = function(x, y) { this._lineTo(x, y); return this; }; PathKit.SkPath.prototype.moveTo = function(x, y) { this._moveTo(x, y); return this; }; PathKit.SkPath.prototype.op = function(otherPath, op) { if (this._op(otherPath, op)) { return this; } return null; }; PathKit.SkPath.prototype.quadraticCurveTo = function(cpx, cpy, x, y) { this._quadTo(cpx, cpy, x, y); return this; }; PathKit.SkPath.prototype.quadTo = function(cpx, cpy, x, y) { this._quadTo(cpx, cpy, x, y); return this; }; PathKit.SkPath.prototype.rect = function(x, y, w, h) { this._rect(x, y, w, h); return this; }; PathKit.SkPath.prototype.simplify = function() { if (this._simplify()) { return this; } return null; }; PathKit.SkPath.prototype.stroke = function(opts) { // Fill out any missing values with the default values. /** * See externs.js for this definition * @type {StrokeOpts} */ opts = opts || {}; opts.width = opts.width || 1; opts.miter_limit = opts.miter_limit || 4; opts.cap = opts.cap || PathKit.StrokeCap.BUTT; opts.join = opts.join || PathKit.StrokeJoin.MITER; if (this._stroke(opts)) { return this; } return null; }; PathKit.SkPath.prototype.transform = function() { // Takes 1 or 9 args if (arguments.length === 1) { // argument 1 should be a 9 element array (which is transformed on the C++ side // to a SimpleMatrix) this._transform(arguments[0]); } else if (arguments.length === 9) { // these arguments are the 9 members of the matrix var a = arguments; this._transform(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); } else { console.err('transform expected to take 1 or 9 arguments. Got ' + arguments.length); return null; } return this; }; // isComplement is optional, defaults to false PathKit.SkPath.prototype.trim = function(startT, stopT, isComplement) { if (this._trim(startT, stopT, !!isComplement)) { return this; } return null; }; }; }(Module)); // When this file is loaded in, the high level object is "Module";