Example #1
0
/***********************************************************************
 *           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;
}
Example #2
0
/***********************************************************************
 *           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;
}
Example #3
0
/***********************************************************************
 *           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;
}
Example #4
0
/***********************************************************************
 *           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;
}
Example #5
0
/***********************************************************************
 *           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;
}
Example #6
0
/***********************************************************************
 *           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;
}
Example #7
0
/***********************************************************************
 *           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;
}
Example #8
0
/***********************************************************************
 *           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;
}
Example #9
0
/***********************************************************************
 *           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;
}
Example #10
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 );
}