6 HGDIOBJ stock_objects
[NB_STOCK_OBJECTS
];
18 if ((fnObject
< 0) || (fnObject
>= NB_STOCK_OBJECTS
))
21 hobj
= stock_objects
[fnObject
];
24 hobj
= NtGdiGetStockObject(fnObject
);
26 if (!GdiValidateHandle(hobj
))
31 stock_objects
[fnObject
] = hobj
;
48 if (GdiValidateHandle(h
))
50 LONG Type
= GDI_HANDLE_GET_TYPE(h
);
53 case GDI_OBJECT_TYPE_PEN
:
56 case GDI_OBJECT_TYPE_BRUSH
:
59 case GDI_OBJECT_TYPE_BITMAP
:
62 case GDI_OBJECT_TYPE_FONT
:
65 case GDI_OBJECT_TYPE_PALETTE
:
68 case GDI_OBJECT_TYPE_REGION
:
71 case GDI_OBJECT_TYPE_DC
:
72 if ( GetDCDWord( h
, GdiGetIsMemDc
, 0))
79 case GDI_OBJECT_TYPE_COLORSPACE
:
82 case GDI_OBJECT_TYPE_METAFILE
:
85 case GDI_OBJECT_TYPE_ENHMETAFILE
:
86 Ret
= OBJ_ENHMETAFILE
;
88 case GDI_OBJECT_TYPE_METADC
:
91 case GDI_OBJECT_TYPE_EXTPEN
:
95 case GDILoObjType_LO_ALTDC_TYPE
:
96 // FIXME: could be something else?
101 DPRINT1("GetObjectType: Magic 0x%08x not implemented\n", Type
);
106 /* From Wine: GetObjectType does SetLastError() on a null object */
107 SetLastError(ERROR_INVALID_HANDLE
);
116 _Out_ LPVOID lpBuffer
)
118 ENUMLOGFONTEXDVW elfedvW
;
119 ENUMLOGFONTEXDVA elfedvA
;
122 /* Check if size only is requested */
123 if (!lpBuffer
) return sizeof(LOGFONTA
);
125 /* Check for size 0 */
128 /* Windows does not SetLastError() */
132 /* Windows does this ... */
133 if (cbSize
== sizeof(LOGFONTW
)) cbSize
= sizeof(LOGFONTA
);
135 /* Call win32k to get the logfont (widechar) */
136 cbResult
= NtGdiExtGetObjectW(hfont
, sizeof(ENUMLOGFONTEXDVW
), &elfedvW
);
142 /* Convert the logfont from widechar to ansi */
143 EnumLogFontExW2A(&elfedvA
.elfEnumLogfontEx
, &elfedvW
.elfEnumLogfontEx
);
144 elfedvA
.elfDesignVector
= elfedvW
.elfDesignVector
;
146 /* Don't copy more than maximum */
147 if (cbSize
> sizeof(ENUMLOGFONTEXDVA
)) cbSize
= sizeof(ENUMLOGFONTEXDVA
);
149 /* Copy the number of bytes requested */
150 memcpy(lpBuffer
, &elfedvA
, cbSize
);
152 /* Return the number of bytes copied */
163 _In_ HGDIOBJ hGdiObj
,
165 _Out_ LPVOID lpBuffer
)
167 DWORD dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
169 /* Chjeck if this is anything else but a font */
170 if (dwType
== GDI_OBJECT_TYPE_FONT
)
172 return GetFontObjectA(hGdiObj
, cbSize
, lpBuffer
);
176 /* Simply pass it to the widechar version */
177 return GetObjectW(hGdiObj
, cbSize
, lpBuffer
);
188 _In_ HGDIOBJ hGdiObj
,
190 _Out_ LPVOID lpBuffer
)
195 /* Fixup handles with upper 16 bits masked */
196 hGdiObj
= GdiFixUpHandle(hGdiObj
);
198 /* Get the object type */
199 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
201 /* Check what kind of object we have */
204 case GDI_OBJECT_TYPE_PEN
:
205 if (!lpBuffer
) return sizeof(LOGPEN
);
208 case GDI_OBJECT_TYPE_BRUSH
:
209 if (!lpBuffer
|| !cbSize
) return sizeof(LOGBRUSH
);
212 case GDI_OBJECT_TYPE_BITMAP
:
213 if (!lpBuffer
) return sizeof(BITMAP
);
216 case GDI_OBJECT_TYPE_PALETTE
:
217 if (!lpBuffer
) return sizeof(WORD
);
220 case GDI_OBJECT_TYPE_FONT
:
221 if (!lpBuffer
) return sizeof(LOGFONTW
);
224 case GDI_OBJECT_TYPE_EXTPEN
:
225 /* we don't know the size, ask win32k */
228 case GDI_OBJECT_TYPE_COLORSPACE
:
229 if ((cbSize
< 328) || !lpBuffer
)
231 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
236 case GDI_OBJECT_TYPE_DC
:
237 case GDI_OBJECT_TYPE_REGION
:
238 case GDI_OBJECT_TYPE_EMF
:
239 case GDI_OBJECT_TYPE_METAFILE
:
240 case GDI_OBJECT_TYPE_ENHMETAFILE
:
241 SetLastError(ERROR_INVALID_HANDLE
);
247 cbResult
= NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
);
252 if (!GdiValidateHandle(hGdiObj
))
254 if ((dwType
== GDI_OBJECT_TYPE_PEN
) ||
255 (dwType
== GDI_OBJECT_TYPE_EXTPEN
) ||
256 (dwType
== GDI_OBJECT_TYPE_BRUSH
) ||
257 (dwType
== GDI_OBJECT_TYPE_COLORSPACE
))
259 SetLastError(ERROR_INVALID_PARAMETER
);
264 if ((dwType
== GDI_OBJECT_TYPE_PEN
) ||
265 (dwType
== GDI_OBJECT_TYPE_BRUSH
) ||
266 (dwType
== GDI_OBJECT_TYPE_COLORSPACE
) ||
267 ( (dwType
== GDI_OBJECT_TYPE_EXTPEN
) &&
268 ( (cbSize
>= sizeof(EXTLOGPEN
)) || (cbSize
== 0) ) ) ||
269 ( (dwType
== GDI_OBJECT_TYPE_BITMAP
) && (cbSize
>= sizeof(BITMAP
)) ))
271 SetLastError(ERROR_NOACCESS
);
284 GDILOOBJTYPE eObjectType
;
289 eObjectType
= GDI_HANDLE_GET_TYPE(hobj
);
291 if ((GdiGetHandleUserData(hobj
, eObjectType
, (PVOID
*)&pbrattr
)) &&
294 pTeb
= NtCurrentTeb();
295 if (pTeb
->Win32ThreadInfo
!= NULL
)
297 pgO
= GdiAllocBatchCommand(NULL
, GdiBCDelObj
);
300 /// FIXME: we need to mark the object as deleted!
307 return NtGdiDeleteObjectApp(hobj
);
315 DeleteObject(HGDIOBJ hObject
)
317 /* Check if the handle is valid (FIXME: we need some special
318 sauce for the stock object flag) */
319 if (!GdiValidateHandle(hObject
))
322 /* Check if this is a stock object */
323 if ((DWORD_PTR
)hObject
& GDI_HANDLE_STOCK_MASK
)
325 /* Ignore the attempt to delete a stock object */
326 DPRINT("Trying to delete system object 0x%p\n", hObject
);
330 /* If we have any METAFILE objects, we need to check them */
333 METADC_DeleteObject(hObject
);
336 /* Switch by object type */
337 switch (GDI_HANDLE_GET_TYPE(hObject
))
339 case GDILoObjType_LO_METAFILE16_TYPE
:
340 case GDILoObjType_LO_METAFILE_TYPE
:
343 case GDILoObjType_LO_DC_TYPE
:
344 case GDILoObjType_LO_ALTDC_TYPE
:
345 return DeleteDC(hObject
);
347 case GDILoObjType_LO_ICMLCS_TYPE
:
348 return NtGdiDeleteColorSpace(hObject
);
350 case GDILoObjType_LO_REGION_TYPE
:
351 return DeleteRegion(hObject
);
353 case GDI_OBJECT_TYPE_METADC
:
354 return MFDRV_DeleteObject( hObject
);
355 case GDI_OBJECT_TYPE_EMF
:
357 PLDC pLDC
= GdiGetLDC(hObject
);
358 if ( !pLDC
) return FALSE
;
359 return EMFDRV_DeleteObject( hObject
);
362 case GDILoObjType_LO_BRUSH_TYPE
:
363 case GDILoObjType_LO_PEN_TYPE
:
364 case GDILoObjType_LO_EXTPEN_TYPE
:
365 return GdiDeleteBrushOrPen(hObject
);
367 case GDILoObjType_LO_FONT_TYPE
:
368 case GDILoObjType_LO_BITMAP_TYPE
:
373 return NtGdiDeleteObjectApp(hObject
);