Alexandre Julliard : winex11: Mask out the alpha channel when converting from color to monochrome.

Alexandre Julliard julliard at winehq.org
Fri Apr 16 10:56:00 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Apr 15 22:53:27 2010 +0200

winex11: Mask out the alpha channel when converting from color to monochrome.

---

 dlls/winex11.drv/bitblt.c |   39 ++++++++++++++++++++++++++++-----------
 1 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index c9aa7cf..94620df 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -552,6 +552,21 @@ static void get_colors(X11DRV_PDEVICE *physDevDst, X11DRV_PDEVICE *physDevSrc,
     }
 }
 
+/* return a mask for meaningful bits when doing an XGetPixel on an image */
+static unsigned long image_pixel_mask( X11DRV_PDEVICE *physDev )
+{
+    unsigned long ret;
+    ColorShifts *shifts = physDev->color_shifts;
+
+    if (!shifts) shifts = &X11DRV_PALETTE_default_shifts;
+    ret = (shifts->physicalRed.max << shifts->physicalRed.shift) |
+        (shifts->physicalGreen.max << shifts->physicalGreen.shift) |
+        (shifts->physicalBlue.max << shifts->physicalBlue.shift);
+    if (!ret) ret = (1 << physDev->depth) - 1;
+    return ret;
+}
+
+
 /***********************************************************************
  *           BITBLT_StretchRow
  *
@@ -617,7 +632,7 @@ static void BITBLT_ShrinkRow( int *rowSrc, int *rowDst,
  */
 static void BITBLT_GetRow( XImage *image, int *pdata, INT row,
                            INT start, INT width, INT depthDst,
-                           int fg, int bg, BOOL swap)
+                           int fg, int bg, unsigned long pixel_mask, BOOL swap)
 {
     register INT i;
 
@@ -655,9 +670,9 @@ static void BITBLT_GetRow( XImage *image, int *pdata, INT row,
         else  /* color -> monochrome */
         {
             if (swap) for (i = 0; i < width; i++)
-                *pdata-- = (XGetPixel( image, i, row ) == bg) ? 1 : 0;
+                *pdata-- = ((XGetPixel( image, i, row ) & pixel_mask) == bg) ? 1 : 0;
             else for (i = 0; i < width; i++)
-                *pdata++ = (XGetPixel( image, i, row ) == bg) ? 1 : 0;
+                *pdata++ = ((XGetPixel( image, i, row ) & pixel_mask) == bg) ? 1 : 0;
         }
     }
 }
@@ -673,7 +688,8 @@ static void BITBLT_StretchImage( XImage *srcImage, XImage *dstImage,
                                  INT widthSrc, INT heightSrc,
                                  INT widthDst, INT heightDst,
                                  RECT *visRectSrc, RECT *visRectDst,
-                                 int foreground, int background, WORD mode )
+                                 int foreground, int background,
+                                 unsigned long pixel_mask, WORD mode )
 {
     int *rowSrc, *rowDst, *pixel;
     char *pdata;
@@ -740,7 +756,7 @@ static void BITBLT_StretchImage( XImage *srcImage, XImage *dstImage,
                            hswap ? widthSrc - visRectSrc->right
                                  : visRectSrc->left,
                            visRectSrc->right - visRectSrc->left,
-                           dstImage->depth, foreground, background, hswap );
+                           dstImage->depth, foreground, background, pixel_mask, hswap );
 
             /* Stretch or shrink it */
             if (hstretch)
@@ -799,7 +815,7 @@ static void BITBLT_StretchImage( XImage *srcImage, XImage *dstImage,
                            hswap ? widthSrc - visRectSrc->right
                                  : visRectSrc->left,
                            visRectSrc->right - visRectSrc->left,
-                           dstImage->depth, foreground, background, hswap );
+                           dstImage->depth, foreground, background, pixel_mask, hswap );
 
             /* Stretch or shrink it */
             if (hstretch)
@@ -901,9 +917,8 @@ static int BITBLT_GetSrcAreaStretch( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
                                         rectDst.bottom - rectDst.top, physDevDst->depth );
     BITBLT_StretchImage( imageSrc, imageDst, src->width, src->height,
                          dst->width, dst->height, &rectSrc, &rectDst,
-                         fg, physDevDst->depth != 1 ?
-                         bg : physDevSrc->backgroundPixel,
-                         GetStretchBltMode(physDevDst->hdc) );
+                         fg, physDevDst->depth != 1 ? bg : physDevSrc->backgroundPixel,
+                         image_pixel_mask( physDevSrc ), GetStretchBltMode(physDevDst->hdc) );
     wine_tsx11_lock();
     XPutImage( gdi_display, pixmap, gc, imageDst, 0, 0, 0, 0,
                rectDst.right - rectDst.left, rectDst.bottom - rectDst.top );
@@ -1013,6 +1028,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe
         }
         else  /* color -> monochrome */
         {
+            unsigned long pixel_mask;
             wine_tsx11_lock();
             /* FIXME: avoid BadMatch error */
             imageSrc = XGetImage( gdi_display, physDevSrc->drawable,
@@ -1031,10 +1047,11 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe
                 wine_tsx11_unlock();
                 return exposures;
             }
+            pixel_mask = image_pixel_mask( physDevSrc );
             for (y = 0; y < height; y++)
                 for (x = 0; x < width; x++)
-                    XPutPixel(imageDst, x, y, (XGetPixel(imageSrc,x,y) ==
-                                               physDevSrc->backgroundPixel) );
+                    XPutPixel(imageDst, x, y,
+                              !((XGetPixel(imageSrc,x,y) ^ physDevSrc->backgroundPixel) & pixel_mask));
             XPutImage( gdi_display, pixmap, gc, imageDst,
                        0, 0, 0, 0, width, height );
             XDestroyImage( imageSrc );




More information about the wine-cvs mailing list