xref: /aosp_15_r20/external/skia/site/docs/user/modules/pathkit.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker---
2*c8dee2aaSAndroid Build Coastguard Workertitle: 'PathKit - Geometry in the Browser'
3*c8dee2aaSAndroid Build Coastguard WorkerlinkTitle: 'PathKit - Geometry in the Browser'
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerweight: 30
6*c8dee2aaSAndroid Build Coastguard Worker---
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard WorkerSkia has made its [SkPath](https://api.skia.org/classSkPath.html) object and
9*c8dee2aaSAndroid Build Coastguard Workermany related methods available to JS clients (e.g. Web Browsers) using
10*c8dee2aaSAndroid Build Coastguard WorkerWebAssembly and asm.js.
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker## Features
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard WorkerPathKit is still under rapid development, so the exact API is subject to change.
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard WorkerThe primary features are:
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker- API compatibility (e.g. drop-in replacement) with
19*c8dee2aaSAndroid Build Coastguard Worker  [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D)
20*c8dee2aaSAndroid Build Coastguard Worker- Can output to SVG / Canvas / Path2D
21*c8dee2aaSAndroid Build Coastguard Worker- Exposes a variety of path effects:
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker<style>
24*c8dee2aaSAndroid Build Coastguard Worker  canvas.patheffect {
25*c8dee2aaSAndroid Build Coastguard Worker    border: 1px dashed #AAA;
26*c8dee2aaSAndroid Build Coastguard Worker    width: 200px;
27*c8dee2aaSAndroid Build Coastguard Worker    height: 200px;
28*c8dee2aaSAndroid Build Coastguard Worker  }
29*c8dee2aaSAndroid Build Coastguard Worker</style>
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker<div id=effects>
32*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas1 title="Plain: A drawn star with overlapping solid lines"></canvas>
33*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas2 title="Dash: A drawn star with overlapping dashed lines"></canvas>
34*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas3 title="Trim: A portion of a drawn star with overlapping solid lines"></canvas>
35*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas4 title="Simplify: A drawn star with non-overlapping solid lines."></canvas>
36*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas5 title="Stroke: A drawn star with non-overlapping solid lines stroked at various thicknesses and with square edges"></canvas>
37*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas6 title="Grow: A drawn star's expanding outline"></canvas>
38*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvas7 title="Shrink: A solid drawn star shrunk down"></canvas>
39*c8dee2aaSAndroid Build Coastguard Worker  <canvas class=patheffect id=canvasTransform title="Transform: A drawn star moved and rotated by an Affine Matrix"></canvas>
40*c8dee2aaSAndroid Build Coastguard Worker</div>
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker<script type="text/javascript">
43*c8dee2aaSAndroid Build Coastguard Worker(function() {
44*c8dee2aaSAndroid Build Coastguard Worker  // Tries to load the WASM version if supported, then falls back to asmjs
45*c8dee2aaSAndroid Build Coastguard Worker  let s = document.createElement('script');
46*c8dee2aaSAndroid Build Coastguard Worker  if (window.WebAssembly && typeof window.WebAssembly.compile === 'function') {
47*c8dee2aaSAndroid Build Coastguard Worker    console.log('WebAssembly is supported! Using the wasm version of PathKit');
48*c8dee2aaSAndroid Build Coastguard Worker    window.__pathkit_locate_file = 'https://unpkg.com/[email protected]/bin/';
49*c8dee2aaSAndroid Build Coastguard Worker  } else {
50*c8dee2aaSAndroid Build Coastguard Worker    console.log('WebAssembly is not supported (yet) on this browser. Using the asmjs version of PathKit');
51*c8dee2aaSAndroid Build Coastguard Worker    window.__pathkit_locate_file = 'https://unpkg.com/[email protected]/bin/';
52*c8dee2aaSAndroid Build Coastguard Worker  }
53*c8dee2aaSAndroid Build Coastguard Worker  s.src = window.__pathkit_locate_file+'pathkit.js';
54*c8dee2aaSAndroid Build Coastguard Worker  s.onload = () => {
55*c8dee2aaSAndroid Build Coastguard Worker    // TODO(kjlubick) remove .ready() when we update the version served here.
56*c8dee2aaSAndroid Build Coastguard Worker    try {
57*c8dee2aaSAndroid Build Coastguard Worker      PathKitInit({
58*c8dee2aaSAndroid Build Coastguard Worker        locateFile: (file) => window.__pathkit_locate_file+file,
59*c8dee2aaSAndroid Build Coastguard Worker      }).ready().then((PathKit) => {
60*c8dee2aaSAndroid Build Coastguard Worker        // Code goes here using PathKit
61*c8dee2aaSAndroid Build Coastguard Worker        PathEffectsExample(PathKit);
62*c8dee2aaSAndroid Build Coastguard Worker        MatrixTransformExample(PathKit);
63*c8dee2aaSAndroid Build Coastguard Worker      });
64*c8dee2aaSAndroid Build Coastguard Worker    }
65*c8dee2aaSAndroid Build Coastguard Worker    catch(error) {
66*c8dee2aaSAndroid Build Coastguard Worker      console.warn(error, 'falling back to image');
67*c8dee2aaSAndroid Build Coastguard Worker      document.getElementById('effects').innerHTML = '<img width=800 src="./PathKit_effects.png"/>'
68*c8dee2aaSAndroid Build Coastguard Worker    }
69*c8dee2aaSAndroid Build Coastguard Worker  }
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker  document.head.appendChild(s);
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Worker  function setCanvasSize(ctx, width, height) {
74*c8dee2aaSAndroid Build Coastguard Worker    ctx.canvas.width = width;
75*c8dee2aaSAndroid Build Coastguard Worker    ctx.canvas.height = height;
76*c8dee2aaSAndroid Build Coastguard Worker  }
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker  function drawStar(path) {
79*c8dee2aaSAndroid Build Coastguard Worker    let R = 115.2, C = 128.0;
80*c8dee2aaSAndroid Build Coastguard Worker    path.moveTo(C + R + 22, C);
81*c8dee2aaSAndroid Build Coastguard Worker    for (let i = 1; i < 8; i++) {
82*c8dee2aaSAndroid Build Coastguard Worker      let a = 2.6927937 * i;
83*c8dee2aaSAndroid Build Coastguard Worker      path.lineTo(C + R * Math.cos(a) + 22, C + R * Math.sin(a));
84*c8dee2aaSAndroid Build Coastguard Worker    }
85*c8dee2aaSAndroid Build Coastguard Worker    path.closePath();
86*c8dee2aaSAndroid Build Coastguard Worker    return path;
87*c8dee2aaSAndroid Build Coastguard Worker  }
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Worker  function PathEffectsExample(PathKit) {
90*c8dee2aaSAndroid Build Coastguard Worker    let effects = [
91*c8dee2aaSAndroid Build Coastguard Worker      // no-op
92*c8dee2aaSAndroid Build Coastguard Worker      (path) => path,
93*c8dee2aaSAndroid Build Coastguard Worker      // dash
94*c8dee2aaSAndroid Build Coastguard Worker      (path, counter) => path.dash(10, 3, counter/5),
95*c8dee2aaSAndroid Build Coastguard Worker      // trim (takes optional 3rd param for returning the trimmed part
96*c8dee2aaSAndroid Build Coastguard Worker      // or the complement)
97*c8dee2aaSAndroid Build Coastguard Worker      (path, counter) => path.trim((counter/100) % 1, 0.8, false),
98*c8dee2aaSAndroid Build Coastguard Worker      // simplify
99*c8dee2aaSAndroid Build Coastguard Worker      (path) => path.simplify(),
100*c8dee2aaSAndroid Build Coastguard Worker      // stroke
101*c8dee2aaSAndroid Build Coastguard Worker      (path, counter) => path.stroke({
102*c8dee2aaSAndroid Build Coastguard Worker        width: 10 * (Math.sin(counter/30) + 1),
103*c8dee2aaSAndroid Build Coastguard Worker        join: PathKit.StrokeJoin.BEVEL,
104*c8dee2aaSAndroid Build Coastguard Worker        cap: PathKit.StrokeCap.BUTT,
105*c8dee2aaSAndroid Build Coastguard Worker        miter_limit: 1,
106*c8dee2aaSAndroid Build Coastguard Worker      }),
107*c8dee2aaSAndroid Build Coastguard Worker      // "offset effect", that is, making a border around the shape.
108*c8dee2aaSAndroid Build Coastguard Worker      (path, counter) => {
109*c8dee2aaSAndroid Build Coastguard Worker        let orig = path.copy();
110*c8dee2aaSAndroid Build Coastguard Worker        path.stroke({
111*c8dee2aaSAndroid Build Coastguard Worker          width: 10 + (counter / 4) % 50,
112*c8dee2aaSAndroid Build Coastguard Worker          join: PathKit.StrokeJoin.ROUND,
113*c8dee2aaSAndroid Build Coastguard Worker          cap: PathKit.StrokeCap.SQUARE,
114*c8dee2aaSAndroid Build Coastguard Worker        })
115*c8dee2aaSAndroid Build Coastguard Worker          .op(orig, PathKit.PathOp.DIFFERENCE);
116*c8dee2aaSAndroid Build Coastguard Worker        orig.delete();
117*c8dee2aaSAndroid Build Coastguard Worker      },
118*c8dee2aaSAndroid Build Coastguard Worker      (path, counter) => {
119*c8dee2aaSAndroid Build Coastguard Worker        let simplified = path.simplify().copy();
120*c8dee2aaSAndroid Build Coastguard Worker        path.stroke({
121*c8dee2aaSAndroid Build Coastguard Worker          width: 2 + (counter / 2) % 100,
122*c8dee2aaSAndroid Build Coastguard Worker          join: PathKit.StrokeJoin.BEVEL,
123*c8dee2aaSAndroid Build Coastguard Worker          cap: PathKit.StrokeCap.BUTT,
124*c8dee2aaSAndroid Build Coastguard Worker        })
125*c8dee2aaSAndroid Build Coastguard Worker          .op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);
126*c8dee2aaSAndroid Build Coastguard Worker        simplified.delete();
127*c8dee2aaSAndroid Build Coastguard Worker      }
128*c8dee2aaSAndroid Build Coastguard Worker    ];
129*c8dee2aaSAndroid Build Coastguard Worker
130*c8dee2aaSAndroid Build Coastguard Worker    let names = ["(plain)", "Dash", "Trim", "Simplify", "Stroke", "Grow", "Shrink"];
131*c8dee2aaSAndroid Build Coastguard Worker
132*c8dee2aaSAndroid Build Coastguard Worker    let counter = 0;
133*c8dee2aaSAndroid Build Coastguard Worker    function frame() {
134*c8dee2aaSAndroid Build Coastguard Worker      counter++;
135*c8dee2aaSAndroid Build Coastguard Worker      for (let i = 0; i < effects.length; i++) {
136*c8dee2aaSAndroid Build Coastguard Worker        let path = PathKit.NewPath();
137*c8dee2aaSAndroid Build Coastguard Worker        drawStar(path);
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker        // The transforms apply directly to the path.
140*c8dee2aaSAndroid Build Coastguard Worker        effects[i](path, counter);
141*c8dee2aaSAndroid Build Coastguard Worker
142*c8dee2aaSAndroid Build Coastguard Worker        let ctx = document.getElementById(`canvas${i+1}`);
143*c8dee2aaSAndroid Build Coastguard Worker        if (!ctx) {
144*c8dee2aaSAndroid Build Coastguard Worker          return;
145*c8dee2aaSAndroid Build Coastguard Worker        } else {
146*c8dee2aaSAndroid Build Coastguard Worker          ctx = ctx.getContext('2d');
147*c8dee2aaSAndroid Build Coastguard Worker        }
148*c8dee2aaSAndroid Build Coastguard Worker        setCanvasSize(ctx, 300, 300);
149*c8dee2aaSAndroid Build Coastguard Worker        ctx.strokeStyle = '#3c597a';
150*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = '#3c597a';
151*c8dee2aaSAndroid Build Coastguard Worker        if (i >=4 ) {
152*c8dee2aaSAndroid Build Coastguard Worker          ctx.fill(path.toPath2D(), path.getFillTypeString());
153*c8dee2aaSAndroid Build Coastguard Worker        } else {
154*c8dee2aaSAndroid Build Coastguard Worker          ctx.stroke(path.toPath2D());
155*c8dee2aaSAndroid Build Coastguard Worker        }
156*c8dee2aaSAndroid Build Coastguard Worker
157*c8dee2aaSAndroid Build Coastguard Worker        ctx.font = '42px monospace';
158*c8dee2aaSAndroid Build Coastguard Worker
159*c8dee2aaSAndroid Build Coastguard Worker        let x = 150-ctx.measureText(names[i]).width/2;
160*c8dee2aaSAndroid Build Coastguard Worker        ctx.strokeText(names[i], x, 290);
161*c8dee2aaSAndroid Build Coastguard Worker
162*c8dee2aaSAndroid Build Coastguard Worker        path.delete();
163*c8dee2aaSAndroid Build Coastguard Worker      }
164*c8dee2aaSAndroid Build Coastguard Worker      window.requestAnimationFrame(frame);
165*c8dee2aaSAndroid Build Coastguard Worker    }
166*c8dee2aaSAndroid Build Coastguard Worker    window.requestAnimationFrame(frame);
167*c8dee2aaSAndroid Build Coastguard Worker  }
168*c8dee2aaSAndroid Build Coastguard Worker
169*c8dee2aaSAndroid Build Coastguard Worker  function MatrixTransformExample(PathKit) {
170*c8dee2aaSAndroid Build Coastguard Worker    // Creates an animated star that twists and moves.
171*c8dee2aaSAndroid Build Coastguard Worker    let ctx = document.getElementById('canvasTransform').getContext('2d');
172*c8dee2aaSAndroid Build Coastguard Worker    setCanvasSize(ctx, 300, 300);
173*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = '#3c597a';
174*c8dee2aaSAndroid Build Coastguard Worker
175*c8dee2aaSAndroid Build Coastguard Worker    let path = drawStar(PathKit.NewPath());
176*c8dee2aaSAndroid Build Coastguard Worker    // TODO(kjlubick): Perhaps expose some matrix helper functions to allow
177*c8dee2aaSAndroid Build Coastguard Worker    // clients to build their own matrices like this?
178*c8dee2aaSAndroid Build Coastguard Worker    // These matrices represent a 2 degree rotation and a 1% scale factor.
179*c8dee2aaSAndroid Build Coastguard Worker    let scaleUp = [1.0094, -0.0352,  3.1041,
180*c8dee2aaSAndroid Build Coastguard Worker                   0.0352,  1.0094, -6.4885,
181*c8dee2aaSAndroid Build Coastguard Worker                   0     ,  0      , 1];
182*c8dee2aaSAndroid Build Coastguard Worker
183*c8dee2aaSAndroid Build Coastguard Worker    let scaleDown = [ 0.9895, 0.0346, -2.8473,
184*c8dee2aaSAndroid Build Coastguard Worker                     -0.0346, 0.9895,  6.5276,
185*c8dee2aaSAndroid Build Coastguard Worker                      0     , 0     ,  1];
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker    let i = 0;
188*c8dee2aaSAndroid Build Coastguard Worker    function frame(){
189*c8dee2aaSAndroid Build Coastguard Worker      i++;
190*c8dee2aaSAndroid Build Coastguard Worker      if (Math.round(i/100) % 2) {
191*c8dee2aaSAndroid Build Coastguard Worker        path.transform(scaleDown);
192*c8dee2aaSAndroid Build Coastguard Worker      } else {
193*c8dee2aaSAndroid Build Coastguard Worker        path.transform(scaleUp);
194*c8dee2aaSAndroid Build Coastguard Worker      }
195*c8dee2aaSAndroid Build Coastguard Worker
196*c8dee2aaSAndroid Build Coastguard Worker      ctx.clearRect(0, 0, 300, 300);
197*c8dee2aaSAndroid Build Coastguard Worker      ctx.stroke(path.toPath2D());
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker      ctx.font = '42px monospace';
200*c8dee2aaSAndroid Build Coastguard Worker      let x = 150-ctx.measureText('Transform').width/2;
201*c8dee2aaSAndroid Build Coastguard Worker      ctx.strokeText('Transform', x, 290);
202*c8dee2aaSAndroid Build Coastguard Worker
203*c8dee2aaSAndroid Build Coastguard Worker      window.requestAnimationFrame(frame);
204*c8dee2aaSAndroid Build Coastguard Worker    }
205*c8dee2aaSAndroid Build Coastguard Worker    window.requestAnimationFrame(frame);
206*c8dee2aaSAndroid Build Coastguard Worker  }
207*c8dee2aaSAndroid Build Coastguard Worker})();
208*c8dee2aaSAndroid Build Coastguard Worker</script>
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker## Example Code
211*c8dee2aaSAndroid Build Coastguard Worker
212*c8dee2aaSAndroid Build Coastguard WorkerThe best place to look for examples on how to use PathKit would be in the
213*c8dee2aaSAndroid Build Coastguard Worker[example.html](https://github.com/google/skia/blob/main/modules/pathkit/npm-wasm/example.html#L45),
214*c8dee2aaSAndroid Build Coastguard Workerwhich comes in the npm package.
215*c8dee2aaSAndroid Build Coastguard Worker
216*c8dee2aaSAndroid Build Coastguard Worker## Download the library
217*c8dee2aaSAndroid Build Coastguard Worker
218*c8dee2aaSAndroid Build Coastguard WorkerSee the the npm page for either the
219*c8dee2aaSAndroid Build Coastguard Worker[WebAssembly](https://www.npmjs.com/package/pathkit-wasm) version or the
220*c8dee2aaSAndroid Build Coastguard Worker[asm.js](https://www.npmjs.com/package/pathkit-asmjs) version for details on
221*c8dee2aaSAndroid Build Coastguard Workerdownloading and getting started.
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard WorkerWebAssembly has faster load times and better overall performance but is
224*c8dee2aaSAndroid Build Coastguard Workercurrently supported by Chrome, Firefox, Edge, and Safari. The asm.js version
225*c8dee2aaSAndroid Build Coastguard Workershould run anywhere JavaScript does.
226*c8dee2aaSAndroid Build Coastguard Worker
227*c8dee2aaSAndroid Build Coastguard Worker## API
228*c8dee2aaSAndroid Build Coastguard Worker
229*c8dee2aaSAndroid Build Coastguard WorkerThe primary feature of the library is the `SkPath` object. It can be created:
230*c8dee2aaSAndroid Build Coastguard Worker
231*c8dee2aaSAndroid Build Coastguard Worker- From the SVG string of a path `PathKit.FromSVGString(str)`
232*c8dee2aaSAndroid Build Coastguard Worker- From a 2D array of verbs and arguments `PathKit.FromCmds(cmds)`
233*c8dee2aaSAndroid Build Coastguard Worker- From `PathKit.NewPath()` (It will be blank)
234*c8dee2aaSAndroid Build Coastguard Worker- As a copy of an existing `SkPath` with `path.copy()` or
235*c8dee2aaSAndroid Build Coastguard Worker  `PathKit.NewPath(path)`
236*c8dee2aaSAndroid Build Coastguard Worker
237*c8dee2aaSAndroid Build Coastguard WorkerIt can be exported as:
238*c8dee2aaSAndroid Build Coastguard Worker
239*c8dee2aaSAndroid Build Coastguard Worker- An SVG string `path.toSVGString()`
240*c8dee2aaSAndroid Build Coastguard Worker- A [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D) object
241*c8dee2aaSAndroid Build Coastguard Worker  `path.toPath2D()`
242*c8dee2aaSAndroid Build Coastguard Worker- Directly to a canvas 2D context `path.toCanvas(ctx)`
243*c8dee2aaSAndroid Build Coastguard Worker- A 2D array of verbs and arguments `path.toCmds()`
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard WorkerOnce an SkPath object has been made, it can be interacted with in the following
246*c8dee2aaSAndroid Build Coastguard Workerways:
247*c8dee2aaSAndroid Build Coastguard Worker
248*c8dee2aaSAndroid Build Coastguard Worker- expanded by any of the Path2D operations (`moveTo`, `lineTo`, `rect`, `arc`,
249*c8dee2aaSAndroid Build Coastguard Worker  etc)
250*c8dee2aaSAndroid Build Coastguard Worker- combined with other paths using `op` or `PathKit.MakeFromOp(p1, p2, op)`. For
251*c8dee2aaSAndroid Build Coastguard Worker  example, `path1.op(path2, PathKit.PathOp.INTERSECT)` will set path1 to be the
252*c8dee2aaSAndroid Build Coastguard Worker  area represented by where path1 and path2 overlap (intersect).
253*c8dee2aaSAndroid Build Coastguard Worker  `PathKit.MakeFromOp(path1, path2, PathKit.PathOp.INTERSECT)` will do the same
254*c8dee2aaSAndroid Build Coastguard Worker  but returned as a new `SkPath` object.
255*c8dee2aaSAndroid Build Coastguard Worker- adjusted with some of the effects (`trim`, `dash`, `stroke`, etc)
256*c8dee2aaSAndroid Build Coastguard Worker
257*c8dee2aaSAndroid Build Coastguard Worker**Important**: Any objects (`SkPath`, `SkOpBuilder`, etc) that are created must
258*c8dee2aaSAndroid Build Coastguard Workerbe cleaned up with `path.delete()` when they leave the scope to avoid leaking
259*c8dee2aaSAndroid Build Coastguard Workerthe memory in the WASM heap. This includes any of the constructors, `copy()`, or
260*c8dee2aaSAndroid Build Coastguard Workerany function prefixed with "make".
261*c8dee2aaSAndroid Build Coastguard Worker
262*c8dee2aaSAndroid Build Coastguard Worker### PathKit
263*c8dee2aaSAndroid Build Coastguard Worker
264*c8dee2aaSAndroid Build Coastguard Worker#### `FromSVGString(str)`
265*c8dee2aaSAndroid Build Coastguard Worker
266*c8dee2aaSAndroid Build Coastguard Worker**str** - `String` representing an
267*c8dee2aaSAndroid Build Coastguard Worker[SVGPath](https://www.w3schools.com/graphics/svg_path.asp)
268*c8dee2aaSAndroid Build Coastguard Worker
269*c8dee2aaSAndroid Build Coastguard WorkerReturns an `SkPath` with the same verbs and arguments as the SVG string, or
270*c8dee2aaSAndroid Build Coastguard Worker`null` on a failure.
271*c8dee2aaSAndroid Build Coastguard Worker
272*c8dee2aaSAndroid Build Coastguard WorkerExample:
273*c8dee2aaSAndroid Build Coastguard Worker
274*c8dee2aaSAndroid Build Coastguard Worker    let path = PathKit.FromSVGString('M150 0 L75 200 L225 200 Z');
275*c8dee2aaSAndroid Build Coastguard Worker    // path represents a triangle
276*c8dee2aaSAndroid Build Coastguard Worker    // don't forget to do path.delete() when it goes out of scope.
277*c8dee2aaSAndroid Build Coastguard Worker
278*c8dee2aaSAndroid Build Coastguard Worker#### `FromCmds(cmds)`
279*c8dee2aaSAndroid Build Coastguard Worker
280*c8dee2aaSAndroid Build Coastguard Worker**cmds** - `Array<Array<Number>>`, a 2D array of commands, where a command is a
281*c8dee2aaSAndroid Build Coastguard Workerverb followed by its arguments.
282*c8dee2aaSAndroid Build Coastguard Worker
283*c8dee2aaSAndroid Build Coastguard WorkerReturns an `SkPath` with the verbs and arguments from the list or `null` on a
284*c8dee2aaSAndroid Build Coastguard Workerfailure.
285*c8dee2aaSAndroid Build Coastguard Worker
286*c8dee2aaSAndroid Build Coastguard WorkerThis can be faster than calling `.moveTo()`, `.lineTo()`, etc many times.
287*c8dee2aaSAndroid Build Coastguard Worker
288*c8dee2aaSAndroid Build Coastguard WorkerExample:
289*c8dee2aaSAndroid Build Coastguard Worker
290*c8dee2aaSAndroid Build Coastguard Worker    let cmds = [
291*c8dee2aaSAndroid Build Coastguard Worker        [PathKit.MOVE_VERB, 0, 10],
292*c8dee2aaSAndroid Build Coastguard Worker        [PathKit.LINE_VERB, 30, 40],
293*c8dee2aaSAndroid Build Coastguard Worker        [PathKit.QUAD_VERB, 20, 50, 45, 60],
294*c8dee2aaSAndroid Build Coastguard Worker    ];
295*c8dee2aaSAndroid Build Coastguard Worker    let path = PathKit.FromCmds(cmds);
296*c8dee2aaSAndroid Build Coastguard Worker    // path is the same as if a user had done
297*c8dee2aaSAndroid Build Coastguard Worker    // let path = PathKit.NewPath().moveTo(0, 10).lineTo(30, 40).quadTo(20, 50, 45, 60);
298*c8dee2aaSAndroid Build Coastguard Worker    // don't forget to do path.delete() when it goes out of scope.
299*c8dee2aaSAndroid Build Coastguard Worker
300*c8dee2aaSAndroid Build Coastguard Worker#### `NewPath()`
301*c8dee2aaSAndroid Build Coastguard Worker
302*c8dee2aaSAndroid Build Coastguard WorkerReturns an empty `SkPath` object.
303*c8dee2aaSAndroid Build Coastguard Worker
304*c8dee2aaSAndroid Build Coastguard WorkerExample:
305*c8dee2aaSAndroid Build Coastguard Worker
306*c8dee2aaSAndroid Build Coastguard Worker    let path = PathKit.NewPath();
307*c8dee2aaSAndroid Build Coastguard Worker    path.moveTo(0, 10)
308*c8dee2aaSAndroid Build Coastguard Worker        .lineTo(30, 40)
309*c8dee2aaSAndroid Build Coastguard Worker        .quadTo(20, 50, 45, 60);
310*c8dee2aaSAndroid Build Coastguard Worker    // don't forget to do path.delete() when it goes out of scope.
311*c8dee2aaSAndroid Build Coastguard Worker    // Users can also do let path = new PathKit.SkPath();
312*c8dee2aaSAndroid Build Coastguard Worker
313*c8dee2aaSAndroid Build Coastguard Worker#### `NewPath(pathToCopy)`
314*c8dee2aaSAndroid Build Coastguard Worker
315*c8dee2aaSAndroid Build Coastguard Worker**pathToCopy** - SkPath, a path to make a copy of.
316*c8dee2aaSAndroid Build Coastguard Worker
317*c8dee2aaSAndroid Build Coastguard WorkerReturns a `SkPath` that is a copy of the passed in `SkPath`.
318*c8dee2aaSAndroid Build Coastguard Worker
319*c8dee2aaSAndroid Build Coastguard WorkerExample:
320*c8dee2aaSAndroid Build Coastguard Worker
321*c8dee2aaSAndroid Build Coastguard Worker    let otherPath = ...;
322*c8dee2aaSAndroid Build Coastguard Worker    let clone = PathKit.NewPath(otherPath);
323*c8dee2aaSAndroid Build Coastguard Worker    clone.simplify();
324*c8dee2aaSAndroid Build Coastguard Worker    // don't forget to do clone.delete() when it goes out of scope.
325*c8dee2aaSAndroid Build Coastguard Worker    // Users can also do let clone = new PathKit.SkPath(otherPath);
326*c8dee2aaSAndroid Build Coastguard Worker    // or let clone = otherPath.copy();
327*c8dee2aaSAndroid Build Coastguard Worker
328*c8dee2aaSAndroid Build Coastguard Worker#### `MakeFromOp(pathOne, pathTwo, op)`
329*c8dee2aaSAndroid Build Coastguard Worker
330*c8dee2aaSAndroid Build Coastguard Worker**pathOne** - `SkPath`, a path. <br> **pathTwo** - `SkPath`, a path. <br>
331*c8dee2aaSAndroid Build Coastguard Worker**op** - `PathOp`, an op to apply
332*c8dee2aaSAndroid Build Coastguard Worker
333*c8dee2aaSAndroid Build Coastguard WorkerReturns a new `SkPath` that is the result of applying the given PathOp to the
334*c8dee2aaSAndroid Build Coastguard Workerfirst and second path (order matters).
335*c8dee2aaSAndroid Build Coastguard Worker
336*c8dee2aaSAndroid Build Coastguard WorkerExample:
337*c8dee2aaSAndroid Build Coastguard Worker
338*c8dee2aaSAndroid Build Coastguard Worker    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();
339*c8dee2aaSAndroid Build Coastguard Worker    let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();
340*c8dee2aaSAndroid Build Coastguard Worker    let mountains = PathKit.MakeFromOp(pathOne, pathTwo, PathKit.PathOp.UNION);
341*c8dee2aaSAndroid Build Coastguard Worker    // don't forget to do mountains.delete() when it goes out of scope.
342*c8dee2aaSAndroid Build Coastguard Worker    // Users can also do pathOne.op(pathTwo, PathKit.PathOp.UNION);
343*c8dee2aaSAndroid Build Coastguard Worker    // to have the resulting path be stored to pathOne and avoid allocating another object.
344*c8dee2aaSAndroid Build Coastguard Worker
345*c8dee2aaSAndroid Build Coastguard Worker#### `cubicYFromX(cpx1, cpy1, cpx2, cpy2, X)`
346*c8dee2aaSAndroid Build Coastguard Worker
347*c8dee2aaSAndroid Build Coastguard Worker**cpx1, cpy1, cpx2, cpy2** - `Number`, coordinates for control points. <br>
348*c8dee2aaSAndroid Build Coastguard Worker**X** - `Number`, The X coordinate for which to find the corresponding Y
349*c8dee2aaSAndroid Build Coastguard Workercoordinate.
350*c8dee2aaSAndroid Build Coastguard Worker
351*c8dee2aaSAndroid Build Coastguard WorkerFast evaluation of a cubic ease-in / ease-out curve. This is defined as a
352*c8dee2aaSAndroid Build Coastguard Workerparametric cubic curve inside the unit square. Makes the following assumptions:
353*c8dee2aaSAndroid Build Coastguard Worker
354*c8dee2aaSAndroid Build Coastguard Worker- pt[0] is implicitly { 0, 0 }
355*c8dee2aaSAndroid Build Coastguard Worker- pt[3] is implicitly { 1, 1 }
356*c8dee2aaSAndroid Build Coastguard Worker- pts[1, 2] are inside the unit square
357*c8dee2aaSAndroid Build Coastguard Worker
358*c8dee2aaSAndroid Build Coastguard WorkerThis returns the Y coordinate for the given X coordinate.
359*c8dee2aaSAndroid Build Coastguard Worker
360*c8dee2aaSAndroid Build Coastguard Worker#### `cubicPtFromT(cpx1, cpy1, cpx2, cpy2, T)`
361*c8dee2aaSAndroid Build Coastguard Worker
362*c8dee2aaSAndroid Build Coastguard Worker**cpx1, cpy1, cpx2, cpy2** - `Number`, coordinates for control points. <br>
363*c8dee2aaSAndroid Build Coastguard Worker**T** - `Number`, The T param for which to find the corresponding (X, Y)
364*c8dee2aaSAndroid Build Coastguard Workercoordinates.
365*c8dee2aaSAndroid Build Coastguard Worker
366*c8dee2aaSAndroid Build Coastguard WorkerFast evaluation of a cubic ease-in / ease-out curve. This is defined as a
367*c8dee2aaSAndroid Build Coastguard Workerparametric cubic curve inside the unit square. Makes the following assumptions:
368*c8dee2aaSAndroid Build Coastguard Worker
369*c8dee2aaSAndroid Build Coastguard Worker- pt[0] is implicitly { 0, 0 }
370*c8dee2aaSAndroid Build Coastguard Worker- pt[3] is implicitly { 1, 1 }
371*c8dee2aaSAndroid Build Coastguard Worker- pts[1, 2] are inside the unit square
372*c8dee2aaSAndroid Build Coastguard Worker
373*c8dee2aaSAndroid Build Coastguard WorkerThis returns the (X, Y) coordinate for the given T value as a length 2 array.
374*c8dee2aaSAndroid Build Coastguard Worker
375*c8dee2aaSAndroid Build Coastguard Worker### SkPath (object)
376*c8dee2aaSAndroid Build Coastguard Worker
377*c8dee2aaSAndroid Build Coastguard Worker#### `addPath(otherPath)`
378*c8dee2aaSAndroid Build Coastguard Worker
379*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, a path to append to this path
380*c8dee2aaSAndroid Build Coastguard Worker
381*c8dee2aaSAndroid Build Coastguard WorkerAdds the given path to `this` and then returns `this` for chaining purposes.
382*c8dee2aaSAndroid Build Coastguard Worker
383*c8dee2aaSAndroid Build Coastguard Worker#### `addPath(otherPath, transform)`
384*c8dee2aaSAndroid Build Coastguard Worker
385*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, a path to append to this path. <br> **transform** -
386*c8dee2aaSAndroid Build Coastguard Worker[SVGMatrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix), a
387*c8dee2aaSAndroid Build Coastguard Workertransform to apply to otherPath before appending it.
388*c8dee2aaSAndroid Build Coastguard Worker
389*c8dee2aaSAndroid Build Coastguard WorkerAdds the given path to `this` after applying the transform and then returns
390*c8dee2aaSAndroid Build Coastguard Worker`this` for chaining purposes. See
391*c8dee2aaSAndroid Build Coastguard Worker[Path2D.addPath()](https://developer.mozilla.org/en-US/docs/Web/API/Path2D/addPath)
392*c8dee2aaSAndroid Build Coastguard Workerfor more details.
393*c8dee2aaSAndroid Build Coastguard Worker
394*c8dee2aaSAndroid Build Coastguard Worker#### `addPath(otherPath, a, b, c, d, e, f)`
395*c8dee2aaSAndroid Build Coastguard Worker
396*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, a path to append to this path. <br> **a, b, c, d, e,
397*c8dee2aaSAndroid Build Coastguard Workerf** - `Number`, the six components of an
398*c8dee2aaSAndroid Build Coastguard Worker[SVGMatrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix), which
399*c8dee2aaSAndroid Build Coastguard Workerdefine the transform to apply to otherPath before appending it.
400*c8dee2aaSAndroid Build Coastguard Worker
401*c8dee2aaSAndroid Build Coastguard WorkerAdds the given path to `this` after applying the transform and then returns
402*c8dee2aaSAndroid Build Coastguard Worker`this` for chaining purposes. See
403*c8dee2aaSAndroid Build Coastguard Worker[Path2D.addPath()](https://developer.mozilla.org/en-US/docs/Web/API/Path2D/addPath)
404*c8dee2aaSAndroid Build Coastguard Workerfor more details.
405*c8dee2aaSAndroid Build Coastguard Worker
406*c8dee2aaSAndroid Build Coastguard WorkerExample:
407*c8dee2aaSAndroid Build Coastguard Worker
408*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
409*c8dee2aaSAndroid Build Coastguard Worker    let moreBoxes = PathKit.NewPath();
410*c8dee2aaSAndroid Build Coastguard Worker    // add box un-transformed (i.e. at 0, 0)
411*c8dee2aaSAndroid Build Coastguard Worker    moreBoxes.addPath(box)
412*c8dee2aaSAndroid Build Coastguard Worker    // the params fill out a 2d matrix like:
413*c8dee2aaSAndroid Build Coastguard Worker    //     a c e
414*c8dee2aaSAndroid Build Coastguard Worker    //     b d f
415*c8dee2aaSAndroid Build Coastguard Worker    //     0 0 1
416*c8dee2aaSAndroid Build Coastguard Worker    // add box 300 points to the right
417*c8dee2aaSAndroid Build Coastguard Worker             .addPath(box, 1, 0, 0, 1, 300, 0)
418*c8dee2aaSAndroid Build Coastguard Worker    // add a box shrunk by 50% in both directions
419*c8dee2aaSAndroid Build Coastguard Worker             .addPath(box, 0.5, 0, 0, 0.5, 0, 0);
420*c8dee2aaSAndroid Build Coastguard Worker    // moreBoxes now has 3 paths appended to it
421*c8dee2aaSAndroid Build Coastguard Worker
422*c8dee2aaSAndroid Build Coastguard Worker#### `addPath(otherPath, scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)`
423*c8dee2aaSAndroid Build Coastguard Worker
424*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, a path to append to this path. <br> **scaleX, skewX,
425*c8dee2aaSAndroid Build Coastguard WorkertransX, skewY, scaleY, transY, pers0, pers1, pers2** - `Number`, the nine
426*c8dee2aaSAndroid Build Coastguard Workercomponents of an
427*c8dee2aaSAndroid Build Coastguard Worker[Affine Matrix](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations),
428*c8dee2aaSAndroid Build Coastguard Workerwhich define the transform to apply to otherPath before appending it.
429*c8dee2aaSAndroid Build Coastguard Worker
430*c8dee2aaSAndroid Build Coastguard WorkerAdds the given path to `this` after applying the transform and then returns
431*c8dee2aaSAndroid Build Coastguard Worker`this` for chaining purposes.
432*c8dee2aaSAndroid Build Coastguard Worker
433*c8dee2aaSAndroid Build Coastguard WorkerExample:
434*c8dee2aaSAndroid Build Coastguard Worker
435*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
436*c8dee2aaSAndroid Build Coastguard Worker    let moreBoxes = PathKit.NewPath();
437*c8dee2aaSAndroid Build Coastguard Worker    // add box un-transformed (i.e. at 0, 0)
438*c8dee2aaSAndroid Build Coastguard Worker    moreBoxes.addPath(box)
439*c8dee2aaSAndroid Build Coastguard Worker    // add box 300 points to the right
440*c8dee2aaSAndroid Build Coastguard Worker             .addPath(box, 1, 0, 0,
441*c8dee2aaSAndroid Build Coastguard Worker                           0, 1, 300,
442*c8dee2aaSAndroid Build Coastguard Worker                           0, 0 ,1)
443*c8dee2aaSAndroid Build Coastguard Worker    // add a box shrunk by 50% in both directions
444*c8dee2aaSAndroid Build Coastguard Worker             .addPath(box, 0.5, 0,   0,
445*c8dee2aaSAndroid Build Coastguard Worker                           0,   0.5, 0,
446*c8dee2aaSAndroid Build Coastguard Worker                           0,   0,   1)
447*c8dee2aaSAndroid Build Coastguard Worker    // moreBoxes now has 3 paths appended to it
448*c8dee2aaSAndroid Build Coastguard Worker
449*c8dee2aaSAndroid Build Coastguard Worker#### `arc(x, y, radius, startAngle, endAngle, ccw=false)`
450*c8dee2aaSAndroid Build Coastguard Worker
451*c8dee2aaSAndroid Build Coastguard Worker**x, y** - `Number`, The coordinates of the arc's center. <br> **radius** -
452*c8dee2aaSAndroid Build Coastguard Worker`Number`, The radius of the arc. <br> **startAngle, endAngle** - `Number`, the
453*c8dee2aaSAndroid Build Coastguard Workerstart and end of the angle, measured clockwise from the positive x axis and in
454*c8dee2aaSAndroid Build Coastguard Workerradians. <br> **ccw** - `Boolean`, optional argument specifying if the arc
455*c8dee2aaSAndroid Build Coastguard Workershould be drawn counter-clockwise between **startAngle** and **endAngle**
456*c8dee2aaSAndroid Build Coastguard Workerinstead of clockwise, the default.
457*c8dee2aaSAndroid Build Coastguard Worker
458*c8dee2aaSAndroid Build Coastguard WorkerAdds the described arc to `this` then returns `this` for chaining purposes. See
459*c8dee2aaSAndroid Build Coastguard Worker[Path2D.arc()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arc)
460*c8dee2aaSAndroid Build Coastguard Workerfor more details.
461*c8dee2aaSAndroid Build Coastguard Worker
462*c8dee2aaSAndroid Build Coastguard WorkerExample:
463*c8dee2aaSAndroid Build Coastguard Worker
464*c8dee2aaSAndroid Build Coastguard Worker    let path = PathKit.NewPath();
465*c8dee2aaSAndroid Build Coastguard Worker    path.moveTo(20, 120);
466*c8dee2aaSAndroid Build Coastguard Worker        .arc(20, 120, 18, 0, 1.75 * Math.PI);
467*c8dee2aaSAndroid Build Coastguard Worker        .lineTo(20, 120);
468*c8dee2aaSAndroid Build Coastguard Worker    // path looks like a pie with a 1/8th slice removed.
469*c8dee2aaSAndroid Build Coastguard Worker
470*c8dee2aaSAndroid Build Coastguard Worker#### `arcTo(x1, y1, x2, y2, radius)`
471*c8dee2aaSAndroid Build Coastguard Worker
472*c8dee2aaSAndroid Build Coastguard Worker**x1, y1, x2, y2** - `Number`, The coordinates defining the control points. <br>
473*c8dee2aaSAndroid Build Coastguard Worker**radius** - `Number`, The radius of the arc.
474*c8dee2aaSAndroid Build Coastguard Worker
475*c8dee2aaSAndroid Build Coastguard WorkerAdds the described arc to `this` (appending a line, if needed) then returns
476*c8dee2aaSAndroid Build Coastguard Worker`this` for chaining purposes. See
477*c8dee2aaSAndroid Build Coastguard Worker[Path2D.arcTo()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arcTo)
478*c8dee2aaSAndroid Build Coastguard Workerfor more details.
479*c8dee2aaSAndroid Build Coastguard Worker
480*c8dee2aaSAndroid Build Coastguard Worker#### `close()` or `closePath()`
481*c8dee2aaSAndroid Build Coastguard Worker
482*c8dee2aaSAndroid Build Coastguard WorkerReturns the pen to the start of the current sub-path, then returns `this` for
483*c8dee2aaSAndroid Build Coastguard Workerchaining purposes. See
484*c8dee2aaSAndroid Build Coastguard Worker[Path2D.closePath()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/closePath)
485*c8dee2aaSAndroid Build Coastguard Workerfor more details.
486*c8dee2aaSAndroid Build Coastguard Worker
487*c8dee2aaSAndroid Build Coastguard Worker#### `computeTightBounds()`
488*c8dee2aaSAndroid Build Coastguard Worker
489*c8dee2aaSAndroid Build Coastguard WorkerReturns an `SkRect` that represents the minimum and maximum area of `this` path.
490*c8dee2aaSAndroid Build Coastguard WorkerSee
491*c8dee2aaSAndroid Build Coastguard Worker[SkPath reference](https://api.skia.org/classSkPath.html#a597c8fcc5e4750542e2688b057a14e9e)
492*c8dee2aaSAndroid Build Coastguard Workerfor more details.
493*c8dee2aaSAndroid Build Coastguard Worker
494*c8dee2aaSAndroid Build Coastguard Worker#### `conicTo(x1, y1, x2, y2, w)`
495*c8dee2aaSAndroid Build Coastguard Worker
496*c8dee2aaSAndroid Build Coastguard Worker**x1, y1, x2, y2** - `Number`, The coordinates defining the control point and
497*c8dee2aaSAndroid Build Coastguard Workerthe end point. <br> **w** - `Number`, The weight of the conic.
498*c8dee2aaSAndroid Build Coastguard Worker
499*c8dee2aaSAndroid Build Coastguard WorkerAdds the described conic line to `this` (appending a line, if needed) then
500*c8dee2aaSAndroid Build Coastguard Workerreturns `this` for chaining purposes. See
501*c8dee2aaSAndroid Build Coastguard Worker[SkPath reference](https://api.skia.org/classSkPath.html#a9edc41978765cfe9a0b16e9ecf4d276e)
502*c8dee2aaSAndroid Build Coastguard Workerfor more details.
503*c8dee2aaSAndroid Build Coastguard Worker
504*c8dee2aaSAndroid Build Coastguard Worker#### `copy()`
505*c8dee2aaSAndroid Build Coastguard Worker
506*c8dee2aaSAndroid Build Coastguard WorkerReturn a copy of `this` path.
507*c8dee2aaSAndroid Build Coastguard Worker
508*c8dee2aaSAndroid Build Coastguard Worker#### `cubicTo(cp1x, cp1y, cp2x, cp2y, x, y)` or `bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)`
509*c8dee2aaSAndroid Build Coastguard Worker
510*c8dee2aaSAndroid Build Coastguard Worker**cp1x, cp1y, cp2x, cp2y** - `Number`, The coordinates defining the control
511*c8dee2aaSAndroid Build Coastguard Workerpoints. <br> **x,y** - `Number`, The coordinates defining the end point
512*c8dee2aaSAndroid Build Coastguard Worker
513*c8dee2aaSAndroid Build Coastguard WorkerAdds the described cubic line to `this` (appending a line, if needed) then
514*c8dee2aaSAndroid Build Coastguard Workerreturns `this` for chaining purposes. See
515*c8dee2aaSAndroid Build Coastguard Worker[Path2D.bezierCurveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo)
516*c8dee2aaSAndroid Build Coastguard Workerfor more details.
517*c8dee2aaSAndroid Build Coastguard Worker
518*c8dee2aaSAndroid Build Coastguard Worker#### `dash(on, off, phase)`
519*c8dee2aaSAndroid Build Coastguard Worker
520*c8dee2aaSAndroid Build Coastguard Worker**on, off** - `Number`, The number of pixels the dash should be on (drawn) and
521*c8dee2aaSAndroid Build Coastguard Workeroff (blank). <br> **phase** - `Number`, The number of pixels the on/off should
522*c8dee2aaSAndroid Build Coastguard Workerbe offset (mod **on** + **off**)
523*c8dee2aaSAndroid Build Coastguard Worker
524*c8dee2aaSAndroid Build Coastguard WorkerApplies a dashed path effect to `this` then returns `this` for chaining
525*c8dee2aaSAndroid Build Coastguard Workerpurposes. See the "Dash" effect above for a visual example.
526*c8dee2aaSAndroid Build Coastguard Worker
527*c8dee2aaSAndroid Build Coastguard WorkerExample:
528*c8dee2aaSAndroid Build Coastguard Worker
529*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
530*c8dee2aaSAndroid Build Coastguard Worker    box.dash(20, 10, 3);
531*c8dee2aaSAndroid Build Coastguard Worker    // box is now a dashed rectangle that will draw for 20 pixels, then
532*c8dee2aaSAndroid Build Coastguard Worker    // stop for 10 pixels.  Since phase is 3, the first line won't start
533*c8dee2aaSAndroid Build Coastguard Worker    // at (0, 0), but 3 pixels around the path (3, 0)
534*c8dee2aaSAndroid Build Coastguard Worker
535*c8dee2aaSAndroid Build Coastguard Worker#### `ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, ccw=false)`
536*c8dee2aaSAndroid Build Coastguard Worker
537*c8dee2aaSAndroid Build Coastguard Worker**x, y** - `Number`, The coordinates of the center of the ellipse. <br>
538*c8dee2aaSAndroid Build Coastguard Worker**radiusX, radiusY** - `Number`, The radii in the X and Y directions. <br>
539*c8dee2aaSAndroid Build Coastguard Worker**rotation** - `Number`, The rotation in radians of this ellipse. <br>
540*c8dee2aaSAndroid Build Coastguard Worker**startAngle, endAngle** - `Number`, the starting and ending angles of which to
541*c8dee2aaSAndroid Build Coastguard Workerdraw, measured in radians from the positive x axis. <br> **ccw** - `Boolean`,
542*c8dee2aaSAndroid Build Coastguard Workeroptional argument specifying if the ellipse should be drawn counter-clockwise
543*c8dee2aaSAndroid Build Coastguard Workerbetween **startAngle** and **endAngle** instead of clockwise, the default.
544*c8dee2aaSAndroid Build Coastguard Worker
545*c8dee2aaSAndroid Build Coastguard WorkerAdds the described ellipse to `this` then returns `this` for chaining purposes.
546*c8dee2aaSAndroid Build Coastguard WorkerSee
547*c8dee2aaSAndroid Build Coastguard Worker[Path2D.ellipse](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse)
548*c8dee2aaSAndroid Build Coastguard Workerfor more details.
549*c8dee2aaSAndroid Build Coastguard Worker
550*c8dee2aaSAndroid Build Coastguard Worker#### `equals(otherPath)`
551*c8dee2aaSAndroid Build Coastguard Worker
552*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, the path to compare to.
553*c8dee2aaSAndroid Build Coastguard Worker
554*c8dee2aaSAndroid Build Coastguard WorkerReturns a `Boolean` value based on if `this` path is equal to **otherPath**.
555*c8dee2aaSAndroid Build Coastguard Worker
556*c8dee2aaSAndroid Build Coastguard Worker#### `getBounds()`
557*c8dee2aaSAndroid Build Coastguard Worker
558*c8dee2aaSAndroid Build Coastguard WorkerReturns an `SkRect` that represents the minimum and maximum area of `this` path.
559*c8dee2aaSAndroid Build Coastguard WorkerSee
560*c8dee2aaSAndroid Build Coastguard Worker[SkPath reference](https://api.skia.org/classSkPath.html#ac60188dc6075d6ebb56b5398fbba0c10)
561*c8dee2aaSAndroid Build Coastguard Workerfor more details.
562*c8dee2aaSAndroid Build Coastguard Worker
563*c8dee2aaSAndroid Build Coastguard Worker#### `getFillType()`
564*c8dee2aaSAndroid Build Coastguard Worker
565*c8dee2aaSAndroid Build Coastguard WorkerReturns a `FillType` based on what this path is. This defaults to
566*c8dee2aaSAndroid Build Coastguard Worker`PathKit.FillType.WINDING`, but may change with `op()` or `simplify()`.
567*c8dee2aaSAndroid Build Coastguard Worker
568*c8dee2aaSAndroid Build Coastguard WorkerClients will typically want `getFillTypeString()` because that value can be
569*c8dee2aaSAndroid Build Coastguard Workerpassed directly to an SVG or Canvas.
570*c8dee2aaSAndroid Build Coastguard Worker
571*c8dee2aaSAndroid Build Coastguard Worker#### `getFillTypeString()`
572*c8dee2aaSAndroid Build Coastguard Worker
573*c8dee2aaSAndroid Build Coastguard WorkerReturns a `String` representing the fillType of `this` path. The values are
574*c8dee2aaSAndroid Build Coastguard Workereither "nonzero" or "evenodd".
575*c8dee2aaSAndroid Build Coastguard Worker
576*c8dee2aaSAndroid Build Coastguard WorkerExample:
577*c8dee2aaSAndroid Build Coastguard Worker
578*c8dee2aaSAndroid Build Coastguard Worker    let path = ...;
579*c8dee2aaSAndroid Build Coastguard Worker    let ctx = document.getElementById('canvas1').getContext('2d');
580*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = 'green';
581*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill(path.toPath2D(), path.getFillTypeString());
582*c8dee2aaSAndroid Build Coastguard Worker
583*c8dee2aaSAndroid Build Coastguard Worker#### `moveTo(x, y)`
584*c8dee2aaSAndroid Build Coastguard Worker
585*c8dee2aaSAndroid Build Coastguard Worker**x, y** - `Number`, The coordinates of where the pen should be moved to.
586*c8dee2aaSAndroid Build Coastguard Worker
587*c8dee2aaSAndroid Build Coastguard WorkerMoves the pen (without drawing) to the given coordinates then returns `this` for
588*c8dee2aaSAndroid Build Coastguard Workerchaining purposes. See
589*c8dee2aaSAndroid Build Coastguard Worker[Path2D.moveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/moveTo)
590*c8dee2aaSAndroid Build Coastguard Workerfor more details.
591*c8dee2aaSAndroid Build Coastguard Worker
592*c8dee2aaSAndroid Build Coastguard Worker#### `lineTo(x, y)`
593*c8dee2aaSAndroid Build Coastguard Worker
594*c8dee2aaSAndroid Build Coastguard Worker**x, y** - `Number`, The coordinates of where the pen should be moved to.
595*c8dee2aaSAndroid Build Coastguard Worker
596*c8dee2aaSAndroid Build Coastguard WorkerDraws a straight line to the given coordinates then returns `this` for chaining
597*c8dee2aaSAndroid Build Coastguard Workerpurposes. See
598*c8dee2aaSAndroid Build Coastguard Worker[Path2D.lineTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineTo)
599*c8dee2aaSAndroid Build Coastguard Workerfor more details.
600*c8dee2aaSAndroid Build Coastguard Worker
601*c8dee2aaSAndroid Build Coastguard Worker#### `op(otherPath, operation)`
602*c8dee2aaSAndroid Build Coastguard Worker
603*c8dee2aaSAndroid Build Coastguard Worker**otherPath** - `SkPath`, The other path to be combined with `this`. <br>
604*c8dee2aaSAndroid Build Coastguard Worker**operation** - `PathOp`, The operation to apply to the two paths.
605*c8dee2aaSAndroid Build Coastguard Worker
606*c8dee2aaSAndroid Build Coastguard WorkerCombines otherPath into `this` path with the given operation and returns `this`
607*c8dee2aaSAndroid Build Coastguard Workerfor chaining purposes.
608*c8dee2aaSAndroid Build Coastguard Worker
609*c8dee2aaSAndroid Build Coastguard WorkerExample:
610*c8dee2aaSAndroid Build Coastguard Worker
611*c8dee2aaSAndroid Build Coastguard Worker    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();
612*c8dee2aaSAndroid Build Coastguard Worker    let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();
613*c8dee2aaSAndroid Build Coastguard Worker    // Combine the two triangles to look like two mountains
614*c8dee2aaSAndroid Build Coastguard Worker    let mountains = pathOne.copy().op(pathOne, pathTwo, PathKit.PathOp.UNION);
615*c8dee2aaSAndroid Build Coastguard Worker    // set pathOne to be the small triangle where pathOne and pathTwo overlap
616*c8dee2aaSAndroid Build Coastguard Worker    pathOne.op(pathOne, pathTwo, PathKit.PathOp.INTERSECT);
617*c8dee2aaSAndroid Build Coastguard Worker    // since copy() was called, don't forget to call delete() on mountains.
618*c8dee2aaSAndroid Build Coastguard Worker
619*c8dee2aaSAndroid Build Coastguard Worker#### `quadTo(cpx, cpy, x, y)` or `quadraticCurveTo(cpx, cpy, x, y)`
620*c8dee2aaSAndroid Build Coastguard Worker
621*c8dee2aaSAndroid Build Coastguard Worker**cpx, cpy** - `Number`, The coordinates for the control point. <br> **x, y** -
622*c8dee2aaSAndroid Build Coastguard Worker`Number`, The coordinates for the end point.
623*c8dee2aaSAndroid Build Coastguard Worker
624*c8dee2aaSAndroid Build Coastguard WorkerDraws a quadratic Bézier curve with the given coordinates then returns `this`
625*c8dee2aaSAndroid Build Coastguard Workerfor chaining purposes. See
626*c8dee2aaSAndroid Build Coastguard Worker[Path2D.quadraticCurveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/quadraticCurveTo)
627*c8dee2aaSAndroid Build Coastguard Workerfor more details.
628*c8dee2aaSAndroid Build Coastguard Worker
629*c8dee2aaSAndroid Build Coastguard Worker#### `rect(x, y, w, h)`
630*c8dee2aaSAndroid Build Coastguard Worker
631*c8dee2aaSAndroid Build Coastguard Worker**x, y** - `Number`, The coordinates of the upper-left corner of the rectangle.
632*c8dee2aaSAndroid Build Coastguard Worker<br> **w, h** - `Number`, The width and height of the rectangle
633*c8dee2aaSAndroid Build Coastguard Worker
634*c8dee2aaSAndroid Build Coastguard WorkerDraws a rectangle on `this`, then returns `this` for chaining purposes. See
635*c8dee2aaSAndroid Build Coastguard Worker[Path2D.rect](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/rect)
636*c8dee2aaSAndroid Build Coastguard Workerfor more details.
637*c8dee2aaSAndroid Build Coastguard Worker
638*c8dee2aaSAndroid Build Coastguard Worker#### `setFillType(fillType)`
639*c8dee2aaSAndroid Build Coastguard Worker
640*c8dee2aaSAndroid Build Coastguard Worker**fillType** - `FillType`, the new fillType.
641*c8dee2aaSAndroid Build Coastguard Worker
642*c8dee2aaSAndroid Build Coastguard WorkerSet the fillType of the path. See
643*c8dee2aaSAndroid Build Coastguard Worker[SkPath reference](https://api.skia.org/SkPathTypes_8h.html#acc5b8721019c4a4b1beb8c759baab011)
644*c8dee2aaSAndroid Build Coastguard Workerfor more details.
645*c8dee2aaSAndroid Build Coastguard Worker
646*c8dee2aaSAndroid Build Coastguard Worker#### `simplify()`
647*c8dee2aaSAndroid Build Coastguard Worker
648*c8dee2aaSAndroid Build Coastguard WorkerSet `this` path to a set of _non-overlapping_ contours that describe the same
649*c8dee2aaSAndroid Build Coastguard Workerarea as the original path. See the "Simplify" effect above for a visual example.
650*c8dee2aaSAndroid Build Coastguard Worker
651*c8dee2aaSAndroid Build Coastguard Worker#### `stroke(opts)`
652*c8dee2aaSAndroid Build Coastguard Worker
653*c8dee2aaSAndroid Build Coastguard Worker**opts** - `StrokeOpts`, contains the options for stroking.
654*c8dee2aaSAndroid Build Coastguard Worker
655*c8dee2aaSAndroid Build Coastguard WorkerStrokes `this` path out with the given options. This can be used for a variety
656*c8dee2aaSAndroid Build Coastguard Workerof effects. See the "Stroke", "Grow", and "Shrink" effects above for visual
657*c8dee2aaSAndroid Build Coastguard Workerexamples.
658*c8dee2aaSAndroid Build Coastguard Worker
659*c8dee2aaSAndroid Build Coastguard WorkerExample:
660*c8dee2aaSAndroid Build Coastguard Worker
661*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
662*c8dee2aaSAndroid Build Coastguard Worker    // Stroke the path with width 10 and rounded corners
663*c8dee2aaSAndroid Build Coastguard Worker    let rounded = box.copy().stroke({width: 10, join: PathKit.StrokeJoin.ROUND});
664*c8dee2aaSAndroid Build Coastguard Worker    // Grow effect, that is, a 20 pixel expansion around the box.
665*c8dee2aaSAndroid Build Coastguard Worker    let grow = box.copy().stroke({width: 20}).op(box, PathKit.PathOp.DIFFERENCE);
666*c8dee2aaSAndroid Build Coastguard Worker    // Shrink effect, in which we subtract away from the original
667*c8dee2aaSAndroid Build Coastguard Worker    let simplified = box.copy().simplify(); // sometimes required for complicated paths
668*c8dee2aaSAndroid Build Coastguard Worker    let shrink = box.copy().stroke({width: 15, cap: PathKit.StrokeCap.BUTT})
669*c8dee2aaSAndroid Build Coastguard Worker                           .op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);
670*c8dee2aaSAndroid Build Coastguard Worker    // Don't forget to call delete() on each of the copies!
671*c8dee2aaSAndroid Build Coastguard Worker
672*c8dee2aaSAndroid Build Coastguard Worker#### `toCanvas(ctx)`
673*c8dee2aaSAndroid Build Coastguard Worker
674*c8dee2aaSAndroid Build Coastguard Worker**ctx** - `Canvas2DContext`, Canvas on which to draw the path.
675*c8dee2aaSAndroid Build Coastguard Worker
676*c8dee2aaSAndroid Build Coastguard WorkerDraws `this` path on the passed in
677*c8dee2aaSAndroid Build Coastguard Worker[Canvas Context](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D).
678*c8dee2aaSAndroid Build Coastguard Worker
679*c8dee2aaSAndroid Build Coastguard WorkerExample:
680*c8dee2aaSAndroid Build Coastguard Worker
681*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
682*c8dee2aaSAndroid Build Coastguard Worker    let ctx = document.getElementById('canvas1').getContext('2d');
683*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = 'green';
684*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
685*c8dee2aaSAndroid Build Coastguard Worker    box.toCanvas(ctx);
686*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();  // could also ctx.fill()
687*c8dee2aaSAndroid Build Coastguard Worker
688*c8dee2aaSAndroid Build Coastguard Worker#### `toCmds()`
689*c8dee2aaSAndroid Build Coastguard Worker
690*c8dee2aaSAndroid Build Coastguard WorkerReturns a 2D Array of verbs and args. See `PathKit.FromCmds()` for more details.
691*c8dee2aaSAndroid Build Coastguard Worker
692*c8dee2aaSAndroid Build Coastguard Worker#### `toPath2D()`
693*c8dee2aaSAndroid Build Coastguard Worker
694*c8dee2aaSAndroid Build Coastguard WorkerReturns a [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D)
695*c8dee2aaSAndroid Build Coastguard Workerobject that has the same operations as `this` path.
696*c8dee2aaSAndroid Build Coastguard Worker
697*c8dee2aaSAndroid Build Coastguard WorkerExample:
698*c8dee2aaSAndroid Build Coastguard Worker
699*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
700*c8dee2aaSAndroid Build Coastguard Worker    let ctx = document.getElementById('canvas1').getContext('2d');
701*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = 'green';
702*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke(box.toPath2D());
703*c8dee2aaSAndroid Build Coastguard Worker
704*c8dee2aaSAndroid Build Coastguard Worker#### `toSVGString()`
705*c8dee2aaSAndroid Build Coastguard Worker
706*c8dee2aaSAndroid Build Coastguard WorkerReturns a `String` representing an
707*c8dee2aaSAndroid Build Coastguard Worker[SVGPath](https://www.w3schools.com/graphics/svg_path.asp) based on `this` path.
708*c8dee2aaSAndroid Build Coastguard Worker
709*c8dee2aaSAndroid Build Coastguard WorkerExample:
710*c8dee2aaSAndroid Build Coastguard Worker
711*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
712*c8dee2aaSAndroid Build Coastguard Worker    let svg = document.getElementById('svg1');
713*c8dee2aaSAndroid Build Coastguard Worker    let newPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
714*c8dee2aaSAndroid Build Coastguard Worker    newPath.setAttribute('stroke', 'green');
715*c8dee2aaSAndroid Build Coastguard Worker    newPath.setAttribute('fill', 'white');
716*c8dee2aaSAndroid Build Coastguard Worker    newPath.setAttribute('d', box.toSVGString());
717*c8dee2aaSAndroid Build Coastguard Worker    svg.appendChild(newPath);
718*c8dee2aaSAndroid Build Coastguard Worker
719*c8dee2aaSAndroid Build Coastguard Worker#### `transform(matr)`
720*c8dee2aaSAndroid Build Coastguard Worker
721*c8dee2aaSAndroid Build Coastguard Worker**matr** - `SkMatrix`, i.e. an `Array<Number>` of the nine numbers of an Affine
722*c8dee2aaSAndroid Build Coastguard WorkerTransform Matrix.
723*c8dee2aaSAndroid Build Coastguard Worker
724*c8dee2aaSAndroid Build Coastguard WorkerApplies the specified
725*c8dee2aaSAndroid Build Coastguard Worker[transform](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations)
726*c8dee2aaSAndroid Build Coastguard Workerto `this` and then returns `this` for chaining purposes.
727*c8dee2aaSAndroid Build Coastguard Worker
728*c8dee2aaSAndroid Build Coastguard Worker#### `transform(scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)`
729*c8dee2aaSAndroid Build Coastguard Worker
730*c8dee2aaSAndroid Build Coastguard Worker**scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2** -
731*c8dee2aaSAndroid Build Coastguard Worker`Number`, the nine numbers of an Affine Transform Matrix.
732*c8dee2aaSAndroid Build Coastguard Worker
733*c8dee2aaSAndroid Build Coastguard WorkerApplies the specified
734*c8dee2aaSAndroid Build Coastguard Worker[transform](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations)
735*c8dee2aaSAndroid Build Coastguard Workerto `this` and then returns `this` for chaining purposes.
736*c8dee2aaSAndroid Build Coastguard Worker
737*c8dee2aaSAndroid Build Coastguard WorkerExample:
738*c8dee2aaSAndroid Build Coastguard Worker
739*c8dee2aaSAndroid Build Coastguard Worker    let path = PathKit.NewPath().rect(0, 0, 100, 100);
740*c8dee2aaSAndroid Build Coastguard Worker    // scale up the path by 5x
741*c8dee2aaSAndroid Build Coastguard Worker    path.transform([5, 0, 0,
742*c8dee2aaSAndroid Build Coastguard Worker                    0, 5, 0,
743*c8dee2aaSAndroid Build Coastguard Worker                    0, 0, 1]);
744*c8dee2aaSAndroid Build Coastguard Worker    // move the path 75 px to the right.
745*c8dee2aaSAndroid Build Coastguard Worker    path.transform(1, 0, 75,
746*c8dee2aaSAndroid Build Coastguard Worker                   0, 1, 0,
747*c8dee2aaSAndroid Build Coastguard Worker                   0, 0, 1);
748*c8dee2aaSAndroid Build Coastguard Worker
749*c8dee2aaSAndroid Build Coastguard Worker#### `trim(startT, stopT, isComplement=false)`
750*c8dee2aaSAndroid Build Coastguard Worker
751*c8dee2aaSAndroid Build Coastguard Worker**startT, stopT** - `Number`, values in [0, 1] that indicate the start and stop
752*c8dee2aaSAndroid Build Coastguard Worker"percentages" of the path to draw <br> **isComplement** - `Boolean`, If the
753*c8dee2aaSAndroid Build Coastguard Workercomplement of the trimmed section should be drawn instead of the areas between
754*c8dee2aaSAndroid Build Coastguard Worker**startT** and **stopT**.
755*c8dee2aaSAndroid Build Coastguard Worker
756*c8dee2aaSAndroid Build Coastguard WorkerSets `this` path to be a subset of the original path, then returns `this` for
757*c8dee2aaSAndroid Build Coastguard Workerchaining purposes. See the "Trim" effect above for a visual example.
758*c8dee2aaSAndroid Build Coastguard Worker
759*c8dee2aaSAndroid Build Coastguard WorkerExample:
760*c8dee2aaSAndroid Build Coastguard Worker
761*c8dee2aaSAndroid Build Coastguard Worker    let box = PathKit.NewPath().rect(0, 0, 100, 100);
762*c8dee2aaSAndroid Build Coastguard Worker    box.trim(0.25, 1.0);
763*c8dee2aaSAndroid Build Coastguard Worker    // box is now the 3 segments that look like a U
764*c8dee2aaSAndroid Build Coastguard Worker    // (the top segment has been removed).
765*c8dee2aaSAndroid Build Coastguard Worker
766*c8dee2aaSAndroid Build Coastguard Worker### SkOpBuilder (object)
767*c8dee2aaSAndroid Build Coastguard Worker
768*c8dee2aaSAndroid Build Coastguard WorkerThis object enables chaining multiple PathOps together. Create one with
769*c8dee2aaSAndroid Build Coastguard Worker`let builder = new PathKit.SkOpBuilder();` When created, the internal state is
770*c8dee2aaSAndroid Build Coastguard Worker"empty path". Don't forget to call `delete()` on both the builder and the result
771*c8dee2aaSAndroid Build Coastguard Workerof `resolve()`
772*c8dee2aaSAndroid Build Coastguard Worker
773*c8dee2aaSAndroid Build Coastguard Worker#### `add(path, operation)`
774*c8dee2aaSAndroid Build Coastguard Worker
775*c8dee2aaSAndroid Build Coastguard Worker**path** - `SkPath`, The path to be combined with the given rule. <br>
776*c8dee2aaSAndroid Build Coastguard Worker**operation** - `PathOp`, The operation to apply to the two paths.
777*c8dee2aaSAndroid Build Coastguard Worker
778*c8dee2aaSAndroid Build Coastguard WorkerAdds a path and the operand to the builder.
779*c8dee2aaSAndroid Build Coastguard Worker
780*c8dee2aaSAndroid Build Coastguard Worker#### `make()` or `resolve()`
781*c8dee2aaSAndroid Build Coastguard Worker
782*c8dee2aaSAndroid Build Coastguard WorkerCreates and returns a new `SkPath` based on all the given paths and operands.
783*c8dee2aaSAndroid Build Coastguard Worker
784*c8dee2aaSAndroid Build Coastguard WorkerDon't forget to call `.delete()` on the returned path when it goes out of scope.
785*c8dee2aaSAndroid Build Coastguard Worker
786*c8dee2aaSAndroid Build Coastguard Worker### SkMatrix (struct)
787*c8dee2aaSAndroid Build Coastguard Worker
788*c8dee2aaSAndroid Build Coastguard Worker`SkMatrix` translates between a C++ struct and a JS Array. It basically takes a
789*c8dee2aaSAndroid Build Coastguard Workernine element 1D Array and turns it into a 3x3 2D Affine Matrix.
790*c8dee2aaSAndroid Build Coastguard Worker
791*c8dee2aaSAndroid Build Coastguard Worker### SkRect (struct)
792*c8dee2aaSAndroid Build Coastguard Worker
793*c8dee2aaSAndroid Build Coastguard Worker`SkRect` translates between a C++ struct and a JS Object with the following keys
794*c8dee2aaSAndroid Build Coastguard Worker(all values are `Number`:
795*c8dee2aaSAndroid Build Coastguard Worker
796*c8dee2aaSAndroid Build Coastguard Worker- **fLeft**: x coordinate of top-left corner
797*c8dee2aaSAndroid Build Coastguard Worker- **fTop**: y coordinate of top-left corner
798*c8dee2aaSAndroid Build Coastguard Worker- **fRight**: x coordinate of bottom-right corner
799*c8dee2aaSAndroid Build Coastguard Worker- **fBottom**: y coordinate of bottom-rightcorner
800*c8dee2aaSAndroid Build Coastguard Worker
801*c8dee2aaSAndroid Build Coastguard Worker### StrokeOpts (struct)
802*c8dee2aaSAndroid Build Coastguard Worker
803*c8dee2aaSAndroid Build Coastguard Worker`StrokeOpts` translates between a C++ struct and a JS Object with the following
804*c8dee2aaSAndroid Build Coastguard Workerkeys:
805*c8dee2aaSAndroid Build Coastguard Worker
806*c8dee2aaSAndroid Build Coastguard Worker- **width**, `Number` the width of the lines of the path. Default 1.
807*c8dee2aaSAndroid Build Coastguard Worker- **miter_limit**, `Number`, the miter limit. Defautl 4. See
808*c8dee2aaSAndroid Build Coastguard Worker  [SkPaint reference](https://api.skia.org/classSkPaint.html#a2e767abfeb7795ed251a08b5ed85033f)
809*c8dee2aaSAndroid Build Coastguard Worker  for more details.
810*c8dee2aaSAndroid Build Coastguard Worker- **join**, `StrokeJoin`, the join to use. Default `PathKit.StrokeJoin.MITER`.
811*c8dee2aaSAndroid Build Coastguard Worker  See
812*c8dee2aaSAndroid Build Coastguard Worker  [SkPaint reference](https://api.skia.org/classSkPaint.html#ac582b0cbf59909c9056de34a6b977cca)
813*c8dee2aaSAndroid Build Coastguard Worker  for more details.
814*c8dee2aaSAndroid Build Coastguard Worker- **cap**, `StrokeCap`, the cap to use. Default `PathKit.StrokeCap.BUTT`. See
815*c8dee2aaSAndroid Build Coastguard Worker  [SkPaint reference](https://api.skia.org/classSkPaint.html#a0f78de8559b795defba93171f6cb6333)
816*c8dee2aaSAndroid Build Coastguard Worker  for more details.
817*c8dee2aaSAndroid Build Coastguard Worker
818*c8dee2aaSAndroid Build Coastguard Worker### PathOp (enum)
819*c8dee2aaSAndroid Build Coastguard Worker
820*c8dee2aaSAndroid Build Coastguard WorkerThe following enum values are exposed. They are essentially constant objects,
821*c8dee2aaSAndroid Build Coastguard Workerdifferentiated by their `.value` property.
822*c8dee2aaSAndroid Build Coastguard Worker
823*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.PathOp.DIFFERENCE`
824*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.PathOp.INTERSECT`
825*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.PathOp.REVERSE_DIFFERENCE`
826*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.PathOp.UNION`
827*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.PathOp.XOR`
828*c8dee2aaSAndroid Build Coastguard Worker
829*c8dee2aaSAndroid Build Coastguard WorkerThese are used in `PathKit.MakeFromOp()` and `SkPath.op()`.
830*c8dee2aaSAndroid Build Coastguard Worker
831*c8dee2aaSAndroid Build Coastguard Worker### FillType (enum)
832*c8dee2aaSAndroid Build Coastguard Worker
833*c8dee2aaSAndroid Build Coastguard WorkerThe following enum values are exposed. They are essentially constant objects,
834*c8dee2aaSAndroid Build Coastguard Workerdifferentiated by their `.value` property.
835*c8dee2aaSAndroid Build Coastguard Worker
836*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.FillType.WINDING` (also known as nonzero)
837*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.FillType.EVENODD`
838*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.FillType.INVERSE_WINDING`
839*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.FillType.INVERSE_EVENODD`
840*c8dee2aaSAndroid Build Coastguard Worker
841*c8dee2aaSAndroid Build Coastguard WorkerThese are used by `SkPath.getFillType()` and `SkPath.setFillType()`, but
842*c8dee2aaSAndroid Build Coastguard Workergenerally clients will want `SkPath.getFillTypeString()`.
843*c8dee2aaSAndroid Build Coastguard Worker
844*c8dee2aaSAndroid Build Coastguard Worker### StrokeJoin (enum)
845*c8dee2aaSAndroid Build Coastguard Worker
846*c8dee2aaSAndroid Build Coastguard WorkerThe following enum values are exposed. They are essentially constant objects,
847*c8dee2aaSAndroid Build Coastguard Workerdifferentiated by their `.value` property.
848*c8dee2aaSAndroid Build Coastguard Worker
849*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeJoin.MITER`
850*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeJoin.ROUND`
851*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeJoin.BEVEL`
852*c8dee2aaSAndroid Build Coastguard Worker
853*c8dee2aaSAndroid Build Coastguard WorkerSee
854*c8dee2aaSAndroid Build Coastguard Worker[SkPaint reference](https://api.skia.org/classSkPaint.html#ac582b0cbf59909c9056de34a6b977cca)
855*c8dee2aaSAndroid Build Coastguard Workerfor more details.
856*c8dee2aaSAndroid Build Coastguard Worker
857*c8dee2aaSAndroid Build Coastguard Worker### StrokeCap (enum)
858*c8dee2aaSAndroid Build Coastguard Worker
859*c8dee2aaSAndroid Build Coastguard WorkerThe following enum values are exposed. They are essentially constant objects,
860*c8dee2aaSAndroid Build Coastguard Workerdifferentiated by their `.value` property.
861*c8dee2aaSAndroid Build Coastguard Worker
862*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeCap.BUTT`
863*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeCap.ROUND`
864*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.StrokeCap.SQUARE`
865*c8dee2aaSAndroid Build Coastguard Worker
866*c8dee2aaSAndroid Build Coastguard WorkerSee
867*c8dee2aaSAndroid Build Coastguard Worker[SkPaint reference](https://api.skia.org/classSkPaint.html#a0f78de8559b795defba93171f6cb6333)
868*c8dee2aaSAndroid Build Coastguard Workerfor more details.
869*c8dee2aaSAndroid Build Coastguard Worker
870*c8dee2aaSAndroid Build Coastguard Worker### Constants
871*c8dee2aaSAndroid Build Coastguard Worker
872*c8dee2aaSAndroid Build Coastguard WorkerThe following constants are exposed:
873*c8dee2aaSAndroid Build Coastguard Worker
874*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.MOVE_VERB` = 0
875*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.LINE_VERB` = 1
876*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.QUAD_VERB` = 2
877*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.CONIC_VERB` = 3
878*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.CUBIC_VERB` = 4
879*c8dee2aaSAndroid Build Coastguard Worker- `PathKit.CLOSE_VERB` = 5
880*c8dee2aaSAndroid Build Coastguard Worker
881*c8dee2aaSAndroid Build Coastguard WorkerThese are only needed for `PathKit.FromCmds()`.
882*c8dee2aaSAndroid Build Coastguard Worker
883*c8dee2aaSAndroid Build Coastguard Worker### Functions for testing only
884*c8dee2aaSAndroid Build Coastguard Worker
885*c8dee2aaSAndroid Build Coastguard Worker#### `PathKit.LTRBRect(left, top, right, bottom)`
886*c8dee2aaSAndroid Build Coastguard Worker
887*c8dee2aaSAndroid Build Coastguard Worker**left** - `Number`, x coordinate of top-left corner of the `SkRect`. <br>
888*c8dee2aaSAndroid Build Coastguard Worker**top** - `Number`, y coordinate of top-left corner of the `SkRect`. <br>
889*c8dee2aaSAndroid Build Coastguard Worker**right** - `Number`, x coordinate of bottom-right corner of the `SkRect`. <br>
890*c8dee2aaSAndroid Build Coastguard Worker**bottom** - `Number`, y coordinate of bottom-right corner of the `SkRect`.
891*c8dee2aaSAndroid Build Coastguard Worker
892*c8dee2aaSAndroid Build Coastguard WorkerReturns an `SkRect` object with the given params.
893*c8dee2aaSAndroid Build Coastguard Worker
894*c8dee2aaSAndroid Build Coastguard Worker#### `SkPath.dump()`
895*c8dee2aaSAndroid Build Coastguard Worker
896*c8dee2aaSAndroid Build Coastguard WorkerPrints all the verbs and arguments to the console. Only available on Debug and
897*c8dee2aaSAndroid Build Coastguard WorkerTest builds.
898