ReactOS  0.4.15-dev-3428-g0609db5
brush.c File Reference
#include <precomp.h>
#include <debug.h>
Include dependency graph for brush.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

HPEN APIENTRY ExtCreatePen (DWORD dwPenStyle, DWORD dwWidth, CONST LOGBRUSH *lplb, DWORD dwStyleCount, CONST DWORD *lpStyle)
 
HBRUSH WINAPI CreateDIBPatternBrush (HGLOBAL hglbDIBPacked, UINT fuColorSpec)
 
HBRUSH WINAPI CreateDIBPatternBrushPt (CONST VOID *lpPackedDIB, UINT fuColorSpec)
 
HBRUSH WINAPI CreateHatchBrush (INT fnStyle, COLORREF clrref)
 
HBRUSH WINAPI CreatePatternBrush (HBITMAP hbmp)
 
HBRUSH WINAPI CreateSolidBrush (IN COLORREF crColor)
 
HBRUSH WINAPI CreateBrushIndirect (CONST LOGBRUSH *LogBrush)
 
BOOL WINAPI GetBrushOrgEx (HDC hdc, LPPOINT pt)
 
BOOL WINAPI SetBrushOrgEx (HDC hdc, int nXOrg, int nYOrg, LPPOINT lppt)
 
DWORD WINAPI GetBrushAttributes (HBRUSH hbr)
 
HBRUSH WINAPI SetBrushAttributes (HBRUSH hbm, DWORD dwFlags)
 
HBRUSH WINAPI ClearBrushAttributes (HBRUSH hbm, DWORD dwFlags)
 
BOOL WINAPI UnrealizeObject (HGDIOBJ hgdiobj)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 3 of file brush.c.

Function Documentation

◆ ClearBrushAttributes()

HBRUSH WINAPI ClearBrushAttributes ( HBRUSH  hbm,
DWORD  dwFlags 
)

Definition at line 375 of file brush.c.

376 {
377  if ( dwFlags & ~SC_BB_STOCKOBJ )
378  {
379  return NULL;
380  }
382 }
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiClearBrushAttributes(_In_ HBRUSH hbm, _In_ DWORD dwFlags)
Definition: brush.cpp:579
#define SC_BB_STOCKOBJ
Definition: ntgdihdl.h:221
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define NULL
Definition: types.h:112

◆ CreateBrushIndirect()

HBRUSH WINAPI CreateBrushIndirect ( CONST LOGBRUSH LogBrush)

Definition at line 206 of file brush.c.

208 {
209  HBRUSH hBrush;
210 
211  switch (LogBrush->lbStyle)
212  {
213  case BS_DIBPATTERN:
214  hBrush = CreateDIBPatternBrush((HGLOBAL)LogBrush->lbHatch,
215  LogBrush->lbColor);
216  break;
217 
218  case BS_DIBPATTERNPT:
219  hBrush = CreateDIBPatternBrushPt((PVOID)LogBrush->lbHatch,
220  LogBrush->lbColor);
221  break;
222 
223  case BS_PATTERN:
224  hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch,
225  FALSE,
226  FALSE);
227  break;
228 
229  case BS_PATTERN8X8:
230  hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch,
231  FALSE,
232  TRUE);
233  break;
234 
235  case BS_SOLID:
236 /* hBrush = hGetPEBHandle(hctBrushHandle, LogBrush->lbColor);
237  if (!hBrush)*/
238  hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0);
239  break;
240 
241  case BS_HATCHED:
242  hBrush = NtGdiCreateHatchBrushInternal(LogBrush->lbHatch,
243  LogBrush->lbColor,
244  FALSE);
245  break;
246 
247  case BS_NULL:
249  break;
250 
251  default:
253  hBrush = NULL;
254  break;
255  }
256 
257  return hBrush;
258 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define BS_DIBPATTERN
Definition: wingdi.h:1092
#define TRUE
Definition: types.h:120
#define NULL_BRUSH
Definition: wingdi.h:901
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetStockObject(_In_ INT iObject)
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateSolidBrush(_In_ COLORREF cr, _In_opt_ HBRUSH hbr)
Definition: brush.cpp:341
#define BS_NULL
Definition: wingdi.h:1087
#define FALSE
Definition: types.h:117
HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL hglbDIBPacked, UINT fuColorSpec)
Definition: brush.c:114
HBRUSH WINAPI CreateDIBPatternBrushPt(CONST VOID *lpPackedDIB, UINT fuColorSpec)
Definition: brush.c:146
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateHatchBrushInternal(_In_ ULONG ulStyle, _In_ COLORREF clrr, _In_ BOOL bPen)
Definition: brush.cpp:357
#define SetLastError(x)
Definition: compat.h:611
#define NULL
Definition: types.h:112
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreatePatternBrushInternal(_In_ HBITMAP hbm, _In_ BOOL bPen, _In_ BOOL b8X8)
Definition: brush.cpp:391
#define BS_PATTERN
Definition: wingdi.h:1090
#define BS_PATTERN8X8
Definition: wingdi.h:1094
#define BS_HATCHED
Definition: wingdi.h:1089
#define BS_SOLID
Definition: wingdi.h:1086
static HBITMAP
Definition: button.c:44
#define BS_DIBPATTERNPT
Definition: wingdi.h:1093

Referenced by test_pattern_brush().

◆ CreateDIBPatternBrush()

HBRUSH WINAPI CreateDIBPatternBrush ( HGLOBAL  hglbDIBPacked,
UINT  fuColorSpec 
)

Definition at line 114 of file brush.c.

117 {
118  PVOID lpPackedDIB;
119  HBRUSH hBrush = NULL;
120  PBITMAPINFO pConvertedInfo;
121  UINT ConvertedInfoSize;
122 
123  lpPackedDIB = GlobalLock(hglbDIBPacked);
124  if (lpPackedDIB == NULL)
125  return 0;
126 
127  pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
128  &ConvertedInfoSize, TRUE);
129  if (pConvertedInfo)
130  {
131  hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
132  ConvertedInfoSize, FALSE, FALSE, lpPackedDIB);
133  if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
134  RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
135  }
136 
137  GlobalUnlock(hglbDIBPacked);
138 
139  return hBrush;
140 }
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
#define FALSE
Definition: types.h:117
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateDIBBrush(_In_reads_bytes_(cj) PVOID pv, _In_ FLONG fl, _In_ UINT cj, _In_ BOOL b8X8, _In_ BOOL bPen, _In_ PVOID pClient)
Definition: brush.cpp:423
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
LPBITMAPINFO WINAPI ConvertBitmapInfo(CONST BITMAPINFO *BitmapInfo, UINT ColorSpec, UINT *BitmapInfoSize, BOOL FollowedByData)
Definition: utils.c:178

Referenced by CreateBrushIndirect().

◆ CreateDIBPatternBrushPt()

HBRUSH WINAPI CreateDIBPatternBrushPt ( CONST VOID lpPackedDIB,
UINT  fuColorSpec 
)

Definition at line 146 of file brush.c.

149 {
150  HBRUSH hBrush = NULL;
151  PBITMAPINFO pConvertedInfo;
152  UINT ConvertedInfoSize;
153 
154  if (lpPackedDIB == NULL)
155  return 0;
156 
157  pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
158  &ConvertedInfoSize, TRUE);
159  if (pConvertedInfo)
160  {
161  hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
162  ConvertedInfoSize, FALSE, FALSE, (PVOID)lpPackedDIB);
163  if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
164  RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
165  }
166 
167  return hBrush;
168 }
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
#define FALSE
Definition: types.h:117
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateDIBBrush(_In_reads_bytes_(cj) PVOID pv, _In_ FLONG fl, _In_ UINT cj, _In_ BOOL b8X8, _In_ BOOL bPen, _In_ PVOID pClient)
Definition: brush.cpp:423
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
LPBITMAPINFO WINAPI ConvertBitmapInfo(CONST BITMAPINFO *BitmapInfo, UINT ColorSpec, UINT *BitmapInfoSize, BOOL FollowedByData)
Definition: utils.c:178

Referenced by CreateBrushIndirect(), test_palette_brush(), and test_pattern_brush().

◆ CreateHatchBrush()

HBRUSH WINAPI CreateHatchBrush ( INT  fnStyle,
COLORREF  clrref 
)

Definition at line 175 of file brush.c.

177 {
178  return NtGdiCreateHatchBrushInternal(fnStyle, clrref, FALSE);
179 }
#define FALSE
Definition: types.h:117
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateHatchBrushInternal(_In_ ULONG ulStyle, _In_ COLORREF clrr, _In_ BOOL bPen)
Definition: brush.cpp:357

Referenced by test_hatch_brush().

◆ CreatePatternBrush()

HBRUSH WINAPI CreatePatternBrush ( HBITMAP  hbmp)

Definition at line 186 of file brush.c.

187 {
189 }
#define FALSE
Definition: types.h:117
HBITMAP hbmp
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreatePatternBrushInternal(_In_ HBITMAP hbm, _In_ BOOL bPen, _In_ BOOL b8X8)
Definition: brush.cpp:391

Referenced by test_pattern_brush().

◆ CreateSolidBrush()

HBRUSH WINAPI CreateSolidBrush ( IN COLORREF  crColor)

Definition at line 196 of file brush.c.

197 {
198  /* Call Server-Side API */
199  return NtGdiCreateSolidBrush(crColor, NULL);
200 }
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiCreateSolidBrush(_In_ COLORREF cr, _In_opt_ HBRUSH hbr)
Definition: brush.cpp:341
#define NULL
Definition: types.h:112

Referenced by test_solidbrush().

◆ ExtCreatePen()

HPEN APIENTRY ExtCreatePen ( DWORD  dwPenStyle,
DWORD  dwWidth,
CONST LOGBRUSH lplb,
DWORD  dwStyleCount,
CONST DWORD lpStyle 
)

Definition at line 13 of file brush.c.

18 {
19  PVOID lpPackedDIB = NULL;
20  HPEN hPen = NULL;
21  PBITMAPINFO pConvertedInfo = NULL;
22  UINT ConvertedInfoSize = 0, lbStyle;
23  BOOL Hit = FALSE;
24 
25  if ((dwPenStyle & PS_STYLE_MASK) == PS_USERSTYLE)
26  {
27  if(!lpStyle)
28  {
30  return 0;
31  }
32  } // This is an enhancement and prevents a call to kernel space.
33  else if ((dwPenStyle & PS_STYLE_MASK) == PS_INSIDEFRAME &&
34  (dwPenStyle & PS_TYPE_MASK) != PS_GEOMETRIC)
35  {
37  return 0;
38  }
39  else if ((dwPenStyle & PS_STYLE_MASK) == PS_ALTERNATE &&
40  (dwPenStyle & PS_TYPE_MASK) != PS_COSMETIC)
41  {
43  return 0;
44  }
45  else
46  {
47  if (dwStyleCount || lpStyle)
48  {
50  return 0;
51  }
52  }
53 
54  lbStyle = lplb->lbStyle;
55 
56  if (lplb->lbStyle > BS_HATCHED)
57  {
58  if (lplb->lbStyle == BS_PATTERN)
59  {
60  pConvertedInfo = (PBITMAPINFO)lplb->lbHatch;
61  if (!pConvertedInfo) return 0;
62  }
63  else
64  {
65  if ((lplb->lbStyle == BS_DIBPATTERN) || (lplb->lbStyle == BS_DIBPATTERNPT))
66  {
67  if (lplb->lbStyle == BS_DIBPATTERN)
68  {
69  lbStyle = BS_DIBPATTERNPT;
70  lpPackedDIB = GlobalLock((HGLOBAL)lplb->lbHatch);
71  if (lpPackedDIB == NULL) return 0;
72  }
73  pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB,
74  lplb->lbColor,
75  &ConvertedInfoSize,
76  TRUE);
77  Hit = TRUE; // We converted DIB.
78  }
79  else
80  pConvertedInfo = (PBITMAPINFO)lpStyle;
81  }
82  }
83  else
84  pConvertedInfo = (PBITMAPINFO)lplb->lbHatch;
85 
86 
87  hPen = NtGdiExtCreatePen(dwPenStyle,
88  dwWidth,
89  lbStyle,
90  lplb->lbColor,
91  lplb->lbHatch,
92  (ULONG_PTR)pConvertedInfo,
93  dwStyleCount,
94  (PULONG)lpStyle,
95  ConvertedInfoSize,
96  FALSE,
97  NULL);
98 
99 
100  if (lplb->lbStyle == BS_DIBPATTERN) GlobalUnlock((HGLOBAL)lplb->lbHatch);
101 
102  if (Hit)
103  {
104  if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
105  RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
106  }
107  return hPen;
108 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define BS_DIBPATTERN
Definition: wingdi.h:1092
#define PS_STYLE_MASK
Definition: wingdi.h:601
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
if(dx==0 &&dy==0)
Definition: linetemp.h:174
#define PS_GEOMETRIC
Definition: wingdi.h:583
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define PS_COSMETIC
Definition: wingdi.h:584
#define PS_ALTERNATE
Definition: wingdi.h:585
#define SetLastError(x)
Definition: compat.h:611
__kernel_entry W32KAPI HPEN APIENTRY NtGdiExtCreatePen(_In_ ULONG flPenStyle, _In_ ULONG ulWidth, _In_ ULONG iBrushStyle, _In_ ULONG ulColor, _In_ ULONG_PTR lClientHatch, _In_ ULONG_PTR lHatch, _In_ ULONG cstyle, _In_reads_opt_(cstyle) PULONG pulStyle, _In_ ULONG cjDIB, _In_ BOOL bOldStylePen, _In_opt_ HBRUSH hbrush)
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
#define PS_INSIDEFRAME
Definition: wingdi.h:593
#define PS_TYPE_MASK
Definition: wingdi.h:603
unsigned int * PULONG
Definition: retypes.h:1
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
#define BS_PATTERN
Definition: wingdi.h:1090
struct tagBITMAPINFO * PBITMAPINFO
#define BS_HATCHED
Definition: wingdi.h:1089
LPBITMAPINFO WINAPI ConvertBitmapInfo(CONST BITMAPINFO *BitmapInfo, UINT ColorSpec, UINT *BitmapInfoSize, BOOL FollowedByData)
Definition: utils.c:178
#define BS_DIBPATTERNPT
Definition: wingdi.h:1093
#define PS_USERSTYLE
Definition: wingdi.h:592
static const WCHAR dwWidth[]
Definition: provider.c:62

◆ GetBrushAttributes()

DWORD WINAPI GetBrushAttributes ( HBRUSH  hbr)

Definition at line 347 of file brush.c.

348 {
349  if ( GDI_HANDLE_IS_STOCKOBJ(hbr) )
350  {
351  return SC_BB_STOCKOBJ;
352  }
353  return 0;
354 }
#define GDI_HANDLE_IS_STOCKOBJ(h)
Definition: gdi.h:37
#define SC_BB_STOCKOBJ
Definition: ntgdihdl.h:221

◆ GetBrushOrgEx()

BOOL WINAPI GetBrushOrgEx ( HDC  hdc,
LPPOINT  pt 
)

Definition at line 266 of file brush.c.

267 {
268  PDC_ATTR Dc_Attr;
269 
270  if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE;
271  if (pt)
272  {
273  pt->x = Dc_Attr->ptlBrushOrigin.x;
274  pt->y = Dc_Attr->ptlBrushOrigin.y;
275  }
276  return TRUE;
277 }
#define TRUE
Definition: types.h:120
#define pt(x, y)
Definition: drawing.c:79
#define FALSE
Definition: types.h:117
#define GDI_OBJECT_TYPE_DC
Definition: gdi.h:46
HDC hdc
Definition: main.c:9
PVOID GdiGetHandleUserData(_In_ HGDIOBJ hobj)
Definition: gditools.c:68

◆ SetBrushAttributes()

HBRUSH WINAPI SetBrushAttributes ( HBRUSH  hbm,
DWORD  dwFlags 
)

Definition at line 361 of file brush.c.

362 {
363  if ( dwFlags & ~SC_BB_STOCKOBJ )
364  {
365  return NULL;
366  }
368 }
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSetBrushAttributes(_In_ HBRUSH hbm, _In_ DWORD dwFlags)
Definition: brush.cpp:553
#define SC_BB_STOCKOBJ
Definition: ntgdihdl.h:221
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define NULL
Definition: types.h:112

◆ SetBrushOrgEx()

BOOL WINAPI SetBrushOrgEx ( HDC  hdc,
int  nXOrg,
int  nYOrg,
LPPOINT  lppt 
)

Definition at line 284 of file brush.c.

288 {
289  PDC_ATTR Dc_Attr;
290 #if 0
291 // Handle something other than a normal dc object.
293  {
294  PLDC pLDC = GdiGetLDC(hdc);
295  if ( (pLDC == NULL) || (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC))
296  {
298  return FALSE;
299  }
300  if (pLDC->iType == LDC_EMFLDC)
301  {
302  return EMFDRV_SetBrushOrg(hdc, nXOrg, nYOrg); // ReactOS only.
303  }
304  return FALSE;
305  }
306 #endif
308  {
309  PGDIBSSETBRHORG pgSBO;
310 
311  /* Does the caller want the current brush origin to be returned? */
312  if (lppt)
313  {
314  lppt->x = Dc_Attr->ptlBrushOrigin.x;
315  lppt->y = Dc_Attr->ptlBrushOrigin.y;
316  }
317 
318  /* Check if we have nothing to do */
319  if ((nXOrg == Dc_Attr->ptlBrushOrigin.x) &&
320  (nYOrg == Dc_Attr->ptlBrushOrigin.y))
321  return TRUE;
322 
323  /* Allocate a batch command buffer */
325  if (pgSBO != NULL)
326  {
327  /* Set current brush origin in the DC attribute */
328  Dc_Attr->ptlBrushOrigin.x = nXOrg;
329  Dc_Attr->ptlBrushOrigin.y = nYOrg;
330 
331  /* Setup the GDI batch command */
332  pgSBO->ptlBrushOrigin = Dc_Attr->ptlBrushOrigin;
333 
334  return TRUE;
335  }
336  }
337 
338  /* Fall back to the slower kernel path */
339  return NtGdiSetBrushOrg(hdc, nXOrg, nYOrg, lppt);
340 }
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define FALSE
Definition: types.h:117
#define GDI_HANDLE_GET_TYPE(h)
Definition: gdi.h:31
PLDC FASTCALL GdiGetLDC(HDC hDC)
Definition: misc.c:785
#define SetLastError(x)
Definition: compat.h:611
#define GDI_OBJECT_TYPE_METADC
Definition: gdi.h:57
Definition: ntgdihdl.h:284
INT iType
Definition: ntgdihdl.h:288
#define GDI_OBJECT_TYPE_DC
Definition: gdi.h:46
HDC hdc
Definition: main.c:9
PVOID GdiGetHandleUserData(_In_ HGDIOBJ hobj)
Definition: gditools.c:68
#define NULL
Definition: types.h:112
POINTL ptlBrushOrigin
Definition: ntgdityp.h:546
FORCEINLINE PVOID GdiAllocBatchCommand(HDC hdc, USHORT Cmd)
Definition: gdi32p.h:381
#define LDC_EMFLDC
Definition: gdi_private.h:105

Referenced by test_brush_org().

◆ UnrealizeObject()

BOOL WINAPI UnrealizeObject ( HGDIOBJ  hgdiobj)

Definition at line 389 of file brush.c.

390 {
391  BOOL retValue = TRUE;
392  /*
393  Win 2k Graphics API, Black Book. by coriolis.com
394  Page 62, Note that Steps 3, 5, and 6 are not required for Windows NT(tm)
395  and Windows 2000(tm).
396 
397  Step 5. UnrealizeObject(hTrackBrush);
398  */
399  /*
400  msdn.microsoft.com,
401  "Windows 2000/XP: If hgdiobj is a brush, UnrealizeObject does nothing,
402  and the function returns TRUE. Use SetBrushOrgEx to set the origin of
403  a brush."
404  */
406  {
407  retValue = NtGdiUnrealizeObject(hgdiobj);
408  }
409 
410  return retValue;
411 }
#define TRUE
Definition: types.h:120
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GDI_OBJECT_TYPE_BRUSH
Definition: gdi.h:52
#define GDI_HANDLE_GET_TYPE(h)
Definition: gdi.h:31
__kernel_entry W32KAPI BOOL APIENTRY NtGdiUnrealizeObject(_In_ HANDLE h)