Hi all !

This mail is a resent because I noticed that it does not appear in wine-devel...

I started a work to get rid of GDI_GetObjPtr and GDI_ReleaseObj in x11drv but I am not sure if have chosen a good way.
This patch is incomplete : some GDI_* are still staying, those that cannot be removed using my way.


Working on it I noticed something which can be interesting : graphics are faster because some times GDI_GetObjPtr were called twice and in my patch only once.

I would some comments on this work.

R�mi
diff -u dlls/gdi/bitblt.c dlls/gdi/bitblt.c
--- dlls/gdi/bitblt.c	2004-08-11 20:51:10.000000000 +0200
+++ dlls/gdi/bitblt.c	2005-01-04 18:03:49.000000000 +0100
@@ -24,7 +24,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(bitblt);
 
-
 /***********************************************************************
  *           PatBlt    (GDI32.@)
  */
@@ -33,13 +32,16 @@
 {
     DC * dc = DC_GetDCUpdate( hdc );
     BOOL bRet = FALSE;
+    BITMAPOBJ *bmp;
+    HBITMAP hBmp = GetCurrentObject( hdc, OBJ_BITMAP );
 
     if (!dc) return FALSE;
 
-    if (dc->funcs->pPatBlt)
+    if (dc->funcs->pPatBlt && (bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC )) )
     {
         TRACE("%p %d,%d %dx%d %06lx\n", hdc, left, top, width, height, rop );
-        bRet = dc->funcs->pPatBlt( dc->physDev, left, top, width, height, rop );
+        bRet = dc->funcs->pPatBlt( dc->physDev, left, top, width, height, rop, bmp );
+        GDI_ReleaseObj( hBmp );
     }
     GDI_ReleaseObj( hdc );
     return bRet;
@@ -54,6 +56,8 @@
 {
     BOOL ret = FALSE;
     DC *dcDst, *dcSrc;
+    BITMAPOBJ *bmpDst, *bmpSrc;
+    HBITMAP hBmp;
 
     if ((dcSrc = DC_GetDCUpdate( hdcSrc ))) GDI_ReleaseObj( hdcSrc );
     /* FIXME: there is a race condition here */
@@ -62,9 +66,17 @@
         dcSrc = DC_GetDCPtr( hdcSrc );
         TRACE("hdcSrc=%p %d,%d -> hdcDest=%p %d,%d %dx%d rop=%06lx\n",
               hdcSrc, xSrc, ySrc, hdcDst, xDst, yDst, width, height, rop);
-        if (dcDst->funcs->pBitBlt)
+        hBmp = GetCurrentObject( dcDst->hSelf, OBJ_BITMAP );
+        bmpDst = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+        hBmp = GetCurrentObject( dcSrc->hSelf, OBJ_BITMAP );
+        bmpSrc = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+        if (dcDst->funcs->pBitBlt && bmpDst && bmpSrc )
             ret = dcDst->funcs->pBitBlt( dcDst->physDev, xDst, yDst, width, height,
-                                         dcSrc ? dcSrc->physDev : NULL, xSrc, ySrc, rop );
+                                         dcSrc ? dcSrc->physDev : NULL, xSrc, ySrc, rop,
+                                         bmpDst, bmpSrc );
+
+        if ( bmpDst ) GDI_ReleaseObj( bmpDst );
+        if ( bmpSrc ) GDI_ReleaseObj( bmpSrc );
         if (dcSrc) GDI_ReleaseObj( hdcSrc );
         GDI_ReleaseObj( hdcDst );
     }
@@ -79,10 +91,12 @@
                             INT widthDst, INT heightDst,
                             HDC hdcSrc, INT xSrc, INT ySrc,
                             INT widthSrc, INT heightSrc,
-			DWORD rop )
+                            DWORD rop )
 {
     BOOL ret = FALSE;
     DC *dcDst, *dcSrc;
+    BITMAPOBJ *bmpDst, *bmpSrc;
+    HBITMAP hBmp;
 
     if ((dcSrc = DC_GetDCUpdate( hdcSrc ))) GDI_ReleaseObj( hdcSrc );
     /* FIXME: there is a race condition here */
@@ -94,14 +108,21 @@
               hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
               hdcDst, xDst, yDst, widthDst, heightDst, rop );
 
-	if (dcSrc) {
-	    if (dcDst->funcs->pStretchBlt)
-		ret = dcDst->funcs->pStretchBlt( dcDst->physDev, xDst, yDst, widthDst, heightDst,
-                                                 dcSrc->physDev, xSrc, ySrc, widthSrc, heightSrc,
-                                                 rop );
-	    GDI_ReleaseObj( hdcSrc );
-	}
-        GDI_ReleaseObj( hdcDst );
+    if (dcSrc) {
+        hBmp = GetCurrentObject( dcDst->hSelf, OBJ_BITMAP );
+        bmpDst = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+        hBmp = GetCurrentObject( dcSrc->hSelf, OBJ_BITMAP );
+        bmpSrc = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+        if (dcDst->funcs->pStretchBlt && bmpDst && bmpSrc )
+            ret = dcDst->funcs->pStretchBlt( dcDst->physDev, xDst, yDst, widthDst, heightDst,
+                                             dcSrc->physDev, xSrc, ySrc, widthSrc, heightSrc,
+                                             rop, bmpDst, bmpSrc );
+
+           if ( bmpDst ) GDI_ReleaseObj( bmpDst );
+           if ( bmpSrc ) GDI_ReleaseObj( bmpSrc );
+           GDI_ReleaseObj( hdcSrc );
+        }
+       GDI_ReleaseObj( hdcDst );
     }
     return ret;
 }
diff -u dlls/gdi/bitmap.c dlls/gdi/bitmap.c
--- dlls/gdi/bitmap.c	2004-12-23 20:04:10.000000000 +0100
+++ dlls/gdi/bitmap.c	2004-12-30 16:05:15.000000000 +0100
@@ -339,7 +339,7 @@
     if(bmp->funcs && bmp->funcs->pGetBitmapBits)
     {
         TRACE("Calling device specific BitmapBits\n");
-        ret = bmp->funcs->pGetBitmapBits(hbitmap, bits, count);
+        ret = bmp->funcs->pGetBitmapBits(bmp, bits, count);
     } else {
 
         if(!bmp->bitmap.bmBits) {
@@ -394,7 +394,7 @@
     if(bmp->funcs && bmp->funcs->pSetBitmapBits) {
 
         TRACE("Calling device specific BitmapBits\n");
-        ret = bmp->funcs->pSetBitmapBits(hbitmap, bits, count);
+        ret = bmp->funcs->pSetBitmapBits(bmp, bits, count);
     } else {
 
         if(!bmp->bitmap.bmBits) /* Alloc enough for entire bitmap */
@@ -456,12 +456,16 @@
     /* never set the owner of the stock bitmap since it can be selected in multiple DCs */
     if (hbitmap == GetStockObject(DEFAULT_BITMAP)) return TRUE;
 
-    if (!(bitmap = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return FALSE;
+    if (!(bitmap = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) 
+    {
+        WARN("Bad bitmap handle %p\n", hbitmap);
+        return FALSE;
+    }
 
     ret = TRUE;
     if (!bitmap->funcs)  /* not owned by a DC yet */
     {
-        if (dc->funcs->pCreateBitmap) ret = dc->funcs->pCreateBitmap( dc->physDev, hbitmap );
+        if (dc->funcs->pCreateBitmap) ret = dc->funcs->pCreateBitmap( dc->physDev, hbitmap, bitmap );
         if (ret) bitmap->funcs = dc->funcs;
     }
     else if (bitmap->funcs != dc->funcs)
@@ -481,6 +485,7 @@
 {
     HGDIOBJ ret;
     BITMAPOBJ *bitmap = obj;
+    BITMAPOBJ *bmp;
     DC *dc = DC_GetDCPtr( hdc );
 
     if (!dc) return 0;
@@ -505,7 +510,15 @@
         return 0;
     }
 
-    if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle );
+    if (dc->funcs->pSelectBitmap) 
+    {
+        if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( handle, BITMAP_MAGIC ))) handle = 0;
+        else 
+        {
+            handle = dc->funcs->pSelectBitmap( dc->physDev, handle, bmp );
+            GDI_ReleaseObj( handle );
+        }
+    }
 
     if (handle)
     {
@@ -528,9 +541,14 @@
 static BOOL BITMAP_DeleteObject( HGDIOBJ handle, void *obj )
 {
     BITMAPOBJ * bmp = obj;
+    BITMAPOBJ * bitmap;
 
     if (bmp->funcs && bmp->funcs->pDeleteBitmap)
-        bmp->funcs->pDeleteBitmap( handle );
+    {
+        bitmap = (BITMAPOBJ *) GDI_GetObjPtr( handle, BITMAP_MAGIC );
+        bmp->funcs->pDeleteBitmap( bitmap );
+        GDI_ReleaseObj( handle );
+    }
 
     HeapFree( GetProcessHeap(), 0, bmp->bitmap.bmBits );
 
diff -u dlls/gdi/dc.c dlls/gdi/dc.c
--- dlls/gdi/dc.c	2004-12-23 20:04:10.000000000 +0100
+++ dlls/gdi/dc.c	2005-01-05 18:53:49.371647480 +0100
@@ -188,7 +188,7 @@
  */
 void DC_InitDC( DC* dc )
 {
-    if (dc->funcs->pRealizeDefaultPalette) dc->funcs->pRealizeDefaultPalette( dc->physDev );
+    if (dc->funcs->pRealizeDefaultPalette) dc->funcs->pRealizeDefaultPalette( dc->physDev, GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC ) );
     SetTextColor( dc->hSelf, dc->textColor );
     SetBkColor( dc->hSelf, dc->backgroundColor );
     SelectObject( dc->hSelf, dc->hPen );
diff -u dlls/gdi/dib.c dlls/gdi/dib.c
--- dlls/gdi/dib.c	2004-11-24 22:05:10.000000000 +0100
+++ dlls/gdi/dib.c	2004-12-31 18:50:23.000000000 +0100
@@ -325,7 +325,7 @@
     if (!bitmap->funcs && !BITMAP_SetOwnerDC( hbitmap, dc )) goto done;
 
     if (bitmap->funcs && bitmap->funcs->pSetDIBits)
-        result = bitmap->funcs->pSetDIBits( dc->physDev, hbitmap, startscan, lines,
+        result = bitmap->funcs->pSetDIBits( dc->physDev, bitmap, startscan, lines,
                                             bits, info, coloruse );
     else
         result = lines;
@@ -370,11 +370,18 @@
 {
     DC * dc;
     UINT result = 0;
+    BITMAPOBJ * bmp;
 
     if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
 
     if (dc->funcs->pSetDIBColorTable)
-        result = dc->funcs->pSetDIBColorTable(dc->physDev, startpos, entries, colors);
+    {
+       HBITMAP hBitmap = GetCurrentObject( hdc, OBJ_BITMAP );
+
+       if ( (bmp = (BITMAPOBJ*)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC )) ) {
+       result = dc->funcs->pSetDIBColorTable( dc->physDev, startpos, entries, colors, bmp);
+       GDI_ReleaseObj( hBitmap ); }
+    }
 
     GDI_ReleaseObj( hdc );
     return result;
@@ -388,11 +395,18 @@
 {
     DC * dc;
     UINT result = 0;
+    BITMAPOBJ * bmp;
 
     if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
 
     if (dc->funcs->pGetDIBColorTable)
-        result = dc->funcs->pGetDIBColorTable(dc->physDev, startpos, entries, colors);
+    {
+       HBITMAP hBitmap = GetCurrentObject( hdc, OBJ_BITMAP );
+
+       if ( (bmp = (BITMAPOBJ*)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC )) ) {
+        result = dc->funcs->pGetDIBColorTable( dc->physDev, startpos, entries, colors, bmp);
+       GDI_ReleaseObj( hBitmap ); }
+    }
 
     GDI_ReleaseObj( hdc );
     return result;
@@ -917,7 +931,7 @@
             else
             {
                 if (bmp->funcs && bmp->funcs->pGetDIBits)
-                    lines = bmp->funcs->pGetDIBits( dc->physDev, hbitmap, startscan,
+                    lines = bmp->funcs->pGetDIBits( dc->physDev, bmp, startscan,
                                                     lines, bits, info, coloruse );
                 else
                     lines = 0;  /* FIXME: should copy from bmp->bitmap.bmBits */
diff -u dlls/gdi/gdi_private.h dlls/gdi/gdi_private.h
--- dlls/gdi/gdi_private.h	2005-01-05 18:49:26.965539272 +0100
+++ dlls/gdi/gdi_private.h	2005-01-05 18:48:11.244050688 +0100
@@ -57,14 +57,14 @@
     BOOL     (*pArc)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pArcTo)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pBeginPath)(PHYSDEV);
-    BOOL     (*pBitBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,DWORD);
+    BOOL     (*pBitBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,DWORD,BITMAPOBJ*,BITMAPOBJ*);
     INT      (*pChoosePixelFormat)(PHYSDEV,const PIXELFORMATDESCRIPTOR *);
     BOOL     (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pCloseFigure)(PHYSDEV);
-    BOOL     (*pCreateBitmap)(PHYSDEV,HBITMAP);
+    BOOL     (*pCreateBitmap)(PHYSDEV,HBITMAP,BITMAPOBJ*);
     BOOL     (*pCreateDC)(HDC,PHYSDEV *,LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*);
     HBITMAP  (*pCreateDIBSection)(PHYSDEV,const BITMAPINFO *,UINT,VOID **,HANDLE,DWORD,DWORD);
-    BOOL     (*pDeleteBitmap)(HBITMAP);
+    BOOL     (*pDeleteBitmap)(BITMAPOBJ*);
     BOOL     (*pDeleteDC)(PHYSDEV);
     BOOL     (*pDeleteObject)(PHYSDEV,HGDIOBJ);
     INT      (*pDescribePixelFormat)(PHYSDEV,INT,UINT,PIXELFORMATDESCRIPTOR *);
@@ -85,11 +85,11 @@
     BOOL     (*pFlattenPath)(PHYSDEV);
     BOOL     (*pFrameRgn)(PHYSDEV,HRGN,HBRUSH,INT,INT);
     BOOL     (*pGdiComment)(PHYSDEV,UINT,CONST BYTE*);
-    LONG     (*pGetBitmapBits)(HBITMAP,void*,LONG);
+    LONG     (*pGetBitmapBits)(BITMAPOBJ*,void*,LONG);
     BOOL     (*pGetCharWidth)(PHYSDEV,UINT,UINT,LPINT);
     BOOL     (*pGetDCOrgEx)(PHYSDEV,LPPOINT);
-    UINT     (*pGetDIBColorTable)(PHYSDEV,UINT,UINT,RGBQUAD*);
-    INT      (*pGetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPVOID,BITMAPINFO*,UINT);
+    UINT     (*pGetDIBColorTable)(PHYSDEV,UINT,UINT,RGBQUAD*,BITMAPOBJ*);
+    INT      (*pGetDIBits)(PHYSDEV,BITMAPOBJ*,UINT,UINT,LPVOID,BITMAPINFO*,UINT);
     INT      (*pGetDeviceCaps)(PHYSDEV,INT);
     BOOL     (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID);
     COLORREF (*pGetNearestColor)(PHYSDEV,COLORREF);
@@ -107,7 +107,7 @@
     INT      (*pOffsetViewportOrg)(PHYSDEV,INT,INT);
     INT      (*pOffsetWindowOrg)(PHYSDEV,INT,INT);
     BOOL     (*pPaintRgn)(PHYSDEV,HRGN);
-    BOOL     (*pPatBlt)(PHYSDEV,INT,INT,INT,INT,DWORD);
+    BOOL     (*pPatBlt)(PHYSDEV,INT,INT,INT,INT,DWORD,BITMAPOBJ*);
     BOOL     (*pPie)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pPolyBezier)(PHYSDEV,const POINT*,DWORD);
     BOOL     (*pPolyBezierTo)(PHYSDEV,const POINT*,DWORD);
@@ -117,8 +117,8 @@
     BOOL     (*pPolygon)(PHYSDEV,const POINT*,INT);
     BOOL     (*pPolyline)(PHYSDEV,const POINT*,INT);
     BOOL     (*pPolylineTo)(PHYSDEV,const POINT*,INT);
-    UINT     (*pRealizeDefaultPalette)(PHYSDEV);
-    UINT     (*pRealizePalette)(PHYSDEV,HPALETTE,BOOL);
+    UINT     (*pRealizeDefaultPalette)(PHYSDEV,PALETTEOBJ*);
+    UINT     (*pRealizePalette)(PHYSDEV,PALETTEOBJ*,BOOL);
     BOOL     (*pRectangle)(PHYSDEV,INT,INT,INT,INT);
     HDC      (*pResetDC)(PHYSDEV,const DEVMODEW*);
     BOOL     (*pRestoreDC)(PHYSDEV,INT);
@@ -126,21 +126,21 @@
     INT      (*pSaveDC)(PHYSDEV);
     INT      (*pScaleViewportExt)(PHYSDEV,INT,INT,INT,INT);
     INT      (*pScaleWindowExt)(PHYSDEV,INT,INT,INT,INT);
-    HBITMAP  (*pSelectBitmap)(PHYSDEV,HBITMAP);
+    HBITMAP  (*pSelectBitmap)(PHYSDEV,HBITMAP,BITMAPOBJ*);
     HBRUSH   (*pSelectBrush)(PHYSDEV,HBRUSH);
     BOOL     (*pSelectClipPath)(PHYSDEV,INT);
     HFONT    (*pSelectFont)(PHYSDEV,HFONT,HANDLE);
     HPALETTE (*pSelectPalette)(PHYSDEV,HPALETTE,BOOL);
     HPEN     (*pSelectPen)(PHYSDEV,HPEN);
     INT      (*pSetArcDirection)(PHYSDEV,INT);
-    LONG     (*pSetBitmapBits)(HBITMAP,const void*,LONG);
+    LONG     (*pSetBitmapBits)(BITMAPOBJ*,const void*,LONG);
     COLORREF (*pSetBkColor)(PHYSDEV,COLORREF);
     INT      (*pSetBkMode)(PHYSDEV,INT);
     COLORREF (*pSetDCBrushColor)(PHYSDEV, COLORREF);
     DWORD    (*pSetDCOrg)(PHYSDEV,INT,INT);
     COLORREF (*pSetDCPenColor)(PHYSDEV, COLORREF);
-    UINT     (*pSetDIBColorTable)(PHYSDEV,UINT,UINT,const RGBQUAD*);
-    INT      (*pSetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT);
+    UINT     (*pSetDIBColorTable)(PHYSDEV,UINT,UINT,const RGBQUAD*,BITMAPOBJ*);
+    INT      (*pSetDIBits)(PHYSDEV,BITMAPOBJ*,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT);
     INT      (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,
                                    const BITMAPINFO*,UINT);
     VOID     (*pSetDeviceClipping)(PHYSDEV,HRGN,HRGN);
@@ -164,7 +164,7 @@
     BOOL     (*pSetWorldTransform)(PHYSDEV,const XFORM*);
     INT      (*pStartDoc)(PHYSDEV,const DOCINFOW*);
     INT      (*pStartPage)(PHYSDEV);
-    BOOL     (*pStretchBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,INT,INT,DWORD);
+    BOOL     (*pStretchBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,INT,INT,DWORD,BITMAPOBJ*,BITMAPOBJ*);
     INT      (*pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void *,
                                const BITMAPINFO*,UINT,DWORD);
     BOOL     (*pStrokeAndFillPath)(PHYSDEV);
diff -u dlls/gdi/palette.c dlls/gdi/palette.c
--- dlls/gdi/palette.c	2005-01-03 18:51:32.000000000 +0100
+++ dlls/gdi/palette.c	2005-01-05 18:48:00.000759928 +0100
@@ -763,26 +763,30 @@
 {
     UINT realized = 0;
     DC* dc = DC_GetDCPtr( hdc );
+    PALETTEOBJ *palPtr;
 
     if (!dc) return 0;
 
     TRACE("%p...\n", hdc );
 
+    if (!(palPtr = GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC ))) return 0;
+
     if( dc->hPalette == GetStockObject( DEFAULT_PALETTE ))
     {
         if (dc->funcs->pRealizeDefaultPalette)
-            realized = dc->funcs->pRealizeDefaultPalette( dc->physDev );
+            realized = dc->funcs->pRealizeDefaultPalette( dc->physDev, palPtr );
     }
     else if(dc->hPalette != hLastRealizedPalette )
     {
         if (dc->funcs->pRealizePalette)
-            realized = dc->funcs->pRealizePalette( dc->physDev, dc->hPalette,
+            realized = dc->funcs->pRealizePalette( dc->physDev, palPtr,
                                                    (dc->hPalette == hPrimaryPalette) );
         hLastRealizedPalette = dc->hPalette;
         pLastRealizedDC = dc->funcs;
     }
     else TRACE("  skipping (hLastRealizedPalette = %p)\n", hLastRealizedPalette);
 
+    GDI_ReleaseObj( dc->hPalette );
     GDI_ReleaseObj( hdc );
     TRACE("   realized %i colors.\n", realized );
     return realized;
@@ -795,13 +799,19 @@
 UINT16 WINAPI RealizeDefaultPalette16( HDC16 hdc )
 {
     UINT16 ret = 0;
-    DC          *dc;
+    DC *dc;
+    PALETTEOBJ *palPtr;
 
     TRACE("%04x\n", hdc );
 
     if (!(dc = DC_GetDCPtr( HDC_32(hdc) ))) return 0;
+    
+    if (!(palPtr = GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC ))) return 0;
 
-    if (dc->funcs->pRealizeDefaultPalette) ret = dc->funcs->pRealizeDefaultPalette( dc->physDev );
+    if (dc->funcs->pRealizeDefaultPalette) 
+        ret = dc->funcs->pRealizeDefaultPalette( dc->physDev, palPtr );
+	
+    GDI_ReleaseObj( dc->hPalette );
     GDI_ReleaseObj( HDC_32(hdc) );
     return ret;
 }
diff -u dlls/gdi/enhmfdrv/bitblt.c dlls/gdi/enhmfdrv/bitblt.c
--- dlls/gdi/enhmfdrv/bitblt.c	2004-03-11 01:37:46.000000000 +0100
+++ dlls/gdi/enhmfdrv/bitblt.c	2005-01-02 14:29:29.000000000 +0100
@@ -31,7 +31,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
 
 BOOL EMFDRV_PatBlt( PHYSDEV dev, INT left, INT top,
-                    INT width, INT height, DWORD rop )
+                    INT width, INT height, DWORD rop, BITMAPOBJ *bmp )
 {
     EMRBITBLT emr;
     BOOL ret;
@@ -177,7 +177,8 @@
 
 BOOL EMFDRV_BitBlt( 
     PHYSDEV devDst, INT xDst, INT yDst, INT width, INT height,
-    PHYSDEV devSrc, INT xSrc, INT ySrc, DWORD rop)
+    PHYSDEV devSrc, INT xSrc, INT ySrc, DWORD rop, 
+    BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     return EMFDRV_BitBlockTransfer( devDst, xDst, yDst, width, height,  
                                     devSrc, xSrc, ySrc, width, height, 
@@ -186,7 +187,8 @@
 
 BOOL EMFDRV_StretchBlt( 
     PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, INT heightDst,  
-    PHYSDEV devSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop )
+    PHYSDEV devSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop,
+    BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     return EMFDRV_BitBlockTransfer( devDst, xDst, yDst, widthDst, heightDst,  
                                     devSrc, xSrc, ySrc, widthSrc, heightSrc, 
diff -u dlls/gdi/enhmfdrv/enhmetafiledrv.h dlls/gdi/enhmfdrv/enhmetafiledrv.h
--- dlls/gdi/enhmfdrv/enhmetafiledrv.h	2004-03-04 21:41:13.000000000 +0100
+++ dlls/gdi/enhmfdrv/enhmetafiledrv.h	2005-01-02 14:26:01.000000000 +0100
@@ -64,7 +64,7 @@
 extern BOOL     EMFDRV_BeginPath( PHYSDEV dev );
 extern BOOL     EMFDRV_BitBlt( PHYSDEV devDst, INT xDst, INT yDst,
                                INT width, INT height, PHYSDEV devSrc,
-                               INT xSrc, INT ySrc, DWORD rop );
+                               INT xSrc, INT ySrc, DWORD rop, BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc );
 extern BOOL     EMFDRV_Chord( PHYSDEV dev, INT left, INT top, INT right,
                               INT bottom, INT xstart, INT ystart, INT xend,
                               INT yend );
@@ -97,7 +97,7 @@
 extern INT      EMFDRV_OffsetWindowOrg( PHYSDEV dev, INT x, INT y );
 extern BOOL     EMFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn );
 extern BOOL     EMFDRV_PatBlt( PHYSDEV dev, INT left, INT top,
-                               INT width, INT height, DWORD rop );
+                               INT width, INT height, DWORD rop, BITMAPOBJ *bmp );
 extern BOOL     EMFDRV_Pie( PHYSDEV dev, INT left, INT top, INT right,
                             INT bottom, INT xstart, INT ystart, INT xend,
                             INT yend );
@@ -118,7 +118,7 @@
                                          INT xDenom, INT yNum, INT yDenom );
 extern INT      EMFDRV_ScaleWindowExt( PHYSDEV dev, INT xNum, INT xDenom,
                                        INT yNum, INT yDenom );
-extern HBITMAP  EMFDRV_SelectBitmap( PHYSDEV dev, HBITMAP handle );
+extern HBITMAP  EMFDRV_SelectBitmap( PHYSDEV dev, HBITMAP handle, BITMAPOBJ *bmp );
 extern HBRUSH   EMFDRV_SelectBrush( PHYSDEV dev, HBRUSH handle );
 extern BOOL     EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode );
 extern HFONT    EMFDRV_SelectFont( PHYSDEV dev, HFONT handle, HANDLE gdiFont );
@@ -149,7 +149,8 @@
 extern BOOL     EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst,
                                    INT widthDst, INT heightDst,
                                    PHYSDEV devSrc, INT xSrc, INT ySrc,
-                                   INT widthSrc, INT heightSrc, DWORD rop );
+                                   INT widthSrc, INT heightSrc, DWORD rop,
+                                   BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc );
 extern INT      EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst,
                                       INT heightDst, INT xSrc, INT ySrc,
                                       INT widthSrc, INT heightSrc,
diff -u dlls/gdi/enhmfdrv/objects.c dlls/gdi/enhmfdrv/objects.c
--- dlls/gdi/enhmfdrv/objects.c	2004-12-21 15:55:01.000000000 +0100
+++ dlls/gdi/enhmfdrv/objects.c	2004-12-30 14:26:33.000000000 +0100
@@ -100,7 +100,7 @@
 /***********************************************************************
  *           EMFDRV_SelectBitmap
  */
-HBITMAP EMFDRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap )
+HBITMAP EMFDRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap, BITMAPOBJ *bmp )
 {
     return 0;
 }
diff -u dlls/gdi/mfdrv/bitblt.c dlls/gdi/mfdrv/bitblt.c
--- dlls/gdi/mfdrv/bitblt.c	2004-11-24 22:05:10.000000000 +0100
+++ dlls/gdi/mfdrv/bitblt.c	2005-01-02 14:34:16.000000000 +0100
@@ -29,7 +29,7 @@
 /***********************************************************************
  *           MFDRV_PatBlt
  */
-BOOL MFDRV_PatBlt( PHYSDEV dev, INT left, INT top, INT width, INT height, DWORD rop )
+BOOL MFDRV_PatBlt( PHYSDEV dev, INT left, INT top, INT width, INT height, DWORD rop, BITMAPOBJ *bmp )
 {
     MFDRV_MetaParam6( dev, META_PATBLT, left, top, width, height, HIWORD(rop), LOWORD(rop) );
     return TRUE;
@@ -40,10 +40,10 @@
  *           MFDRV_BitBlt
  */
 BOOL MFDRV_BitBlt( PHYSDEV devDst, INT xDst, INT yDst, INT width, INT height,
-		   PHYSDEV devSrc, INT xSrc, INT ySrc, DWORD rop )
+		   PHYSDEV devSrc, INT xSrc, INT ySrc, DWORD rop, BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     return MFDRV_StretchBlt(devDst, xDst, yDst, width, height, devSrc,
-                            xSrc, ySrc, width, height, rop);
+                            xSrc, ySrc, width, height, rop, bmpDst, bmpSrc);
 }
 
 
@@ -58,7 +58,7 @@
 
 BOOL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
 		       INT heightDst, PHYSDEV devSrc, INT xSrc, INT ySrc,
-		       INT widthSrc, INT heightSrc, DWORD rop )
+		       INT widthSrc, INT heightSrc, DWORD rop, BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     BOOL ret;
     DWORD len;

diff -u dlls/gdi/mfdrv/metafiledrv.h dlls/gdi/mfdrv/metafiledrv.h
--- dlls/gdi/mfdrv/metafiledrv.h	2004-03-04 21:41:13.000000000 +0100
+++ dlls/gdi/mfdrv/metafiledrv.h	2005-01-02 14:27:05.000000000 +0100
@@ -67,7 +67,7 @@
 extern BOOL MFDRV_BeginPath( PHYSDEV dev );
 extern BOOL MFDRV_BitBlt( PHYSDEV devDst, INT xDst, INT yDst,  INT width,
                           INT height, PHYSDEV devSrc, INT xSrc, INT ySrc,
-                          DWORD rop );
+                          DWORD rop, BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc );
 extern BOOL MFDRV_Chord( PHYSDEV dev, INT left, INT top, INT right,
                          INT bottom, INT xstart, INT ystart, INT xend,
                          INT yend );
@@ -100,7 +100,7 @@
 extern INT  MFDRV_OffsetWindowOrg( PHYSDEV dev, INT x, INT y );
 extern BOOL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn );
 extern BOOL MFDRV_PatBlt( PHYSDEV dev, INT left, INT top, INT width, INT height,
-                          DWORD rop );
+                          DWORD rop, BITMAPOBJ *bmp );
 extern BOOL MFDRV_Pie( PHYSDEV dev, INT left, INT top, INT right,
                        INT bottom, INT xstart, INT ystart, INT xend,
                        INT yend );
@@ -121,13 +121,13 @@
 				   INT yDenom );
 extern INT MFDRV_ScaleWindowExt( PHYSDEV dev, INT xNum, INT xDenom, INT yNum,
 				 INT yDenom );
-extern HBITMAP MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP handle );
+extern HBITMAP MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP handle, BITMAPOBJ *bmp );
 extern HBRUSH MFDRV_SelectBrush( PHYSDEV dev, HBRUSH handle );
 extern BOOL MFDRV_SelectClipPath( PHYSDEV dev, INT iMode );
 extern HFONT MFDRV_SelectFont( PHYSDEV dev, HFONT handle, HANDLE gdiFont );
 extern HPEN MFDRV_SelectPen( PHYSDEV dev, HPEN handle );
 extern HPALETTE MFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPalette, BOOL bForceBackground);
-extern UINT MFDRV_RealizePalette(PHYSDEV dev, HPALETTE hPalette, BOOL primary);
+extern UINT MFDRV_RealizePalette(PHYSDEV dev, PALETTEOBJ *palPtr, BOOL primary);
 extern COLORREF MFDRV_SetBkColor( PHYSDEV dev, COLORREF color );
 extern INT MFDRV_SetBkMode( PHYSDEV dev, INT mode );
 extern INT MFDRV_SetMapMode( PHYSDEV dev, INT mode );
@@ -147,7 +147,8 @@
 extern INT MFDRV_SetWindowOrg( PHYSDEV dev, INT x, INT y );
 extern BOOL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
                               INT heightDst, PHYSDEV devSrc, INT xSrc, INT ySrc,
-                              INT widthSrc, INT heightSrc, DWORD rop );
+                              INT widthSrc, INT heightSrc, DWORD rop,
+                              BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc );
 extern BOOL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn );
 extern INT MFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest, DWORD cx,
                                     DWORD cy, INT xSrc, INT ySrc,

diff -u dlls/gdi/mfdrv/objects.c dlls/gdi/mfdrv/objects.c
--- dlls/gdi/mfdrv/objects.c	2004-11-24 22:05:10.000000000 +0100
+++ dlls/gdi/mfdrv/objects.c	2004-12-30 22:22:29.000000000 +0100
@@ -121,7 +121,7 @@
 /***********************************************************************
  *           MFDRV_SelectBitmap
  */
-HBITMAP MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap )
+HBITMAP MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap, BITMAPOBJ *bmp )
 {
     return 0;
 }
@@ -406,7 +406,7 @@
 /***********************************************************************
  *           MFDRV_RealizePalette
  */
-UINT MFDRV_RealizePalette(PHYSDEV dev, HPALETTE hPalette, BOOL dummy)
+UINT MFDRV_RealizePalette(PHYSDEV dev, PALETTEOBJ *palPtr, BOOL dummy)
 {
     char buffer[sizeof(METARECORD) - sizeof(WORD)];
     METARECORD *mr = (METARECORD *)&buffer;

diff -u dlls/x11drv/bitblt.c dlls/x11drv/bitblt.c
--- dlls/x11drv/bitblt.c	2004-12-24 18:40:06.000000000 +0100
+++ dlls/x11drv/bitblt.c	2005-01-04 19:20:11.000000000 +0100
@@ -28,6 +28,7 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "gdi.h"
 #include "wingdi.h"
 #include "winreg.h"
 #include "winuser.h"
@@ -1550,13 +1551,13 @@
 /***********************************************************************
  *           X11DRV_PatBlt
  */
-BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top, INT width, INT height, DWORD rop )
+BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top, INT width, INT height, DWORD rop, BITMAPOBJ *bmp )
 {
     BOOL result;
 
-    X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
+    X11DRV_DIB_Lock( bmp, DIB_Status_GdiMod, FALSE );
     result = BITBLT_InternalStretchBlt( physDev, left, top, width, height, NULL, 0, 0, 0, 0, rop );
-    X11DRV_UnlockDIBSection( physDev, TRUE );
+    X11DRV_DIB_Unlock( bmp, TRUE );
     return result;
 }
 
@@ -1566,7 +1567,7 @@
  */
 BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                     INT width, INT height, X11DRV_PDEVICE *physDevSrc,
-                    INT xSrc, INT ySrc, DWORD rop )
+                    INT xSrc, INT ySrc, DWORD rop, BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     BOOL result = FALSE;
     INT sSrc, sDst;
@@ -1579,9 +1580,9 @@
        * which may avoid a copy in some situations */
     }
 
-    sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None, FALSE );
+    sDst = X11DRV_DIB_Lock( bmpDst, DIB_Status_None, FALSE );
     if (physDevDst != physDevSrc)
-        sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None, FALSE );
+        sSrc = X11DRV_DIB_Lock( bmpSrc, DIB_Status_None, FALSE );
     else
         sSrc = sDst;
 
@@ -1625,24 +1626,24 @@
       if (sDst == DIB_Status_AppMod) {
         FIXME("potential optimization - client-side DIB copy\n");
       }
-      X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod, FALSE );
+      X11DRV_DIB_Coerce( bmpDst, DIB_Status_GdiMod, FALSE );
 
-      X11DRV_DIB_CopyDIBSection( physDevSrc, physDevDst, xSrc, ySrc, xDst, yDst, width, height );
+      X11DRV_DIB_CopyDIBSection( physDevSrc, bmpSrc, physDevDst, xSrc, ySrc, xDst, yDst, width, height );
       result = TRUE;
       goto END;
     }
 
-    X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod, FALSE );
+    X11DRV_DIB_Coerce( bmpDst, DIB_Status_GdiMod, FALSE );
     if (physDevDst != physDevSrc)
-      X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE );
+      X11DRV_DIB_Coerce( bmpSrc, DIB_Status_GdiMod, FALSE );
 
     result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, width, height,
                                         physDevSrc, xSrc, ySrc, width, height, rop );
 
 END:
     if (physDevDst != physDevSrc)
-      X11DRV_UnlockDIBSection( physDevSrc, FALSE );
-    X11DRV_UnlockDIBSection( physDevDst, TRUE );
+      X11DRV_DIB_Unlock( bmpSrc, FALSE );
+    X11DRV_DIB_Unlock( bmpDst, TRUE );
 
     return result;
 }
@@ -1654,19 +1655,20 @@
 BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                         INT widthDst, INT heightDst,
                         X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
-                        INT widthSrc, INT heightSrc, DWORD rop )
+                        INT widthSrc, INT heightSrc, DWORD rop,
+                        BITMAPOBJ *bmpDst, BITMAPOBJ *bmpSrc )
 {
     BOOL result;
 
-    X11DRV_LockDIBSection( physDevDst, DIB_Status_GdiMod, FALSE );
+    X11DRV_DIB_Lock( bmpDst, DIB_Status_GdiMod, FALSE );
     if (physDevDst != physDevSrc)
-      X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE );
+      X11DRV_DIB_Lock( bmpSrc, DIB_Status_GdiMod, FALSE );
 
     result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, widthDst, heightDst,
                                         physDevSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
 
     if (physDevDst != physDevSrc)
-      X11DRV_UnlockDIBSection( physDevSrc, FALSE );
-    X11DRV_UnlockDIBSection( physDevDst, TRUE );
+      X11DRV_DIB_Unlock( bmpSrc, FALSE );
+    X11DRV_DIB_Unlock( bmpDst, TRUE );
     return result;
 }
diff -u dlls/x11drv/bitmap.c dlls/x11drv/bitmap.c
--- dlls/x11drv/bitmap.c	2004-07-13 05:49:52.000000000 +0200
+++ dlls/x11drv/bitmap.c	2004-12-30 16:05:14.000000000 +0100
@@ -67,12 +67,8 @@
 /***********************************************************************
  *           SelectBitmap   (X11DRV.@)
  */
-HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
+HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, BITMAPOBJ *bmp )
 {
-    BITMAPOBJ *bmp;
-
-    if (!(bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
-
     if(physDev->xrender)
         X11DRV_XRender_UpdateDrawable( physDev );
 
@@ -94,7 +90,6 @@
         XFlush( gdi_display );
         wine_tsx11_unlock();
     }
-    GDI_ReleaseObj( hbitmap );
     return hbitmap;
 }
 
@@ -106,32 +101,20 @@
  *
  * Returns TRUE on success else FALSE
  */
-BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
+BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, BITMAPOBJ *bmp )
 {
-    BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
-
-    if(!bmp) {
-        WARN("Bad bitmap handle %p\n", hbitmap);
-	return FALSE;
-    }
-
       /* Check parameters */
-    if (bmp->bitmap.bmPlanes != 1)
-    {
-        GDI_ReleaseObj( hbitmap );
-        return 0;
-    }
-    if ((bmp->bitmap.bmBitsPixel != 1) && (bmp->bitmap.bmBitsPixel != screen_depth))
+    if (bmp->bitmap.bmPlanes != 1) return 0;
+    
+	if ((bmp->bitmap.bmBitsPixel != 1) && (bmp->bitmap.bmBitsPixel != screen_depth))
     {
         ERR("Trying to make bitmap with planes=%d, bpp=%d\n",
 	    bmp->bitmap.bmPlanes, bmp->bitmap.bmBitsPixel);
-        GDI_ReleaseObj( hbitmap );
 	return FALSE;
     }
     if (hbitmap == GetStockObject(DEFAULT_BITMAP))
     {
         ERR( "called for stock bitmap, please report\n" );
-        GDI_ReleaseObj( hbitmap );
         return FALSE;
     }
 
@@ -147,15 +130,13 @@
     if (!bmp->physBitmap)
     {
         WARN("Can't create Pixmap\n");
-	GDI_ReleaseObj( hbitmap );
-	return FALSE;
+        return FALSE;
     }
 
     if (bmp->bitmap.bmBits) /* Set bitmap bits */
-        X11DRV_SetBitmapBits( hbitmap, bmp->bitmap.bmBits,
+        X11DRV_SetBitmapBits( bmp, bmp->bitmap.bmBits,
                               bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes );
 
-    GDI_ReleaseObj( hbitmap );
     return TRUE;
 }
 
@@ -167,9 +148,8 @@
  *    Success: Number of bytes copied
  *    Failure: 0
  */
-LONG X11DRV_GetBitmapBits( HBITMAP hbitmap, void *buffer, LONG count )
+LONG X11DRV_GetBitmapBits( BITMAPOBJ *bmp, void *buffer, LONG count )
 {
-    BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     LONG old_height, height;
     XImage *image;
     LPBYTE tbuf, startline;
@@ -284,7 +264,6 @@
     }
     XDestroyImage( image );
     wine_tsx11_unlock();
-    GDI_ReleaseObj( hbitmap );
     return count;
 }
 
@@ -297,9 +276,8 @@
  *    Success: Number of bytes used in setting the bitmap bits
  *    Failure: 0
  */
-LONG X11DRV_SetBitmapBits( HBITMAP hbitmap, const void *bits, LONG count )
+LONG X11DRV_SetBitmapBits( BITMAPOBJ *bmp, const void *bits, LONG count )
 {
-    BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     LONG height;
     XImage *image;
     const BYTE *sbuf, *startline;
@@ -318,7 +296,6 @@
         WARN("No memory to create image data.\n");
         XDestroyImage( image );
         wine_tsx11_unlock();
-        GDI_ReleaseObj( hbitmap );
         return 0;
     }
 
@@ -407,26 +384,21 @@
                image, 0, 0, 0, 0, bmp->bitmap.bmWidth, height );
     XDestroyImage( image ); /* frees image->data too */
     wine_tsx11_unlock();
-    GDI_ReleaseObj( hbitmap );
     return count;
 }
 
 /***********************************************************************
  *           DeleteBitmap   (X11DRV.@)
  */
-BOOL X11DRV_DeleteBitmap( HBITMAP hbitmap )
+BOOL X11DRV_DeleteBitmap( BITMAPOBJ *bmp )
 {
-    BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
-    if (bmp)
-    {
-        wine_tsx11_lock();
-        if (bmp->physBitmap) XFreePixmap( gdi_display, (Pixmap)bmp->physBitmap );
-        bmp->physBitmap = NULL;
-        wine_tsx11_unlock();
-        if (bmp->dib) X11DRV_DIB_DeleteDIBSection( bmp );
-        GDI_ReleaseObj( hbitmap );
-    }
-    return TRUE;
+    wine_tsx11_lock();
+    if (bmp->physBitmap) XFreePixmap( gdi_display, (Pixmap)bmp->physBitmap );
+    bmp->physBitmap = NULL;
+    wine_tsx11_unlock();
+    if (bmp->dib) X11DRV_DIB_DeleteDIBSection( bmp );
+    
+	return TRUE;
 }
 
 /**************************************************************************
diff -u dlls/x11drv/dib.c dlls/x11drv/dib.c
--- dlls/x11drv/dib.c	2004-12-23 21:44:48.000000000 +0100
+++ dlls/x11drv/dib.c	2005-01-04 19:21:26.000000000 +0100
@@ -3816,11 +3816,10 @@
 /***********************************************************************
  *           SetDIBits   (X11DRV.@)
  */
-INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
+INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, BITMAPOBJ *bmp, UINT startscan,
                       UINT lines, LPCVOID bits, const BITMAPINFO *info, UINT coloruse )
 {
   X11DRV_DIB_IMAGEBITS_DESCR descr;
-  BITMAPOBJ *bmp;
   LONG height, tmpheight;
   INT result;
   void* colorPtr;
@@ -3836,8 +3835,6 @@
   if (!lines || (startscan >= height))
       return 0;
 
-  if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
-
   if (startscan + lines > height) lines = height - startscan;
 
   colorPtr = (LPBYTE) info + (WORD) info->bmiHeader.biSize;
@@ -3852,10 +3849,7 @@
                                                           bmp->bitmap.bmBitsPixel,
                                                           info, &descr.nColorMap );
                if (!descr.colorMap)
-               {
-                   GDI_ReleaseObj( hbitmap );
                    return 0;
-               }
                descr.rMask = descr.gMask = descr.bMask = 0;
                break;
        case 15:
@@ -3898,20 +3892,18 @@
 
   HeapFree(GetProcessHeap(), 0, descr.colorMap);
 
-  GDI_ReleaseObj( hbitmap );
   return result;
 }
 
 /***********************************************************************
  *           GetDIBits   (X11DRV.@)
  */
-INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan, UINT lines,
+INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, BITMAPOBJ *bmp, UINT startscan, UINT lines,
                       LPVOID bits, BITMAPINFO *info, UINT coloruse )
 {
   X11DRV_DIBSECTION *dib;
   X11DRV_DIB_IMAGEBITS_DESCR descr;
   PALETTEENTRY palette[256];
-  BITMAPOBJ *bmp;
   int height;
   LONG tempHeight;
   int bitmap_type;
@@ -3920,8 +3912,6 @@
 
   GetPaletteEntries( GetCurrentObject( physDev->hdc, OBJ_PAL ), 0, 256, palette );
 
-  if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
-
   dib = (X11DRV_DIBSECTION *) bmp->dib;
   
   bitmap_type = DIB_GetBitmapInfo( (BITMAPINFOHEADER*) info, &descr.infoWidth, &tempHeight, &descr.infoBpp, &descr.compression);
@@ -3929,8 +3919,7 @@
   if (bitmap_type == -1)
   {
       ERR("Invalid bitmap\n");
-      lines = 0;
-      goto done;
+      return 0;
   }
   core_header = (bitmap_type == 0);
   colorPtr = (LPBYTE) info + (WORD) info->bmiHeader.biSize;
@@ -3953,10 +3942,7 @@
   if( descr.lines < 0 && lines > 0) lines = -lines;
 
   if( startscan >= bmp->bitmap.bmHeight )
-  {
-      lines = 0;
-      goto done;
-  }
+      return 0;
 
   descr.colorMap = NULL;
 
@@ -4052,8 +4038,7 @@
 
   if(descr.colorMap && descr.colorMap != colorPtr)
       HeapFree(GetProcessHeap(), 0, descr.colorMap);
-done:
-  GDI_ReleaseObj( hbitmap );
+
   return lines;
 }
 
@@ -4082,7 +4067,7 @@
 }
 
 /***********************************************************************
- *           X11DRV_DIB_DoUpdateDIBSection
+ *           X11DRV_DIB_DoCopyDIBSection
  */
 static void X11DRV_DIB_DoCopyDIBSection(BITMAPOBJ *bmp, BOOL toDIB,
 					void *colorMap, int nColorMap,
@@ -4165,68 +4150,58 @@
 /***********************************************************************
  *           X11DRV_DIB_CopyDIBSection
  */
-void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
-                               DWORD xSrc, DWORD ySrc, DWORD xDest, DWORD yDest,
-                               DWORD width, DWORD height)
+void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, BITMAPOBJ *bmpSrc,
+                               X11DRV_PDEVICE *physDevDst, DWORD xSrc, DWORD ySrc,
+                               DWORD xDest, DWORD yDest, DWORD width, DWORD height)
 {
-  BITMAPOBJ *bmp;
-  HBITMAP hBitmap;
   int nColorMap = 0, *colorMap = NULL, aColorMap = FALSE;
 
   TRACE("(%p,%p,%ld,%ld,%ld,%ld,%ld,%ld)\n", physDevSrc->hdc, physDevDst->hdc,
     xSrc, ySrc, xDest, yDest, width, height);
   /* this function is meant as an optimization for BitBlt,
    * not to be called otherwise */
-  if (GetObjectType( physDevSrc->hdc ) != OBJ_MEMDC) {
-    ERR("called for non-memory source DC!?\n");
-    return;
-  }
 
-  hBitmap = GetCurrentObject( physDevSrc->hdc, OBJ_BITMAP );
-  bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC );
-  if (!(bmp && bmp->dib)) {
+  if (!(bmpSrc && bmpSrc->dib)) {
     ERR("called for non-DIBSection!?\n");
-    GDI_ReleaseObj( hBitmap );
     return;
   }
   /* while BitBlt should already have made sure we only get
    * positive values, we should check for oversize values */
-  if ((xSrc < bmp->bitmap.bmWidth) &&
-      (ySrc < bmp->bitmap.bmHeight)) {
-    if (xSrc + width > bmp->bitmap.bmWidth)
-      width = bmp->bitmap.bmWidth - xSrc;
-    if (ySrc + height > bmp->bitmap.bmHeight)
-      height = bmp->bitmap.bmHeight - ySrc;
+  if ((xSrc < bmpSrc->bitmap.bmWidth) &&
+      (ySrc < bmpSrc->bitmap.bmHeight)) {
+    if (xSrc + width > bmpSrc->bitmap.bmWidth)
+      width = bmpSrc->bitmap.bmWidth - xSrc;
+    if (ySrc + height > bmpSrc->bitmap.bmHeight)
+      height = bmpSrc->bitmap.bmHeight - ySrc;
     /* if the source bitmap is 8bpp or less, we're supposed to use the
      * DC's palette for color conversion (not the DIB color table) */
-    if (bmp->dib->dsBm.bmBitsPixel <= 8) {
-      X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
+    if (bmpSrc->dib->dsBm.bmBitsPixel <= 8) {
+      X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmpSrc->dib;
       HPALETTE hPalette = GetCurrentObject( physDevSrc->hdc, OBJ_PAL );
       if (!hPalette || (hPalette == GetStockObject(DEFAULT_PALETTE))) {
-	/* HACK: no palette has been set in the source DC,
-	 * use the DIB colormap instead - this is necessary in some
-	 * cases since we need to do depth conversion in some places
-	 * where real Windows can just copy data straight over */
-	colorMap = dib->colorMap;
-	nColorMap = dib->nColorMap;
+        /* HACK: no palette has been set in the source DC,
+         * use the DIB colormap instead - this is necessary in some
+         * cases since we need to do depth conversion in some places
+         * where real Windows can just copy data straight over */
+        colorMap = dib->colorMap;
+        nColorMap = dib->nColorMap;
       } else {
-	colorMap = X11DRV_DIB_BuildColorMap( physDevSrc, (WORD)-1,
-					     bmp->dib->dsBm.bmBitsPixel,
-					     (BITMAPINFO*)&(bmp->dib->dsBmih),
-					     &nColorMap );
-	if (colorMap) aColorMap = TRUE;
+        colorMap = X11DRV_DIB_BuildColorMap( physDevSrc, (WORD)-1,
+                                             bmpSrc->dib->dsBm.bmBitsPixel,
+                                             (BITMAPINFO*)&(bmpSrc->dib->dsBmih),
+                                             &nColorMap );
+        if (colorMap) aColorMap = TRUE;
       }
     }
     /* perform the copy */
-    X11DRV_DIB_DoCopyDIBSection(bmp, FALSE, colorMap, nColorMap,
-				physDevDst->drawable, xSrc, ySrc,
+    X11DRV_DIB_DoCopyDIBSection(bmpSrc, FALSE, colorMap, nColorMap,
+                                physDevDst->drawable, xSrc, ySrc,
                                 physDevDst->org.x + xDest, physDevDst->org.y + yDest,
-				width, height);
+                                width, height);
     /* free color mapping */
     if (aColorMap)
       HeapFree(GetProcessHeap(), 0, colorMap);
   }
-  GDI_ReleaseObj( hBitmap );
 }
 
 /***********************************************************************
@@ -4534,27 +4509,16 @@
 }
 
 /***********************************************************************
- *           X11DRV_CoerceDIBSection2
+ *           X11DRV_LockDIBSection
  */
-INT X11DRV_CoerceDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
+INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
 {
-  BITMAPOBJ *bmp;
-  INT ret;
-
-  bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
-  if (!bmp) return DIB_Status_None;
-  ret = X11DRV_DIB_Coerce(bmp, req, lossy);
-  GDI_ReleaseObj( hBmp );
-  return ret;
-}
+  if (!physDev) return DIB_Status_None;
+  if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return DIB_Status_None;
 
-/***********************************************************************
- *           X11DRV_LockDIBSection2
- */
-INT X11DRV_LockDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
-{
   BITMAPOBJ *bmp;
   INT ret;
+  HBITMAP hBmp = GetCurrentObject( physDev->hdc, OBJ_BITMAP );
 
   bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
   if (!bmp) return DIB_Status_None;
@@ -4564,11 +4528,15 @@
 }
 
 /***********************************************************************
- *           X11DRV_UnlockDIBSection2
+ *           X11DRV_UnlockDIBSection
  */
-void X11DRV_UnlockDIBSection2(HBITMAP hBmp, BOOL commit)
+void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev, BOOL commit)
 {
+  if (!physDev) return;
+  if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return;
+
   BITMAPOBJ *bmp;
+  HBITMAP hBmp = GetCurrentObject( physDev->hdc, OBJ_BITMAP );
 
   bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
   if (!bmp) return;
@@ -4576,37 +4544,6 @@
   GDI_ReleaseObj( hBmp );
 }
 
-/***********************************************************************
- *           X11DRV_CoerceDIBSection
- */
-INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
-{
-  if (!physDev) return DIB_Status_None;
-  return X11DRV_CoerceDIBSection2( GetCurrentObject( physDev->hdc, OBJ_BITMAP ), req, lossy );
-}
-
-/***********************************************************************
- *           X11DRV_LockDIBSection
- */
-INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
-{
-  if (!physDev) return DIB_Status_None;
-  if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return DIB_Status_None;
-
-  return X11DRV_LockDIBSection2( GetCurrentObject( physDev->hdc, OBJ_BITMAP ), req, lossy );
-}
-
-/***********************************************************************
- *           X11DRV_UnlockDIBSection
- */
-void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev, BOOL commit)
-{
-  if (!physDev) return;
-  if (GetObjectType( physDev->hdc ) != OBJ_MEMDC) return;
-
-  X11DRV_UnlockDIBSection2( GetCurrentObject( physDev->hdc, OBJ_BITMAP ), commit );
-}
-
 
 #ifdef HAVE_LIBXXSHM
 /***********************************************************************
@@ -4664,7 +4601,7 @@
 
 
 /***********************************************************************
- *           X11DRV_DIB_CreateDIBSection
+ *           CreateDIBSection
  */
 HBITMAP X11DRV_DIB_CreateDIBSection(
   X11DRV_PDEVICE *physDev, const BITMAPINFO *bmi, UINT usage,
@@ -4910,14 +4847,11 @@
 /***********************************************************************
  *           SetDIBColorTable   (X11DRV.@)
  */
-UINT X11DRV_SetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, const RGBQUAD *colors )
+UINT X11DRV_SetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, const RGBQUAD *colors, BITMAPOBJ *bmp )
 {
-    BITMAPOBJ * bmp;
     X11DRV_DIBSECTION *dib;
     UINT ret = 0;
-    HBITMAP hBitmap = GetCurrentObject( physDev->hdc, OBJ_BITMAP );
 
-    if (!(bmp = (BITMAPOBJ*)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC ))) return 0;
     dib = (X11DRV_DIBSECTION *) bmp->dib;
 
     if (dib && dib->colorMap && start < dib->nColorMap) {
@@ -4936,21 +4870,17 @@
         X11DRV_DIB_Unlock(bmp, TRUE);
         ret = end - start;
     }
-    GDI_ReleaseObj( hBitmap );
     return ret;
 }
 
 /***********************************************************************
  *           GetDIBColorTable   (X11DRV.@)
  */
-UINT X11DRV_GetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, RGBQUAD *colors )
+UINT X11DRV_GetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, RGBQUAD *colors, BITMAPOBJ *bmp )
 {
-    BITMAPOBJ * bmp;
     X11DRV_DIBSECTION *dib;
     UINT ret = 0;
-    HBITMAP hBitmap = GetCurrentObject( physDev->hdc, OBJ_BITMAP );
 
-    if (!(bmp = (BITMAPOBJ*)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC ))) return 0;
     dib = (X11DRV_DIBSECTION *) bmp->dib;
 
     if (dib && dib->colorTable && start < dib->nColorMap) {
@@ -4958,7 +4888,6 @@
         memcpy(colors, dib->colorTable + start, count * sizeof(RGBQUAD));
         ret = count;
     }
-    GDI_ReleaseObj( hBitmap );
     return ret;
 }
 
diff -u dlls/x11drv/palette.c dlls/x11drv/palette.c
--- dlls/x11drv/palette.c	2004-12-23 21:44:48.000000000 +0100
+++ dlls/x11drv/palette.c	2004-12-30 22:14:53.000000000 +0100
@@ -1250,16 +1250,13 @@
 /***********************************************************************
  *              RealizePalette    (X11DRV.@)
  */
-UINT X11DRV_RealizePalette( X11DRV_PDEVICE *physDev, HPALETTE hpal, BOOL primary )
+UINT X11DRV_RealizePalette( X11DRV_PDEVICE *physDev, PALETTEOBJ *palPtr, BOOL primary )
 {
     UINT ret;
-    PALETTEOBJ *palPtr;
 
     if (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) return 0;
 
-    if (!(palPtr = GDI_GetObjPtr( hpal, PALETTE_MAGIC ))) return 0;
     ret = X11DRV_PALETTE_SetMapping( palPtr, 0, palPtr->logpalette.palNumEntries, !primary );
-    GDI_ReleaseObj( hpal );
     return ret;
 }
 
@@ -1267,29 +1264,24 @@
 /***********************************************************************
  *              RealizeDefaultPalette    (X11DRV.@)
  */
-UINT X11DRV_RealizeDefaultPalette( X11DRV_PDEVICE *physDev )
+UINT X11DRV_RealizeDefaultPalette( X11DRV_PDEVICE *physDev, PALETTEOBJ *palPtr )
 {
     UINT ret = 0;
 
     if (palette_size && GetObjectType(physDev->hdc) != OBJ_MEMDC)
     {
-        PALETTEOBJ*  palPtr = GDI_GetObjPtr( GetStockObject(DEFAULT_PALETTE), PALETTE_MAGIC );
-        if (palPtr)
-        {
-            /* lookup is needed to account for SetSystemPaletteUse() stuff */
-            int i, index;
+        /* lookup is needed to account for SetSystemPaletteUse() stuff */
+        int i, index;
 
-            for( i = 0; i < 20; i++ )
+        for( i = 0; i < 20; i++ )
+        {
+            index = X11DRV_PALETTE_LookupSystemXPixel(*(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+            /* mapping is allocated in COLOR_InitPalette() */
+            if( index != palPtr->mapping[i] )
             {
-                index = X11DRV_PALETTE_LookupSystemXPixel(*(COLORREF*)(palPtr->logpalette.palPalEntry + i));
-                /* mapping is allocated in COLOR_InitPalette() */
-                if( index != palPtr->mapping[i] )
-                {
-                    palPtr->mapping[i]=index;
-                    ret++;
-                }
+                palPtr->mapping[i]=index;
+                ret++;
             }
-            GDI_ReleaseObj( GetStockObject(DEFAULT_PALETTE) );
         }
     }
     return ret;
diff -u dlls/x11drv/x11drv.h dlls/x11drv/x11drv.h
--- dlls/x11drv/x11drv.h	2005-01-05 18:49:47.225459296 +0100
+++ dlls/x11drv/x11drv.h	2005-01-05 13:03:54.000000000 +0100
@@ -120,10 +120,11 @@
                                INT widthSrc, INT heightSrc, BLENDFUNCTION blendfn );
 extern BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                              INT width, INT height, X11DRV_PDEVICE *physDevSrc,
-                             INT xSrc, INT ySrc, DWORD rop );
+                             INT xSrc, INT ySrc, DWORD rop, 
+                             struct tagBITMAPOBJ *bmpDst, struct tagBITMAPOBJ *bmpSrc );
 extern BOOL X11DRV_EnumDeviceFonts( X11DRV_PDEVICE *physDev, LPLOGFONTW plf,
                                     FONTENUMPROCW dfeproc, LPARAM lp );
-extern LONG X11DRV_GetBitmapBits( HBITMAP hbitmap, void *bits, LONG count );
+extern LONG X11DRV_GetBitmapBits( struct tagBITMAPOBJ *bmp, void *bits, LONG count );
 extern BOOL X11DRV_GetCharWidth( X11DRV_PDEVICE *physDev, UINT firstChar,
                                    UINT lastChar, LPINT buffer );
 extern BOOL X11DRV_GetDCOrgEx( X11DRV_PDEVICE *physDev, LPPOINT lpp );
@@ -131,11 +132,12 @@
                                          INT count, LPSIZE size );
 extern BOOL X11DRV_GetTextMetrics(X11DRV_PDEVICE *physDev, TEXTMETRICW *metrics);
 extern BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top,
-                             INT width, INT height, DWORD rop );
+                             INT width, INT height, DWORD rop, struct tagBITMAPOBJ *bmp );
 extern BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                                  INT widthDst, INT heightDst,
                                  X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
-                                 INT widthSrc, INT heightSrc, DWORD rop );
+                                 INT widthSrc, INT heightSrc, DWORD rop,
+                                 struct tagBITMAPOBJ *bmpDst, struct tagBITMAPOBJ *bmpSrc );
 extern BOOL X11DRV_LineTo( X11DRV_PDEVICE *physDev, INT x, INT y);
 extern BOOL X11DRV_Arc( X11DRV_PDEVICE *physDev, INT left, INT top, INT right,
 			  INT bottom, INT xstart, INT ystart, INT xend,
@@ -171,7 +173,7 @@
 extern BOOL X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y,
 				 UINT flags, const RECT *lprect,
 				 LPCWSTR str, UINT count, const INT *lpDx, INT breakExtra );
-extern LONG X11DRV_SetBitmapBits( HBITMAP hbitmap, const void *bits, LONG count );
+extern LONG X11DRV_SetBitmapBits( struct tagBITMAPOBJ *bmp, const void *bits, LONG count );
 extern void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev, HRGN vis_rgn, HRGN clip_rgn );
 extern INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest,
 				       INT yDest, DWORD cx, DWORD cy,
@@ -284,12 +286,8 @@
 extern int *X11DRV_DIB_BuildColorMap( X11DRV_PDEVICE *physDev, WORD coloruse,
 				      WORD depth, const BITMAPINFO *info,
 				      int *nColors );
-extern INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
 extern INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
 extern void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev,BOOL);
-extern INT X11DRV_CoerceDIBSection2(HBITMAP bmp,INT,BOOL);
-extern INT X11DRV_LockDIBSection2(HBITMAP bmp,INT,BOOL);
-extern void X11DRV_UnlockDIBSection2(HBITMAP bmp,BOOL);
 
 extern HBITMAP X11DRV_DIB_CreateDIBSection(X11DRV_PDEVICE *physDev, const BITMAPINFO *bmi, UINT usage,
                                            VOID **bits, HANDLE section, DWORD offset, DWORD ovr_pitch);
@@ -297,8 +295,8 @@
 extern INT X11DRV_DIB_Coerce(struct tagBITMAPOBJ *,INT,BOOL);
 extern INT X11DRV_DIB_Lock(struct tagBITMAPOBJ *,INT,BOOL);
 extern void X11DRV_DIB_Unlock(struct tagBITMAPOBJ *,BOOL);
-void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
-                               DWORD xSrc, DWORD ySrc, DWORD xDest, DWORD yDest,
+void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, struct tagBITMAPOBJ *bmpSrc,
+                               X11DRV_PDEVICE *physDevDst, DWORD xSrc, DWORD ySrc, DWORD xDest, DWORD yDest,
                                DWORD width, DWORD height);
 struct _DCICMD;
 extern INT X11DRV_DCICommand(INT cbInput, const struct _DCICMD *lpCmd, LPVOID lpOutData);

Reply via email to