| |
| describe('PathKit\'s Path Behavior', function() { |
| // Note, don't try to print the PathKit object - it can cause Karma/Jasmine to lock up. |
| var PathKit = null; |
| const LoadPathKit = new Promise(function(resolve, reject) { |
| if (PathKit) { |
| resolve(); |
| } else { |
| PathKitInit({ |
| locateFile: (file) => '/pathkit/'+file, |
| }).ready().then((_PathKit) => { |
| PathKit = _PathKit; |
| resolve(); |
| }); |
| } |
| }); |
| |
| // see https://fiddle.skia.org/c/@discrete_path |
| function drawStar() { |
| let path = PathKit.NewPath(); |
| let R = 115.2, C = 128.0; |
| path.moveTo(C + R + 22, C); |
| for (let i = 1; i < 8; i++) { |
| let a = 2.6927937 * i; |
| path.lineTo(C + R * Math.cos(a) + 22, C + R * Math.sin(a)); |
| } |
| path.closePath(); |
| return path; |
| } |
| |
| describe('Dash Path Effect', function() { |
| it('performs dash in-place with start, stop, phase', function(done) { |
| LoadPathKit.then(catchException(done, () => { |
| let orig = drawStar(); |
| let dashed = drawStar(); |
| let notACopy = dashed.dash(10, 3, 0); |
| let phased = drawStar().dash(10, 3, 2); |
| |
| expect(dashed === notACopy).toBe(true); |
| expect(dashed.equals(phased)).toBe(false); |
| expect(dashed.equals(orig)).toBe(false); |
| |
| reportPath(dashed, 'dashed_no_phase', () => { |
| reportPath(phased, 'dashed_with_phase', done); |
| orig.delete(); |
| dashed.delete(); |
| phased.delete(); |
| }); |
| })); |
| }); |
| }); |
| |
| describe('Trim Path Effect', function() { |
| it('performs trim in-place with start, stop, phase', function(done) { |
| LoadPathKit.then(catchException(done, () => { |
| let orig = drawStar(); |
| let trimmed = drawStar(); |
| let notACopy = trimmed.trim(0.25, .8); |
| let complement = drawStar().trim(.1, .9, true); |
| |
| expect(trimmed === notACopy).toBe(true); |
| expect(trimmed.equals(complement)).toBe(false); |
| expect(trimmed.equals(orig)).toBe(false); |
| expect(complement.equals(orig)).toBe(false); |
| |
| reportPath(trimmed, 'trimmed_non_complement', () => { |
| reportPath(complement, 'trimmed_complement', done); |
| orig.delete(); |
| trimmed.delete(); |
| complement.delete(); |
| }); |
| })); |
| }); |
| }); |
| |
| describe('Transform Path Effect', function() { |
| it('performs matrix transform in-place', function(done) { |
| LoadPathKit.then(catchException(done, () => { |
| let orig = drawStar(); |
| let scaled = drawStar(); |
| let notACopy = scaled.transform(3, 0, 0, |
| 0, 3, 0, |
| 0, 0, 1); |
| |
| let scaled2 = drawStar().transform([3, 0, 0, |
| 0, 3, 0, |
| 0, 0, 1]); |
| |
| expect(scaled === notACopy).toBe(true); |
| expect(scaled.equals(scaled2)).toBe(true); |
| expect(scaled.equals(orig)).toBe(false); |
| |
| reportPath(scaled, 'transformed_scale', () => { |
| reportPath(scaled2, 'transformed_scale2', done); |
| orig.delete(); |
| scaled.delete(); |
| scaled2.delete(); |
| }); |
| })); |
| }); |
| }); |
| |
| describe('Stroke Path Effect', function() { |
| it('creates a stroked path in-place', function(done) { |
| LoadPathKit.then(catchException(done, () => { |
| let orig = drawStar(); |
| let stroked = drawStar(); |
| let notACopy = stroked.stroke({ |
| width: 15, |
| join: PathKit.StrokeJoin.BEVEL, |
| cap: PathKit.StrokeCap.BUTT, |
| miter_limit: 2, |
| }); |
| |
| // Don't have to specify all of the fields, defaults will |
| // be used instead. |
| let rounded = drawStar().stroke({ |
| width: 10, |
| join: PathKit.StrokeJoin.ROUND, |
| cap:PathKit.StrokeCap.SQUARE, |
| }); |
| |
| expect(stroked === notACopy).toBe(true); |
| expect(stroked.equals(rounded)).toBe(false); |
| expect(stroked.equals(orig)).toBe(false); |
| |
| reportPath(stroked, 'stroke_bevel_butt', () => { |
| reportPath(rounded, 'stroke_round_square', done); |
| orig.delete(); |
| stroked.delete(); |
| rounded.delete(); |
| }); |
| })); |
| }); |
| }); |
| |
| }); |