ae5d556044055e734574c51730d9bad3ac0dc7bb
[reactos.git] / rostests / apitests / gdi32api / tests / GetObject.c
1 static INT
2 Test_General(PTESTINFO pti)
3 {
4 struct
5 {
6 LOGBRUSH logbrush;
7 BYTE additional[5];
8 } TestStruct;
9 PLOGBRUSH plogbrush;
10 HBRUSH hBrush;
11
12 /* Test null pointer and invalid handles */
13 SetLastError(ERROR_SUCCESS);
14 RTEST(GetObjectA(0, 0, NULL) == 0);
15 RTEST(GetObjectA((HANDLE)-1, 0, NULL) == 0);
16 RTEST(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0);
17 RTEST(GetLastError() == ERROR_SUCCESS);
18
19 SetLastError(ERROR_SUCCESS);
20 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
21 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
22 SetLastError(ERROR_SUCCESS);
23 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
24 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
25 SetLastError(ERROR_SUCCESS);
26 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
27 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
28 SetLastError(ERROR_SUCCESS);
29 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
30 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
31 SetLastError(ERROR_SUCCESS);
32 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
33 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
34 SetLastError(ERROR_SUCCESS);
35 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
36 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
37 SetLastError(ERROR_SUCCESS);
38 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
39 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
40 SetLastError(ERROR_SUCCESS);
41 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
42 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
43 SetLastError(ERROR_SUCCESS);
44 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
45 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
46 SetLastError(ERROR_SUCCESS);
47 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
48 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
49
50 /* Test need of alignment */
51 hBrush = GetStockObject(WHITE_BRUSH);
52 plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);
53 RTEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
54 plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);
55 RTEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
56 plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
57 RTEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0);
58
59 return TRUE;
60 }
61
62 static INT
63 Test_Bitmap(PTESTINFO pti)
64 {
65 HBITMAP hBitmap;
66 BITMAP bitmap;
67 DIBSECTION dibsection;
68 BYTE bData[100] = {0};
69 BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};
70
71 FillMemory(&bitmap, sizeof(BITMAP), 0x77);
72 hBitmap = CreateBitmap(10,10,1,8,bData);
73 if (!hBitmap) return FALSE;
74
75 SetLastError(ERROR_SUCCESS);
76 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
77 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
78 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP));
79 RTEST(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
80 RTEST(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP));
81 RTEST(GetObjectA((HANDLE)((UINT)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP));
82 RTEST(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP));
83 RTEST(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP));
84 RTEST(GetObjectA(hBitmap, 0, Buffer) == 0);
85 RTEST(GetObjectA(hBitmap, 5, Buffer) == 0);
86 RTEST(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
87 RTEST(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));
88 RTEST(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP));
89 RTEST(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP));
90 RTEST(GetLastError() == ERROR_SUCCESS);
91
92 // todo: test invalid handle + buffer
93
94 DeleteObject(hBitmap);
95 return TRUE;
96 }
97
98 static INT
99 Test_Dibsection(PTESTINFO pti)
100 {
101 BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
102 HBITMAP hBitmap;
103 BITMAP bitmap;
104 DIBSECTION dibsection;
105 PVOID pData;
106 HDC hDC;
107
108 FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);
109 hDC = GetDC(0);
110 hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);
111 ASSERT(hBitmap);
112
113 SetLastError(ERROR_SUCCESS);
114 RTEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
115 RTEST(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP));
116 RTEST(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP));
117 RTEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));
118 RTEST(GetObject(hBitmap, 0, &dibsection) == 0);
119 RTEST(GetObject(hBitmap, 5, &dibsection) == 0);
120 RTEST(GetObject(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
121 RTEST(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));
122 TEST(bitmap.bmType == 0);
123 TEST(bitmap.bmWidth == 10);
124 TEST(bitmap.bmHeight == 9);
125 TEST(bitmap.bmWidthBytes == 12);
126 TEST(bitmap.bmPlanes == 1);
127 TEST(bitmap.bmBitsPixel == 8);
128 TEST(bitmap.bmBits == pData);
129 RTEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
130 RTEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));
131 RTEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));
132 RTEST(GetLastError() == ERROR_SUCCESS);
133 DeleteObject(hBitmap);
134 ReleaseDC(0, hDC);
135
136 return TRUE;
137 }
138
139 static INT
140 Test_Palette(PTESTINFO pti)
141 {
142 LOGPALETTE logpal;
143 HPALETTE hPalette;
144 WORD wPalette;
145
146 FillMemory(&wPalette, sizeof(WORD), 0x77);
147 logpal.palVersion = 0x0300;
148 logpal.palNumEntries = 1;
149 logpal.palPalEntry[0].peRed = 0;
150 logpal.palPalEntry[0].peGreen = 0;
151 logpal.palPalEntry[0].peBlue = 0;
152 logpal.palPalEntry[0].peFlags = PC_EXPLICIT;
153 hPalette = CreatePalette(&logpal);
154 if (!hPalette) return FALSE;
155
156 SetLastError(ERROR_SUCCESS);
157 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
158 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
159 RTEST(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD));
160 RTEST(GetObject(hPalette, 0, NULL) == sizeof(WORD));
161 RTEST(GetObject(hPalette, 5, NULL) == sizeof(WORD));
162 RTEST(GetObject(hPalette, -5, NULL) == sizeof(WORD));
163 RTEST(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD));
164 RTEST(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD));
165 RTEST(GetObject(hPalette, 0, &wPalette) == 0);
166 RTEST(GetObject(hPalette, 1, &wPalette) == 0);
167 RTEST(GetObject(hPalette, -1, &wPalette) == sizeof(WORD));
168 RTEST(GetLastError() == ERROR_SUCCESS);
169 DeleteObject(hPalette);
170 return TRUE;
171 }
172
173 static INT
174 Test_Brush(PTESTINFO pti)
175 {
176 LOGBRUSH logbrush;
177 HBRUSH hBrush;
178
179 FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
180 hBrush = CreateSolidBrush(RGB(1,2,3));
181 if (!hBrush) return FALSE;
182
183 SetLastError(ERROR_SUCCESS);
184 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
185 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
186 RTEST(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH));
187 RTEST(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH));
188 RTEST(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH));
189 RTEST(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH));
190
191 RTEST(GetObject(hBrush, 0, &logbrush) == 0);
192 RTEST(logbrush.lbStyle == 0x77777777);
193 RTEST(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH));
194 RTEST(logbrush.lbStyle == 0);
195 RTEST(logbrush.lbColor == 0x77777701);
196
197 RTEST(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH));
198 RTEST(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH));
199 RTEST(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH));
200 // TODO: test all members
201
202 RTEST(GetLastError() == ERROR_SUCCESS);
203 DeleteObject(hBrush);
204 return TRUE;
205 }
206
207 static INT
208 Test_Pen(PTESTINFO pti)
209 {
210 LOGPEN logpen;
211 HPEN hPen;
212
213 FillMemory(&logpen, sizeof(LOGPEN), 0x77);
214 hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));
215 if (!hPen) return FALSE;
216 SetLastError(ERROR_SUCCESS);
217 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
218 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
219 RTEST(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN));
220 RTEST(GetObject(hPen, 0, NULL) == sizeof(LOGPEN));
221 RTEST(GetObject(hPen, 5, NULL) == sizeof(LOGPEN));
222 RTEST(GetObject(hPen, -5, NULL) == sizeof(LOGPEN));
223 RTEST(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN));
224 RTEST(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0);
225 RTEST(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN));
226 RTEST(GetObject(hPen, 0, &logpen) == 0);
227 RTEST(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN));
228 RTEST(GetLastError() == ERROR_SUCCESS);
229
230 /* test if the fields are filled correctly */
231 RTEST(logpen.lopnStyle == PS_SOLID);
232
233
234 DeleteObject(hPen);
235 return TRUE;
236 }
237
238 static INT
239 Test_ExtPen(PTESTINFO pti)
240 {
241 HPEN hPen;
242 EXTLOGPEN extlogpen;
243 LOGBRUSH logbrush;
244 DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
245 struct
246 {
247 EXTLOGPEN extlogpen;
248 DWORD dwStyles[50];
249 } elpUserStyle;
250
251 SetLastError(ERROR_SUCCESS);
252 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
253 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
254 TEST(GetLastError() == ERROR_INVALID_PARAMETER);
255
256 FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);
257 logbrush.lbStyle = BS_SOLID;
258 logbrush.lbColor = RGB(1,2,3);
259 logbrush.lbHatch = 22;
260 hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);
261
262 RTEST(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN);
263 RTEST(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
264 RTEST(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
265 RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
266 RTEST(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
267 RTEST(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
268 RTEST(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
269 RTEST(GetObject(hPen, 0, &extlogpen) == 0);
270 RTEST(GetObject(hPen, 4, &extlogpen) == 0);
271
272 /* Nothing should be filled */
273 RTEST(extlogpen.elpPenStyle == 0x77777777);
274 RTEST(extlogpen.elpWidth == 0x77777777);
275
276 RTEST(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
277 RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
278 RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0);
279 RTEST(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
280 RTEST(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
281
282 /* test if the fields are filled correctly */
283 RTEST(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH));
284 RTEST(extlogpen.elpWidth == 5);
285 RTEST(extlogpen.elpBrushStyle == 0);
286 RTEST(extlogpen.elpColor == RGB(1,2,3));
287 RTEST(extlogpen.elpHatch == 22);
288 RTEST(extlogpen.elpNumEntries == 0);
289 DeleteObject(hPen);
290
291 /* A maximum of 16 Styles is allowed */
292 hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
293 RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
294 RTEST(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
295 RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0);
296 RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1);
297 RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15);
298 DeleteObject(hPen);
299
300 return TRUE;
301 }
302
303 static INT
304 Test_Font(PTESTINFO pti)
305 {
306 HFONT hFont;
307 LOGFONTA logfonta;
308 LOGFONTW logfontw;
309 EXTLOGFONTA extlogfonta;
310 EXTLOGFONTW extlogfontw;
311 ENUMLOGFONTEXA enumlogfontexa;
312 ENUMLOGFONTEXW enumlogfontexw;
313 ENUMLOGFONTEXDVA enumlogfontexdva;
314 ENUMLOGFONTEXDVW enumlogfontexdvw;
315 ENUMLOGFONTA enumlogfonta;
316 ENUMLOGFONTW enumlogfontw;
317 BYTE bData[270];
318
319 FillMemory(&logfonta, sizeof(LOGFONTA), 0x77);
320 hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
321 ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
322 ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");
323 RTEST(hFont);
324
325 SetLastError(ERROR_SUCCESS);
326 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA));
327 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW));
328 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA)); // 60
329 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA)); // 156
330 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA)); // 188
331 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA)); // 192
332 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA)); // 260
333 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA)); // 260
334 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW)); // 92
335 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW)); // 284
336 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW)); // 320
337 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW)); // 348
338 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW)); // 420
339 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW)); // 356!
340
341 RTEST(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA));
342 RTEST(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA));
343 RTEST(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA));
344 RTEST(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA));
345 RTEST(GetObjectA(hFont, 0, &logfonta) == 0);
346 RTEST(logfonta.lfHeight == 0x77777777);
347
348 TEST(GetObjectA(hFont, 5, &logfonta) == 5);
349 TEST(logfonta.lfHeight == 8);
350 TEST(logfonta.lfWidth == 0x77777708);
351
352 RTEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
353 TEST(GetObjectA(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTA)); // 92
354 RTEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
355 TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &extlogfonta) == sizeof(EXTLOGFONTA)+1); // 192
356 TEST(GetObjectA(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(ENUMLOGFONTEXDVA)); // 320
357
358 TEST(GetObjectA(hFont, 261, &bData) == 260); // no
359
360 /* LOGFONT / GetObjectW */
361 FillMemory(&logfontw, sizeof(LOGFONTW), 0x77);
362
363 RTEST(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW));
364 RTEST(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW));
365 RTEST(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW));
366 RTEST(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW));
367 RTEST(GetObjectW(hFont, 0, &logfontw) == 0);
368 RTEST(logfontw.lfHeight == 0x77777777);
369
370 TEST(GetObjectW(hFont, 5, &logfontw) == 5);
371 TEST(logfontw.lfHeight == 8);
372 TEST(logfontw.lfWidth == 0x77777708);
373
374 RTEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
375 RTEST(logfonta.lfHeight == 8);
376 RTEST(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &enumlogfonta) == sizeof(ENUMLOGFONTA)); // 156
377 RTEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &enumlogfontexa) == sizeof(ENUMLOGFONTEXA)); // 188
378 RTEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
379 RTEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
380 TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
381
382 RTEST(GetObjectW(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTW)); // 92
383 RTEST(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &enumlogfontw) == sizeof(ENUMLOGFONTW)); // 284
384 RTEST(GetObjectW(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(EXTLOGFONTW)); // 320
385 RTEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &enumlogfontexw) == sizeof(ENUMLOGFONTEXW)); // 348
386 TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 420
387 TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 356!
388
389 TEST(GetObjectW(hFont, 356, &bData) == 356);
390 TEST(GetLastError() == ERROR_SUCCESS);
391
392 DeleteObject(hFont);
393
394 return TRUE;
395 }
396
397 static INT
398 Test_Colorspace(PTESTINFO pti)
399 {
400 SetLastError(ERROR_SUCCESS);
401 TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60);// FIXME: what structure?
402 TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
403 SetLastError(ERROR_SUCCESS);
404 RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0);
405 TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
406
407 return TRUE;
408 }
409
410 static INT
411 Test_MetaDC(PTESTINFO pti)
412 {
413 /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */
414 HDC hMetaDC;
415 BYTE buffer[100];
416
417 hMetaDC = CreateMetaFile(NULL);
418 if(!hMetaDC) return FALSE;
419 if(((UINT)hMetaDC & GDI_HANDLE_TYPE_MASK) != GDI_OBJECT_TYPE_METADC) return FALSE;
420
421 SetLastError(ERROR_SUCCESS);
422 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0);
423 RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0);
424 RTEST(GetObjectA(hMetaDC, 0, NULL) == 0);
425 RTEST(GetObjectA(hMetaDC, 100, &buffer) == 0);
426 RTEST(GetLastError() == ERROR_SUCCESS);
427 return TRUE;
428 }
429
430 INT
431 Test_GetObject(PTESTINFO pti)
432 {
433
434 HRGN hRgn;
435 hRgn = CreateRectRgn(0,0,5,5);
436 SetLastError(ERROR_SUCCESS);
437 RTEST(GetObjectW(hRgn, 0, NULL) == 0);
438 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
439 DeleteObject(hRgn);
440
441 Test_Font(pti);
442 Test_Colorspace(pti);
443 Test_General(pti);
444 Test_Bitmap(pti);
445 Test_Dibsection(pti);
446 Test_Palette(pti);
447 Test_Brush(pti);
448 Test_Pen(pti);
449 Test_ExtPen(pti); // not implemented yet in ROS
450 Test_MetaDC(pti);
451
452 return APISTATUS_NORMAL;
453 }