1 #include "tests.h"
2 
irand()3 static int irand()
4 {
5     return rand() - RAND_MAX / 2;
6 }
7 
main()8 int main()
9 {
10     pl_log log = pl_test_logger();
11     pl_log_update(log, NULL);
12     pl_log_destroy(&log);
13 
14     // Test some misc helper functions
15     struct pl_rect2d rc2 = {
16         irand(), irand(),
17         irand(), irand(),
18     };
19 
20     struct pl_rect3d rc3 = {
21         irand(), irand(), irand(),
22         irand(), irand(), irand(),
23     };
24 
25     pl_rect2d_normalize(&rc2);
26     REQUIRE(rc2.x1 >= rc2.x0);
27     REQUIRE(rc2.y1 >= rc2.y0);
28 
29     pl_rect3d_normalize(&rc3);
30     REQUIRE(rc3.x1 >= rc3.x0);
31     REQUIRE(rc3.y1 >= rc3.y0);
32     REQUIRE(rc3.z1 >= rc3.z0);
33 
34     struct pl_rect2df rc2f = {
35         RANDOM, RANDOM,
36         RANDOM, RANDOM,
37     };
38 
39     struct pl_rect3df rc3f = {
40         RANDOM, RANDOM, RANDOM,
41         RANDOM, RANDOM, RANDOM,
42     };
43 
44     pl_rect2df_normalize(&rc2f);
45     REQUIRE(rc2.x1 >= rc2.x0);
46     REQUIRE(rc2.y1 >= rc2.y0);
47 
48     pl_rect3df_normalize(&rc3f);
49     REQUIRE(rc3.x1 >= rc3.x0);
50     REQUIRE(rc3.y1 >= rc3.y0);
51     REQUIRE(rc3.z1 >= rc3.z0);
52 
53     struct pl_rect2d rc2r = pl_rect2df_round(&rc2f);
54     struct pl_rect3d rc3r = pl_rect3df_round(&rc3f);
55 
56     REQUIRE(fabs(rc2r.x0 - rc2f.x0) <= 0.5);
57     REQUIRE(fabs(rc2r.x1 - rc2f.x1) <= 0.5);
58     REQUIRE(fabs(rc2r.y0 - rc2f.y0) <= 0.5);
59     REQUIRE(fabs(rc2r.y1 - rc2f.y1) <= 0.5);
60 
61     REQUIRE(fabs(rc3r.x0 - rc3f.x0) <= 0.5);
62     REQUIRE(fabs(rc3r.x1 - rc3f.x1) <= 0.5);
63     REQUIRE(fabs(rc3r.y0 - rc3f.y0) <= 0.5);
64     REQUIRE(fabs(rc3r.y1 - rc3f.y1) <= 0.5);
65     REQUIRE(fabs(rc3r.z0 - rc3f.z0) <= 0.5);
66     REQUIRE(fabs(rc3r.z1 - rc3f.z1) <= 0.5);
67 
68     struct pl_transform3x3 tr = {
69         .mat = {{
70             { RANDOM, RANDOM, RANDOM },
71             { RANDOM, RANDOM, RANDOM },
72             { RANDOM, RANDOM, RANDOM },
73         }},
74         .c = { RANDOM, RANDOM, RANDOM },
75     };
76 
77     struct pl_transform3x3 tr2 = tr;
78     float scale = 1.0 + RANDOM;
79     pl_transform3x3_scale(&tr2, scale);
80     pl_transform3x3_invert(&tr2);
81     pl_transform3x3_invert(&tr2);
82     pl_transform3x3_scale(&tr2, 1.0 / scale);
83 
84     for (int i = 0; i < 3; i++) {
85         for (int j = 0; j < 3; j++) {
86             printf("%f %f\n", tr.mat.m[i][j], tr2.mat.m[i][j]);
87             REQUIRE(feq(tr.mat.m[i][j], tr2.mat.m[i][j], 1e-4));
88         }
89         REQUIRE(feq(tr.c[i], tr2.c[i], 1e-4));
90     }
91 
92     // Test aspect ratio code
93     const struct pl_rect2df rc1080p = {0, 0, 1920, 1080};
94     const struct pl_rect2df rc43 = {0, 0, 1024, 768};
95     struct pl_rect2df rc;
96 
97     REQUIRE(feq(pl_rect2df_aspect(&rc1080p), 16.0/9.0, 1e-8));
98     REQUIRE(feq(pl_rect2df_aspect(&rc43), 4.0/3.0, 1e-8));
99 
100 #define pl_rect2df_midx(rc) (((rc).x0 + (rc).x1) / 2.0)
101 #define pl_rect2df_midy(rc) (((rc).y0 + (rc).y1) / 2.0)
102 
103     for (float aspect = 0.2; aspect < 3.0; aspect += 0.4) {
104         for (float scan = 0.0; scan <= 1.0; scan += 0.5) {
105             rc = rc1080p;
106             pl_rect2df_aspect_set(&rc, aspect, scan);
107             printf("aspect %.2f, panscan %.1f: {%f %f} -> {%f %f}\n",
108                    aspect, scan, rc.x0, rc.y0, rc.x1, rc.y1);
109             REQUIRE(feq(pl_rect2df_aspect(&rc), aspect, 1e-6));
110             REQUIRE(feq(pl_rect2df_midx(rc), pl_rect2df_midx(rc1080p), 1e-6));
111             REQUIRE(feq(pl_rect2df_midy(rc), pl_rect2df_midy(rc1080p), 1e-6));
112         }
113     }
114 
115     rc = rc1080p;
116     pl_rect2df_aspect_fit(&rc, &rc43, 0.0);
117     REQUIRE(feq(pl_rect2df_aspect(&rc), pl_rect2df_aspect(&rc43), 1e-6));
118     REQUIRE(feq(pl_rect2df_midx(rc), pl_rect2df_midx(rc1080p), 1e-6));
119     REQUIRE(feq(pl_rect2df_midy(rc), pl_rect2df_midy(rc1080p), 1e-6));
120     REQUIRE(feq(pl_rect_w(rc), pl_rect_w(rc43), 1e-6));
121     REQUIRE(feq(pl_rect_h(rc), pl_rect_h(rc43), 1e-6));
122 
123     rc = rc43;
124     pl_rect2df_aspect_fit(&rc, &rc1080p, 0.0);
125     REQUIRE(feq(pl_rect2df_aspect(&rc), pl_rect2df_aspect(&rc1080p), 1e-6));
126     REQUIRE(feq(pl_rect2df_midx(rc), pl_rect2df_midx(rc43), 1e-6));
127     REQUIRE(feq(pl_rect2df_midy(rc), pl_rect2df_midy(rc43), 1e-6));
128     REQUIRE(feq(pl_rect_w(rc), pl_rect_w(rc43), 1e-6));
129 
130     rc = (struct pl_rect2df) { 1920, 1080, 0, 0 };
131     pl_rect2df_offset(&rc, 50, 100);
132     REQUIRE(feq(rc.x0, 1870, 1e-6));
133     REQUIRE(feq(rc.x1, -50, 1e-6));
134     REQUIRE(feq(rc.y0, 980, 1e-6));
135     REQUIRE(feq(rc.y1, -100, 1e-6));
136 }
137