*/
BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
{
- Pixmap pixmap;
+ X_PHYSBITMAP *physBitmap;
+ BOOL ret = FALSE;
BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if(!bmp) {
}
/* Check parameters */
- if (bmp->bitmap.bmPlanes != 1)
- {
- GDI_ReleaseObj( hbitmap );
- return 0;
- }
+ if (bmp->bitmap.bmPlanes != 1) goto done;
+
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;
+ goto done;
}
if (hbitmap == BITMAP_stock_bitmap)
{
ERR( "called for stock bitmap, please report\n" );
- GDI_ReleaseObj( hbitmap );
- return FALSE;
+ goto done;
}
TRACE("(%p) %dx%d %d bpp\n", hbitmap, bmp->bitmap.bmWidth,
bmp->bitmap.bmHeight, bmp->bitmap.bmBitsPixel);
+ if (!(physBitmap = HeapAlloc( GetProcessHeap(), 0, sizeof(*physBitmap) ))) goto done;
+
/* Create the pixmap */
wine_tsx11_lock();
- pixmap = XCreatePixmap(gdi_display, root_window,
- bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, bmp->bitmap.bmBitsPixel);
+ physBitmap->pixmap = XCreatePixmap(gdi_display, root_window,
+ bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
+ bmp->bitmap.bmBitsPixel);
wine_tsx11_unlock();
- if (!pixmap)
+ if (!physBitmap->pixmap)
{
WARN("Can't create Pixmap\n");
- GDI_ReleaseObj( hbitmap );
- return FALSE;
+ HeapFree( GetProcessHeap(), 0, physBitmap );
+ goto done;
}
- X11DRV_set_pixmap( hbitmap, pixmap );
+ bmp->physBitmap = physBitmap;
+ ret = TRUE;
if (bmp->bitmap.bmBits) /* Set bitmap bits */
X11DRV_SetBitmapBits( hbitmap, bmp->bitmap.bmBits,
bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes );
+done:
GDI_ReleaseObj( hbitmap );
- return TRUE;
+ return ret;
}
BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if (bmp)
{
- Pixmap pixmap;
- if (bmp->dib) X11DRV_DIB_DeleteDIBSection( bmp );
- pixmap = X11DRV_set_pixmap( hbitmap, 0 );
- wine_tsx11_lock();
- if (pixmap) XFreePixmap( gdi_display, pixmap );
- wine_tsx11_unlock();
+ X_PHYSBITMAP *physBitmap = bmp->physBitmap;
+
+ if (physBitmap)
+ {
+ if (bmp->dib) X11DRV_DIB_DeleteDIBSection( physBitmap, bmp );
+ wine_tsx11_lock();
+ if (physBitmap->pixmap) XFreePixmap( gdi_display, physBitmap->pixmap );
+ wine_tsx11_unlock();
+ HeapFree( GetProcessHeap(), 0, physBitmap );
+ bmp->physBitmap = NULL;
+ }
GDI_ReleaseObj( hbitmap );
}
return TRUE;
}
+/***********************************************************************
+ * X11DRV_get_phys_bitmap
+ *
+ * Retrieve the X physical bitmap info.
+ */
+X_PHYSBITMAP *X11DRV_get_phys_bitmap( HBITMAP hbitmap )
+{
+ X_PHYSBITMAP *ret = NULL;
+ BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
+ if (bmp)
+ {
+ ret = bmp->physBitmap;
+ GDI_ReleaseObj( hbitmap );
+ }
+ return ret;
+}
+
+
/***********************************************************************
* X11DRV_set_pixmap
*
Pixmap X11DRV_set_pixmap( HBITMAP hbitmap, Pixmap pixmap )
{
Pixmap ret = 0;
- BITMAPOBJ *bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
- if (bmp)
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
+
+ if (physBitmap)
{
- ret = (Pixmap)bmp->physBitmap;
- bmp->physBitmap = (void *)pixmap;
- GDI_ReleaseObj( hbitmap );
+ ret = physBitmap->pixmap;
+ physBitmap->pixmap = pixmap;
}
return ret;
}
*/
Pixmap X11DRV_get_pixmap( HBITMAP hbitmap )
{
- Pixmap pixmap = 0;
- BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
- if (bmp)
- {
- pixmap = (Pixmap)bmp->physBitmap;
- GDI_ReleaseObj( hbitmap );
- }
- return pixmap;
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
+
+ if (!physBitmap) return 0;
+ return physBitmap->pixmap;
}
};
+static INT X11DRV_DIB_Coerce(X_PHYSBITMAP *,struct tagBITMAPOBJ *,INT,BOOL);
+static INT X11DRV_DIB_Lock(X_PHYSBITMAP *,struct tagBITMAPOBJ *,INT,BOOL);
+static void X11DRV_DIB_Unlock(X_PHYSBITMAP *,struct tagBITMAPOBJ *,BOOL);
+
/*
Some of the following helper functions are duplicated in
dlls/gdi/dib.c
INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
UINT lines, LPCVOID bits, const BITMAPINFO *info, UINT coloruse )
{
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
X11DRV_DIB_IMAGEBITS_DESCR descr;
BITMAPOBJ *bmp;
LONG height, tmpheight;
descr.physDev = physDev;
+ if (!physBitmap) return 0;
+
if (DIB_GetBitmapInfo( &info->bmiHeader, &descr.infoWidth, &height,
&descr.infoBpp, &descr.compression ) == -1)
return 0;
descr.palentry = NULL;
descr.lines = tmpheight >= 0 ? lines : -lines;
descr.depth = bmp->bitmap.bmBitsPixel;
- descr.drawable = X11DRV_get_pixmap( hbitmap );
+ descr.drawable = physBitmap->pixmap;
descr.gc = BITMAP_GC(bmp);
descr.xSrc = 0;
descr.ySrc = 0;
descr.height = lines;
descr.useShm = FALSE;
descr.dibpitch = ((descr.infoWidth * descr.infoBpp + 31) &~31) / 8;
- X11DRV_DIB_Lock(bmp, DIB_Status_GdiMod, FALSE);
+ X11DRV_DIB_Lock( physBitmap, bmp, DIB_Status_GdiMod, FALSE );
result = X11DRV_DIB_SetImageBits( &descr );
- X11DRV_DIB_Unlock(bmp, TRUE);
+ X11DRV_DIB_Unlock( physBitmap, bmp, TRUE );
HeapFree(GetProcessHeap(), 0, descr.colorMap);
INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan, UINT lines,
LPVOID bits, BITMAPINFO *info, UINT coloruse )
{
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
X11DRV_DIBSECTION *dib;
X11DRV_DIB_IMAGEBITS_DESCR descr;
PALETTEENTRY palette[256];
GetPaletteEntries( GetCurrentObject( physDev->hdc, OBJ_PAL ), 0, 256, palette );
+ if (!physBitmap) return 0;
if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
dib = (X11DRV_DIBSECTION *) bmp->dib;
descr.image = NULL;
descr.lines = lines;
descr.depth = bmp->bitmap.bmBitsPixel;
- descr.drawable = X11DRV_get_pixmap( hbitmap );
+ descr.drawable = physBitmap->pixmap;
descr.gc = BITMAP_GC(bmp);
descr.width = bmp->bitmap.bmWidth;
descr.height = bmp->bitmap.bmHeight;
descr.dibpitch = dib ? (dib->dibSection.dsBm.bmWidthBytes)
: (((descr.infoWidth * descr.infoBpp + 31) &~31) / 8);
- X11DRV_DIB_Lock(bmp, DIB_Status_GdiMod, FALSE);
+ X11DRV_DIB_Lock( physBitmap, bmp, DIB_Status_GdiMod, FALSE );
X11DRV_DIB_GetImageBits( &descr );
- X11DRV_DIB_Unlock(bmp, TRUE);
+ X11DRV_DIB_Unlock( physBitmap, bmp, TRUE );
if(!core_header && info->bmiHeader.biSizeImage == 0) /* Fill in biSizeImage */
info->bmiHeader.biSizeImage = X11DRV_DIB_GetDIBImageBytes( descr.infoWidth,
/***********************************************************************
* X11DRV_DIB_DoUpdateDIBSection
*/
-static void X11DRV_DIB_DoUpdateDIBSection(BITMAPOBJ *bmp, BOOL toDIB)
+static void X11DRV_DIB_DoUpdateDIBSection(X_PHYSBITMAP *physBitmap, BITMAPOBJ *bmp, BOOL toDIB)
{
X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
X11DRV_DIB_DoCopyDIBSection(bmp, toDIB, dib->colorMap, dib->nColorMap,
- (Drawable)bmp->physBitmap, 0, 0, 0, 0,
- bmp->bitmap.bmWidth, bmp->bitmap.bmHeight);
+ physBitmap->pixmap, 0, 0, 0, 0,
+ bmp->bitmap.bmWidth, bmp->bitmap.bmHeight);
}
/***********************************************************************
*/
static BOOL X11DRV_DIB_FaultHandler( LPVOID res, LPCVOID addr )
{
+ HBITMAP bitmap = (HBITMAP)res;
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( bitmap );
BITMAPOBJ *bmp;
INT state;
- bmp = (BITMAPOBJ *)GDI_GetObjPtr( (HBITMAP)res, BITMAP_MAGIC );
+ if (!physBitmap) return FALSE;
+ bmp = (BITMAPOBJ *)GDI_GetObjPtr( bitmap, BITMAP_MAGIC );
if (!bmp) return FALSE;
- state = X11DRV_DIB_Lock(bmp, DIB_Status_None, FALSE);
+ state = X11DRV_DIB_Lock( physBitmap, bmp, DIB_Status_None, FALSE );
if (state != DIB_Status_InSync) {
/* no way to tell whether app needs read or write yet,
* try read first */
- X11DRV_DIB_Coerce(bmp, DIB_Status_InSync, FALSE);
+ X11DRV_DIB_Coerce( physBitmap, bmp, DIB_Status_InSync, FALSE );
} else {
/* hm, apparently the app must have write access */
- X11DRV_DIB_Coerce(bmp, DIB_Status_AppMod, FALSE);
+ X11DRV_DIB_Coerce( physBitmap, bmp, DIB_Status_AppMod, FALSE );
}
- X11DRV_DIB_Unlock(bmp, TRUE);
+ X11DRV_DIB_Unlock( physBitmap, bmp, TRUE );
- GDI_ReleaseObj( (HBITMAP)res );
+ GDI_ReleaseObj( bitmap );
return TRUE;
}
/***********************************************************************
* X11DRV_DIB_Coerce
*/
-INT X11DRV_DIB_Coerce(BITMAPOBJ *bmp, INT req, BOOL lossy)
+static INT X11DRV_DIB_Coerce(X_PHYSBITMAP *physBitmap, BITMAPOBJ *bmp, INT req, BOOL lossy)
{
X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
INT ret = DIB_Status_None;
default:
case DIB_Status_None:
dib->p_status = DIB_Status_GdiMod;
- X11DRV_DIB_DoUpdateDIBSection( bmp, FALSE );
+ X11DRV_DIB_DoUpdateDIBSection( physBitmap, bmp, FALSE );
break;
case DIB_Status_GdiMod:
if (!lossy) {
/* make it readonly to avoid app changing data while we copy */
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
- X11DRV_DIB_DoUpdateDIBSection( bmp, FALSE );
+ X11DRV_DIB_DoUpdateDIBSection( physBitmap, bmp, FALSE );
}
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_NOACCESS );
dib->p_status = DIB_Status_AppMod;
TRACE("InSync requested in status GdiMod\n" );
if (!lossy) {
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
- X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE );
+ X11DRV_DIB_DoUpdateDIBSection( physBitmap, bmp, TRUE );
}
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
dib->status = DIB_Status_InSync;
case DIB_Status_GdiMod:
TRACE("AppMod requested in status GdiMod\n" );
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
- if (!lossy) X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE );
+ if (!lossy) X11DRV_DIB_DoUpdateDIBSection( physBitmap, bmp, TRUE );
dib->status = DIB_Status_AppMod;
break;
/***********************************************************************
* X11DRV_DIB_Lock
*/
-INT X11DRV_DIB_Lock(BITMAPOBJ *bmp, INT req, BOOL lossy)
+static INT X11DRV_DIB_Lock(X_PHYSBITMAP *physBitmap, BITMAPOBJ *bmp, INT req, BOOL lossy)
{
X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
INT ret = DIB_Status_None;
EnterCriticalSection(&(dib->lock));
ret = dib->status;
if (req != DIB_Status_None)
- X11DRV_DIB_Coerce(bmp, req, lossy);
+ X11DRV_DIB_Coerce(physBitmap, bmp, req, lossy);
}
return ret;
}
/***********************************************************************
* X11DRV_DIB_Unlock
*/
-void X11DRV_DIB_Unlock(BITMAPOBJ *bmp, BOOL commit)
+static void X11DRV_DIB_Unlock(X_PHYSBITMAP *physBitmap, BITMAPOBJ *bmp, BOOL commit)
{
X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
case DIB_Status_GdiMod:
TRACE("Unlocking and syncing from GdiMod\n" );
- X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE );
+ X11DRV_DIB_DoUpdateDIBSection( physBitmap, bmp, TRUE );
break;
default:
*/
INT X11DRV_CoerceDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
{
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hBmp );
BITMAPOBJ *bmp;
INT ret;
+ if (!physBitmap) return DIB_Status_None;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!bmp) return DIB_Status_None;
- ret = X11DRV_DIB_Coerce(bmp, req, lossy);
+ ret = X11DRV_DIB_Coerce(physBitmap, bmp, req, lossy);
GDI_ReleaseObj( hBmp );
return ret;
}
*/
INT X11DRV_LockDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
{
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hBmp );
BITMAPOBJ *bmp;
INT ret;
+ if (!physBitmap) return DIB_Status_None;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!bmp) return DIB_Status_None;
- ret = X11DRV_DIB_Lock(bmp, req, lossy);
+ ret = X11DRV_DIB_Lock(physBitmap, bmp, req, lossy);
GDI_ReleaseObj( hBmp );
return ret;
}
*/
void X11DRV_UnlockDIBSection2(HBITMAP hBmp, BOOL commit)
{
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hBmp );
BITMAPOBJ *bmp;
+ if (!physBitmap) return;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!bmp) return;
- X11DRV_DIB_Unlock(bmp, commit);
+ X11DRV_DIB_Unlock(physBitmap, bmp, commit);
GDI_ReleaseObj( hBmp );
}
/***********************************************************************
* X11DRV_DIB_DeleteDIBSection
*/
-void X11DRV_DIB_DeleteDIBSection(BITMAPOBJ *bmp)
+void X11DRV_DIB_DeleteDIBSection(X_PHYSBITMAP *physBitmap, BITMAPOBJ *bmp)
{
X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
if (dib->dibSection.dshSection)
- X11DRV_DIB_Coerce(bmp, DIB_Status_InSync, FALSE);
+ X11DRV_DIB_Coerce(physBitmap, bmp, DIB_Status_InSync, FALSE);
if (dib->image)
{
X11DRV_DIBSECTION *dib;
UINT ret = 0;
HBITMAP hBitmap = GetCurrentObject( physDev->hdc, OBJ_BITMAP );
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hBitmap );
+ if (!physBitmap) return 0;
if (!(bmp = (BITMAPOBJ*)GDI_GetObjPtr( hBitmap, BITMAP_MAGIC ))) return 0;
dib = (X11DRV_DIBSECTION *) bmp->dib;
* DIB colors and X11 colors and thus alter the visible state
* of the bitmap object.
*/
- X11DRV_DIB_Lock(bmp, DIB_Status_AppMod, FALSE);
+ X11DRV_DIB_Lock( physBitmap, bmp, DIB_Status_AppMod, FALSE );
memcpy(dib->colorTable + start, colors, (end - start) * sizeof(RGBQUAD));
X11DRV_DIB_GenColorMap( physDev, dib->colorMap, DIB_RGB_COLORS,
dib->dibSection.dsBm.bmBitsPixel,
TRUE, colors, start, end );
- X11DRV_DIB_Unlock(bmp, TRUE);
+ X11DRV_DIB_Unlock( physBitmap, bmp, TRUE );
ret = end - start;
}
GDI_ReleaseObj( hBitmap );