|  | describe('PathKit\'s Pathops', function() { | 
|  | // see https://fiddle.skia.org/c/@discrete_path | 
|  | function drawStar(X=128, Y=128, R=116) { | 
|  | let p = PathKit.NewPath(); | 
|  | p.moveTo(X + R, Y); | 
|  | for (let i = 1; i < 8; i++) { | 
|  | let a = 2.6927937 * i; | 
|  | p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a)); | 
|  | } | 
|  | p.closePath(); | 
|  | return p; | 
|  | } | 
|  |  | 
|  | it('pathops_simplify', function(done) { | 
|  | function setup(ctx) { | 
|  | ctx.path = drawStar(); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = ctx.path.copy().simplify(); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_simplify', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | it('pathops_diff', function(done) { | 
|  | function setup(ctx) { | 
|  | // Values chosen abitrarily to have some overlap and some not. | 
|  | ctx.path1 = drawStar(X=120, Y=120); | 
|  | ctx.path2 = drawStar(X=140, Y=145); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.DIFFERENCE); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path1.delete(); | 
|  | ctx.path2.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_diff', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | it('pathops_intersect', function(done) { | 
|  | function setup(ctx) { | 
|  | // Values chosen abitrarily to have some overlap and some not. | 
|  | ctx.path1 = drawStar(X=120, Y=120); | 
|  | ctx.path2 = drawStar(X=140, Y=145); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.INTERSECT); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path1.delete(); | 
|  | ctx.path2.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_intersect', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | it('pathops_union', function(done) { | 
|  | function setup(ctx) { | 
|  | // Values chosen abitrarily to have some overlap and some not. | 
|  | ctx.path1 = drawStar(X=120, Y=120); | 
|  | ctx.path2 = drawStar(X=140, Y=145); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.UNION); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path1.delete(); | 
|  | ctx.path2.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_union', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | it('pathops_xor', function(done) { | 
|  | function setup(ctx) { | 
|  | // Values chosen abitrarily to have some overlap and some not. | 
|  | ctx.path1 = drawStar(X=120, Y=120); | 
|  | ctx.path2 = drawStar(X=140, Y=145); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.XOR); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path1.delete(); | 
|  | ctx.path2.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_xor', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | it('pathops_reverse_diff', function(done) { | 
|  | function setup(ctx) { | 
|  | // Values chosen abitrarily to have some overlap and some not. | 
|  | ctx.path1 = drawStar(X=120, Y=120); | 
|  | ctx.path2 = drawStar(X=140, Y=145); | 
|  | } | 
|  |  | 
|  | function test(ctx) { | 
|  | let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.REVERSE_DIFFERENCE); | 
|  | path.delete(); | 
|  | } | 
|  |  | 
|  | function teardown(ctx) { | 
|  | ctx.path1.delete(); | 
|  | ctx.path2.delete(); | 
|  | } | 
|  |  | 
|  | LoadPathKit.then(() => { | 
|  | benchmarkAndReport('pathops_reverse_diff', setup, test, teardown).then(() => { | 
|  | done(); | 
|  | }).catch(reportError(done)); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | }); |