1*c8dee2aaSAndroid Build Coastguard Workerdescribe('PathKit\'s Pathops', function() { 2*c8dee2aaSAndroid Build Coastguard Worker // see https://fiddle.skia.org/c/@discrete_path 3*c8dee2aaSAndroid Build Coastguard Worker function drawStar(X=128, Y=128, R=116) { 4*c8dee2aaSAndroid Build Coastguard Worker let p = PathKit.NewPath(); 5*c8dee2aaSAndroid Build Coastguard Worker p.moveTo(X + R, Y); 6*c8dee2aaSAndroid Build Coastguard Worker for (let i = 1; i < 8; i++) { 7*c8dee2aaSAndroid Build Coastguard Worker let a = 2.6927937 * i; 8*c8dee2aaSAndroid Build Coastguard Worker p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a)); 9*c8dee2aaSAndroid Build Coastguard Worker } 10*c8dee2aaSAndroid Build Coastguard Worker p.closePath(); 11*c8dee2aaSAndroid Build Coastguard Worker return p; 12*c8dee2aaSAndroid Build Coastguard Worker } 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker it('pathops_simplify', function(done) { 15*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 16*c8dee2aaSAndroid Build Coastguard Worker ctx.path = drawStar(); 17*c8dee2aaSAndroid Build Coastguard Worker } 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 20*c8dee2aaSAndroid Build Coastguard Worker let path = ctx.path.copy().simplify(); 21*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 22*c8dee2aaSAndroid Build Coastguard Worker } 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 25*c8dee2aaSAndroid Build Coastguard Worker ctx.path.delete(); 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 29*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_simplify', setup, test, teardown).then(() => { 30*c8dee2aaSAndroid Build Coastguard Worker done(); 31*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 32*c8dee2aaSAndroid Build Coastguard Worker }); 33*c8dee2aaSAndroid Build Coastguard Worker }); 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker it('pathops_diff', function(done) { 36*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 37*c8dee2aaSAndroid Build Coastguard Worker // Values chosen abitrarily to have some overlap and some not. 38*c8dee2aaSAndroid Build Coastguard Worker ctx.path1 = drawStar(X=120, Y=120); 39*c8dee2aaSAndroid Build Coastguard Worker ctx.path2 = drawStar(X=140, Y=145); 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 43*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.DIFFERENCE); 44*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 48*c8dee2aaSAndroid Build Coastguard Worker ctx.path1.delete(); 49*c8dee2aaSAndroid Build Coastguard Worker ctx.path2.delete(); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 53*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_diff', setup, test, teardown).then(() => { 54*c8dee2aaSAndroid Build Coastguard Worker done(); 55*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 56*c8dee2aaSAndroid Build Coastguard Worker }); 57*c8dee2aaSAndroid Build Coastguard Worker }); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker it('pathops_intersect', function(done) { 60*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 61*c8dee2aaSAndroid Build Coastguard Worker // Values chosen abitrarily to have some overlap and some not. 62*c8dee2aaSAndroid Build Coastguard Worker ctx.path1 = drawStar(X=120, Y=120); 63*c8dee2aaSAndroid Build Coastguard Worker ctx.path2 = drawStar(X=140, Y=145); 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 67*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.INTERSECT); 68*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 72*c8dee2aaSAndroid Build Coastguard Worker ctx.path1.delete(); 73*c8dee2aaSAndroid Build Coastguard Worker ctx.path2.delete(); 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 77*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_intersect', setup, test, teardown).then(() => { 78*c8dee2aaSAndroid Build Coastguard Worker done(); 79*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 80*c8dee2aaSAndroid Build Coastguard Worker }); 81*c8dee2aaSAndroid Build Coastguard Worker }); 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker it('pathops_union', function(done) { 84*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 85*c8dee2aaSAndroid Build Coastguard Worker // Values chosen abitrarily to have some overlap and some not. 86*c8dee2aaSAndroid Build Coastguard Worker ctx.path1 = drawStar(X=120, Y=120); 87*c8dee2aaSAndroid Build Coastguard Worker ctx.path2 = drawStar(X=140, Y=145); 88*c8dee2aaSAndroid Build Coastguard Worker } 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 91*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.UNION); 92*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 96*c8dee2aaSAndroid Build Coastguard Worker ctx.path1.delete(); 97*c8dee2aaSAndroid Build Coastguard Worker ctx.path2.delete(); 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 101*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_union', setup, test, teardown).then(() => { 102*c8dee2aaSAndroid Build Coastguard Worker done(); 103*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 104*c8dee2aaSAndroid Build Coastguard Worker }); 105*c8dee2aaSAndroid Build Coastguard Worker }); 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker it('pathops_xor', function(done) { 108*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 109*c8dee2aaSAndroid Build Coastguard Worker // Values chosen abitrarily to have some overlap and some not. 110*c8dee2aaSAndroid Build Coastguard Worker ctx.path1 = drawStar(X=120, Y=120); 111*c8dee2aaSAndroid Build Coastguard Worker ctx.path2 = drawStar(X=140, Y=145); 112*c8dee2aaSAndroid Build Coastguard Worker } 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 115*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.XOR); 116*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 120*c8dee2aaSAndroid Build Coastguard Worker ctx.path1.delete(); 121*c8dee2aaSAndroid Build Coastguard Worker ctx.path2.delete(); 122*c8dee2aaSAndroid Build Coastguard Worker } 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 125*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_xor', setup, test, teardown).then(() => { 126*c8dee2aaSAndroid Build Coastguard Worker done(); 127*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 128*c8dee2aaSAndroid Build Coastguard Worker }); 129*c8dee2aaSAndroid Build Coastguard Worker }); 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker it('pathops_reverse_diff', function(done) { 132*c8dee2aaSAndroid Build Coastguard Worker function setup(ctx) { 133*c8dee2aaSAndroid Build Coastguard Worker // Values chosen abitrarily to have some overlap and some not. 134*c8dee2aaSAndroid Build Coastguard Worker ctx.path1 = drawStar(X=120, Y=120); 135*c8dee2aaSAndroid Build Coastguard Worker ctx.path2 = drawStar(X=140, Y=145); 136*c8dee2aaSAndroid Build Coastguard Worker } 137*c8dee2aaSAndroid Build Coastguard Worker 138*c8dee2aaSAndroid Build Coastguard Worker function test(ctx) { 139*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.REVERSE_DIFFERENCE); 140*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker function teardown(ctx) { 144*c8dee2aaSAndroid Build Coastguard Worker ctx.path1.delete(); 145*c8dee2aaSAndroid Build Coastguard Worker ctx.path2.delete(); 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker 148*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(() => { 149*c8dee2aaSAndroid Build Coastguard Worker benchmarkAndReport('pathops_reverse_diff', setup, test, teardown).then(() => { 150*c8dee2aaSAndroid Build Coastguard Worker done(); 151*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 152*c8dee2aaSAndroid Build Coastguard Worker }); 153*c8dee2aaSAndroid Build Coastguard Worker }); 154*c8dee2aaSAndroid Build Coastguard Worker 155*c8dee2aaSAndroid Build Coastguard Worker});