23
#define DBL_EPSILON 0.0000001
30
#include "eina_suite.h"
32
EFL_START_TEST(eina_matrix2)
36
double xx, xy, yx, yy;
39
eina_matrix2_values_set(&m,
42
fail_if(eina_matrix2_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
44
eina_matrix2_inverse(&n, &m);
45
fail_if(eina_matrix2_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
47
eina_matrix2_values_get(&m,
51
fail_if(!EINA_DBL_EQ(xx, yy) ||
53
fail_if(!EINA_DBL_EQ(xy, yx) ||
59
EFL_START_TEST(eina_matrix2_operation)
61
Eina_Matrix2 m1, m2, m3;
62
double xx, xy, yx, yy;
63
double arr[] = {1, 1, 1, 1};
65
eina_matrix2_values_set(&m2,
68
eina_matrix2_inverse(&m1, &m2);
69
eina_matrix2_values_get(&m1,
72
fail_if((xx - (-0.4) > DBL_EPSILON) || (xy - 0.6 > DBL_EPSILON) ||
73
(yx - 0.6 > DBL_EPSILON) || (yy - (-0.4) > DBL_EPSILON));
75
eina_matrix2_identity(&m1);
76
eina_matrix2_values_get(&m1,
79
fail_if(!EINA_DBL_EQ(xx, yy) ||
81
fail_if(!EINA_DBL_EQ(xy, yx) ||
84
eina_matrix2_array_set(&m1, arr);
85
eina_matrix2_values_get(&m1,
88
fail_if(!EINA_DBL_EQ(xx, yy) ||
89
!EINA_DBL_EQ(yx, xy) ||
92
eina_matrix2_copy(&m2, &m1);
93
eina_matrix2_values_get(&m2,
96
fail_if(!EINA_DBL_EQ(xx, yy) ||
97
!EINA_DBL_EQ(yx, xy) ||
100
eina_matrix2_values_set(&m1,
103
eina_matrix2_multiply_copy(&m3, &m1, &m2);
104
eina_matrix2_values_get(&m3,
107
fail_if(!EINA_DBL_EQ(xx, yy) ||
108
!EINA_DBL_EQ(yx, xy) ||
109
!EINA_DBL_EQ(xy, 5));
111
eina_matrix2_multiply(&m3, &m1, &m2);
112
eina_matrix2_values_get(&m3,
115
fail_if(!EINA_DBL_EQ(xx, yy) ||
116
!EINA_DBL_EQ(yx, xy) ||
117
!EINA_DBL_EQ(xy, 5));
122
EFL_START_TEST(eina_matrix4)
126
double xx, xy, xz, xw,
132
eina_matrix4_values_set(&m,
137
fail_if(eina_matrix4_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
139
fail_if(!eina_matrix4_normalized(&n, &m));
140
fail_if(eina_matrix4_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
142
fail_if(!eina_matrix4_inverse(&n, &m));
143
fail_if(eina_matrix4_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
145
eina_matrix4_values_get(&m,
151
fail_if(!EINA_DBL_EQ(xx, yy) ||
152
!EINA_DBL_EQ(yy, zz) ||
153
!EINA_DBL_EQ(zz, ww) ||
154
!EINA_DBL_EQ(ww, 1));
155
fail_if(!EINA_DBL_EQ(xy, xz) ||
156
!EINA_DBL_EQ(xz, xw) ||
157
!EINA_DBL_EQ(xw, yx) ||
158
!EINA_DBL_EQ(yx, yz) ||
159
!EINA_DBL_EQ(yz, yw) ||
160
!EINA_DBL_EQ(yw, zx) ||
161
!EINA_DBL_EQ(zx, zy) ||
162
!EINA_DBL_EQ(zy, zw) ||
163
!EINA_DBL_EQ(zw, wx) ||
164
!EINA_DBL_EQ(wx, wy) ||
165
!EINA_DBL_EQ(wy, wz) ||
166
!EINA_DBL_EQ(wz, 0));
168
eina_matrix4_values_set(&m,
174
eina_matrix4_transpose(&n, &m);
175
fail_if(!EINA_DBL_EQ(n.xx, 1) ||
176
!EINA_DBL_EQ(n.xy, 5) ||
177
!EINA_DBL_EQ(n.xz, 9) ||
178
!EINA_DBL_EQ(n.xw, 13) ||
179
!EINA_DBL_EQ(n.yx, 2) ||
180
!EINA_DBL_EQ(n.yy, 6) ||
181
!EINA_DBL_EQ(n.yz, 10) ||
182
!EINA_DBL_EQ(n.yw, 14) ||
183
!EINA_DBL_EQ(n.zx, 3) ||
184
!EINA_DBL_EQ(n.zy, 7) ||
185
!EINA_DBL_EQ(n.zz, 11) ||
186
!EINA_DBL_EQ(n.zw, 15) ||
187
!EINA_DBL_EQ(n.wx, 4) ||
188
!EINA_DBL_EQ(n.wy, 8) ||
189
!EINA_DBL_EQ(n.wz, 12) ||
190
!EINA_DBL_EQ(n.ww, 16));
195
#define MATRIX4_CMP(XX, XY, XZ, XW, YX, YY, YZ, YW, ZX, ZY, ZZ, ZW, WX, WY, WZ, WW, AXX, AXY, AXZ, AXW, AYX, AYY, AYZ, AYW, AZX, AZY, AZZ, AZW, AWX, AWY, AWZ, AWW) \
196
(EINA_DBL_EQ(XX, AXX) && \
197
EINA_DBL_EQ(XY, AXY) && \
198
EINA_DBL_EQ(XZ, AXZ) && \
199
EINA_DBL_EQ(XW, AXW) && \
200
EINA_DBL_EQ(YX, AYX) && \
201
EINA_DBL_EQ(YY, AYY) && \
202
EINA_DBL_EQ(YZ, AYZ) && \
203
EINA_DBL_EQ(YW, AYW) && \
204
EINA_DBL_EQ(ZX, AZX) && \
205
EINA_DBL_EQ(ZY, AZY) && \
206
EINA_DBL_EQ(ZZ, AZZ) && \
207
EINA_DBL_EQ(ZW, AZW) && \
208
EINA_DBL_EQ(WX, AWX) && \
209
EINA_DBL_EQ(WY, AWY) && \
210
EINA_DBL_EQ(WZ, AWZ) && \
211
EINA_DBL_EQ(WW, AWW))
213
EFL_START_TEST(eina_matrix4_operation)
216
double l=5, r=4, b=4, t=3, dn=3, df=2;
217
Eina_Matrix4 m, m1, m2;
218
double xx, xy, xz, xw,
222
const double arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
223
double rotate_radian = 45.0 * M_PI / 180.0;
225
eina_matrix4_values_set(&m,
230
det = eina_matrix4_determinant(&m);
231
fail_if(!EINA_DBL_EQ(det, -16));
233
eina_matrix4_inverse(&m1, &m);
234
eina_matrix4_values_get(&m1,
239
fail_if (!EINA_DBL_EQ(xy, 0.5) ||
240
!EINA_DBL_EQ(yw, xy) ||
241
!EINA_DBL_EQ(zx, yw) ||
242
!EINA_DBL_EQ(wz, zx));
244
eina_matrix4_identity(&m1);
245
eina_matrix4_values_get(&m1,
250
fail_if (!EINA_DBL_EQ(xx, 1) ||
251
!EINA_DBL_EQ(yy, xx) ||
252
!EINA_DBL_EQ(zz, yy) ||
253
!EINA_DBL_EQ(ww, zz));
255
eina_matrix4_values_set(&m1,
260
eina_matrix4_multiply_copy(&m2, &m1, &m);
261
eina_matrix4_values_get(&m2,
266
fail_if (!EINA_DBL_EQ(xx, 4) ||
267
!EINA_DBL_EQ(xw, xx) ||
268
!EINA_DBL_EQ(yy, xw) ||
269
!EINA_DBL_EQ(yz, yy) ||
270
!EINA_DBL_EQ(zy, yz) ||
271
!EINA_DBL_EQ(zz, yy) ||
272
!EINA_DBL_EQ(wx, xx) ||
273
!EINA_DBL_EQ(ww, zy));
275
eina_matrix4_multiply(&m2, &m1, &m);
276
eina_matrix4_values_get(&m2,
281
fail_if (!EINA_DBL_EQ(xx, 4) ||
282
!EINA_DBL_EQ(xw, xx) ||
283
!EINA_DBL_EQ(yy, xw) ||
284
!EINA_DBL_EQ(yz, yy) ||
285
!EINA_DBL_EQ(zy, yz) ||
286
!EINA_DBL_EQ(zz, yy) ||
287
!EINA_DBL_EQ(wx, xx) ||
288
!EINA_DBL_EQ(ww, zy));
290
eina_matrix4_array_set(&m1, arr);
291
eina_matrix4_values_get(&m1,
296
fail_if (!EINA_DBL_EQ(xx, 1) ||
297
!EINA_DBL_EQ(xw, xx) ||
298
!EINA_DBL_EQ(yy, xw) ||
299
!EINA_DBL_EQ(yz, yy) ||
300
!EINA_DBL_EQ(zy, yz) ||
301
!EINA_DBL_EQ(zz, yy) ||
302
!EINA_DBL_EQ(wx, xx) ||
303
!EINA_DBL_EQ(ww, zy));
305
eina_matrix4_copy(&m, &m1);
306
eina_matrix4_values_get(&m1,
311
fail_if (!EINA_DBL_EQ(xx, 1) ||
312
!EINA_DBL_EQ(xw, xx) ||
313
!EINA_DBL_EQ(yy, xw) ||
314
!EINA_DBL_EQ(yz, yy) ||
315
!EINA_DBL_EQ(zy, yz) ||
316
!EINA_DBL_EQ(zz, yy) ||
317
!EINA_DBL_EQ(wx, xx) ||
318
!EINA_DBL_EQ(ww, zy));
320
eina_matrix4_ortho_set(&m, l, r, b, t, dn, df);
321
eina_matrix4_values_get(&m,
326
fail_if (!EINA_DBL_EQ(xx, -2) ||
327
!EINA_DBL_EQ(yy, -2) ||
328
!EINA_DBL_EQ(zz, 2) ||
329
!EINA_DBL_EQ(wx, 9) ||
330
!EINA_DBL_EQ(wy, 7) ||
331
!EINA_DBL_EQ(wz, 5) ||
332
!EINA_DBL_EQ(ww, 1));
335
eina_matrix4_identity(&m);
337
eina_matrix4_scale(&m, 5, 5, 5);
338
eina_matrix4_values_get(&m,
344
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
353
eina_matrix4_translate(&m, 5, 5, 5);
354
eina_matrix4_values_get(&m,
359
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
368
eina_matrix4_identity(&m);
369
eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_X);
370
eina_matrix4_values_get(&m,
375
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
380
0, cos(rotate_radian), -sin(rotate_radian), 0,
381
0, sin(rotate_radian), cos(rotate_radian), 0,
384
eina_matrix4_identity(&m);
385
eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_Y);
386
eina_matrix4_values_get(&m,
391
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
395
cos(rotate_radian), 0, sin(rotate_radian), 0,
397
-sin(rotate_radian), 0, cos(rotate_radian), 0,
400
eina_matrix4_identity(&m);
401
eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_Z);
402
eina_matrix4_values_get(&m,
407
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
411
cos(rotate_radian), -sin(rotate_radian), 0, 0,
412
sin(rotate_radian), cos(rotate_radian), 0, 0,
417
eina_matrix4_identity(&m1);
418
eina_matrix4_values_set(&m2,
423
eina_matrix4_compose(&m1, &m2, &m);
424
eina_matrix4_values_get(&m,
429
fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
440
EFL_START_TEST(eina_matrix4_2_3)
443
Eina_Matrix3 m3, m3b;
446
eina_matrix3_values_set(&m3,
451
eina_matrix3_matrix4_to(&m4, &m3);
452
eina_matrix4_matrix3_to(&m3b, &m4);
454
fail_if(memcmp(&m3, &m3b, sizeof (Eina_Matrix3)) != 0);
459
EFL_START_TEST(eina_matrix3)
462
Eina_Matrix3 m, m1, m2;
468
eina_matrix3_values_set(&m,
473
eina_matrix3_values_set(&m1,
478
eina_matrix3_values_set(&m2,
482
fail_if(eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
484
eina_matrix3_values_get(&m,
489
fail_if(!EINA_DBL_EQ(xx, yy) ||
490
!EINA_DBL_EQ(yy, zz) ||
491
!EINA_DBL_EQ(zz, 1));
493
fail_if(!EINA_DBL_EQ(xy, xz) ||
494
!EINA_DBL_EQ(yx, yz) ||
495
!EINA_DBL_EQ(zx, zy) ||
496
!EINA_DBL_EQ(zy, 0));
498
ret = eina_matrix3_equal(&m, &m1);
499
fail_if(ret != EINA_TRUE);
501
ret = eina_matrix3_equal(&m1, &m2);
502
fail_if(ret != EINA_FALSE);
507
#define MATRIX3_CMP(XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ, AXX, AXY, AXZ, AYX, AYY, AYZ, AZX, AZY, AZZ) \
508
(EINA_DBL_EQ(XX, AXX) && \
509
EINA_DBL_EQ(XY, AXY) && \
510
EINA_DBL_EQ(XZ, AXZ) && \
511
EINA_DBL_EQ(YX, AYX) && \
512
EINA_DBL_EQ(YY, AYY) && \
513
EINA_DBL_EQ(YZ, AYZ) && \
514
EINA_DBL_EQ(ZX, AZX) && \
515
EINA_DBL_EQ(ZY, AZY) && \
516
EINA_DBL_EQ(ZZ, AZZ))
518
EFL_START_TEST(eina_matrix3_operations)
520
Eina_Matrix3 m1, m2, m3;
524
double tx = 20, ty = 30, ret;
525
const double arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
526
double rotate_radian = 45.0 * M_PI / 180.0;
528
eina_matrix3_values_set(&m1,
533
eina_matrix3_values_set(&m2,
539
eina_matrix3_compose(&m1, &m2, &m3);
540
eina_matrix3_values_get(&m3,
544
fail_if (!EINA_DBL_EQ(xx, xy) ||
545
!EINA_DBL_EQ(xy, xz) ||
546
!EINA_DBL_EQ(yx, yy) ||
547
!EINA_DBL_EQ(yy, yz) ||
548
!EINA_DBL_EQ(zx, zy) ||
549
!EINA_DBL_EQ(zy, zz) ||
550
!EINA_DBL_EQ(zz, 1));
552
eina_matrix3_translate(&m1, tx, ty);
553
eina_matrix3_values_get(&m1,
557
fail_if(!MATRIX3_CMP(xx, xy, xz,
564
eina_matrix3_values_set(&m1,
569
eina_matrix3_scale(&m1, tx, ty);
570
eina_matrix3_values_get(&m1,
574
fail_if(!MATRIX3_CMP(xx, xy, xz,
581
eina_matrix3_values_set(&m1,
585
eina_matrix3_rotate(&m1, rotate_radian);
586
fail_if (!MATRIX3_CMP(m1.xx, m1.xy, m1.xz,
589
cos(rotate_radian), -sin(rotate_radian), 0,
590
sin(rotate_radian), cos(rotate_radian), 0,
593
eina_matrix3_values_set(&m1,
597
eina_matrix3_identity(&m1);
598
eina_matrix3_values_get(&m1,
602
fail_if(!EINA_DBL_EQ(xx, yy) ||
603
!EINA_DBL_EQ(yy, zz) ||
604
!EINA_DBL_EQ(zz, 1));
606
fail_if(!EINA_DBL_EQ(xy, xz) ||
607
!EINA_DBL_EQ(yx, yz) ||
608
!EINA_DBL_EQ(zx, zy) ||
609
!EINA_DBL_EQ(zy, 0));
611
eina_matrix3_values_set(&m1,
615
ret = eina_matrix3_determinant(&m1);
616
fail_if(!EINA_DBL_EQ(ret, -3));
618
eina_matrix3_values_set(&m1,
622
eina_matrix3_divide(&m1, 2);
623
eina_matrix3_values_get(&m1,
627
fail_if (!EINA_DBL_EQ(xx, xy) ||
628
!EINA_DBL_EQ(xy, xz) ||
629
!EINA_DBL_EQ(yx, yy) ||
630
!EINA_DBL_EQ(yy, yz) ||
631
!EINA_DBL_EQ(zx, zy) ||
632
!EINA_DBL_EQ(zy, zz) ||
633
!EINA_DBL_EQ(zz, 1.5));
635
eina_matrix3_values_set(&m1,
639
eina_matrix3_inverse(&m1, &m2);
640
eina_matrix3_values_get(&m2,
644
fail_if(!MATRIX3_CMP(xx, xy, xz,
651
eina_matrix3_values_set(&m1,
655
eina_matrix3_transpose(&m1, &m2);
656
eina_matrix3_values_get(&m2,
660
fail_if(!MATRIX3_CMP(xx, xy, xz,
667
eina_matrix3_values_set(&m1,
671
eina_matrix3_cofactor(&m1, &m2);
672
eina_matrix3_values_get(&m2,
676
fail_if(!MATRIX3_CMP(xx, xy, xz,
683
eina_matrix3_adjoint(&m1, &m2);
684
eina_matrix3_values_get(&m2,
688
fail_if(!MATRIX3_CMP(xx, xy, xz,
695
eina_matrix3_values_set(&m2,
699
eina_matrix3_values_set(&m3,
703
eina_matrix3_multiply_copy(&m1, &m2, &m3);
704
eina_matrix3_values_get(&m1,
708
fail_if(!MATRIX3_CMP(xx, xy, xz,
715
eina_matrix3_values_set(&m2,
719
eina_matrix3_multiply(&m1, &m2, &m3);
720
eina_matrix3_values_get(&m1,
724
fail_if(!MATRIX3_CMP(xx, xy, xz,
731
eina_matrix3_copy(&m1, &m2);
732
eina_matrix3_values_get(&m1,
736
fail_if(!MATRIX3_CMP(xx, xy, xz,
743
eina_matrix3_array_set(&m1, arr);
744
eina_matrix3_values_get(&m1,
748
fail_if(!MATRIX3_CMP(xx, xy, xz,
755
eina_matrix3_position_transform_set(&m3, 5, 3);
756
eina_matrix3_values_get(&m3,
760
fail_if (!EINA_DBL_EQ(xz, 5) ||
761
!EINA_DBL_EQ(yz, 3));
763
eina_matrix3_scale_transform_set(&m2, 6, 7);
764
eina_matrix3_values_get(&m2,
768
fail_if (!EINA_DBL_EQ(xx, 6) ||
769
!EINA_DBL_EQ(yy, 7));
773
EFL_START_TEST(eina_matrix3_f16p16)
775
Eina_Matrix3_F16p16 m1;
777
Eina_F16p16 xx, xy, xz,
780
Eina_Matrix3_F16p16 m3;
783
eina_matrix3_values_set(&m2,
787
eina_matrix3_matrix3_f16p16_to(&m2, &m1);
788
fail_if (eina_matrix3_f16p16_type_get(&m1) != EINA_MATRIX_TYPE_IDENTITY);
790
eina_matrix3_fixed_values_get(&m2,
803
eina_matrix3_values_set(&m2,
807
eina_matrix3_matrix3_f16p16_to(&m2, &m1);
808
eina_matrix3_f16p16_identity(&m1);
809
fail_if(m1.xx != m1.yy ||
813
fail_if(m1.xy != m1.xz ||
818
eina_matrix3_values_set(&m2,
822
eina_matrix3_matrix3_f16p16_to(&m2, &m1);
823
eina_matrix3_f16p16_compose(&m1, &m1, &m3);
824
fail_if (m3.xx != m3.xy ||
835
EFL_START_TEST(eina_matrix3_map_transform)
837
double x = 2, y = 3, x1, y1;
844
eina_matrix3_values_set(&m,
849
eina_matrix3_point_transform(&m,
852
fail_if(!EINA_DBL_EQ(x1, 3) ||
853
!EINA_DBL_EQ(y1, 2));
855
EINA_RECTANGLE_SET(&r, 0, 0, 3, 4);
856
eina_matrix3_rectangle_transform(&m, &r, &q);
858
fail_if(!EINA_DBL_EQ(q.x0, 0) ||
859
!EINA_DBL_EQ(q.y0, 0) ||
860
!EINA_DBL_EQ(q.x1, 0) ||
861
!EINA_DBL_EQ(q.y1, 3) ||
862
!EINA_DBL_EQ(q.x2, 4) ||
863
!EINA_DBL_EQ(q.y2, 3) ||
864
!EINA_DBL_EQ(q.x3, 4) ||
865
!EINA_DBL_EQ(q.y3, 0));
867
eina_quad_coords_set(&q,
872
ret = eina_matrix3_square_quad_map(&m, &q);
873
fail_if(ret != EINA_TRUE);
875
fail_if(!MATRIX3_CMP(m.xx, m.xy, m.xz,
882
ret = eina_matrix3_quad_square_map(&m, &q);
883
fail_if(ret != EINA_TRUE);
885
fail_if(!EINA_DBL_EQ(q.x0, 0) ||
886
!EINA_DBL_EQ(q.y0, 0) ||
887
!EINA_DBL_EQ(q.x1, 3) ||
888
!EINA_DBL_EQ(q.y1, 0) ||
889
!EINA_DBL_EQ(q.x2, 3) ||
890
!EINA_DBL_EQ(q.y2, 3) ||
891
!EINA_DBL_EQ(q.x3, 0) ||
892
!EINA_DBL_EQ(q.y3, 3));
897
EFL_START_TEST(eina_normal3_test)
905
eina_matrix4_values_set(&m,
910
eina_normal3_matrix_get(&out, &m);
911
eina_matrix3_values_get(&out,
917
fail_if((fabs(xy) - 1.0) > DBL_EPSILON ||
918
(fabs(yx) - 1.0) > DBL_EPSILON ||
919
(fabs(yz) - 1.0) > DBL_EPSILON ||
920
(fabs(zy) - 1.0) > DBL_EPSILON
923
eina_matrix4_values_set(&m,
928
eina_normal3_matrix_get(&out, &m);
929
eina_matrix3_values_get(&out,
934
fail_if((fabs(xy)) > DBL_EPSILON ||
935
(fabs(yx)) > DBL_EPSILON ||
936
(fabs(yz)) > DBL_EPSILON ||
937
(fabs(zy)) > DBL_EPSILON
943
eina_test_matrix(TCase *tc)
945
tcase_add_test(tc, eina_matrix2);
946
tcase_add_test(tc, eina_matrix2_operation);
947
tcase_add_test(tc, eina_matrix4);
948
tcase_add_test(tc, eina_matrix4_operation);
949
tcase_add_test(tc, eina_matrix4_2_3);
950
tcase_add_test(tc, eina_matrix3);
951
tcase_add_test(tc, eina_matrix3_operations);
952
tcase_add_test(tc, eina_matrix3_f16p16);
953
tcase_add_test(tc, eina_matrix3_map_transform);
954
tcase_add_test(tc, eina_normal3_test);