1*c8dee2aaSAndroid Build Coastguard Worker// Adds JS functions to allow for chaining w/o leaking by re-using 'this' path. 2*c8dee2aaSAndroid Build Coastguard Worker(function(PathKit){ 3*c8dee2aaSAndroid Build Coastguard Worker // PathKit.onRuntimeInitialized is called after the WASM library has loaded. 4*c8dee2aaSAndroid Build Coastguard Worker // when onRuntimeInitialized is called, PathKit.SkPath is defined with many 5*c8dee2aaSAndroid Build Coastguard Worker // functions on it (see pathkit_wasm_bindings.cpp@EMSCRIPTEN_BINDINGS) 6*c8dee2aaSAndroid Build Coastguard Worker PathKit.onRuntimeInitialized = function() { 7*c8dee2aaSAndroid Build Coastguard Worker // All calls to 'this' need to go in externs.js so closure doesn't minify them away. 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.addPath = function() { 10*c8dee2aaSAndroid Build Coastguard Worker // Takes 1, 2, 7 or 10 args, where the first arg is always the path. 11*c8dee2aaSAndroid Build Coastguard Worker // The options for the remaining args are: 12*c8dee2aaSAndroid Build Coastguard Worker // - an SVGMatrix 13*c8dee2aaSAndroid Build Coastguard Worker // - the 6 parameters of an SVG Matrix 14*c8dee2aaSAndroid Build Coastguard Worker // - the 9 parameters of a full Matrix 15*c8dee2aaSAndroid Build Coastguard Worker var path = arguments[0]; 16*c8dee2aaSAndroid Build Coastguard Worker if (arguments.length === 1) { 17*c8dee2aaSAndroid Build Coastguard Worker // Add path, unchanged. Use identity matrix 18*c8dee2aaSAndroid Build Coastguard Worker this._addPath(path, 1, 0, 0, 19*c8dee2aaSAndroid Build Coastguard Worker 0, 1, 0, 20*c8dee2aaSAndroid Build Coastguard Worker 0, 0, 1); 21*c8dee2aaSAndroid Build Coastguard Worker } else if (arguments.length === 2) { 22*c8dee2aaSAndroid Build Coastguard Worker // Takes SVGMatrix, which has its args in a counter-intuitive order 23*c8dee2aaSAndroid Build Coastguard Worker // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#Transform_functions 24*c8dee2aaSAndroid Build Coastguard Worker var sm = arguments[1]; 25*c8dee2aaSAndroid Build Coastguard Worker this._addPath(path, sm['a'], sm['c'], sm['e'], 26*c8dee2aaSAndroid Build Coastguard Worker sm['b'], sm['d'], sm['f'], 27*c8dee2aaSAndroid Build Coastguard Worker 0, 0, 1); 28*c8dee2aaSAndroid Build Coastguard Worker } else if (arguments.length === 7) { 29*c8dee2aaSAndroid Build Coastguard Worker // User provided the 6 params for an SVGMatrix directly. 30*c8dee2aaSAndroid Build Coastguard Worker var a = arguments; 31*c8dee2aaSAndroid Build Coastguard Worker this._addPath(path, a[1], a[3], a[5], 32*c8dee2aaSAndroid Build Coastguard Worker a[2], a[4], a[6], 33*c8dee2aaSAndroid Build Coastguard Worker 0 , 0 , 1 ); 34*c8dee2aaSAndroid Build Coastguard Worker } else if (arguments.length === 10) { 35*c8dee2aaSAndroid Build Coastguard Worker // User provided the 9 params of a (full) matrix directly. 36*c8dee2aaSAndroid Build Coastguard Worker // These are in the same order as what Skia expects. 37*c8dee2aaSAndroid Build Coastguard Worker var a = arguments; 38*c8dee2aaSAndroid Build Coastguard Worker this._addPath(path, a[1], a[2], a[3], 39*c8dee2aaSAndroid Build Coastguard Worker a[4], a[5], a[6], 40*c8dee2aaSAndroid Build Coastguard Worker a[7], a[8], a[9]); 41*c8dee2aaSAndroid Build Coastguard Worker } else { 42*c8dee2aaSAndroid Build Coastguard Worker console.err('addPath expected to take 1, 2, 7, or 10 args. Got ' + arguments.length); 43*c8dee2aaSAndroid Build Coastguard Worker return null; 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker return this; 46*c8dee2aaSAndroid Build Coastguard Worker }; 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.reverseAddPath = function() { 49*c8dee2aaSAndroid Build Coastguard Worker this._reverseAddPath(arguments[0]); 50*c8dee2aaSAndroid Build Coastguard Worker return this; 51*c8dee2aaSAndroid Build Coastguard Worker }; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker // ccw (counter clock wise) is optional and defaults to false. 54*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.arc = function(x, y, radius, startAngle, endAngle, ccw) { 55*c8dee2aaSAndroid Build Coastguard Worker this._arc(x, y, radius, startAngle, endAngle, !!ccw); 56*c8dee2aaSAndroid Build Coastguard Worker return this; 57*c8dee2aaSAndroid Build Coastguard Worker }; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.arcTo = function(x1, y1, x2, y2, radius) { 60*c8dee2aaSAndroid Build Coastguard Worker this._arcTo(x1, y1, x2, y2, radius); 61*c8dee2aaSAndroid Build Coastguard Worker return this; 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) { 65*c8dee2aaSAndroid Build Coastguard Worker this._cubicTo(cp1x, cp1y, cp2x, cp2y, x, y); 66*c8dee2aaSAndroid Build Coastguard Worker return this; 67*c8dee2aaSAndroid Build Coastguard Worker }; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.close = function() { 70*c8dee2aaSAndroid Build Coastguard Worker this._close(); 71*c8dee2aaSAndroid Build Coastguard Worker return this; 72*c8dee2aaSAndroid Build Coastguard Worker }; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker // Reminder, we have some duplicate definitions because we want to be a 75*c8dee2aaSAndroid Build Coastguard Worker // superset of Path2D and also work like the original SkPath C++ object. 76*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.closePath = function() { 77*c8dee2aaSAndroid Build Coastguard Worker this._close(); 78*c8dee2aaSAndroid Build Coastguard Worker return this; 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.conicTo = function(x1, y1, x2, y2, w) { 82*c8dee2aaSAndroid Build Coastguard Worker this._conicTo(x1, y1, x2, y2, w); 83*c8dee2aaSAndroid Build Coastguard Worker return this; 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.cubicTo = function(cp1x, cp1y, cp2x, cp2y, x, y) { 87*c8dee2aaSAndroid Build Coastguard Worker this._cubicTo(cp1x, cp1y, cp2x, cp2y, x, y); 88*c8dee2aaSAndroid Build Coastguard Worker return this; 89*c8dee2aaSAndroid Build Coastguard Worker }; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.dash = function(on, off, phase) { 92*c8dee2aaSAndroid Build Coastguard Worker if (this._dash(on, off, phase)) { 93*c8dee2aaSAndroid Build Coastguard Worker return this; 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker return null; 96*c8dee2aaSAndroid Build Coastguard Worker }; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker // ccw (counter clock wise) is optional and defaults to false. 99*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle, ccw) { 100*c8dee2aaSAndroid Build Coastguard Worker this._ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, !!ccw); 101*c8dee2aaSAndroid Build Coastguard Worker return this; 102*c8dee2aaSAndroid Build Coastguard Worker }; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.lineTo = function(x, y) { 105*c8dee2aaSAndroid Build Coastguard Worker this._lineTo(x, y); 106*c8dee2aaSAndroid Build Coastguard Worker return this; 107*c8dee2aaSAndroid Build Coastguard Worker }; 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.moveTo = function(x, y) { 110*c8dee2aaSAndroid Build Coastguard Worker this._moveTo(x, y); 111*c8dee2aaSAndroid Build Coastguard Worker return this; 112*c8dee2aaSAndroid Build Coastguard Worker }; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.op = function(otherPath, op) { 115*c8dee2aaSAndroid Build Coastguard Worker if (this._op(otherPath, op)) { 116*c8dee2aaSAndroid Build Coastguard Worker return this; 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker return null; 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.quadraticCurveTo = function(cpx, cpy, x, y) { 122*c8dee2aaSAndroid Build Coastguard Worker this._quadTo(cpx, cpy, x, y); 123*c8dee2aaSAndroid Build Coastguard Worker return this; 124*c8dee2aaSAndroid Build Coastguard Worker }; 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.quadTo = function(cpx, cpy, x, y) { 127*c8dee2aaSAndroid Build Coastguard Worker this._quadTo(cpx, cpy, x, y); 128*c8dee2aaSAndroid Build Coastguard Worker return this; 129*c8dee2aaSAndroid Build Coastguard Worker }; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.rect = function(x, y, w, h) { 132*c8dee2aaSAndroid Build Coastguard Worker this._rect(x, y, w, h); 133*c8dee2aaSAndroid Build Coastguard Worker return this; 134*c8dee2aaSAndroid Build Coastguard Worker }; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.simplify = function() { 137*c8dee2aaSAndroid Build Coastguard Worker if (this._simplify()) { 138*c8dee2aaSAndroid Build Coastguard Worker return this; 139*c8dee2aaSAndroid Build Coastguard Worker } 140*c8dee2aaSAndroid Build Coastguard Worker return null; 141*c8dee2aaSAndroid Build Coastguard Worker }; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.asWinding = function() { 144*c8dee2aaSAndroid Build Coastguard Worker if (this._asWinding()) { 145*c8dee2aaSAndroid Build Coastguard Worker return this; 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker return null; 148*c8dee2aaSAndroid Build Coastguard Worker } 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.isEmpty = function() { 151*c8dee2aaSAndroid Build Coastguard Worker return this._isEmpty(); 152*c8dee2aaSAndroid Build Coastguard Worker }; 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.stroke = function(opts) { 155*c8dee2aaSAndroid Build Coastguard Worker // Fill out any missing values with the default values. 156*c8dee2aaSAndroid Build Coastguard Worker /** 157*c8dee2aaSAndroid Build Coastguard Worker * See externs.js for this definition 158*c8dee2aaSAndroid Build Coastguard Worker * @type {StrokeOpts} 159*c8dee2aaSAndroid Build Coastguard Worker */ 160*c8dee2aaSAndroid Build Coastguard Worker opts = opts || {}; 161*c8dee2aaSAndroid Build Coastguard Worker opts['width'] = opts['width'] || 1; 162*c8dee2aaSAndroid Build Coastguard Worker opts['miter_limit'] = opts['miter_limit'] || 4; 163*c8dee2aaSAndroid Build Coastguard Worker opts['cap'] = opts['cap'] || PathKit.StrokeCap.BUTT; 164*c8dee2aaSAndroid Build Coastguard Worker opts['join'] = opts['join'] || PathKit.StrokeJoin.MITER; 165*c8dee2aaSAndroid Build Coastguard Worker opts['res_scale'] = opts['res_scale'] || 1; 166*c8dee2aaSAndroid Build Coastguard Worker if (this._stroke(opts)) { 167*c8dee2aaSAndroid Build Coastguard Worker return this; 168*c8dee2aaSAndroid Build Coastguard Worker } 169*c8dee2aaSAndroid Build Coastguard Worker return null; 170*c8dee2aaSAndroid Build Coastguard Worker }; 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.transform = function() { 173*c8dee2aaSAndroid Build Coastguard Worker // Takes 1 or 9 args 174*c8dee2aaSAndroid Build Coastguard Worker if (arguments.length === 1) { 175*c8dee2aaSAndroid Build Coastguard Worker // argument 1 should be a 9 element array (which is transformed on the C++ side 176*c8dee2aaSAndroid Build Coastguard Worker // to a SimpleMatrix) 177*c8dee2aaSAndroid Build Coastguard Worker this._transform(arguments[0]); 178*c8dee2aaSAndroid Build Coastguard Worker } else if (arguments.length === 9) { 179*c8dee2aaSAndroid Build Coastguard Worker // these arguments are the 9 members of the matrix 180*c8dee2aaSAndroid Build Coastguard Worker var a = arguments; 181*c8dee2aaSAndroid Build Coastguard Worker this._transform(a[0], a[1], a[2], 182*c8dee2aaSAndroid Build Coastguard Worker a[3], a[4], a[5], 183*c8dee2aaSAndroid Build Coastguard Worker a[6], a[7], a[8]); 184*c8dee2aaSAndroid Build Coastguard Worker } else { 185*c8dee2aaSAndroid Build Coastguard Worker console.err('transform expected to take 1 or 9 arguments. Got ' + arguments.length); 186*c8dee2aaSAndroid Build Coastguard Worker return null; 187*c8dee2aaSAndroid Build Coastguard Worker } 188*c8dee2aaSAndroid Build Coastguard Worker return this; 189*c8dee2aaSAndroid Build Coastguard Worker }; 190*c8dee2aaSAndroid Build Coastguard Worker 191*c8dee2aaSAndroid Build Coastguard Worker // isComplement is optional, defaults to false 192*c8dee2aaSAndroid Build Coastguard Worker PathKit.SkPath.prototype.trim = function(startT, stopT, isComplement) { 193*c8dee2aaSAndroid Build Coastguard Worker if (this._trim(startT, stopT, !!isComplement)) { 194*c8dee2aaSAndroid Build Coastguard Worker return this; 195*c8dee2aaSAndroid Build Coastguard Worker } 196*c8dee2aaSAndroid Build Coastguard Worker return null; 197*c8dee2aaSAndroid Build Coastguard Worker }; 198*c8dee2aaSAndroid Build Coastguard Worker }; 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker}(Module)); // When this file is loaded in, the high level object is "Module"; 201*c8dee2aaSAndroid Build Coastguard Worker 202