Alexandre Julliard : winex11: Move the pixel-> color conversion out of the get_tile_pict function.

Alexandre Julliard julliard at winehq.org
Thu Sep 15 12:34:52 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 15 12:51:08 2011 +0200

winex11: Move the pixel->color conversion out of the get_tile_pict function.

---

 dlls/winex11.drv/xrender.c |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index e525d5f..66f8cc3 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1869,15 +1869,14 @@ static void SmoothGlyphGray(XImage *image, int x, int y, void *bitmap, XGlyphInf
  * Returns an appropriate Picture for tiling the text colour.
  * Call and use result within the xrender_cs
  */
-static Picture get_tile_pict(const WineXRenderFormat *wxr_format, int text_pixel)
+static Picture get_tile_pict(const WineXRenderFormat *wxr_format, const XRenderColor *color)
 {
     static struct
     {
         Pixmap xpm;
         Picture pict;
-        int current_color;
+        XRenderColor current_color;
     } tiles[WXR_NB_FORMATS], *tile;
-    XRenderColor col;
 
     tile = &tiles[wxr_format->format];
 
@@ -1893,11 +1892,13 @@ static Picture get_tile_pict(const WineXRenderFormat *wxr_format, int text_pixel
         wine_tsx11_unlock();
 
         /* init current_color to something different from text_pixel */
-        tile->current_color = ~text_pixel;
+        tile->current_color = *color;
+        tile->current_color.red ^= 0xffff;
 
         if(wxr_format->format == WXR_FORMAT_MONO)
         {
             /* for a 1bpp bitmap we always need a 1 in the tile */
+            XRenderColor col;
             col.red = col.green = col.blue = 0;
             col.alpha = 0xffff;
             wine_tsx11_lock();
@@ -1906,13 +1907,12 @@ static Picture get_tile_pict(const WineXRenderFormat *wxr_format, int text_pixel
         }
     }
 
-    if(text_pixel != tile->current_color && wxr_format->format != WXR_FORMAT_MONO)
+    if (memcmp( color, &tile->current_color, sizeof(*color) ) && wxr_format->format != WXR_FORMAT_MONO)
     {
-        get_xrender_color(wxr_format, text_pixel, &col);
         wine_tsx11_lock();
-        pXRenderFillRectangle(gdi_display, PictOpSrc, tile->pict, &col, 0, 0, 1, 1);
+        pXRenderFillRectangle(gdi_display, PictOpSrc, tile->pict, color, 0, 0, 1, 1);
         wine_tsx11_unlock();
-        tile->current_color = text_pixel;
+        tile->current_color = *color;
     }
     return tile->pict;
 }
@@ -2080,6 +2080,7 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
         POINT desired, current;
         int render_op = PictOpOver;
         Picture pict = get_xrender_picture(physdev->x11dev);
+        XRenderColor col;
 
         /* There's a bug in XRenderCompositeText that ignores the xDst and yDst parameters.
            So we pass zeros to the function and move to our starting position using the first
@@ -2089,7 +2090,8 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
         desired.y = physdev->x11dev->dc_rect.top + y;
         current.x = current.y = 0;
 
-        tile_pict = get_tile_pict(physdev->info.format, physdev->x11dev->textPixel);
+        get_xrender_color(physdev->info.format, physdev->x11dev->textPixel, &col);
+        tile_pict = get_tile_pict(physdev->info.format, &col);
 
 	/* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation.
 	 */
@@ -2549,20 +2551,21 @@ BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
     /* mono -> color */
     if(physDevSrc->depth == 1 && physDevDst->depth > 1)
     {
-        XRenderColor col;
-        get_xrender_color(dst_format, physDevDst->textPixel, &col);
+        XRenderColor fg, bg;
+        get_xrender_color(dst_format, physDevDst->textPixel, &fg);
+        get_xrender_color(dst_format, physDevDst->backgroundPixel, &bg);
 
         /* We use the source drawable as a mask */
         mask_pict = get_xrender_picture_source( physDevSrc, use_repeat );
 
         /* Use backgroundPixel as the foreground color */
         EnterCriticalSection( &xrender_cs );
-        src_pict = get_tile_pict(dst_format, physDevDst->backgroundPixel);
+        src_pict = get_tile_pict(dst_format, &bg);
 
         /* Create a destination picture and fill it with textPixel color as the background color */
         wine_tsx11_lock();
         dst_pict = pXRenderCreatePicture(gdi_display, pixmap, dst_format->pict_format, CPSubwindowMode|CPRepeat, &pa);
-        pXRenderFillRectangle(gdi_display, PictOpSrc, dst_pict, &col, 0, 0, width, height);
+        pXRenderFillRectangle(gdi_display, PictOpSrc, dst_pict, &fg, 0, 0, width, height);
 
         xrender_mono_blit(src_pict, mask_pict, dst_pict, x_src, y_src, xscale, yscale, width, height);
 




More information about the wine-cvs mailing list