1 describe('CanvasKit\'s Matrix Helpers', () => {
3 beforeEach(async () => {
4 await EverythingLoaded;
7 const expectArrayCloseTo = (a, b, precision) => {
8 precision = precision || 14; // digits of precision in base 10
9 expect(a.length).toEqual(b.length);
10 for (let i=0; i<a.length; i++) {
11 expect(a[i]).toBeCloseTo(b[i], precision);
15 describe('3x3 matrices', () => {
17 it('can make a translated 3x3 matrix', () => {
19 CanvasKit.Matrix.translated(5, -1),
25 it('can make a scaled 3x3 matrix', () => {
27 CanvasKit.Matrix.scaled(2, 3),
33 it('can make a rotated 3x3 matrix', () => {
35 CanvasKit.Matrix.rotated(Math.PI, 9, 9),
41 it('can make a skewed 3x3 matrix', () => {
43 CanvasKit.Matrix.skewed(4, 3, 2, 1),
49 it('can multiply 3x3 matrices', () => {
66 CanvasKit.Matrix.multiply(a, b),
70 it('satisfies the inverse rule for 3x3 matrics', () => {
71 // a matrix times its inverse is the identity matrix.
77 const b = CanvasKit.Matrix.invert(a);
79 CanvasKit.Matrix.multiply(a, b),
80 CanvasKit.Matrix.identity());
83 it('maps 2D points correctly with a 3x3 matrix', () => {
98 CanvasKit.Matrix.mapPoints(a, points),
103 describe('4x4 matrices', () => {
105 it('can make a translated 4x4 matrix', () => {
107 CanvasKit.M44.translated([5, 6, 7]),
114 it('can make a scaled 4x4 matrix', () => {
116 CanvasKit.M44.scaled([5, 6, 7]),
123 it('can make a rotated 4x4 matrix', () => {
125 CanvasKit.M44.rotated([1,1,1], Math.PI),
132 it('can make a 4x4 matrix looking from eye to center', () => {
137 CanvasKit.M44.lookat(eye, center, up),
144 it('can make a 4x4 prespective matrix', () => {
146 CanvasKit.M44.perspective(2, 10, Math.PI/2),
153 it('can multiply 4x4 matrices', () => {
157 0.9, -0.9, -0.8, -0.7,
158 -0.6, -0.5, -0.4, -0.3,
162 -3.0, -4.0, -5.0, -6.0,
164 -4.0, -3.0, -2.0, -1.0,
170 -1.3, -2.1, -2.9, -3.7,
173 CanvasKit.M44.multiply(a, b),
177 it('satisfies the identity rule for 4x4 matrices', () => {
181 0.9, 0.9, -0.8, -0.7,
182 -0.6, -0.5, -0.4, -0.3,
184 const b = CanvasKit.M44.invert(a)
186 CanvasKit.M44.multiply(a, b),
187 CanvasKit.M44.identity());
190 it('can create a camera setup matrix', () => {
191 const camAngle = Math.PI / 12;
193 'eye' : [0, 0, 1 / Math.tan(camAngle/2) - 1],
200 const mat = CanvasKit.M44.setupCamera(CanvasKit.LTRBRect(0, 0, 200, 200), 200, cam);
201 // these values came from an invocation of setupCamera visually inspected.
203 7.595754, 0, -0.5, 0,
204 0, 7.595754, -0.5, 0,
205 0, 0, 1.010050, -1324.368418,
206 0, 0, -0.005, 7.595754];
207 expectArrayCloseTo(mat, expected, 5);