| /* | |
| * GDI functions | |
| * | |
| * Copyright 1993 Alexandre Julliard | |
| */ | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include "gdi.h" | |
| #include "color.h" | |
| #include "bitmap.h" | |
| #include "brush.h" | |
| #include "font.h" | |
| #include "palette.h" | |
| #include "pen.h" | |
| #include "region.h" | |
| #include "callback.h" | |
| #include "stddebug.h" | |
| /* #define DEBUG_GDI */ | |
| #include "debug.h" | |
| #include "xmalloc.h" | |
| LPSTR GDI_Heap = NULL; | |
| WORD GDI_HeapSel = 0; | |
| /* Object types for EnumObjects() */ | |
| #define OBJ_PEN 1 | |
| #define OBJ_BRUSH 2 | |
| #define MAX_OBJ 1024 | |
| HANDLE *lpPenBrushList = NULL; | |
| /*********************************************************************** | |
| * GDI stock objects | |
| */ | |
| static BRUSHOBJ WhiteBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_SOLID, RGB(255,255,255), 0 } /* logbrush */ | |
| }; | |
| static BRUSHOBJ LtGrayBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_SOLID, RGB(192,192,192), 0 } /* logbrush */ | |
| }; | |
| static BRUSHOBJ GrayBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_SOLID, RGB(128,128,128), 0 } /* logbrush */ | |
| }; | |
| static BRUSHOBJ DkGrayBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_SOLID, RGB(64,64,64), 0 } /* logbrush */ | |
| }; | |
| static BRUSHOBJ BlackBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_SOLID, RGB(0,0,0), 0 } /* logbrush */ | |
| }; | |
| static BRUSHOBJ NullBrush = | |
| { | |
| { 0, BRUSH_MAGIC, 1, 0 }, /* header */ | |
| { BS_NULL, 0, 0 } /* logbrush */ | |
| }; | |
| static PENOBJ WhitePen = | |
| { | |
| { 0, PEN_MAGIC, 1, 0 }, /* header */ | |
| { PS_SOLID, { 1, 0 }, RGB(255,255,255) } /* logpen */ | |
| }; | |
| static PENOBJ BlackPen = | |
| { | |
| { 0, PEN_MAGIC, 1, 0 }, /* header */ | |
| { PS_SOLID, { 1, 0 }, RGB(0,0,0) } /* logpen */ | |
| }; | |
| static PENOBJ NullPen = | |
| { | |
| { 0, PEN_MAGIC, 1, 0 }, /* header */ | |
| { PS_NULL, { 1, 0 }, 0 } /* logpen */ | |
| }; | |
| static FONTOBJ OEMFixedFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" } | |
| }; | |
| static FONTOBJ AnsiFixedFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" } | |
| }; | |
| static FONTOBJ AnsiVarFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" } | |
| }; | |
| static FONTOBJ SystemFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" } | |
| }; | |
| static FONTOBJ DeviceDefaultFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" } | |
| }; | |
| static FONTOBJ SystemFixedFont = | |
| { | |
| { 0, FONT_MAGIC, 1, 0 }, /* header */ | |
| { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, | |
| 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" } | |
| }; | |
| static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] = | |
| { | |
| (GDIOBJHDR *) &WhiteBrush, | |
| (GDIOBJHDR *) &LtGrayBrush, | |
| (GDIOBJHDR *) &GrayBrush, | |
| (GDIOBJHDR *) &DkGrayBrush, | |
| (GDIOBJHDR *) &BlackBrush, | |
| (GDIOBJHDR *) &NullBrush, | |
| (GDIOBJHDR *) &WhitePen, | |
| (GDIOBJHDR *) &BlackPen, | |
| (GDIOBJHDR *) &NullPen, | |
| NULL, | |
| (GDIOBJHDR *) &OEMFixedFont, | |
| (GDIOBJHDR *) &AnsiFixedFont, | |
| (GDIOBJHDR *) &AnsiVarFont, | |
| (GDIOBJHDR *) &SystemFont, | |
| (GDIOBJHDR *) &DeviceDefaultFont, | |
| NULL, /* DEFAULT_PALETTE created by COLOR_Init */ | |
| (GDIOBJHDR *) &SystemFixedFont | |
| }; | |
| /*********************************************************************** | |
| * GDI_Init | |
| * | |
| * GDI initialisation. | |
| */ | |
| BOOL GDI_Init(void) | |
| { | |
| HPALETTE hpalette; | |
| #ifndef WINELIB | |
| /* Create GDI heap */ | |
| if (!(GDI_HeapSel = GlobalAlloc(GMEM_FIXED, GDI_HEAP_SIZE))) return FALSE; | |
| GDI_Heap = GlobalLock( GDI_HeapSel ); | |
| LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 ); | |
| #endif | |
| /* Create default palette */ | |
| if (!(hpalette = COLOR_Init())) return FALSE; | |
| StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( hpalette ); | |
| /* Create default bitmap */ | |
| if (!BITMAP_Init()) return FALSE; | |
| /* Initialise brush dithering */ | |
| if (!BRUSH_Init()) return FALSE; | |
| /* Initialise fonts */ | |
| if (!FONT_Init()) return FALSE; | |
| return TRUE; | |
| } | |
| /*********************************************************************** | |
| * GDI_AllocObject | |
| */ | |
| HANDLE GDI_AllocObject( WORD size, WORD magic ) | |
| { | |
| static DWORD count = 0; | |
| GDIOBJHDR * obj; | |
| HANDLE handle = GDI_HEAP_ALLOC( size ); | |
| if (!handle) return 0; | |
| obj = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| obj->hNext = 0; | |
| obj->wMagic = magic; | |
| obj->dwCount = ++count; | |
| return handle; | |
| } | |
| /*********************************************************************** | |
| * GDI_FreeObject | |
| */ | |
| BOOL GDI_FreeObject( HANDLE handle ) | |
| { | |
| GDIOBJHDR * object; | |
| /* Can't free stock objects */ | |
| if ((DWORD)handle >= FIRST_STOCK_HANDLE && | |
| (DWORD)handle <= LAST_STOCK_HANDLE ) return TRUE; | |
| object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| if (!object) return FALSE; | |
| object->wMagic = 0; /* Mark it as invalid */ | |
| /* Free object */ | |
| GDI_HEAP_FREE( handle ); | |
| return TRUE; | |
| } | |
| /*********************************************************************** | |
| * GDI_GetObjPtr | |
| * | |
| * Return a pointer to the GDI object associated to the handle. | |
| * Return NULL if the object has the wrong magic number. | |
| */ | |
| GDIOBJHDR * GDI_GetObjPtr( HANDLE handle, WORD magic ) | |
| { | |
| GDIOBJHDR * ptr = NULL; | |
| if ((DWORD)handle >= FIRST_STOCK_HANDLE && | |
| (DWORD)handle <= LAST_STOCK_HANDLE ) | |
| ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE]; | |
| else | |
| ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| if (!ptr) return NULL; | |
| if (ptr->wMagic != magic) return NULL; | |
| return ptr; | |
| } | |
| /*********************************************************************** | |
| * DeleteObject (GDI.69) | |
| */ | |
| BOOL DeleteObject( HANDLE obj ) | |
| { | |
| /* Check if object is valid */ | |
| GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj ); | |
| if (!header) return FALSE; | |
| dprintf_gdi(stddeb, "DeleteObject: "NPFMT"\n", obj ); | |
| /* Delete object */ | |
| switch(header->wMagic) | |
| { | |
| case PEN_MAGIC: return GDI_FreeObject( obj ); | |
| case BRUSH_MAGIC: return BRUSH_DeleteObject( obj, (BRUSHOBJ*)header ); | |
| case FONT_MAGIC: return GDI_FreeObject( obj ); | |
| case PALETTE_MAGIC: return GDI_FreeObject( obj ); | |
| case BITMAP_MAGIC: return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header); | |
| case REGION_MAGIC: return REGION_DeleteObject( obj, (RGNOBJ*)header ); | |
| } | |
| return FALSE; | |
| } | |
| /*********************************************************************** | |
| * GetStockObject (GDI.87) | |
| */ | |
| HANDLE GetStockObject( int obj ) | |
| { | |
| if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0; | |
| if (!StockObjects[obj]) return 0; | |
| dprintf_gdi(stddeb, "GetStockObject: returning %ld\n", | |
| (DWORD)FIRST_STOCK_HANDLE + obj ); | |
| return (HANDLE)((DWORD)FIRST_STOCK_HANDLE + obj); | |
| } | |
| /*********************************************************************** | |
| * GetObject (GDI.82) | |
| */ | |
| int GetObject( HANDLE handle, int count, LPSTR buffer ) | |
| { | |
| GDIOBJHDR * ptr = NULL; | |
| dprintf_gdi(stddeb, "GetObject: "NPFMT" %d %p\n", handle, count, buffer ); | |
| if (!count) return 0; | |
| if ((DWORD)handle >= FIRST_STOCK_HANDLE && | |
| (DWORD)handle <= LAST_STOCK_HANDLE ) | |
| ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE]; | |
| else | |
| ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| if (!ptr) return 0; | |
| switch(ptr->wMagic) | |
| { | |
| case PEN_MAGIC: | |
| return PEN_GetObject( (PENOBJ *)ptr, count, buffer ); | |
| case BRUSH_MAGIC: | |
| return BRUSH_GetObject( (BRUSHOBJ *)ptr, count, buffer ); | |
| case BITMAP_MAGIC: | |
| return BITMAP_GetObject( (BITMAPOBJ *)ptr, count, buffer ); | |
| case FONT_MAGIC: | |
| return FONT_GetObject( (FONTOBJ *)ptr, count, buffer ); | |
| case PALETTE_MAGIC: | |
| return PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer ); | |
| } | |
| return 0; | |
| } | |
| /*********************************************************************** | |
| * SelectObject (GDI.45) | |
| */ | |
| HANDLE SelectObject( HDC hdc, HANDLE handle ) | |
| { | |
| GDIOBJHDR * ptr = NULL; | |
| DC * dc; | |
| dprintf_gdi(stddeb, "SelectObject: "NPFMT" "NPFMT"\n", hdc, handle ); | |
| if ((DWORD)handle >= FIRST_STOCK_HANDLE && | |
| (DWORD)handle <= LAST_STOCK_HANDLE ) | |
| ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE]; | |
| else | |
| ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| if (!ptr) return 0; | |
| dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); | |
| if (!dc) | |
| { | |
| dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); | |
| if (!dc) return 0; | |
| } | |
| switch(ptr->wMagic) | |
| { | |
| case PEN_MAGIC: | |
| return PEN_SelectObject( dc, handle, (PENOBJ *)ptr ); | |
| case BRUSH_MAGIC: | |
| return BRUSH_SelectObject( hdc, dc, handle, (BRUSHOBJ *)ptr ); | |
| case BITMAP_MAGIC: | |
| return BITMAP_SelectObject( hdc, dc, handle, (BITMAPOBJ *)ptr ); | |
| case FONT_MAGIC: | |
| return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr ); | |
| case REGION_MAGIC: | |
| return (HANDLE)SelectClipRgn( hdc, handle ); | |
| } | |
| return 0; | |
| } | |
| /*********************************************************************** | |
| * UnrealizeObject (GDI.150) | |
| */ | |
| BOOL UnrealizeObject( HANDLE handle ) | |
| { | |
| dprintf_gdi(stdnimp, "UnrealizeObject: "NPFMT"\n", handle ); | |
| return TRUE; | |
| } | |
| /*********************************************************************** | |
| * EnumObjects (GDI.71) | |
| */ | |
| int EnumObjects( HDC hdc, int nObjType, FARPROC lpEnumFunc, LPARAM lParam ) | |
| { | |
| /* Solid colors to enumerate */ | |
| static const COLORREF solid_colors[] = | |
| { RGB(0x00,0x00,0x00), RGB(0xff,0xff,0xff), | |
| RGB(0xff,0x00,0x00), RGB(0x00,0xff,0x00), | |
| RGB(0x00,0x00,0xff), RGB(0xff,0xff,0x00), | |
| RGB(0xff,0x00,0xff), RGB(0x00,0xff,0xff), | |
| RGB(0x80,0x00,0x00), RGB(0x00,0x80,0x00), | |
| RGB(0x80,0x80,0x00), RGB(0x00,0x00,0x80), | |
| RGB(0x80,0x00,0x80), RGB(0x00,0x80,0x80), | |
| RGB(0x80,0x80,0x80), RGB(0xc0,0xc0,0xc0) | |
| }; | |
| int i, retval = 0; | |
| dprintf_gdi( stddeb, "EnumObjects: "NPFMT" %d %08lx %08lx\n", | |
| hdc, nObjType, (DWORD)lpEnumFunc, lParam ); | |
| switch(nObjType) | |
| { | |
| case OBJ_PEN: | |
| /* Enumerate solid pens */ | |
| for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++) | |
| { | |
| LOGPEN pen = { PS_SOLID, { 1, 0 }, solid_colors[i] }; | |
| retval = CallEnumObjectsProc( lpEnumFunc, MAKE_SEGPTR(&pen), | |
| lParam ); | |
| dprintf_gdi( stddeb, "EnumObject: solid pen %08lx, ret=%d\n", | |
| solid_colors[i], retval); | |
| if (!retval) break; | |
| } | |
| break; | |
| case OBJ_BRUSH: | |
| /* Enumerate solid brushes */ | |
| for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++) | |
| { | |
| LOGBRUSH brush = { BS_SOLID, solid_colors[i], 0 }; | |
| retval = CallEnumObjectsProc( lpEnumFunc, MAKE_SEGPTR(&brush), | |
| lParam ); | |
| dprintf_gdi( stddeb, "EnumObject: solid brush %08lx, ret=%d\n", | |
| solid_colors[i], retval); | |
| if (!retval) break; | |
| } | |
| if (!retval) break; | |
| /* Now enumerate hatched brushes */ | |
| for (i = HS_HORIZONTAL; i <= HS_DIAGCROSS; i++) | |
| { | |
| LOGBRUSH brush = { BS_HATCHED, RGB(0,0,0), i }; | |
| retval = CallEnumObjectsProc( lpEnumFunc, MAKE_SEGPTR(&brush), | |
| lParam ); | |
| dprintf_gdi( stddeb, "EnumObject: hatched brush %d, ret=%d\n", | |
| i, retval); | |
| if (!retval) break; | |
| } | |
| break; | |
| default: | |
| fprintf( stderr, "EnumObjects: invalid type %d\n", nObjType ); | |
| break; | |
| } | |
| return retval; | |
| #if 0 | |
| /* HANDLE handle; | |
| DC *dc;*/ | |
| HANDLE *lphObj; | |
| GDIOBJHDR *header; | |
| WORD wMagic; | |
| LPSTR lpLog; /* Point to a LOGBRUSH or LOGPEN struct */ | |
| HANDLE hLog; | |
| int nRet = 0; | |
| if (lpEnumFunc == 0) { | |
| fprintf(stderr,"EnumObjects // Bad EnumProc callback address !\n"); | |
| return 0; | |
| } | |
| switch (nObjType) { | |
| case OBJ_PEN: | |
| wMagic = PEN_MAGIC; | |
| dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_PEN, %08lx, %p);\n", | |
| hDC, (LONG)lpEnumFunc, lpData); | |
| hLog = GDI_HEAP_ALLOC( sizeof(LOGPEN) ); | |
| lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog); | |
| if (lpLog == NULL) { | |
| fprintf(stderr,"EnumObjects // Unable to alloc LOGPEN struct !\n"); | |
| return 0; | |
| } | |
| break; | |
| case OBJ_BRUSH: | |
| wMagic = BRUSH_MAGIC; | |
| dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_BRUSH, %08lx, %p);\n", | |
| hDC, (LONG)lpEnumFunc, lpData); | |
| hLog = GDI_HEAP_ALLOC( sizeof(LOGBRUSH) ); | |
| lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog); | |
| if (lpLog == NULL) { | |
| fprintf(stderr,"EnumObjects // Unable to alloc LOGBRUSH struct !\n"); | |
| return 0; | |
| } | |
| break; | |
| default: | |
| fprintf(stderr,"EnumObjects("NPFMT", %04X, %08lx, %p); // Unknown OBJ type !\n", | |
| hDC, nObjType, (LONG)lpEnumFunc, lpData); | |
| return 0; | |
| } | |
| #ifdef notdef /* FIXME: stock object ptr won't work in callback */ | |
| dprintf_gdi(stddeb,"EnumObjects // Stock Objects first !\n"); | |
| for (i = 0; i < NB_STOCK_OBJECTS; i++) { | |
| header = StockObjects[i]; | |
| if (header->wMagic == wMagic) { | |
| PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog); | |
| BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH),lpLog); | |
| dprintf_gdi(stddeb,"EnumObjects // StockObj lpLog=%p lpData=%p\n", lpLog, lpData); | |
| if (header->wMagic == BRUSH_MAGIC) { | |
| dprintf_gdi(stddeb,"EnumObjects // StockBrush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle); | |
| dprintf_gdi(stddeb,"EnumObjects // StockBrush lbColor=%08lX\n", ((LPLOGBRUSH)lpLog)->lbColor); | |
| dprintf_gdi(stddeb,"EnumObjects // StockBrush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch); | |
| } | |
| if (header->wMagic == PEN_MAGIC) { | |
| dprintf_gdi(stddeb,"EnumObjects // StockPen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle); | |
| dprintf_gdi(stddeb,"EnumObjects // StockPen lopnWidth=%d\n", ((LPLOGPEN)lpLog)->lopnWidth.x); | |
| dprintf_gdi(stddeb,"EnumObjects // StockPen lopnColor=%08lX\n", ((LPLOGPEN)lpLog)->lopnColor); | |
| } | |
| nRet = CallEnumObjectsProc( lpEnumFunc, | |
| GDI_HEAP_SEG_ADDR(hLog), | |
| (int)lpData ); | |
| dprintf_gdi(stddeb,"EnumObjects // after Callback!\n"); | |
| if (nRet == 0) { | |
| GDI_HEAP_FREE(hLog); | |
| dprintf_gdi(stddeb,"EnumObjects // EnumEnd requested by application !\n"); | |
| return 0; | |
| } | |
| } | |
| } | |
| dprintf_gdi(stddeb,"EnumObjects // Now DC owned objects %p !\n", header); | |
| #endif /* notdef */ | |
| if (lpPenBrushList == NULL) return 0; | |
| for (lphObj = lpPenBrushList; *lphObj != 0; ) { | |
| dprintf_gdi(stddeb,"EnumObjects // *lphObj="NPFMT"\n", *lphObj); | |
| header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR(*lphObj++); | |
| if (header->wMagic == wMagic) { | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Obj lpLog=%p lpData=%p\n", lpLog, lpData); | |
| if (header->wMagic == BRUSH_MAGIC) { | |
| BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), lpLog); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbColor=%08lX\n", ((LPLOGBRUSH)lpLog)->lbColor); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbHatch=%04lX\n", (LONG)((LPLOGBRUSH)lpLog)->lbHatch); | |
| } | |
| if (header->wMagic == PEN_MAGIC) { | |
| PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnWidth=%ld\n", (LONG)((LPLOGPEN)lpLog)->lopnWidth.x); | |
| dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnColor=%08lX\n", ((LPLOGPEN)lpLog)->lopnColor); | |
| } | |
| nRet = CallEnumObjectsProc(lpEnumFunc, GDI_HEAP_SEG_ADDR(hLog), | |
| (LONG)lpData); | |
| if (nRet == 0) | |
| break; | |
| } | |
| } | |
| GDI_HEAP_FREE(hLog); | |
| dprintf_gdi(stddeb,"EnumObjects // End of enumeration !\n"); | |
| return nRet; | |
| #endif | |
| } | |
| /*********************************************************************** | |
| * IsGDIObject(GDI.462) | |
| */ | |
| BOOL IsGDIObject(HANDLE handle) | |
| { | |
| GDIOBJHDR *object; | |
| object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); | |
| if (object) | |
| return TRUE; | |
| else | |
| return FALSE; | |
| } |