Alexandre Julliard : winex11: Use the brush information passed in SelectBrush for pattern brushes.

Alexandre Julliard julliard at winehq.org
Tue Nov 8 12:23:08 CST 2011


Module: wine
Branch: master
Commit: 265068974d26bd2bf6e36a5f47329695f250cf00
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=265068974d26bd2bf6e36a5f47329695f250cf00

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  3 12:03:19 2011 +0100

winex11: Use the brush information passed in SelectBrush for pattern brushes.

---

 dlls/winex11.drv/brush.c |   67 +++++++++++++++++++++++++--------------------
 1 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/dlls/winex11.drv/brush.c b/dlls/winex11.drv/brush.c
index 7b7f8cf..c628d7e 100644
--- a/dlls/winex11.drv/brush.c
+++ b/dlls/winex11.drv/brush.c
@@ -209,15 +209,21 @@ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color )
 /***********************************************************************
  *           BRUSH_SelectPatternBrush
  */
-static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
+static void BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, X_PHYSBITMAP *physBitmap )
 {
     BITMAP bitmap;
-    X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
 
-    if (!physBitmap || !GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return FALSE;
+    GetObjectW( hbitmap, sizeof(bitmap), &bitmap );
 
     X11DRV_DIB_Lock( physBitmap, DIB_Status_GdiMod );
 
+    if (physDev->brush.pixmap)
+    {
+        wine_tsx11_lock();
+        XFreePixmap( gdi_display, physDev->brush.pixmap );
+        wine_tsx11_unlock();
+    }
+
     if ((physDev->depth == 1) && (physBitmap->depth != 1))
     {
         wine_tsx11_lock();
@@ -247,33 +253,26 @@ static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
 	physDev->brush.fillStyle = FillOpaqueStippled;
 	physDev->brush.pixel = -1;  /* Special case (see DC_SetupGCForBrush) */
     }
-    return TRUE;
 }
 
-
-/***********************************************************************
- *           BRUSH_SelectDIBPatternBrush
- */
-static BOOL BRUSH_SelectDIBPatternBrush( X11DRV_PDEVICE *physDev, const BITMAPINFO *info )
+/* create a bitmap appropriate for the given DIB pattern brush */
+HBITMAP create_brush_bitmap( X11DRV_PDEVICE *physDev, const BITMAPINFO *info, void *bits, UINT usage )
 {
-    BOOL ret;
     HDC memdc;
-    HBITMAP bitmap = CreateDIBitmap( physDev->dev.hdc, &info->bmiHeader, CBM_INIT,
-                                     (LPBYTE)info + bitmap_info_size( info, DIB_RGB_COLORS ),
-                                     info, DIB_RGB_COLORS );
+    int bpp = screen_bpp;
+    HBITMAP bitmap;
+
+    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 ((ret = BRUSH_SelectPatternBrush( physDev, bitmap )))
-    {
-        X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( bitmap );
-        physBitmap->pixmap = 0;  /* so it doesn't get freed */
-    }
-    DeleteObject( bitmap );
-    return ret;
+    SetDIBits( physDev->dev.hdc, bitmap, 0, abs(info->bmiHeader.biHeight), bits, info, usage );
+    return bitmap;
 }
 
 
@@ -286,6 +285,24 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
     X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
     LOGBRUSH logbrush;
 
+    if (bitmap || info)  /* pattern brush */
+    {
+        X_PHYSBITMAP *physbitmap;
+        BOOL delete_bitmap = FALSE;
+
+        if (!bitmap || !(physbitmap = X11DRV_get_phys_bitmap( bitmap )))
+        {
+            if (!(bitmap = create_brush_bitmap( physDev, info, bits, usage ))) return 0;
+            physbitmap = X11DRV_get_phys_bitmap( bitmap );
+            delete_bitmap = TRUE;
+        }
+        BRUSH_SelectPatternBrush( physDev, bitmap, physbitmap );
+        TRACE("BS_PATTERN\n");
+        physDev->brush.style = BS_PATTERN;
+        if (delete_bitmap) DeleteObject( bitmap );
+        return hbrush;
+    }
+
     if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0;
 
     TRACE("hdc=%p hbrush=%p\n", dev->hdc, hbrush);
@@ -321,16 +338,6 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
         wine_tsx11_unlock();
 	physDev->brush.fillStyle = FillStippled;
 	break;
-
-      case BS_PATTERN:
-	TRACE("BS_PATTERN\n");
-	if (!BRUSH_SelectPatternBrush( physDev, (HBITMAP)logbrush.lbHatch )) return 0;
-	break;
-
-      case BS_DIBPATTERN:
-	TRACE("BS_DIBPATTERN\n");
-	if (!BRUSH_SelectDIBPatternBrush( physDev, (BITMAPINFO *)logbrush.lbHatch )) return 0;
-	break;
     }
     return hbrush;
 }




More information about the wine-cvs mailing list