#include <stdio.h>
#include <stdlib.h>
-#include "gdi.h"
+#include "windef.h"
+#include "wingdi.h"
#include "wine/debug.h"
#include "x11drv.h"
-#include "wingdi.h"
-#include "windef.h"
-#include "wine/winuser16.h"
WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
GC BITMAP_monoGC = 0, BITMAP_colorGC = 0;
X_PHYSBITMAP BITMAP_stock_phys_bitmap = { 0 }; /* phys bitmap for the default stock bitmap */
+static XContext bitmap_context; /* X context to associate a phys bitmap to a handle */
+
/***********************************************************************
* X11DRV_BITMAP_Init
*/
/* Create the necessary GCs */
wine_tsx11_lock();
+ bitmap_context = XUniqueContext();
BITMAP_stock_phys_bitmap.pixmap_depth = 1;
BITMAP_stock_phys_bitmap.pixmap = XCreatePixmap( gdi_display, root_window, 1, 1, 1 );
BITMAP_monoGC = XCreateGC( gdi_display, BITMAP_stock_phys_bitmap.pixmap, 0, NULL );
BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
{
X_PHYSBITMAP *physBitmap;
- BOOL ret = FALSE;
- BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
+ BITMAP bitmap;
- if(!bmp) {
- WARN("Bad bitmap handle %p\n", hbitmap);
- return FALSE;
- }
+ if (!GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return FALSE;
/* Check parameters */
- if (bmp->bitmap.bmPlanes != 1) goto done;
+ if (bitmap.bmPlanes != 1) return FALSE;
- if ((bmp->bitmap.bmBitsPixel != 1) && (bmp->bitmap.bmBitsPixel != screen_depth))
+ if ((bitmap.bmBitsPixel != 1) && (bitmap.bmBitsPixel != screen_depth))
{
ERR("Trying to make bitmap with planes=%d, bpp=%d\n",
- bmp->bitmap.bmPlanes, bmp->bitmap.bmBitsPixel);
- goto done;
+ bitmap.bmPlanes, bitmap.bmBitsPixel);
+ return FALSE;
}
if (hbitmap == BITMAP_stock_phys_bitmap.hbitmap)
{
ERR( "called for stock bitmap, please report\n" );
- goto done;
+ return FALSE;
}
- TRACE("(%p) %dx%d %d bpp\n", hbitmap, bmp->bitmap.bmWidth,
- bmp->bitmap.bmHeight, bmp->bitmap.bmBitsPixel);
+ TRACE("(%p) %dx%d %d bpp\n", hbitmap, bitmap.bmWidth, bitmap.bmHeight, bitmap.bmBitsPixel);
- if (!(physBitmap = X11DRV_init_phys_bitmap( hbitmap ))) goto done;
+ if (!(physBitmap = X11DRV_init_phys_bitmap( hbitmap ))) return FALSE;
/* Create the pixmap */
wine_tsx11_lock();
+ physBitmap->pixmap_depth = bitmap.bmBitsPixel;
physBitmap->pixmap = XCreatePixmap(gdi_display, root_window,
- bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
- bmp->bitmap.bmBitsPixel);
+ bitmap.bmWidth, bitmap.bmHeight, bitmap.bmBitsPixel);
wine_tsx11_unlock();
if (!physBitmap->pixmap)
{
WARN("Can't create Pixmap\n");
HeapFree( GetProcessHeap(), 0, physBitmap );
- goto done;
+ return FALSE;
}
- 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 ret;
+ if (bitmap.bmBits) /* Set bitmap bits */
+ X11DRV_SetBitmapBits( hbitmap, bitmap.bmBits, bitmap.bmHeight * bitmap.bmWidthBytes );
+ return TRUE;
}
*/
BOOL X11DRV_DeleteBitmap( HBITMAP hbitmap )
{
- BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
- if (bmp)
- {
- X_PHYSBITMAP *physBitmap = bmp->physBitmap;
+ X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
- if (physBitmap)
- {
- DIBSECTION dib;
+ if (physBitmap)
+ {
+ DIBSECTION dib;
- if (GetObjectW( hbitmap, sizeof(dib), &dib ) == sizeof(dib))
- X11DRV_DIB_DeleteDIBSection( physBitmap, &dib );
+ if (GetObjectW( hbitmap, sizeof(dib), &dib ) == sizeof(dib))
+ X11DRV_DIB_DeleteDIBSection( physBitmap, &dib );
- wine_tsx11_lock();
- if (physBitmap->pixmap) XFreePixmap( gdi_display, physBitmap->pixmap );
- wine_tsx11_unlock();
- HeapFree( GetProcessHeap(), 0, physBitmap );
- bmp->physBitmap = NULL;
- }
- GDI_ReleaseObj( hbitmap );
+ wine_tsx11_lock();
+ if (physBitmap->pixmap) XFreePixmap( gdi_display, physBitmap->pixmap );
+ XDeleteContext( gdi_display, (XID)hbitmap, bitmap_context );
+ wine_tsx11_unlock();
+ HeapFree( GetProcessHeap(), 0, physBitmap );
}
return TRUE;
}
*/
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 );
- }
+ X_PHYSBITMAP *ret;
+
+ wine_tsx11_lock();
+ if (XFindContext( gdi_display, (XID)hbitmap, bitmap_context, (char **)&ret )) ret = NULL;
+ wine_tsx11_unlock();
return ret;
}
/***********************************************************************
* X11DRV_init_phys_bitmap
*
- * Initialize the X physical bitmap info if necessary.
+ * Initialize the X physical bitmap info.
*/
X_PHYSBITMAP *X11DRV_init_phys_bitmap( HBITMAP hbitmap )
{
- X_PHYSBITMAP *ret = NULL;
- BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
- if (bmp)
+ X_PHYSBITMAP *ret;
+
+ if ((ret = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret) )) != NULL)
{
- if (!(ret = bmp->physBitmap))
- {
- if ((ret = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret) )) != NULL)
- {
- ret->hbitmap = hbitmap;
- ret->pixmap = 0;
- ret->pixmap_depth = bmp->bitmap.bmBitsPixel;
- bmp->physBitmap = ret;
- }
- }
- GDI_ReleaseObj( hbitmap );
+ ret->hbitmap = hbitmap;
+ wine_tsx11_lock();
+ XSaveContext( gdi_display, (XID)hbitmap, bitmap_context, (char *)ret );
+ wine_tsx11_unlock();
}
return ret;
}