/*********************************************************************** * GetObjectW (GDI32.@) */ INT WINAPI GetObjectW( HANDLE handle, INT count, LPVOID buffer ) { GDIOBJHDR * ptr; INT result = 0; TRACE("%08x %d %p\n", handle, count, buffer ); if (!count) return 0; if (!(ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE ))) return 0; switch(GDIMAGIC(ptr->wMagic)) { case PEN_MAGIC: result = PEN_GetObject( (PENOBJ *)ptr, count, buffer ); break; case BRUSH_MAGIC: result = BRUSH_GetObject( (BRUSHOBJ *)ptr, count, buffer ); break; case BITMAP_MAGIC: result = BITMAP_GetObject( (BITMAPOBJ *)ptr, count, buffer ); break; case FONT_MAGIC: result = FONT_GetObjectW( (FONTOBJ *)ptr, count, buffer ); break; case PALETTE_MAGIC: result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer ); break; default: FIXME("Magic %04x not implemented\n", GDIMAGIC(ptr->wMagic) ); break; } GDI_ReleaseObj( handle ); return result; }
/*********************************************************************** * DeleteObject (GDI32.@) */ BOOL WINAPI DeleteObject( HGDIOBJ obj ) { /* Check if object is valid */ GDIOBJHDR * header; if (HIWORD(obj)) return FALSE; if (!(header = GDI_GetObjPtr( obj, MAGIC_DONTCARE ))) return FALSE; if (!(header->wMagic & OBJECT_NOSYSTEM) && (header->wMagic >= FIRST_MAGIC) && (header->wMagic <= LAST_MAGIC)) { TRACE("Preserving system object %04x\n", obj); GDI_ReleaseObj( obj ); return TRUE; } if (header->dwCount) { TRACE("delayed for %04x because object in use, count %ld\n", obj, header->dwCount ); header->dwCount |= 0x80000000; /* mark for delete */ GDI_ReleaseObj( obj ); return TRUE; } TRACE("%04x\n", obj ); /* Delete object */ switch(GDIMAGIC(header->wMagic)) { case PEN_MAGIC: return GDI_FreeObject( obj, header ); case BRUSH_MAGIC: return BRUSH_DeleteObject( obj, (BRUSHOBJ*)header ); case FONT_MAGIC: return FONT_DeleteObject( obj, (FONTOBJ*)header ); case PALETTE_MAGIC: return PALETTE_DeleteObject(obj,(PALETTEOBJ*)header); case BITMAP_MAGIC: return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header); case REGION_MAGIC: return REGION_DeleteObject( obj, (RGNOBJ*)header ); case DC_MAGIC: GDI_ReleaseObj( obj ); return DeleteDC(obj); case 0 : WARN("Already deleted\n"); break; default: WARN("Unknown magic number (%04x)\n",GDIMAGIC(header->wMagic)); } GDI_ReleaseObj( obj ); return FALSE; }
/*********************************************************************** * GetObjectType (GDI32.@) */ DWORD WINAPI GetObjectType( HANDLE handle ) { GDIOBJHDR * ptr; INT result = 0; TRACE("%08x\n", handle ); if (!(ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE ))) return 0; switch(GDIMAGIC(ptr->wMagic)) { case PEN_MAGIC: result = OBJ_PEN; break; case BRUSH_MAGIC: result = OBJ_BRUSH; break; case BITMAP_MAGIC: result = OBJ_BITMAP; break; case FONT_MAGIC: result = OBJ_FONT; break; case PALETTE_MAGIC: result = OBJ_PAL; break; case REGION_MAGIC: result = OBJ_REGION; break; case DC_MAGIC: result = OBJ_DC; break; case META_DC_MAGIC: result = OBJ_METADC; break; case METAFILE_MAGIC: result = OBJ_METAFILE; break; case METAFILE_DC_MAGIC: result = OBJ_METADC; break; case ENHMETAFILE_MAGIC: result = OBJ_ENHMETAFILE; break; case ENHMETAFILE_DC_MAGIC: result = OBJ_ENHMETADC; break; default: FIXME("Magic %04x not implemented\n", GDIMAGIC(ptr->wMagic) ); break; } GDI_ReleaseObj( handle ); return result; }
/*********************************************************************** * UnrealizeObject (GDI32.@) */ BOOL WINAPI UnrealizeObject( HGDIOBJ obj ) { BOOL result = TRUE; /* Check if object is valid */ GDIOBJHDR * header = GDI_GetObjPtr( obj, MAGIC_DONTCARE ); if (!header) return FALSE; TRACE("%04x\n", obj ); /* Unrealize object */ switch(GDIMAGIC(header->wMagic)) { case PALETTE_MAGIC: result = PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header ); break; case BRUSH_MAGIC: /* Windows resets the brush origin. We don't need to. */ break; } GDI_ReleaseObj( obj ); return result; }
/*********************************************************************** * GetObject (GDI.82) */ INT16 WINAPI GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer ) { GDIOBJHDR * ptr; INT16 result = 0; TRACE("%04x %d %p\n", handle, count, buffer ); if (!count) return 0; if (!(ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE ))) return 0; switch(GDIMAGIC(ptr->wMagic)) { case PEN_MAGIC: result = PEN_GetObject16( (PENOBJ *)ptr, count, buffer ); break; case BRUSH_MAGIC: result = BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer ); break; case BITMAP_MAGIC: result = BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer ); break; case FONT_MAGIC: result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer ); break; case PALETTE_MAGIC: result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer ); break; } GDI_ReleaseObj( handle ); return result; }
/*********************************************************************** * EMFDRV_SelectObject */ HGDIOBJ EMFDRV_SelectObject( DC *dc, HGDIOBJ handle ) { GDIOBJHDR * ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE ); HGDIOBJ ret = 0; if (!ptr) return 0; TRACE("hdc=%04x %04x\n", dc->hSelf, handle ); switch(GDIMAGIC(ptr->wMagic)) { case PEN_MAGIC: ret = EMFDRV_PEN_SelectObject( dc, handle ); break; case BRUSH_MAGIC: ret = EMFDRV_BRUSH_SelectObject( dc, handle ); break; case FONT_MAGIC: ret = EMFDRV_FONT_SelectObject( dc, handle ); break; case BITMAP_MAGIC: ret = EMFDRV_BITMAP_SelectObject( dc, handle ); break; } GDI_ReleaseObj( handle ); return ret; }
/*********************************************************************** * IsGDIObject (GDI.462) * * returns type of object if valid (W95 system programming secrets p. 264-5) */ BOOL16 WINAPI IsGDIObject16( HGDIOBJ16 handle ) { UINT16 magic = 0; GDIOBJHDR *object = GDI_GetObjPtr( handle, MAGIC_DONTCARE ); if (object) { magic = GDIMAGIC(object->wMagic) - PEN_MAGIC + 1; GDI_ReleaseObj( handle ); } return magic; }
/*********************************************************************** * GDI_GetObjPtr * * Return a pointer to the GDI object associated to the handle. * Return NULL if the object has the wrong magic number. * The object must be released with GDI_ReleaseObj. */ void *GDI_GetObjPtr( HGDIOBJ handle, WORD magic ) { GDIOBJHDR *ptr = NULL; _EnterSysLevel( &GDI_level ); if ((UINT_PTR)handle & 2) /* GDI heap handle */ { ptr = (GDIOBJHDR *)LOCAL_Lock( GDI_HeapSel, handle ); if (ptr) { if (((magic != MAGIC_DONTCARE) && (GDIMAGIC(ptr->wMagic) != magic)) || (GDIMAGIC(ptr->wMagic) < FIRST_MAGIC) || (GDIMAGIC(ptr->wMagic) > LAST_MAGIC)) { LOCAL_Unlock( GDI_HeapSel, handle ); ptr = NULL; } } } else /* large heap handle */ { int i = ((UINT_PTR)handle >> 2) - FIRST_LARGE_HANDLE; if (i >= 0 && i < MAX_LARGE_HANDLES) { ptr = large_handles[i]; if (ptr && (magic != MAGIC_DONTCARE) && (GDIMAGIC(ptr->wMagic) != magic)) ptr = NULL; } } if (!ptr) { _LeaveSysLevel( &GDI_level ); SetLastError( ERROR_INVALID_HANDLE ); WARN( "Invalid handle %x\n", handle ); } else TRACE_SEC( handle, "enter" ); return ptr; }
/*********************************************************************** * PEN_GetObject */ static INT PEN_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ) { PENOBJ *pen = obj; switch (GDIMAGIC(pen->header.wMagic)) { case PEN_MAGIC: { LOGPEN *lp; if (!buffer) return sizeof(LOGPEN); if (count < sizeof(LOGPEN)) return 0; if ((pen->logpen.elpPenStyle & PS_STYLE_MASK) == PS_NULL && count == sizeof(EXTLOGPEN)) { EXTLOGPEN *elp = buffer; *elp = pen->logpen; elp->elpWidth = 0; return sizeof(EXTLOGPEN); } lp = buffer; lp->lopnStyle = pen->logpen.elpPenStyle; lp->lopnColor = pen->logpen.elpColor; lp->lopnWidth.x = pen->logpen.elpWidth; lp->lopnWidth.y = 0; return sizeof(LOGPEN); } case EXT_PEN_MAGIC: { INT size = sizeof(EXTLOGPEN) + pen->logpen.elpNumEntries * sizeof(DWORD) - sizeof(pen->logpen.elpStyleEntry); if (!buffer) return size; if (count < size) return 0; memcpy(buffer, &pen->logpen, size); return size; } default: break; } assert(0); return 0; }
/*********************************************************************** * create_default_clip_region * * Create a default clipping region when none already exists. */ static inline void create_default_clip_region( DC * dc ) { UINT width, height; if (GDIMAGIC( dc->header.wMagic ) == MEMORY_DC_MAGIC) { BITMAP bitmap; GetObjectW( dc->hBitmap, sizeof(bitmap), &bitmap ); width = bitmap.bmWidth; height = bitmap.bmHeight; } else { width = GetDeviceCaps( dc->hSelf, DESKTOPHORZRES ); height = GetDeviceCaps( dc->hSelf, DESKTOPVERTRES ); } dc->hClipRgn = CreateRectRgn( 0, 0, width, height ); }