xref: /aosp_15_r20/external/skia/modules/pathkit/chaining.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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