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);
