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, jfloat* src) {
38 (void)memcpy((
void*)dest, (
void*)src,
sizeof(
float) * LLVG_MATRIX_SIZE);
42 void LLVG_MATRIX_IMPL_multiply(jfloat* dest, jfloat* a, jfloat* b) {
44 dest[0] = (a[0] * b[0]) + (a[1] * b[3]) + (a[2] * b[6]);
45 dest[1] = (a[0] * b[1]) + (a[1] * b[4]) + (a[2] * b[7]);
46 dest[2] = (a[0] * b[2]) + (a[1] * b[5]) + (a[2] * b[8]);
48 dest[3] = (a[3] * b[0]) + (a[4] * b[3]) + (a[5] * b[6]);
49 dest[4] = (a[3] * b[1]) + (a[4] * b[4]) + (a[5] * b[7]);
50 dest[5] = (a[3] * b[2]) + (a[4] * b[5]) + (a[5] * b[8]);
52 dest[6] = (a[6] * b[0]) + (a[7] * b[3]) + (a[8] * b[6]);
53 dest[7] = (a[6] * b[1]) + (a[7] * b[4]) + (a[8] * b[7]);
54 dest[8] = (a[6] * b[2]) + (a[7] * b[5]) + (a[8] * b[8]);
58 void LLVG_MATRIX_IMPL_setTranslate(jfloat* matrix, jfloat x, jfloat y) {
71 void LLVG_MATRIX_IMPL_setScale(jfloat* matrix, jfloat sx, jfloat sy) {
72 LLVG_MATRIX_IMPL_identity(matrix);
73 LLVG_MATRIX_IMPL_scale(matrix, sx, sy);
77 void LLVG_MATRIX_IMPL_setRotate(jfloat* matrix, jfloat degrees) {
78 LLVG_MATRIX_IMPL_identity(matrix);
79 LLVG_MATRIX_IMPL_rotate(matrix, degrees);
83 void LLVG_MATRIX_IMPL_setConcat(jfloat* dest, jfloat* a, jfloat* b) {
86 float temp[LLVG_MATRIX_SIZE];
87 LLVG_MATRIX_IMPL_copy(temp, a);
88 LLVG_MATRIX_IMPL_multiply(dest, temp, b);
92 float temp[LLVG_MATRIX_SIZE];
93 LLVG_MATRIX_IMPL_copy(temp, b);
94 LLVG_MATRIX_IMPL_multiply(dest, a, temp);
97 LLVG_MATRIX_IMPL_multiply(dest, a, b);
102 void LLVG_MATRIX_IMPL_translate(jfloat* matrix, jfloat x, jfloat y) {
103 matrix[2] = (matrix[0] * x) + (matrix[1] * y) + matrix[2];
104 matrix[5] = (matrix[3] * x) + (matrix[4] * y) + matrix[5];
105 matrix[8] = (matrix[6] * x) + (matrix[7] * y) + matrix[8];
109 void LLVG_MATRIX_IMPL_scale(jfloat* matrix, jfloat scaleX, jfloat scaleY) {
119 void LLVG_MATRIX_IMPL_rotate(jfloat* matrix, jfloat angleDegrees) {
121 float angleRadians = DEG_TO_RAD(angleDegrees);
124 float cosAngle = cosf(angleRadians);
125 float sinAngle = sinf(angleRadians);
129 tmp = (cosAngle * matrix[0]) + (sinAngle * matrix[1]);
130 matrix[1] = (cosAngle * matrix[1]) - (sinAngle * matrix[0]);
133 tmp = (cosAngle * matrix[3]) + (sinAngle * matrix[4]);
134 matrix[4] = (cosAngle * matrix[4]) - (sinAngle * matrix[3]);
137 tmp = (cosAngle * matrix[6]) + (sinAngle * matrix[7]);
138 matrix[7] = (cosAngle * matrix[7]) - (sinAngle * matrix[6]);
143 void LLVG_MATRIX_IMPL_concatenate(jfloat* matrix, jfloat* other) {
145 float temp[LLVG_MATRIX_SIZE];
146 LLVG_MATRIX_IMPL_copy(temp, matrix);
147 LLVG_MATRIX_IMPL_multiply(matrix, temp, other);
151 void LLVG_MATRIX_IMPL_postTranslate(jfloat* matrix, jfloat dx, jfloat dy) {
153 float a[LLVG_MATRIX_SIZE];
155 float b[LLVG_MATRIX_SIZE];
156 LLVG_MATRIX_IMPL_setTranslate(a, dx, dy);
157 LLVG_MATRIX_IMPL_copy(b, matrix);
158 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
162 void LLVG_MATRIX_IMPL_postScale(jfloat* matrix, jfloat sx, jfloat sy) {
164 float a[LLVG_MATRIX_SIZE];
166 float b[LLVG_MATRIX_SIZE];
167 LLVG_MATRIX_IMPL_identity(a);
168 LLVG_MATRIX_IMPL_scale(a, sx, sy);
169 LLVG_MATRIX_IMPL_copy(b, matrix);
170 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
174 void LLVG_MATRIX_IMPL_postRotate(jfloat* matrix, jfloat degrees) {
176 float a[LLVG_MATRIX_SIZE];
178 float b[LLVG_MATRIX_SIZE];
179 LLVG_MATRIX_IMPL_identity(a);
180 LLVG_MATRIX_IMPL_rotate(a, degrees);
181 LLVG_MATRIX_IMPL_copy(b, matrix);
182 LLVG_MATRIX_IMPL_multiply(matrix, a, b);
186 void LLVG_MATRIX_IMPL_postConcat(jfloat* matrix, jfloat* other) {
188 float a[LLVG_MATRIX_SIZE];
189 LLVG_MATRIX_IMPL_copy(a, matrix);
190 LLVG_MATRIX_IMPL_multiply(matrix, other, a);
MicroEJ MicroVG library low level API: helper to implement library natives methods.