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