2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for GetObject
5 * PROGRAMMERS: Timo Kreuzer
13 #include <include/ntgdityp.h>
14 #include <include/ntgdihdl.h>
28 /* Test null pointer and invalid handles */
29 SetLastError(ERROR_SUCCESS
);
30 ok(GetObjectA(0, 0, NULL
) == 0, "\n");
31 ok(GetObjectA((HANDLE
)-1, 0, NULL
) == 0, "\n");
33 /* Test invalid habdles of different types */
34 ok(GetObjectA((HANDLE
)0x00380000, 0, NULL
) == 0, "\n");
35 ok(GetLastError() == ERROR_SUCCESS
, "\n");
36 ok(GetObjectA((HANDLE
)0x00380000, 10, &TestStruct
) == 0, "\n");
37 ok(GetLastError() == ERROR_SUCCESS
, "\n");
38 SetLastError(ERROR_SUCCESS
);
39 ok(GetObjectA((HANDLE
)0x00010000, 0, NULL
) == 0, "\n");
40 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
41 SetLastError(ERROR_SUCCESS
);
42 ok(GetObjectA((HANDLE
)0x00020000, 0, NULL
) == 0, "\n");
43 ok(GetLastError() == ERROR_SUCCESS
, "\n");
44 SetLastError(ERROR_SUCCESS
);
45 ok(GetObjectA((HANDLE
)0x00030000, 0, NULL
) == 0, "\n");
46 ok(GetLastError() == ERROR_SUCCESS
, "\n");
47 SetLastError(ERROR_SUCCESS
);
48 ok(GetObjectA((HANDLE
)0x00040000, 0, NULL
) == 0, "\n");
49 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
50 SetLastError(ERROR_SUCCESS
);
51 ok(GetObjectA((HANDLE
)0x00060000, 0, NULL
) == 0, "\n");
52 ok(GetLastError() == ERROR_SUCCESS
, "\n");
53 SetLastError(ERROR_SUCCESS
);
54 ok(GetObjectA((HANDLE
)0x00070000, 0, NULL
) == 0, "\n");
55 ok(GetLastError() == ERROR_SUCCESS
, "\n");
56 SetLastError(ERROR_SUCCESS
);
57 ok(GetObjectA((HANDLE
)0x000B0000, 0, NULL
) == 0, "\n");
58 ok(GetLastError() == ERROR_SUCCESS
, "\n");
59 SetLastError(ERROR_SUCCESS
);
60 ok(GetObjectA((HANDLE
)0x000C0000, 0, NULL
) == 0, "\n");
61 ok(GetLastError() == ERROR_SUCCESS
, "\n");
62 SetLastError(ERROR_SUCCESS
);
63 ok(GetObjectA((HANDLE
)0x000D0000, 0, NULL
) == 0, "\n");
64 ok(GetLastError() == ERROR_SUCCESS
, "\n");
65 SetLastError(ERROR_SUCCESS
);
66 ok(GetObjectA((HANDLE
)0x000E0000, 0, NULL
) == 0, "\n");
67 ok(GetLastError() == ERROR_SUCCESS
, "\n");
68 SetLastError(ERROR_SUCCESS
);
69 ok(GetObjectA((HANDLE
)0x000F0000, 0, NULL
) == 0, "\n");
70 ok(GetLastError() == ERROR_SUCCESS
, "\n");
71 SetLastError(ERROR_SUCCESS
);
72 ok(GetObjectA((HANDLE
)0x00110000, 0, NULL
) == 0, "\n");
73 ok(GetLastError() == ERROR_SUCCESS
, "\n");
74 SetLastError(ERROR_SUCCESS
);
75 ok(GetObjectA((HANDLE
)0x00120000, 0, NULL
) == 0, "\n");
76 ok(GetLastError() == ERROR_SUCCESS
, "\n");
77 SetLastError(ERROR_SUCCESS
);
78 ok(GetObjectA((HANDLE
)0x00130000, 0, NULL
) == 0, "\n");
79 ok(GetLastError() == ERROR_SUCCESS
, "\n");
80 SetLastError(ERROR_SUCCESS
);
81 ok(GetObjectA((HANDLE
)0x00140000, 0, NULL
) == 0, "\n");
82 ok(GetLastError() == ERROR_SUCCESS
, "\n");
83 SetLastError(ERROR_SUCCESS
);
84 ok(GetObjectA((HANDLE
)0x00150000, 0, NULL
) == 0, "\n");
85 ok(GetLastError() == ERROR_SUCCESS
, "\n");
86 SetLastError(ERROR_SUCCESS
);
87 ok(GetObjectA((HANDLE
)0x00160000, 0, NULL
) == 0, "\n");
88 ok(GetLastError() == ERROR_SUCCESS
, "\n");
89 SetLastError(ERROR_SUCCESS
);
90 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_DC
, 0, NULL
) == 0, "\n");
91 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
92 SetLastError(ERROR_SUCCESS
);
93 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_DC
, 0, NULL
) == 0, "\n");
94 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
95 SetLastError(ERROR_SUCCESS
);
96 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_REGION
, 0, NULL
) == 0, "\n");
97 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
98 SetLastError(ERROR_SUCCESS
);
99 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_REGION
, 0, NULL
) == 0, "\n");
100 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
101 SetLastError(ERROR_SUCCESS
);
102 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_EMF
, 0, NULL
) == 0, "\n");
103 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
104 SetLastError(ERROR_SUCCESS
);
105 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_EMF
, 0, NULL
) == 0, "\n");
106 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
107 SetLastError(ERROR_SUCCESS
);
108 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_METAFILE
, 0, NULL
) == 0, "\n");
109 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
110 SetLastError(ERROR_SUCCESS
);
111 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_METAFILE
, 0, NULL
) == 0, "\n");
112 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
113 SetLastError(ERROR_SUCCESS
);
114 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_ENHMETAFILE
, 0, NULL
) == 0, "\n");
115 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
116 SetLastError(ERROR_SUCCESS
);
117 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_ENHMETAFILE
, 0, NULL
) == 0, "\n");
118 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
120 /* Test need of alignment */
121 SetLastError(ERROR_SUCCESS
);
122 hBrush
= GetStockObject(WHITE_BRUSH
);
123 plogbrush
= (PVOID
)((ULONG_PTR
)&TestStruct
.logbrush
);
124 ok(GetObject(hBrush
, sizeof(LOGBRUSH
), plogbrush
) == sizeof(LOGBRUSH
), "\n");
125 plogbrush
= (PVOID
)((ULONG_PTR
)&TestStruct
.logbrush
+ 2);
126 ok(GetObject(hBrush
, sizeof(LOGBRUSH
), plogbrush
) == sizeof(LOGBRUSH
), "\n");
127 plogbrush
= (PVOID
)((ULONG_PTR
)&TestStruct
.logbrush
+ 1);
128 //ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0, "\n"); // fails on win7
130 /* Test invalid buffer */
131 SetLastError(0xbadbad00);
132 ok(GetObjectA(GetStockObject(WHITE_BRUSH
), sizeof(LOGBRUSH
), (PVOID
)0xc0000000) == 0, "\n");
133 ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS
), "wrong error: %ld\n", GetLastError());
134 SetLastError(ERROR_SUCCESS
);
135 ok(GetObjectW(GetStockObject(BLACK_PEN
), sizeof(LOGPEN
), (PVOID
)0xc0000000) == 0, "\n");
136 ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS
), "wrong error: %ld\n", GetLastError());
137 SetLastError(ERROR_SUCCESS
);
138 ok(GetObjectW(GetStockObject(21), sizeof(BITMAP
), (PVOID
)0xc0000000) == 0, "\n");
139 ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS
), "wrong error: %ld\n", GetLastError());
140 SetLastError(ERROR_SUCCESS
);
141 ok(GetObjectW(GetStockObject(SYSTEM_FONT
), sizeof(LOGFONT
), (PVOID
)0xc0000000) == 0, "\n");
142 ok(GetLastError() == ERROR_SUCCESS
, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
143 SetLastError(ERROR_SUCCESS
);
146 ret
= GetObjectA(GetStockObject(SYSTEM_FONT
), sizeof(LOGFONT
), (PVOID
)0xc0000000);
148 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
153 ok(ret
== -1, "should have got an exception\n");
155 ok(GetObjectW(GetStockObject(SYSTEM_FONT
), 0x50000000, &TestStruct
) == 356, "\n");
156 ok(GetObjectW(GetStockObject(WHITE_BRUSH
), 0x50000000, &TestStruct
) == sizeof(LOGBRUSH
), "\n");
159 /* Test buffer size of 0 */
160 SetLastError(ERROR_SUCCESS
);
161 ok_long(GetObjectA(GetStockObject(WHITE_BRUSH
), 0, &TestStruct
), sizeof(LOGBRUSH
));
162 ok(GetLastError() == ERROR_SUCCESS
, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
163 SetLastError(ERROR_SUCCESS
);
164 ok(GetObjectA(GetStockObject(BLACK_PEN
), 0, &TestStruct
) == 0, "\n");
165 ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS
), "wrong error: %ld\n", GetLastError());
166 SetLastError(ERROR_SUCCESS
);
167 ok(GetObjectW(GetStockObject(SYSTEM_FONT
), 0, &TestStruct
) == 0, "\n");
168 ok(GetLastError() == ERROR_SUCCESS
, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
169 SetLastError(ERROR_SUCCESS
);
170 ok(GetObjectW(GetStockObject(21), 0, &TestStruct
) == 0, "\n");
171 ok(GetLastError() == ERROR_SUCCESS
, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
180 DIBSECTION dibsection
;
181 BYTE bData
[100] = {0};
182 BYTE Buffer
[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};
184 FillMemory(&bitmap
, sizeof(BITMAP
), 0x77);
185 hBitmap
= CreateBitmap(10,10,1,8,bData
);
186 ok(hBitmap
!= 0, "CreateBitmap failed, skipping tests.\n");
187 if (!hBitmap
) return;
189 SetLastError(ERROR_SUCCESS
);
190 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_BITMAP
, 0, NULL
) == sizeof(BITMAP
), "\n");
191 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_BITMAP
, 0, NULL
) == sizeof(BITMAP
), "\n");
192 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_BITMAP
, sizeof(BITMAP
), NULL
) == sizeof(BITMAP
), "\n");
193 ok(GetLastError() == ERROR_SUCCESS
, "\n");
194 ok(GetObjectA(hBitmap
, sizeof(DIBSECTION
), NULL
) == sizeof(BITMAP
), "\n");
195 ok(GetObjectA(hBitmap
, 0, NULL
) == sizeof(BITMAP
), "\n");
196 ok(GetObjectA((HANDLE
)((UINT_PTR
)hBitmap
& 0x0000ffff), 0, NULL
) == sizeof(BITMAP
), "\n");
197 ok(GetObjectW((HANDLE
)((UINT_PTR
)hBitmap
& 0x0000ffff), 0, NULL
) == sizeof(BITMAP
), "\n");
198 ok(GetLastError() == ERROR_SUCCESS
, "\n");
199 ok(GetObjectA(hBitmap
, 5, NULL
) == sizeof(BITMAP
), "\n");
200 ok(GetObjectA(hBitmap
, -5, NULL
) == sizeof(BITMAP
), "\n");
201 ok(GetObjectA(hBitmap
, 0, Buffer
) == 0, "\n");
202 ok(GetObjectA(hBitmap
, 5, Buffer
) == 0, "\n");
203 ok(GetLastError() == ERROR_SUCCESS
, "\n");
204 ok(GetObjectA(hBitmap
, sizeof(BITMAP
), &bitmap
) == sizeof(BITMAP
), "\n");
205 ok(GetObjectA(hBitmap
, sizeof(BITMAP
)+2, &bitmap
) == sizeof(BITMAP
), "\n");
206 ok(GetObjectA(hBitmap
, sizeof(DIBSECTION
), &dibsection
) == sizeof(BITMAP
), "\n");
207 ok(GetObjectA(hBitmap
, -5, &bitmap
) == sizeof(BITMAP
), "\n");
208 ok(GetLastError() == ERROR_SUCCESS
, "\n");
209 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_BITMAP
, sizeof(BITMAP
), &bitmap
) == 0, "\n");
210 ok(GetLastError() == ERROR_SUCCESS
, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
212 // todo: test invalid handle + buffer
214 DeleteObject(hBitmap
);
218 Test_Dibsection(void)
220 BITMAPINFO bmi
= {{sizeof(BITMAPINFOHEADER
), 10, 9, 1, 16, BI_RGB
, 0, 10, 10, 0,0}};
223 DIBSECTION dibsection
;
227 FillMemory(&dibsection
, sizeof(DIBSECTION
), 0x77);
229 hBitmap
= CreateDIBSection(hDC
, &bmi
, DIB_RGB_COLORS
, &pData
, NULL
, 0);
230 ok(hBitmap
!= 0, "CreateDIBSection failed with %ld, skipping tests.\n", GetLastError());
231 if (!hBitmap
) return;
233 ok(GetObjectA((HANDLE
)((UINT_PTR
)hBitmap
& 0x0000ffff), 0, NULL
) == sizeof(BITMAP
), "\n");
234 ok(GetObjectW((HANDLE
)((UINT_PTR
)hBitmap
& 0x0000ffff), 0, NULL
) == sizeof(BITMAP
), "\n");
236 SetLastError(ERROR_SUCCESS
);
237 ok_long(GetObject(hBitmap
, sizeof(DIBSECTION
), NULL
), sizeof(BITMAP
));
238 ok_long(GetObject(hBitmap
, 0, NULL
), sizeof(BITMAP
));
239 ok_long(GetObject(hBitmap
, 5, NULL
), sizeof(BITMAP
));
240 ok_long(GetObject(hBitmap
, -5, NULL
), sizeof(BITMAP
));
241 ok_long(GetObject(hBitmap
, 0, &dibsection
), 0);
242 ok_long(GetObject(hBitmap
, 5, &dibsection
), 0);
243 ok_long(GetObject(hBitmap
, sizeof(BITMAP
), &bitmap
), sizeof(BITMAP
));
244 ok_long(GetObject(hBitmap
, sizeof(BITMAP
)+2, &bitmap
), sizeof(BITMAP
));
245 ok_long(bitmap
.bmType
, 0);
246 ok_long(bitmap
.bmWidth
, 10);
247 ok_long(bitmap
.bmHeight
, 9);
248 ok_long(bitmap
.bmWidthBytes
, 20);
249 ok_long(bitmap
.bmPlanes
, 1);
250 ok_long(bitmap
.bmBitsPixel
, 16);
251 ok(bitmap
.bmBits
== pData
, "\n");
252 ok_long(GetObject(hBitmap
, sizeof(DIBSECTION
), &dibsection
), sizeof(DIBSECTION
));
253 ok_long(GetObject(hBitmap
, sizeof(DIBSECTION
)+2, &dibsection
), sizeof(DIBSECTION
));
254 ok_long(GetObject(hBitmap
, -5, &dibsection
), sizeof(DIBSECTION
));
255 ok_err(ERROR_SUCCESS
);
256 DeleteObject(hBitmap
);
267 FillMemory(&wPalette
, sizeof(WORD
), 0x77);
268 logpal
.palVersion
= 0x0300;
269 logpal
.palNumEntries
= 1;
270 logpal
.palPalEntry
[0].peRed
= 0;
271 logpal
.palPalEntry
[0].peGreen
= 0;
272 logpal
.palPalEntry
[0].peBlue
= 0;
273 logpal
.palPalEntry
[0].peFlags
= PC_EXPLICIT
;
274 hPalette
= CreatePalette(&logpal
);
275 ok(hPalette
!= 0, "CreatePalette failed, skipping tests.\n");
276 if (!hPalette
) return;
278 ok(GetObjectA((HANDLE
)((UINT_PTR
)hPalette
& 0x0000ffff), 0, NULL
) == sizeof(WORD
), "\n");
279 ok(GetObjectW((HANDLE
)((UINT_PTR
)hPalette
& 0x0000ffff), 0, NULL
) == sizeof(WORD
), "\n");
281 SetLastError(ERROR_SUCCESS
);
282 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_PALETTE
, 0, NULL
) == sizeof(WORD
), "\n");
283 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_PALETTE
, 0, NULL
) == sizeof(WORD
), "\n");
284 ok(GetObject(hPalette
, sizeof(WORD
), NULL
) == sizeof(WORD
), "\n");
285 ok(GetObject(hPalette
, 0, NULL
) == sizeof(WORD
), "\n");
286 ok(GetObject(hPalette
, 5, NULL
) == sizeof(WORD
), "\n");
287 ok(GetObject(hPalette
, -5, NULL
) == sizeof(WORD
), "\n");
288 ok(GetObject(hPalette
, sizeof(WORD
), &wPalette
) == sizeof(WORD
), "\n");
289 ok(GetObject(hPalette
, sizeof(WORD
)+2, &wPalette
) == sizeof(WORD
), "\n");
290 ok(GetObject(hPalette
, 0, &wPalette
) == 0, "\n");
291 ok(GetObject(hPalette
, 1, &wPalette
) == 0, "\n");
292 ok(GetObject(hPalette
, -1, &wPalette
) == sizeof(WORD
), "\n");
293 ok(GetLastError() == ERROR_SUCCESS
, "\n");
294 DeleteObject(hPalette
);
295 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_PALETTE
, sizeof(WORD
), &wPalette
) == 0, "\n");
296 ok(GetLastError() == ERROR_SUCCESS
, "\n");
306 FillMemory(&logbrush
, sizeof(LOGBRUSH
), 0x77);
307 hBrush
= CreateSolidBrush(RGB(1,2,3));
308 ok(hBrush
!= 0, "CreateSolidBrush failed, skipping tests.\n");
311 SetLastError(ERROR_SUCCESS
);
312 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_BRUSH
, 0, NULL
) == sizeof(LOGBRUSH
), "\n");
313 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_BRUSH
, 0, NULL
) == sizeof(LOGBRUSH
), "\n");
314 ok(GetObject(hBrush
, sizeof(WORD
), NULL
) == sizeof(LOGBRUSH
), "\n");
315 ok(GetObject(hBrush
, 0, NULL
) == sizeof(LOGBRUSH
), "\n");
316 ok(GetObject(hBrush
, 5, NULL
) == sizeof(LOGBRUSH
), "\n");
317 ok(GetObject(hBrush
, -5, NULL
) == sizeof(LOGBRUSH
), "\n");
319 //ok(GetObject(hBrush, 0, &logbrush) == 0, "\n"); fails on win7
320 ok(logbrush
.lbStyle
== 0x77777777, "\n");
321 ok(GetObject(hBrush
, 5, &logbrush
) == sizeof(LOGBRUSH
), "\n");
322 ok(logbrush
.lbStyle
== 0, "\n");
323 ok(logbrush
.lbColor
== 0x77777701, "\n");
325 ok(GetObject(hBrush
, sizeof(LOGBRUSH
), &logbrush
) == sizeof(LOGBRUSH
), "\n");
326 ok(GetObject(hBrush
, sizeof(LOGBRUSH
) - 1, &logbrush
) == sizeof(LOGBRUSH
), "\n");
327 ok(GetObject(hBrush
, 1, &logbrush
) == sizeof(LOGBRUSH
), "\n");
328 ok(GetObject(hBrush
, sizeof(LOGBRUSH
)+2, &logbrush
) == sizeof(LOGBRUSH
), "\n");
329 ok(GetObject(hBrush
, -1, &logbrush
) == sizeof(LOGBRUSH
), "\n");
330 // TODO: test all members
332 ok(GetLastError() == ERROR_SUCCESS
, "\n");
333 DeleteObject(hBrush
);
335 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_BRUSH
, sizeof(LOGBRUSH
), &logbrush
) == 0, "\n");
336 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
344 BITMAPINFOHEADER bmiHeader
;
349 {sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 4, 0},
351 {0,1,2,3, 1,2,3,0, 2,3,0,1, 3,0,1,2},
356 /* Create a DIB brush */
357 hBrush
= CreateDIBPatternBrushPt(&PackedDIB
, DIB_PAL_COLORS
);
358 ok(hBrush
!= 0, "CreateSolidBrush failed, skipping tests.\n");
361 FillMemory(&logbrush
, sizeof(LOGBRUSH
), 0x77);
362 SetLastError(ERROR_SUCCESS
);
364 ok_long(GetObject(hBrush
, sizeof(LOGBRUSH
), &logbrush
), sizeof(LOGBRUSH
));
365 ok_long(logbrush
.lbStyle
, BS_DIBPATTERN
);
366 ok_long(logbrush
.lbColor
, 0);
367 ok_long(logbrush
.lbHatch
, (ULONG_PTR
)&PackedDIB
);
369 ok_err(ERROR_SUCCESS
);
370 DeleteObject(hBrush
);
373 /* Create a DIB brush with undocumented iUsage 2 */
374 hBrush
= CreateDIBPatternBrushPt(&PackedDIB
, 2);
375 ok(hBrush
!= 0, "CreateSolidBrush failed, skipping tests.\n");
378 FillMemory(&logbrush
, sizeof(LOGBRUSH
), 0x77);
379 SetLastError(ERROR_SUCCESS
);
381 ok_long(GetObject(hBrush
, sizeof(LOGBRUSH
), &logbrush
), sizeof(LOGBRUSH
));
382 ok_long(logbrush
.lbStyle
, BS_DIBPATTERN
);
383 ok_long(logbrush
.lbColor
, 0);
384 ok_long(logbrush
.lbHatch
, (ULONG_PTR
)&PackedDIB
);
386 ok_err(ERROR_SUCCESS
);
387 DeleteObject(hBrush
);
397 FillMemory(&logpen
, sizeof(LOGPEN
), 0x77);
398 hPen
= CreatePen(PS_SOLID
, 3, RGB(4,5,6));
399 ok(hPen
!= 0, "CreatePen failed, skipping tests.\n");
401 SetLastError(ERROR_SUCCESS
);
402 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_PEN
, 0, NULL
) == sizeof(LOGPEN
), "\n");
403 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_PEN
, 0, NULL
) == sizeof(LOGPEN
), "\n");
404 ok(GetObject(hPen
, sizeof(BITMAP
), NULL
) == sizeof(LOGPEN
), "\n");
405 ok(GetObject(hPen
, 0, NULL
) == sizeof(LOGPEN
), "\n");
406 ok(GetObject(hPen
, 5, NULL
) == sizeof(LOGPEN
), "\n");
407 ok(GetObject(hPen
, -5, NULL
) == sizeof(LOGPEN
), "\n");
408 ok(GetObject(hPen
, sizeof(LOGPEN
), &logpen
) == sizeof(LOGPEN
), "\n");
409 ok(GetObject(hPen
, sizeof(LOGPEN
)-1, &logpen
) == 0, "\n");
410 ok(GetObject(hPen
, sizeof(LOGPEN
)+2, &logpen
) == sizeof(LOGPEN
), "\n");
411 ok(GetObject(hPen
, 0, &logpen
) == 0, "\n");
412 ok(GetObject(hPen
, -5, &logpen
) == sizeof(LOGPEN
), "\n");
413 //ok(GetLastError() == ERROR_SUCCESS, "\n"); fails on win7
415 /* test if the fields are filled correctly */
416 ok(logpen
.lopnStyle
== PS_SOLID
, "\n");
418 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_PEN
, sizeof(LOGPEN
), &logpen
) == 0, "\n");
419 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
430 DWORD dwStyles
[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
438 SetLastError(ERROR_SUCCESS
);
439 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_EXTPEN
, 0, NULL
) == 0, "\n");
440 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "\n");
441 SetLastError(ERROR_SUCCESS
);
442 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_EXTPEN
, 0, NULL
) == 0, "\n");
443 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "\n");
445 FillMemory(&extlogpen
, sizeof(EXTLOGPEN
), 0x77);
446 logbrush
.lbStyle
= BS_SOLID
;
447 logbrush
.lbColor
= RGB(1,2,3);
448 logbrush
.lbHatch
= 22;
449 hPen
= ExtCreatePen(PS_GEOMETRIC
| PS_DASH
, 5, &logbrush
, 0, NULL
);
451 SetLastError(ERROR_SUCCESS
);
452 ok(GDI_HANDLE_GET_TYPE(hPen
) == GDI_OBJECT_TYPE_EXTPEN
, "\n");
453 ok(GetObject(hPen
, sizeof(EXTLOGPEN
), NULL
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
454 ok(GetObject(hPen
, 0, NULL
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
455 ok(GetObject((HANDLE
)GDI_HANDLE_GET_INDEX(hPen
), 0, NULL
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
456 ok(GetObject(hPen
, 5, NULL
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
457 ok(GetObject(hPen
, -5, NULL
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
458 ok(GetLastError() == ERROR_SUCCESS
, "\n");
459 ok(GetObject((HANDLE
)GDI_OBJECT_TYPE_EXTPEN
, 0, NULL
) == 0, "\n");
460 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "got %ld\n", GetLastError());
461 SetLastError(ERROR_SUCCESS
);
462 ok(GetObject(hPen
, 0, &extlogpen
) == 0, "\n");
463 ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS
), "wrong error: %ld\n", GetLastError());
464 SetLastError(ERROR_SUCCESS
);
465 ok(GetObject(hPen
, 4, &extlogpen
) == 0, "\n");
466 ok(GetLastError() == ERROR_SUCCESS
, "got %ld\n", GetLastError());
467 SetLastError(ERROR_SUCCESS
);
468 ok(GetObject((HANDLE
)GDI_OBJECT_TYPE_EXTPEN
, 0, &extlogpen
) == 0, "\n");
469 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "got %ld\n", GetLastError());
470 SetLastError(ERROR_SUCCESS
);
471 ok(GetObject((HANDLE
)GDI_OBJECT_TYPE_EXTPEN
, 4, &extlogpen
) == 0, "\n");
472 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "got %ld\n", GetLastError());
473 SetLastError(ERROR_SUCCESS
);
474 ok(GetObject(hPen
, sizeof(EXTLOGPEN
) - 5, &extlogpen
) == 0, "\n");
475 ok(GetLastError() == ERROR_SUCCESS
, "got %ld\n", GetLastError());
477 /* Nothing should be filled */
478 ok(extlogpen
.elpPenStyle
== 0x77777777, "\n");
479 ok(extlogpen
.elpWidth
== 0x77777777, "\n");
481 ok(GetObject(hPen
, sizeof(EXTLOGPEN
), &extlogpen
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
482 ok(GetObject(hPen
, sizeof(EXTLOGPEN
)-sizeof(DWORD
), &extlogpen
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
483 ok(GetObject(hPen
, sizeof(EXTLOGPEN
)-sizeof(DWORD
)-1, &extlogpen
) == 0, "\n");
484 ok(GetObject(hPen
, sizeof(EXTLOGPEN
)+2, &extlogpen
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
485 ok(GetObject(hPen
, -5, &extlogpen
) == sizeof(EXTLOGPEN
)-sizeof(DWORD
), "\n");
487 /* test if the fields are filled correctly */
488 ok(extlogpen
.elpPenStyle
== (PS_GEOMETRIC
| PS_DASH
), "\n");
489 ok(extlogpen
.elpWidth
== 5, "\n");
490 ok(extlogpen
.elpBrushStyle
== 0, "\n");
491 ok(extlogpen
.elpColor
== RGB(1,2,3), "\n");
492 ok(extlogpen
.elpHatch
== 22, "\n");
493 ok(extlogpen
.elpNumEntries
== 0, "\n");
496 /* A maximum of 16 Styles is allowed */
497 hPen
= ExtCreatePen(PS_GEOMETRIC
| PS_USERSTYLE
, 5, &logbrush
, 16, (CONST DWORD
*)&dwStyles
);
498 ok(GetObject(hPen
, 0, NULL
) == sizeof(EXTLOGPEN
) + 15*sizeof(DWORD
), "\n");
499 ok(GetObject(hPen
, sizeof(EXTLOGPEN
) + 15*sizeof(DWORD
), &elpUserStyle
) == sizeof(EXTLOGPEN
) + 15*sizeof(DWORD
), "\n");
500 for (i
= 0; i
<= 15; i
++)
501 ok(((EXTLOGPEN
*)&elpUserStyle
)->elpStyleEntry
[i
] == i
, "%d\n", i
);
513 EXTLOGFONTA extlogfonta
;
514 EXTLOGFONTW extlogfontw
;
515 ENUMLOGFONTEXA enumlogfontexa
;
516 ENUMLOGFONTEXW enumlogfontexw
;
517 ENUMLOGFONTEXDVA enumlogfontexdva
;
518 ENUMLOGFONTEXDVW enumlogfontexdvw
;
519 ENUMLOGFONTA enumlogfonta
;
520 ENUMLOGFONTW enumlogfontw
;
525 FillMemory(&u
, sizeof(u
), 0x77);
526 hFont
= CreateFontA(8, 8, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
,
527 ANSI_CHARSET
, OUT_CHARACTER_PRECIS
, CLIP_CHARACTER_PRECIS
,
528 ANTIALIASED_QUALITY
, DEFAULT_PITCH
, "testfont");
529 ok(hFont
!= 0, "\n");
531 SetLastError(ERROR_SUCCESS
);
532 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, 0, NULL
) == sizeof(LOGFONTA
), "\n");
533 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, 0, NULL
) == sizeof(LOGFONTW
), "\n");
534 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(LOGFONTA
), NULL
) == sizeof(LOGFONTA
), "\n"); // 60
535 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTA
), NULL
) == sizeof(LOGFONTA
), "\n"); // 156
536 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXA
), NULL
) == sizeof(LOGFONTA
), "\n"); // 188
537 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(EXTLOGFONTA
), NULL
) == sizeof(LOGFONTA
), "\n"); // 192
538 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXDVA
), NULL
) == sizeof(LOGFONTA
), "\n"); // 260
539 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXDVA
)+1, NULL
) == sizeof(LOGFONTA
), "\n"); // 260
540 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(LOGFONTW
), NULL
) == sizeof(LOGFONTW
), "\n"); // 92
541 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTW
), NULL
) == sizeof(LOGFONTW
), "\n"); // 284
542 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(EXTLOGFONTW
), NULL
) == sizeof(LOGFONTW
), "\n"); // 320
543 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXW
), NULL
) == sizeof(LOGFONTW
), "\n"); // 348
544 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXDVW
), NULL
) == sizeof(LOGFONTW
), "\n"); // 420
545 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_FONT
, sizeof(ENUMLOGFONTEXDVW
)+1, NULL
) == sizeof(LOGFONTW
), "\n"); // 356!
546 ok(GetLastError() == ERROR_SUCCESS
, "got %ld\n", GetLastError());
548 ok(GetObjectA(hFont
, sizeof(LOGFONTA
), NULL
) == sizeof(LOGFONTA
), "\n");
549 ok(GetObjectA(hFont
, 0, NULL
) == sizeof(LOGFONTA
), "\n");
550 ok(GetObjectA(hFont
, 5, NULL
) == sizeof(LOGFONTA
), "\n");
551 ok(GetObjectA(hFont
, -5, NULL
) == sizeof(LOGFONTA
), "\n");
552 ok(GetObjectA(hFont
, 0, &u
.logfonta
) == 0, "\n");
553 ok(u
.logfonta
.lfHeight
== 0x77777777, "\n");
555 ok(GetObjectA(hFont
, 5, &u
.logfonta
) == 5, "\n");
556 ok(u
.logfonta
.lfHeight
== 8, "\n");
557 ok(u
.logfonta
.lfWidth
== 0x77777708, "\n");
559 ok(GetObjectA(hFont
, 0, &u
.logfonta
) == 0, "\n");
560 ok(GetObjectA(hFont
, -1, &u
.logfonta
) == sizeof(ENUMLOGFONTEXDVA
), "\n");
561 ok(GetObjectA(hFont
, 1, &u
.logfonta
) == 1, "\n"); // 1 -> 1
562 ok(GetObjectA(hFont
, sizeof(LOGFONTA
) - 1, &u
.logfonta
) == sizeof(LOGFONTA
) - 1, "\n"); // 59 -> 59
563 ok(GetObjectA(hFont
, sizeof(LOGFONTA
), &u
.logfonta
) == sizeof(LOGFONTA
), "\n"); // 60 -> 60
564 ok(GetObjectA(hFont
, sizeof(LOGFONTA
) + 1, &u
.logfonta
) == sizeof(LOGFONTA
) + 1, "\n"); // 61 -> 61
565 ok(GetObjectA(hFont
, sizeof(LOGFONTW
) - 1, &u
.logfontw
) == sizeof(LOGFONTW
) - 1, "\n"); // 91 -> 91
566 ok(GetObjectA(hFont
, sizeof(LOGFONTW
), &u
.logfontw
) == sizeof(LOGFONTA
), "\n"); // 92 -> 60
567 ok(GetObjectA(hFont
, sizeof(LOGFONTW
) + 1, &u
.logfontw
) == sizeof(LOGFONTW
) + 1, "\n"); // 93 -> 93
568 ok(GetObjectA(hFont
, sizeof(EXTLOGFONTA
), &u
.extlogfonta
) == sizeof(EXTLOGFONTA
), "\n"); // 192 -> 192
569 ok(GetObjectA(hFont
, sizeof(EXTLOGFONTA
)+1, &u
.extlogfonta
) == sizeof(EXTLOGFONTA
)+1, "\n"); // 192+1 -> 192+1
570 ok(GetObjectA(hFont
, sizeof(EXTLOGFONTA
)+16*4, &u
.extlogfonta
) == sizeof(EXTLOGFONTA
)+16*4, "\n"); // 192+1 -> 192+1
571 ok(GetObjectA(hFont
, sizeof(EXTLOGFONTW
), &u
.extlogfontw
) == sizeof(ENUMLOGFONTEXDVA
), "\n"); // 320 -> 260
572 ok(GetObjectA(hFont
, 261, &u
.bData
) == 260, "\n"); // no
574 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXDVA
) - 1, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXDVA
) - 1, "\n"); // 419
575 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXDVA
), &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXDVA
), "\n"); // 420
576 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXDVA
)+1, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXDVA
), "\n"); // 356!
578 /* LOGFONT / GetObjectW */
579 FillMemory(&u
.logfontw
, sizeof(LOGFONTW
), 0x77);
581 ok(GetObjectW(hFont
, sizeof(LOGFONTW
), NULL
) == sizeof(LOGFONTW
), "1\n");
582 ok(GetObjectW(hFont
, 0, NULL
) == sizeof(LOGFONTW
), "\n");
583 ok(GetObjectW(hFont
, 5, NULL
) == sizeof(LOGFONTW
), "\n");
584 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXA
), NULL
) == sizeof(LOGFONTW
), "\n");
585 ok(GetObjectW(hFont
, -5, NULL
) == sizeof(LOGFONTW
), "\n");
586 ok(GetObjectW(hFont
, 0, &u
.logfontw
) == 0, "\n");
587 ok(u
.logfontw
.lfHeight
== 0x77777777, "\n");
589 ok(GetObjectW(hFont
, 5, &u
.logfontw
) == 5, "\n");
590 ok(u
.logfontw
.lfHeight
== 8, "\n");
591 ok(u
.logfontw
.lfWidth
== 0x77777708, "\n");
593 ok(GetObjectA(hFont
, sizeof(LOGFONTA
), &u
.logfonta
) == sizeof(LOGFONTA
), "\n"); // 60
594 ok(u
.logfonta
.lfHeight
== 8, "\n");
595 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTA
), &u
.enumlogfonta
) == sizeof(ENUMLOGFONTA
), "\n"); // 156
596 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXA
), &u
.enumlogfontexa
) == sizeof(ENUMLOGFONTEXA
), "\n"); // 188
597 ok(GetObjectA(hFont
, sizeof(EXTLOGFONTA
), &u
.extlogfonta
) == sizeof(EXTLOGFONTA
), "\n"); // 192
598 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXDVA
), &u
.enumlogfontexdva
) == sizeof(ENUMLOGFONTEXDVA
), "\n"); // 260
599 ok(GetObjectA(hFont
, sizeof(ENUMLOGFONTEXDVA
)+1, &u
.enumlogfontexdva
) == sizeof(ENUMLOGFONTEXDVA
), "\n"); // 260
601 ok(GetObjectW(hFont
, sizeof(LOGFONTW
), &u
.logfontw
) == sizeof(LOGFONTW
), "\n"); // 92
602 ok(GetObjectW(hFont
, sizeof(LOGFONTW
) + 1, &u
.logfontw
) == sizeof(LOGFONTW
) + 1, "\n"); // 92
603 ok(GetObjectW(hFont
, sizeof(LOGFONTW
) - 1, &u
.logfontw
) == sizeof(LOGFONTW
) - 1, "\n"); // 92
604 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTW
), &u
.enumlogfontw
) == sizeof(ENUMLOGFONTW
), "\n"); // 284
605 ok(GetObjectW(hFont
, sizeof(EXTLOGFONTW
), &u
.extlogfontw
) == sizeof(EXTLOGFONTW
), "\n"); // 320
606 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXW
), &u
.enumlogfontexw
) == sizeof(ENUMLOGFONTEXW
), "\n"); // 348
607 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXW
) + 1, &u
.enumlogfontexw
) == sizeof(ENUMLOGFONTEXW
) + 1, "\n"); // 348
608 ok(GetObjectW(hFont
, 355, &u
.enumlogfontexdvw
) == 355, "\n"); // 419
610 ok(GetObjectW(hFont
, 356, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n"); // 419
611 ret
= sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
);
612 ret
= GetObjectW(hFont
, 357, &u
.enumlogfontexdvw
);
613 ok(ret
== sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n");
614 ok(GetObjectW(hFont
, 357, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n"); // 419
615 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXDVW
) - 1, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n"); // 419
616 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXDVW
), &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n"); // 420
617 ok(GetObjectW(hFont
, sizeof(ENUMLOGFONTEXDVW
)+1, &u
.enumlogfontexdvw
) == sizeof(ENUMLOGFONTEXW
) + 2*sizeof(DWORD
), "\n"); // 356!
618 ok(GetLastError() == ERROR_SUCCESS
, "got %ld\n", GetLastError());
624 Test_Colorspace(void)
628 SetLastError(ERROR_SUCCESS
);
629 GetObjectA((HANDLE
)GDI_OBJECT_TYPE_COLORSPACE
, 0, NULL
);
630 //ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60, "\n");// FIXME: what structure? fails on win7
631 ok_err(ERROR_INSUFFICIENT_BUFFER
);
632 SetLastError(ERROR_SUCCESS
);
633 ok(GetObjectW((HANDLE
)GDI_OBJECT_TYPE_COLORSPACE
, 0, NULL
) == 0, "\n");
634 ok_err(ERROR_INSUFFICIENT_BUFFER
);
635 SetLastError(ERROR_SUCCESS
);
636 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_COLORSPACE
, 327, buffer
) == 0, "\n");
637 ok_err(ERROR_INSUFFICIENT_BUFFER
);
638 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_COLORSPACE
, 328, buffer
) == 0, "\n");
639 ok_err(ERROR_INVALID_PARAMETER
);
641 ok_long(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_COLORSPACE
, 328, NULL
), 0);
642 ok_err(ERROR_INSUFFICIENT_BUFFER
);
648 /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */
652 hMetaDC
= CreateMetaFile(NULL
);
653 ok(hMetaDC
!= 0, "CreateMetaFile failed, skipping tests.\n");
656 ok(((UINT_PTR
)hMetaDC
& GDI_HANDLE_TYPE_MASK
) == GDI_OBJECT_TYPE_METADC
, "\n");
658 SetLastError(ERROR_SUCCESS
);
659 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_METADC
, 0, NULL
) == 0, "\n");
660 ok(GetObjectA((HANDLE
)GDI_OBJECT_TYPE_METADC
, 100, &buffer
) == 0, "\n");
661 ok(GetObjectA(hMetaDC
, 0, NULL
) == 0, "\n");
662 ok(GetObjectA(hMetaDC
, 1000, &buffer
) == 0, "\n");
663 ok(GetLastError() == ERROR_SUCCESS
, "got %ld\n", GetLastError());
670 hRgn
= CreateRectRgn(0,0,5,5);
671 SetLastError(ERROR_SUCCESS
);
672 ok(GetObjectW(hRgn
, 0, NULL
) == 0, "\n");
673 ok(GetLastError() == ERROR_INVALID_HANDLE
, "\n");
677 START_TEST(GetObject
)
689 Test_ExtPen(); // not implemented yet in ROS