Use a different magic for memory DCs and get rid of the DC_MEMORY

flag.
This commit is contained in:
Alexandre Julliard 2003-05-13 23:56:12 +00:00
parent ad9121c4ad
commit e1147baa00
12 changed files with 57 additions and 54 deletions

View File

@ -284,8 +284,7 @@ HDC WINAPI CreateEnhMetaFileW(
TRACE("%s\n", debugstr_w(filename) );
if (!(dc = DC_AllocDC( &EMFDRV_Funcs ))) return 0;
dc->header.wMagic = ENHMETAFILE_DC_MAGIC;
if (!(dc = DC_AllocDC( &EMFDRV_Funcs, ENHMETAFILE_DC_MAGIC ))) return 0;
physDev = (EMFDRV_PDEVICE *)HeapAlloc(GetProcessHeap(),0,sizeof(*physDev));
if (!physDev) {

View File

@ -154,8 +154,7 @@ static DC *MFDRV_AllocMetaFile(void)
DC *dc;
METAFILEDRV_PDEVICE *physDev;
if (!(dc = DC_AllocDC( &MFDRV_Funcs ))) return NULL;
dc->header.wMagic = METAFILE_DC_MAGIC;
if (!(dc = DC_AllocDC( &MFDRV_Funcs, METAFILE_DC_MAGIC ))) return NULL;
physDev = (METAFILEDRV_PDEVICE *)HeapAlloc(GetProcessHeap(),0,sizeof(*physDev));
if (!physDev)

View File

@ -57,7 +57,7 @@ BOOL TTYDRV_DC_CreateDC(DC *dc, TTYDRV_PDEVICE **pdev, LPCSTR driver, LPCSTR dev
physDev->hdc = dc->hSelf;
physDev->org.x = physDev->org.y = 0;
if(dc->flags & DC_MEMORY){
if(GetObjectType(dc->hSelf) == OBJ_MEMDC) {
physDev->window = NULL;
physDev->cellWidth = 1;
physDev->cellHeight = 1;

View File

@ -953,7 +953,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe
}
else /* color -> color */
{
if (dcSrc->flags & DC_MEMORY)
if (GetObjectType(physDevSrc->hdc) == OBJ_MEMDC)
imageSrc = XGetImage( gdi_display, physDevSrc->drawable,
physDevSrc->org.x + visRectSrc->left,
physDevSrc->org.y + visRectSrc->top,
@ -1047,7 +1047,7 @@ static int BITBLT_GetDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, GC gc, RECT
register INT x, y;
XImage *image;
if (physDev->dc->flags & DC_MEMORY)
if (GetObjectType( physDev->hdc ) == OBJ_MEMDC)
image = XGetImage( gdi_display, physDev->drawable,
physDev->org.x + visRectDst->left,
physDev->org.y + visRectDst->top,

View File

@ -5209,7 +5209,7 @@ void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physD
xSrc, ySrc, xDest, yDest, width, height);
/* this function is meant as an optimization for BitBlt,
* not to be called otherwise */
if (!(dcSrc->flags & DC_MEMORY)) {
if (GetObjectType( physDevSrc->hdc ) != OBJ_MEMDC) {
ERR("called for non-memory source DC!?\n");
return;
}
@ -5621,7 +5621,7 @@ INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
{
if (!physDev) return DIB_Status_None;
if (!(physDev->dc->flags & DC_MEMORY)) return DIB_Status_None;
if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return DIB_Status_None;
return X11DRV_LockDIBSection2( physDev->dc->hBitmap, req, lossy );
}
@ -5632,7 +5632,7 @@ INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev, BOOL commit)
{
if (!physDev) return;
if (!(physDev->dc->flags & DC_MEMORY)) return;
if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return;
X11DRV_UnlockDIBSection2( physDev->dc->hBitmap, commit );
}

View File

@ -898,6 +898,7 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y )
XImage * image;
int pixel;
POINT pt;
BOOL memdc = (GetObjectType(physDev->hdc) == OBJ_MEMDC);
DC *dc = physDev->dc;
pt.x = x;
@ -908,7 +909,7 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y )
X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
wine_tsx11_lock();
if (dc->flags & DC_MEMORY)
if (memdc)
{
image = XGetImage( gdi_display, physDev->drawable,
physDev->org.x + pt.x, physDev->org.y + pt.y,

View File

@ -103,7 +103,7 @@ BOOL X11DRV_CreateDC( DC *dc, X11DRV_PDEVICE **pdev, LPCSTR driver, LPCSTR devic
physDev->hdc = dc->hSelf;
physDev->dc = dc; /* FIXME */
if (dc->flags & DC_MEMORY)
if (GetObjectType( dc->hSelf ) == OBJ_MEMDC)
{
physDev->drawable = BITMAP_stock_pixmap;
}

View File

@ -1233,10 +1233,9 @@ UINT X11DRV_RealizePalette( X11DRV_PDEVICE *physDev, HPALETTE hpal, BOOL primary
*/
UINT X11DRV_RealizeDefaultPalette( X11DRV_PDEVICE *physDev )
{
DC *dc = physDev->dc;
UINT ret = 0;
if (palette_size && !(dc->flags & DC_MEMORY))
if (palette_size && GetObjectType(physDev->hdc) != OBJ_MEMDC)
{
PALETTEOBJ* palPtr = GDI_GetObjPtr( GetStockObject(DEFAULT_PALETTE), PALETTE_MAGIC );
if (palPtr)

View File

@ -41,7 +41,8 @@
#define METAFILE_DC_MAGIC 0x4f51
#define ENHMETAFILE_MAGIC 0x4f52
#define ENHMETAFILE_DC_MAGIC 0x4f53
#define LAST_MAGIC 0x4f53
#define MEMORY_DC_MAGIC 0x4f54
#define LAST_MAGIC 0x4f54
#define MAGIC_DONTCARE 0xffff
@ -296,7 +297,6 @@ typedef struct tagDC_FUNCS
#define DCHF_VALIDATEVISRGN 0x0002
/* DC flags */
#define DC_MEMORY 0x0001 /* It is a memory DC */
#define DC_SAVED 0x0002 /* It is a saved DC */
#define DC_DIRTY 0x0004 /* hVisRgn has to be updated */
#define DC_THUNKHOOK 0x0008 /* DC hook is in the 16-bit code */
@ -455,7 +455,7 @@ extern BOOL DRIVER_GetDriverName( LPCSTR device, LPSTR driver, DWORD size );
extern POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut );
extern DC * DC_AllocDC( const DC_FUNCTIONS *funcs );
extern DC * DC_AllocDC( const DC_FUNCTIONS *funcs, WORD magic );
extern DC * DC_GetDCPtr( HDC hdc );
extern DC * DC_GetDCUpdate( HDC hdc );
extern void DC_InitDC( DC * dc );

View File

@ -407,7 +407,7 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
DC *dc = DC_GetDCPtr( hdc );
if (!dc) return 0;
if (!(dc->flags & DC_MEMORY))
if (GetObjectType( hdc ) != OBJ_MEMDC)
{
GDI_ReleaseObj( hdc );
return 0;

View File

@ -48,12 +48,12 @@ static const struct gdi_obj_funcs dc_funcs =
/***********************************************************************
* DC_AllocDC
*/
DC *DC_AllocDC( const DC_FUNCTIONS *funcs )
DC *DC_AllocDC( const DC_FUNCTIONS *funcs, WORD magic )
{
HDC hdc;
DC *dc;
if (!(dc = GDI_AllocObject( sizeof(*dc), DC_MAGIC, (HGDIOBJ*)&hdc, &dc_funcs ))) return NULL;
if (!(dc = GDI_AllocObject( sizeof(*dc), magic, (HGDIOBJ*)&hdc, &dc_funcs ))) return NULL;
dc->hSelf = hdc;
dc->funcs = funcs;
@ -130,8 +130,9 @@ DC *DC_GetDCPtr( HDC hdc )
GDIOBJHDR *ptr = GDI_GetObjPtr( hdc, MAGIC_DONTCARE );
if (!ptr) return NULL;
if ((GDIMAGIC(ptr->wMagic) == DC_MAGIC) ||
(GDIMAGIC(ptr->wMagic) == METAFILE_DC_MAGIC) ||
(GDIMAGIC(ptr->wMagic) == ENHMETAFILE_DC_MAGIC))
(GDIMAGIC(ptr->wMagic) == MEMORY_DC_MAGIC) ||
(GDIMAGIC(ptr->wMagic) == METAFILE_DC_MAGIC) ||
(GDIMAGIC(ptr->wMagic) == ENHMETAFILE_DC_MAGIC))
return (DC *)ptr;
GDI_ReleaseObj( hdc );
SetLastError( ERROR_INVALID_HANDLE );
@ -151,18 +152,15 @@ DC *DC_GetDCUpdate( HDC hdc )
if (!dc) return NULL;
while (dc->flags & DC_DIRTY)
{
DCHOOKPROC proc = dc->hookThunk;
dc->flags &= ~DC_DIRTY;
if (!(dc->flags & (DC_SAVED | DC_MEMORY)))
if (proc)
{
DCHOOKPROC proc = dc->hookThunk;
if (proc)
{
DWORD data = dc->dwHookData;
GDI_ReleaseObj( hdc );
proc( HDC_16(hdc), DCHC_INVALIDVISRGN, data, 0 );
if (!(dc = DC_GetDCPtr( hdc ))) break;
/* otherwise restart the loop in case it became dirty again in the meantime */
}
DWORD data = dc->dwHookData;
GDI_ReleaseObj( hdc );
proc( HDC_16(hdc), DCHC_INVALIDVISRGN, data, 0 );
if (!(dc = DC_GetDCPtr( hdc ))) break;
/* otherwise restart the loop in case it became dirty again in the meantime */
}
}
return dc;
@ -271,7 +269,7 @@ HDC WINAPI GetDCState( HDC hdc )
HGDIOBJ handle;
if (!(dc = DC_GetDCPtr( hdc ))) return 0;
if (!(newdc = GDI_AllocObject( sizeof(DC), DC_MAGIC, &handle, &dc_funcs )))
if (!(newdc = GDI_AllocObject( sizeof(DC), GDIMAGIC(dc->header.wMagic), &handle, &dc_funcs )))
{
GDI_ReleaseObj( hdc );
return 0;
@ -409,7 +407,7 @@ void WINAPI SetDCState( HDC hdc, HDC hdcs )
dc->vportExtX = dcs->vportExtX;
dc->vportExtY = dcs->vportExtY;
if (!(dc->flags & DC_MEMORY)) dc->bitsPerPixel = dcs->bitsPerPixel;
if (GDIMAGIC(dc->header.wMagic) != MEMORY_DC_MAGIC) dc->bitsPerPixel = dcs->bitsPerPixel;
if (dcs->hClipRgn)
{
@ -586,13 +584,12 @@ HDC WINAPI CreateDCA( LPCSTR driver, LPCSTR device, LPCSTR output,
ERR( "no driver found for %s\n", buf );
return 0;
}
if (!(dc = DC_AllocDC( funcs )))
if (!(dc = DC_AllocDC( funcs, DC_MAGIC )))
{
DRIVER_release_driver( funcs );
return 0;
}
dc->flags = 0;
dc->hBitmap = GetStockObject( DEFAULT_BITMAP );
TRACE("(driver=%s, device=%s, output=%s): returning %p\n",
@ -667,20 +664,26 @@ HDC WINAPI CreateCompatibleDC( HDC hdc )
{
DC *dc, *origDC;
const DC_FUNCTIONS *funcs;
PHYSDEV physDev;
GDI_CheckNotLock();
if ((origDC = GDI_GetObjPtr( hdc, DC_MAGIC )))
{
funcs = origDC->funcs;
physDev = origDC->physDev;
GDI_ReleaseObj( hdc ); /* can't hold the lock while loading the driver */
funcs = DRIVER_get_driver( funcs );
}
else funcs = DRIVER_load_driver( "DISPLAY" );
else
{
funcs = DRIVER_load_driver( "DISPLAY" );
physDev = NULL;
}
if (!funcs) return 0;
if (!(dc = DC_AllocDC( funcs )))
if (!(dc = DC_AllocDC( funcs, MEMORY_DC_MAGIC )))
{
DRIVER_release_driver( funcs );
return 0;
@ -688,21 +691,19 @@ HDC WINAPI CreateCompatibleDC( HDC hdc )
TRACE("(%p): returning %p\n", hdc, dc->hSelf );
dc->flags = DC_MEMORY;
dc->bitsPerPixel = 1;
dc->hBitmap = GetStockObject( DEFAULT_BITMAP );
/* Copy the driver-specific physical device info into
* the new DC. The driver may use this read-only info
* while creating the compatible DC below. */
if ((origDC = GDI_GetObjPtr( hdc, DC_MAGIC ))) dc->physDev = origDC->physDev;
dc->physDev = physDev;
if (dc->funcs->pCreateDC &&
!dc->funcs->pCreateDC( dc, &dc->physDev, NULL, NULL, NULL, NULL ))
{
WARN("creation aborted by device\n");
GDI_FreeObject( dc->hSelf, dc );
if (origDC) GDI_ReleaseObj( hdc );
DRIVER_release_driver( funcs );
return 0;
}
@ -715,7 +716,6 @@ HDC WINAPI CreateCompatibleDC( HDC hdc )
DC_InitDC( dc );
GDI_ReleaseObj( dc->hSelf );
if (origDC) GDI_ReleaseObj( hdc );
return dc->hSelf;
}
@ -732,19 +732,16 @@ BOOL WINAPI DeleteDC( HDC hdc )
GDI_CheckNotLock();
if (!(dc = GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
if (!(dc = DC_GetDCPtr( hdc ))) return FALSE;
/* Call hook procedure to check whether is it OK to delete this DC */
if (dc->hookThunk && !(dc->flags & (DC_SAVED | DC_MEMORY)))
if (dc->hookThunk)
{
DCHOOKPROC proc = dc->hookThunk;
if (proc)
{
DWORD data = dc->dwHookData;
GDI_ReleaseObj( hdc );
if (!proc( HDC_16(hdc), DCHC_DELETEDC, data, 0 )) return FALSE;
if (!(dc = DC_GetDCPtr( hdc ))) return TRUE; /* deleted by the hook */
}
DWORD data = dc->dwHookData;
GDI_ReleaseObj( hdc );
if (!proc( HDC_16(hdc), DCHC_DELETEDC, data, 0 )) return FALSE;
if (!(dc = DC_GetDCPtr( hdc ))) return TRUE; /* deleted by the hook */
}
while (dc->saveLevel)
@ -1141,11 +1138,15 @@ BOOL WINAPI CombineTransform( LPXFORM xformResult, const XFORM *xform1,
*/
BOOL WINAPI SetDCHook( HDC hdc, DCHOOKPROC hookProc, DWORD dwHookData )
{
DC *dc = DC_GetDCPtr( hdc );
DC *dc = GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return FALSE;
dc->dwHookData = dwHookData;
dc->hookThunk = hookProc;
if (!(dc->flags & DC_SAVED))
{
dc->dwHookData = dwHookData;
dc->hookThunk = hookProc;
}
GDI_ReleaseObj( hdc );
return TRUE;
}

View File

@ -692,6 +692,7 @@ void *GDI_AllocObject( WORD size, WORD magic, HGDIOBJ *handle, const struct gdi_
case METAFILE_DC_MAGIC:
case ENHMETAFILE_MAGIC:
case ENHMETAFILE_DC_MAGIC:
case MEMORY_DC_MAGIC:
case BITMAP_MAGIC:
case PALETTE_MAGIC:
if (!(obj = alloc_large_heap( size, handle ))) goto error;
@ -1023,6 +1024,9 @@ DWORD WINAPI GetObjectType( HANDLE handle )
case ENHMETAFILE_DC_MAGIC:
result = OBJ_ENHMETADC;
break;
case MEMORY_DC_MAGIC:
result = OBJ_MEMDC;
break;
default:
FIXME("Magic %04x not implemented\n", GDIMAGIC(ptr->wMagic) );
break;