Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | 1470x 24x 1470x 961x 961x 961x 961x 961x 961x 961x 961x 961x 961x 961x 961x 961x 4266x 4266x 1422x 1422x 1422x 1422x 1374x 1374x 1374x | import {
CPUFallbackTransform,
Point2,
TransformMatrix2D,
} from '../../../../types';
// By Simon Sarris
// Www.simonsarris.com
// Sarris@acm.org
//
// Free to use and distribute at will
// So long as you are nice to people, etc
// Simple class for keeping track of the current transformation matrix
// For instance:
// Var t = new Transform();
// T.rotate(5);
// Var m = t.m;
// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);
// Is equivalent to:
// Ctx.rotate(5);
// But now you can retrieve it :)
// Remember that this does not account for any CSS transforms applied to the canvas
export class Transform implements CPUFallbackTransform {
private m: TransformMatrix2D;
constructor() {
this.reset();
}
getMatrix(): TransformMatrix2D {
return this.m;
}
reset(): void {
this.m = [1, 0, 0, 1, 0, 0];
}
clone(): CPUFallbackTransform {
const transform = new Transform();
transform.m[0] = this.m[0];
transform.m[1] = this.m[1];
transform.m[2] = this.m[2];
transform.m[3] = this.m[3];
transform.m[4] = this.m[4];
transform.m[5] = this.m[5];
return transform;
}
multiply(matrix: TransformMatrix2D): void {
const m11 = this.m[0] * matrix[0] + this.m[2] * matrix[1];
const m12 = this.m[1] * matrix[0] + this.m[3] * matrix[1];
const m21 = this.m[0] * matrix[2] + this.m[2] * matrix[3];
const m22 = this.m[1] * matrix[2] + this.m[3] * matrix[3];
const dx = this.m[0] * matrix[4] + this.m[2] * matrix[5] + this.m[4];
const dy = this.m[1] * matrix[4] + this.m[3] * matrix[5] + this.m[5];
this.m[0] = m11;
this.m[1] = m12;
this.m[2] = m21;
this.m[3] = m22;
this.m[4] = dx;
this.m[5] = dy;
}
invert(): void {
const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);
const m0 = this.m[3] * d;
const m1 = -this.m[1] * d;
const m2 = -this.m[2] * d;
const m3 = this.m[0] * d;
const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);
const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);
this.m[0] = m0;
this.m[1] = m1;
this.m[2] = m2;
this.m[3] = m3;
this.m[4] = m4;
this.m[5] = m5;
}
rotate(rad: number): void {
const c = Math.cos(rad);
const s = Math.sin(rad);
const m11 = this.m[0] * c + this.m[2] * s;
const m12 = this.m[1] * c + this.m[3] * s;
const m21 = this.m[0] * -s + this.m[2] * c;
const m22 = this.m[1] * -s + this.m[3] * c;
this.m[0] = m11;
this.m[1] = m12;
this.m[2] = m21;
this.m[3] = m22;
}
translate(x: number, y: number): void {
this.m[4] += this.m[0] * x + this.m[2] * y;
this.m[5] += this.m[1] * x + this.m[3] * y;
}
scale(sx: number, sy: number) {
this.m[0] *= sx;
this.m[1] *= sx;
this.m[2] *= sy;
this.m[3] *= sy;
}
transformPoint(point: Point2): Point2 {
const x = point[0];
const y = point[1];
return [
x * this.m[0] + y * this.m[2] + this.m[4],
x * this.m[1] + y * this.m[3] + this.m[5],
];
}
}
|