Module: wine Branch: master Commit: 995e2104df603af1feea7999fefe4765a655d2ee URL: http://source.winehq.org/git/wine.git/?a=commit;h=995e2104df603af1feea7999fe...
Author: Alexandre Julliard julliard@winehq.org Date: Wed May 23 21:44:59 2012 +0200
winex11: Always create the brush pixmap from the pattern bits.
---
dlls/winex11.drv/brush.c | 79 +------------------------------------------- dlls/winex11.drv/x11drv.h | 1 - dlls/winex11.drv/xrender.c | 44 ++++++------------------ 3 files changed, 12 insertions(+), 112 deletions(-)
diff --git a/dlls/winex11.drv/brush.c b/dlls/winex11.drv/brush.c index 6574eb8..3406190 100644 --- a/dlls/winex11.drv/brush.c +++ b/dlls/winex11.drv/brush.c @@ -210,76 +210,6 @@ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color ) }
-/*********************************************************************** - * BRUSH_SelectPatternBrush - */ -static void BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, X_PHYSBITMAP *physBitmap ) -{ - BITMAP bitmap; - - GetObjectW( hbitmap, sizeof(bitmap), &bitmap ); - - wine_tsx11_lock(); - - if (physDev->brush.pixmap) XFreePixmap( gdi_display, physDev->brush.pixmap ); - - if ((physDev->depth == 1) && (physBitmap->depth != 1)) - { - /* Special case: a color pattern on a monochrome DC */ - physDev->brush.pixmap = XCreatePixmap( gdi_display, root_window, - bitmap.bmWidth, bitmap.bmHeight, 1); - /* FIXME: should probably convert to monochrome instead */ - XCopyPlane( gdi_display, physBitmap->pixmap, physDev->brush.pixmap, - get_bitmap_gc(1), 0, 0, bitmap.bmWidth, bitmap.bmHeight, 0, 0, 1 ); - } - else - { - physDev->brush.pixmap = XCreatePixmap( gdi_display, root_window, - bitmap.bmWidth, bitmap.bmHeight, physBitmap->depth ); - XCopyArea( gdi_display, physBitmap->pixmap, physDev->brush.pixmap, - get_bitmap_gc(physBitmap->depth), 0, 0, bitmap.bmWidth, bitmap.bmHeight, 0, 0 ); - } - wine_tsx11_unlock(); - - if (physBitmap->depth > 1) - { - physDev->brush.fillStyle = FillTiled; - physDev->brush.pixel = 0; /* Ignored */ - } - else - { - physDev->brush.fillStyle = FillOpaqueStippled; - physDev->brush.pixel = -1; /* Special case (see DC_SetupGCForBrush) */ - } -} - -/* create a bitmap appropriate for the given DIB pattern brush */ -HBITMAP create_brush_bitmap( X11DRV_PDEVICE *physDev, const struct brush_pattern *pattern ) -{ - HDC memdc; - int bpp = screen_bpp; - HBITMAP bitmap; - const BITMAPINFO *info = pattern->info; - - if (physDev->depth == 1 || info->bmiHeader.biBitCount == 1) bpp = 1; - bitmap = CreateBitmap( info->bmiHeader.biWidth, abs(info->bmiHeader.biHeight), 1, bpp, NULL ); - if (!bitmap) return 0; - - /* make sure it's owned by x11drv */ - memdc = CreateCompatibleDC( physDev->dev.hdc ); - SelectObject( memdc, bitmap ); - DeleteDC( memdc ); - if (!X11DRV_get_phys_bitmap( bitmap )) - { - DeleteObject( bitmap ); - return 0; - } - - SetDIBits( physDev->dev.hdc, bitmap, 0, abs(info->bmiHeader.biHeight), - pattern->bits.ptr, info, pattern->usage ); - return bitmap; -} - static BOOL select_pattern_brush( X11DRV_PDEVICE *physdev, const struct brush_pattern *pattern ) { XVisualInfo vis; @@ -330,14 +260,7 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct brush_patter
if (pattern) /* pattern brush */ { - X_PHYSBITMAP *physbitmap; - HBITMAP bitmap = pattern->bitmap; - - if (!bitmap || !(physbitmap = X11DRV_get_phys_bitmap( bitmap ))) - { - if (!select_pattern_brush( physDev, pattern )) return 0; - } - else BRUSH_SelectPatternBrush( physDev, bitmap, physbitmap ); + if (!select_pattern_brush( physDev, pattern )) return 0; TRACE("BS_PATTERN\n"); physDev->brush.style = BS_PATTERN; return hbrush; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9b05e3e..7ea8164 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -221,7 +221,6 @@ extern void X11DRV_Xcursor_Init(void) DECLSPEC_HIDDEN; extern void X11DRV_BITMAP_Init(void) DECLSPEC_HIDDEN; extern void X11DRV_XInput2_Init(void) DECLSPEC_HIDDEN;
-extern HBITMAP create_brush_bitmap( X11DRV_PDEVICE *physDev, const struct brush_pattern *pattern ) DECLSPEC_HIDDEN; extern X_PHYSBITMAP *X11DRV_get_phys_bitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN; extern X_PHYSBITMAP *X11DRV_init_phys_bitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN; extern X_PHYSBITMAP *X11DRV_create_phys_bitmap( HBITMAP hbitmap, const BITMAP *bitmap, int depth ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index ffd1b4d..91a6bd2 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2589,56 +2589,34 @@ fallback: static HBRUSH xrenderdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct brush_pattern *pattern ) { struct xrender_physdev *physdev = get_xrender_dev( dev ); - X_PHYSBITMAP *physbitmap; - BOOL delete_bitmap = FALSE; - BITMAP bm; - HBITMAP bitmap; Pixmap pixmap; - XRenderPictFormat *pict_format; - Picture src_pict, dst_pict; - XRenderPictureAttributes pa; + XVisualInfo vis; + XRenderPictFormat *format = physdev->pict_format;
if (!pattern) goto x11drv_fallback; + if (pattern->info->bmiHeader.biBitCount == 1) goto x11drv_fallback; if (physdev->format == WXR_FORMAT_MONO) goto x11drv_fallback;
- bitmap = pattern->bitmap; - if (!bitmap || !(physbitmap = X11DRV_get_phys_bitmap( bitmap ))) - { - if (!(bitmap = create_brush_bitmap( physdev->x11dev, pattern ))) return 0; - physbitmap = X11DRV_get_phys_bitmap( bitmap ); - delete_bitmap = TRUE; - } - - if (physbitmap->format == WXR_FORMAT_MONO) goto x11drv_fallback; - if (!(pict_format = pict_formats[physbitmap->format])) goto x11drv_fallback; + memset( &vis, 0, sizeof(vis) ); + vis.depth = format->depth; + vis.red_mask = format->direct.redMask << format->direct.red; + vis.green_mask = format->direct.greenMask << format->direct.green; + vis.blue_mask = format->direct.blueMask << format->direct.blue;
- GetObjectW( bitmap, sizeof(bm), &bm ); + pixmap = create_pixmap_from_image( physdev->dev.hdc, &vis, pattern->info, + &pattern->bits, pattern->usage ); + if (!pixmap) return 0;
wine_tsx11_lock(); - pixmap = XCreatePixmap( gdi_display, root_window, bm.bmWidth, bm.bmHeight, - physdev->pict_format->depth ); - - pa.repeat = RepeatNone; - src_pict = pXRenderCreatePicture(gdi_display, physbitmap->pixmap, pict_format, CPRepeat, &pa); - dst_pict = pXRenderCreatePicture(gdi_display, pixmap, physdev->pict_format, CPRepeat, &pa); - - xrender_blit( PictOpSrc, src_pict, 0, dst_pict, 0, 0, bm.bmWidth, bm.bmHeight, - 0, 0, bm.bmWidth, bm.bmHeight, 1.0, 1.0 ); - pXRenderFreePicture( gdi_display, src_pict ); - pXRenderFreePicture( gdi_display, dst_pict ); - if (physdev->x11dev->brush.pixmap) XFreePixmap( gdi_display, physdev->x11dev->brush.pixmap ); physdev->x11dev->brush.pixmap = pixmap; physdev->x11dev->brush.fillStyle = FillTiled; physdev->x11dev->brush.pixel = 0; /* ignored */ physdev->x11dev->brush.style = BS_PATTERN; wine_tsx11_unlock(); - - if (delete_bitmap) DeleteObject( bitmap ); return hbrush;
x11drv_fallback: - if (delete_bitmap) DeleteObject( bitmap ); dev = GET_NEXT_PHYSDEV( dev, pSelectBrush ); return dev->funcs->pSelectBrush( dev, hbrush, pattern ); }