23 #include <LLVG_MATRIX_impl.h>
32 void LLVG_MATRIX_IMPL_identity(jfloat *matrix) {
33 LLVG_MATRIX_IMPL_setTranslate(matrix, 0, 0);
37 void LLVG_MATRIX_IMPL_copy(jfloat *dest,
const jfloat *src) {
38 (void)memcpy((
void *)dest, (
void *)src,
sizeof(
float) * LLVG_MATRIX_SIZE);
42 void LLVG_MATRIX_IMPL_multiply(jfloat *dest,
const jfloat *a,
const jfloat *b) {
43 dest[0] = (a[0] * b[0]) + (a[1] * b[3]) + (a[2] * b[6]);
44 dest[1] = (a[0] * b[1]) + (a[1] * b[4]) + (a[2] * b[7]);
45 dest[2] = (a[0] * b[2]) + (a[1] * b[5]) + (a[2] * b[8]);
47 dest[3] = (a[3] * b[0]) + (a[4] * b[3]) + (a[5] * b[6]);
48 dest[4] = (a[3] * b[1]) + (a[4] * b[4]) + (a[5] * b[7]);
49 dest[5] = (a[3] * b[2]) + (a[4] * b[5]) + (a[5] * b[8]);
51 dest[6] = (a[6] * b[0]) + (a[7] * b[3]) + (a[8] * b[6]);
52 dest[7] = (a[6] * b[1]) + (a[7] * b[4]) + (a[8] * b[7]);
53 dest[8] = (a[6] * b[2]) + (a[7] * b[5]) + (a[8] * b[8]);
57 void LLVG_MATRIX_IMPL_setTranslate(jfloat *matrix, jfloat x, jfloat y) {
70 void LLVG_MATRIX_IMPL_setScale(jfloat *matrix, jfloat sx, jfloat sy) {
71 LLVG_MATRIX_IMPL_identity(matrix);
72 LLVG_MATRIX_IMPL_scale(matrix, sx, sy);
76 void LLVG_MATRIX_IMPL_setRotate(jfloat *matrix, jfloat degrees) {
77 LLVG_MATRIX_IMPL_identity(matrix);
78 LLVG_MATRIX_IMPL_rotate(matrix, degrees);
82 void LLVG_MATRIX_IMPL_setConcat(jfloat *dest,
const jfloat *a,
const jfloat *b) {
85 float temp[LLVG_MATRIX_SIZE];
86 LLVG_MATRIX_IMPL_copy(temp, a);
87 LLVG_MATRIX_IMPL_multiply(dest, temp, b);
88 }
else if (dest == b) {
90 float temp[LLVG_MATRIX_SIZE];
91 LLVG_MATRIX_IMPL_copy(temp, b);
92 LLVG_MATRIX_IMPL_multiply(dest, a, temp);
94 LLVG_MATRIX_IMPL_multiply(dest, a, b);
99 void LLVG_MATRIX_IMPL_translate(jfloat *matrix, jfloat x, jfloat y) {
100 matrix[2] = (matrix[0] * x) + (matrix[1] * y) + matrix[2];
101 matrix[5] = (matrix[3] * x) + (matrix[4] * y) + matrix[5];
102 matrix[8] = (matrix[6] * x) + (matrix[7] * y) + matrix[8];
106 void LLVG_MATRIX_IMPL_scale(jfloat *matrix, jfloat scaleX, jfloat scaleY) {
116 void LLVG_MATRIX_IMPL_rotate(jfloat *matrix, jfloat angleDegrees) {
117 float angleRadians = DEG_TO_RAD(angleDegrees);
120 float cosAngle = cosf(angleRadians);
121 float sinAngle = sinf(angleRadians);
125 tmp = (cosAngle * matrix[0]) + (sinAngle * matrix[1]);
126 matrix[1] = (cosAngle * matrix[1]) - (sinAngle * matrix[0]);
129 tmp = (cosAngle * matrix[3]) + (sinAngle * matrix[4]);
130 matrix[4] = (cosAngle * matrix[4]) - (sinAngle * matrix[3]);
133 tmp = (cosAngle * matrix[6]) + (sinAngle * matrix[7]);
134 matrix[7] = (cosAngle * matrix[7]) - (sinAngle * matrix[6]);
139 void LLVG_MATRIX_IMPL_concatenate(jfloat *matrix,
const jfloat *other) {
141 float temp[LLVG_MATRIX_SIZE];
142 LLVG_MATRIX_IMPL_copy(temp, matrix);
143 LLVG_MATRIX_IMPL_multiply(matrix, temp, other);
147 void LLVG_MATRIX_IMPL_postTranslate(jfloat *matrix, jfloat dx, jfloat dy) {
149 float a[LLVG_MATRIX_SIZE];
151 float b[LLVG_MATRIX_SIZE];
152 LLVG_MATRIX_IMPL_setTranslate(a, dx, dy);
153 LLVG_MATRIX_IMPL_copy(b, matrix);
154 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
158 void LLVG_MATRIX_IMPL_postScale(jfloat *matrix, jfloat sx, jfloat sy) {
160 float a[LLVG_MATRIX_SIZE];
162 float b[LLVG_MATRIX_SIZE];
163 LLVG_MATRIX_IMPL_identity(a);
164 LLVG_MATRIX_IMPL_scale(a, sx, sy);
165 LLVG_MATRIX_IMPL_copy(b, matrix);
166 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
170 void LLVG_MATRIX_IMPL_postRotate(jfloat *matrix, jfloat degrees) {
172 float a[LLVG_MATRIX_SIZE];
174 float b[LLVG_MATRIX_SIZE];
175 LLVG_MATRIX_IMPL_identity(a);
176 LLVG_MATRIX_IMPL_rotate(a, degrees);
177 LLVG_MATRIX_IMPL_copy(b, matrix);
178 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
182 void LLVG_MATRIX_IMPL_postConcat(jfloat *matrix,
const jfloat *other) {
184 float a[LLVG_MATRIX_SIZE];
185 LLVG_MATRIX_IMPL_copy(a, matrix);
186 LLVG_MATRIX_IMPL_multiply(matrix, other, a);
190 void LLVG_MATRIX_IMPL_transformPoint(jfloat *x, jfloat *y,
const jfloat *matrix) {
192 jfloat tw = (*x * matrix[(2 * 3) + 0]) + (*y * matrix[(2 * 3) + 1]) + matrix[(2 * 3) + 2];
198 jfloat tx = (*x * matrix[(0 * 3) + 0]) + (*y * matrix[(0 * 3) + 1]) + matrix[(0 * 3) + 2];
199 jfloat ty = (*x * matrix[(1 * 3) + 0]) + (*y * matrix[(1 * 3) + 1]) + matrix[(1 * 3) + 2];
MicroEJ MicroVG library low level API: helper to implement library natives methods.