Alexandre Julliard : winex11: Always allocate a new GC for bitmap operations.
Alexandre Julliard
julliard at winehq.org
Wed May 30 13:18:51 CDT 2012
Module: wine
Branch: master
Commit: 73919154bf7b781132404d2ef6937fe7e5133574
URL: http://source.winehq.org/git/wine.git/?a=commit;h=73919154bf7b781132404d2ef6937fe7e5133574
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue May 29 21:12:15 2012 +0200
winex11: Always allocate a new GC for bitmap operations.
---
dlls/winex11.drv/bitblt.c | 13 ++++++++++---
dlls/winex11.drv/bitmap.c | 2 +-
dlls/winex11.drv/brush.c | 7 ++++---
dlls/winex11.drv/x11drv.h | 3 ---
dlls/winex11.drv/xrender.c | 6 ++++--
5 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index 887384e..2db9e70 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1365,16 +1365,21 @@ DWORD X11DRV_GetImage( PHYSDEV dev, BITMAPINFO *info,
if (X11DRV_check_error())
{
/* use a temporary pixmap to avoid the BadMatch error */
+ GC gc;
Pixmap pixmap;
wine_tsx11_lock();
pixmap = XCreatePixmap( gdi_display, root_window, width, height, vis.depth );
- XCopyArea( gdi_display, physdev->drawable, pixmap, get_bitmap_gc(vis.depth),
+ gc = XCreateGC( gdi_display, pixmap, 0, NULL );
+ XSetGraphicsExposures( gdi_display, gc, False );
+ XCopyArea( gdi_display, physdev->drawable, pixmap, gc,
physdev->dc_rect.left + x, physdev->dc_rect.top + y, width, height, 0, 0 );
image = XGetImage( gdi_display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap );
XFreePixmap( gdi_display, pixmap );
+ XFreeGC( gdi_display, gc );
wine_tsx11_unlock();
}
+
if (!image) return ERROR_OUTOFMEMORY;
info->bmiHeader.biWidth = width;
@@ -1408,6 +1413,7 @@ static DWORD put_pixmap_image( Pixmap pixmap, const XVisualInfo *vis,
{
DWORD ret;
XImage *image;
+ GC gc;
struct bitblt_coords coords;
struct gdi_image_bits dst_bits;
const XPixmapFormatValues *format = pixmap_formats[vis->depth];
@@ -1439,8 +1445,9 @@ static DWORD put_pixmap_image( Pixmap pixmap, const XVisualInfo *vis,
{
image->data = dst_bits.ptr;
wine_tsx11_lock();
- XPutImage( gdi_display, pixmap, get_bitmap_gc( vis->depth ),
- image, 0, 0, 0, 0, coords.width, coords.height );
+ gc = XCreateGC( gdi_display, pixmap, 0, NULL );
+ XPutImage( gdi_display, pixmap, gc, image, 0, 0, 0, 0, coords.width, coords.height );
+ XFreeGC( gdi_display, gc );
wine_tsx11_unlock();
image->data = NULL;
}
diff --git a/dlls/winex11.drv/bitmap.c b/dlls/winex11.drv/bitmap.c
index 27723ef..eb423a2 100644
--- a/dlls/winex11.drv/bitmap.c
+++ b/dlls/winex11.drv/bitmap.c
@@ -36,7 +36,7 @@ X_PHYSBITMAP BITMAP_stock_phys_bitmap = { 0 }; /* phys bitmap for the default s
static XContext bitmap_context; /* X context to associate a phys bitmap to a handle */
-GC get_bitmap_gc(int depth)
+static GC get_bitmap_gc(int depth)
{
if(depth < 1 || depth > 32)
return 0;
diff --git a/dlls/winex11.drv/brush.c b/dlls/winex11.drv/brush.c
index 3406190..23fcce5 100644
--- a/dlls/winex11.drv/brush.c
+++ b/dlls/winex11.drv/brush.c
@@ -110,7 +110,7 @@ static Pixmap BRUSH_DitherColor( COLORREF color, int depth)
static COLORREF prevColor = 0xffffffff;
unsigned int x, y;
Pixmap pixmap;
- GC gc = get_bitmap_gc(depth);
+ GC gc;
wine_tsx11_lock();
if (!ditherImage)
@@ -149,8 +149,9 @@ static Pixmap BRUSH_DitherColor( COLORREF color, int depth)
}
pixmap = XCreatePixmap( gdi_display, root_window, MATRIX_SIZE, MATRIX_SIZE, depth );
- XPutImage( gdi_display, pixmap, gc, ditherImage, 0, 0,
- 0, 0, MATRIX_SIZE, MATRIX_SIZE );
+ gc = XCreateGC( gdi_display, pixmap, 0, NULL );
+ XPutImage( gdi_display, pixmap, gc, ditherImage, 0, 0, 0, 0, MATRIX_SIZE, MATRIX_SIZE );
+ XFreeGC( gdi_display, gc );
wine_tsx11_unlock();
return pixmap;
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 0b10ecf..0d9746a 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -164,9 +164,6 @@ static inline void add_bounds_rect( RECT *bounds, const RECT *rect )
extern X_PHYSBITMAP BITMAP_stock_phys_bitmap DECLSPEC_HIDDEN; /* phys bitmap for the default stock bitmap */
-/* Retrieve the GC used for bitmap operations */
-extern GC get_bitmap_gc(int depth) DECLSPEC_HIDDEN;
-
/* Wine driver X11 functions */
extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right,
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 0c66ff8..68a2b4d 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1876,6 +1876,7 @@ static DWORD create_image_pixmap( BITMAPINFO *info, const struct gdi_image_bits
int depth = pict_formats[format]->depth;
struct gdi_image_bits dst_bits;
XRenderPictureAttributes pa;
+ GC gc;
XImage *image;
wine_tsx11_lock();
@@ -1894,9 +1895,10 @@ static DWORD create_image_pixmap( BITMAPINFO *info, const struct gdi_image_bits
wine_tsx11_lock();
*pixmap = XCreatePixmap( gdi_display, root_window, width, height, depth );
- XPutImage( gdi_display, *pixmap, get_bitmap_gc( depth ), image,
- src->visrect.left, 0, 0, 0, width, height );
+ gc = XCreateGC( gdi_display, *pixmap, 0, NULL );
+ XPutImage( gdi_display, *pixmap, gc, image, src->visrect.left, 0, 0, 0, width, height );
*pict = pXRenderCreatePicture( gdi_display, *pixmap, pict_formats[format], CPRepeat, &pa );
+ XFreeGC( gdi_display, gc );
wine_tsx11_unlock();
/* make coordinates relative to the pixmap */
More information about the wine-cvs
mailing list