[GDI32_APITEST]
[reactos.git] / rostests / apitests / gdi32 / CombineTransform.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for CreatePen
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include <stdio.h>
9 #include <wine/test.h>
10 #include <windows.h>
11 #include <winddi.h>
12 #include <reactos/win32k/ntgdityp.h>
13 #include <reactos/win32k/ntgdihdl.h>
14
15 #define ok_int(x, y) ok(x == y, "Wrong value for " #x ", expected " #y ", got %ld\n", (long)x);
16 #define ok_flt(x, y) ok(x == y, "Wrong value for " #x ", expected " #y ", got %f\n", (double)x);
17
18 #define ok_xform(xform, m11, m12, m21, m22, dx, dy) \
19 ok_flt(xform.eM11, m11); \
20 ok_flt(xform.eM12, m12); \
21 ok_flt(xform.eM21, m21); \
22 ok_flt(xform.eM22, m22); \
23 ok_flt(xform.eDx, dx); \
24 ok_flt(xform.eDy, dy);
25
26 void Test_CombineTransform()
27 {
28 XFORM xform1, xform2, xform3;
29 BOOL ret;
30
31 /* Test NULL paramters */
32 SetLastError(ERROR_SUCCESS);
33 ret = CombineTransform(&xform3, &xform1, NULL);
34 ok_int(ret, 0);
35 ret = CombineTransform(&xform3, NULL, &xform2);
36 ok_int(ret, 0);
37 ret = CombineTransform(NULL, &xform1, &xform2);
38 ok_int(ret, 0);
39 ret = CombineTransform(&xform3, &xform1, &xform2);
40 ok_int(ret, 0);
41 ok_int(GetLastError(), ERROR_SUCCESS);
42
43 /* 2 Identity matrices */
44 xform1.eM11 = 1.0;
45 xform1.eM12 = 0;
46 xform1.eM21 = 0;
47 xform1.eM22 = 1.0;
48 xform1.eDx = 0;
49 xform1.eDy = 0;
50 xform2 = xform1;
51 SetLastError(ERROR_SUCCESS);
52 ret = CombineTransform(&xform3, &xform1, &xform2);
53 ok_int(ret, 1);
54 ok_xform(xform3, 1.0, 0., 0., 1.0, 0., 0.);
55 ok_int(GetLastError(), ERROR_SUCCESS);
56
57 /* 2 Identity matrices with offsets */
58 xform1.eDx = 20.0;
59 xform1.eDy = -100;
60 ret = CombineTransform(&xform3, &xform1, &xform2);
61 ok_int(ret, 1);
62 ok_xform(xform3, 1.0, 0., 0., 1.0, 20.0, -100.0);
63
64 xform2.eDx = -60.0;
65 xform2.eDy = -20;
66 ret = CombineTransform(&xform3, &xform1, &xform2);
67 ok_int(ret, 1);
68 ok_flt(xform3.eDx, -40.0);
69 ok_flt(xform3.eDy, -120.0);
70
71 /* add some stretching */
72 xform2.eM11 = 2;
73 xform2.eM22 = 4;
74 ret = CombineTransform(&xform3, &xform1, &xform2);
75 ok_int(ret, 1);
76 ok_xform(xform3, 2.0, 0., 0., 4.0, -20.0, -420.0);
77
78 /* add some more stretching */
79 xform1.eM11 = -2.5;
80 xform1.eM22 = 0.5;
81 ret = CombineTransform(&xform3, &xform1, &xform2);
82 ok_int(ret, 1);
83 ok_xform(xform3, -5.0, 0., 0., 2.0, -20.0, -420.0);
84
85 xform1.eM12 = 2.0;
86 xform1.eM21 = -0.5;
87 ret = CombineTransform(&xform3, &xform1, &xform2);
88 ok_int(ret, 1);
89 ok_xform(xform3, -5.0, 8.0, -1.0, 2.0, -20.0, -420.0);
90
91 xform2.eM12 = 4.0;
92 xform2.eM21 = 6.5;
93 ret = CombineTransform(&xform3, &xform1, &xform2);
94 ok_int(ret, 1);
95 ok_xform(xform3, 8.0, -2.0, 2.25, 0.0, -670.0, -340.0);
96
97 xform1.eM11 = 1.;
98 xform1.eM12 = 0;
99 xform1.eM21 = 0;
100 xform1.eM22 = 1.;
101 xform1.eDx = 0;
102 xform1.eDy = 0;
103 xform2 = xform1;
104
105 xform1.eDx = 4294967167.999999761;
106 ok(xform1.eDx == 4294967040.0, "float rounding error.\n");
107 ret = CombineTransform(&xform3, &xform1, &xform2);
108 ok(ret == 1, "expected ret = 1, got %d\n", ret);
109
110 xform1.eDx = 4294967167.999999762;
111 ok(xform1.eDx == 4294967296.0, "float rounding error.\n");
112 ret = CombineTransform(&xform3, &xform1, &xform2);
113 ok_int(ret, 0);
114 ok_int(GetLastError(), ERROR_SUCCESS);
115
116 xform1.eDx = -4294967167.999999761;
117 ok(xform1.eDx == -4294967040.0, "float rounding error.\n");
118 ret = CombineTransform(&xform3, &xform1, &xform2);
119 ok_int(ret, 1);
120
121 xform1.eDx = -4294967167.999999762;
122 ok(xform1.eDx == -4294967296.0, "float rounding error.\n");
123 ret = CombineTransform(&xform3, &xform1, &xform2);
124 ok_int(ret, 0);
125 ok_int(GetLastError(), ERROR_SUCCESS);
126
127 xform1.eDx = 0;
128 xform1.eDy = 4294967167.999999761;
129 ok(xform1.eDy == 4294967040.0, "float rounding error.\n");
130 ret = CombineTransform(&xform3, &xform1, &xform2);
131 ok_int(ret, 1);
132
133 xform2.eDy = 1;
134 ret = CombineTransform(&xform3, &xform1, &xform2);
135 ok_int(ret, 1);
136
137 xform1.eDy = 4294967167.999999762;
138 ok(xform1.eDy == 4294967296.0, "float rounding error.\n");
139 ret = CombineTransform(&xform3, &xform1, &xform2);
140 ok_int(ret, 0);
141 ok_int(GetLastError(), ERROR_SUCCESS);
142
143 xform1.eDy = -4294967167.999999761;
144 ok(xform1.eDy == -4294967040.0, "float rounding error.\n");
145 ret = CombineTransform(&xform3, &xform1, &xform2);
146 ok_int(ret, 1);
147
148 xform1.eDy = -4294967167.999999762;
149 ok(xform1.eDy == -4294967296.0, "float rounding error.\n");
150 ret = CombineTransform(&xform3, &xform1, &xform2);
151 ok_int(ret, 0);
152 ok_int(GetLastError(), ERROR_SUCCESS);
153
154 xform2.eDy = 10000;
155 ret = CombineTransform(&xform3, &xform1, &xform2);
156 ok_int(ret, 1);
157
158 xform1.eDx = -4294967167.999999762;
159 xform1.eM11 = 1000.0;
160 xform2.eM11 = 1000.0;
161 ret = CombineTransform(&xform3, &xform1, &xform2);
162 ok_int(ret, 0);
163 ok_int(GetLastError(), ERROR_SUCCESS);
164
165 xform1.eDx = 100000.0;
166 xform2.eM11 = 100000.0;
167 ret = CombineTransform(&xform3, &xform1, &xform2);
168 ok_int(ret, 0);
169 ok_int(GetLastError(), ERROR_SUCCESS);
170
171 /* Some undefined values */
172 *(DWORD*)&xform1.eM11 = 0xffc00000; // (0.0F/0.0F)
173 xform1.eM12 = 0;
174 xform1.eM21 = 0;
175 *(DWORD*)&xform1.eM22 = 0x7f800000; // (1.0F/0.0F)
176 xform1.eDx = 0;
177 xform1.eDy = 0;
178 xform2 = xform1;
179 SetLastError(ERROR_SUCCESS);
180 ret = CombineTransform(&xform3, &xform1, &xform2);
181 ok_int(ret, 1);
182 ok(*(DWORD*)&xform3.eM11 == 0xffc00000, "eM11: Expected 0xffc00000, got 0x%lx\n", *(DWORD*)&xform3.eM11);
183 ok(xform3.eM12 == 0, "eM12: Expected 0, got %f\n", xform3.eM12);
184 ok(xform3.eM21 == 0, "eM21: Expected 0, got %f\n", xform3.eM21);
185 ok(*(DWORD*)&xform3.eM22 == 0x7f800000, "eM22: Expected 0x7f800000, got 0x%lx\n", *(DWORD*)&xform3.eM22);
186 ok(xform3.eDx == 0, "eDx: Expected 0, got %f\n", xform3.eDx);
187 ok(xform3.eDy == 0, "eDy: Expected 0, got %f\n", xform3.eDy);
188 ok_int(GetLastError(), ERROR_SUCCESS);
189
190 /* Some undefined values */
191 xform2.eM11 = 1.;
192 xform2.eM22 = 1.;
193 xform2.eM12 = 1.;
194 xform2.eM21 = 1.;
195 ret = CombineTransform(&xform3, &xform1, &xform2);
196 ok_int(ret, 1);
197
198 ok_int(*(DWORD*)&xform3.eM11, 0xffc00000);
199 ok_int(*(DWORD*)&xform3.eM12, 0xffc00000);
200 ok_int(*(DWORD*)&xform3.eM21, 0x7f800000);
201 ok_int(*(DWORD*)&xform3.eM22, 0x7f800000);
202 ok(xform3.eDx == 0, "eDx: Expected 0, got %f\n", xform3.eDx);
203 ok(xform3.eDy == 0, "eDy: Expected 0, got %f\n", xform3.eDy);
204 ok_int(GetLastError(), ERROR_SUCCESS);
205
206 }
207
208 START_TEST(CombineTransform)
209 {
210 Test_CombineTransform();
211 }
212