From bd2fe1a2fa06212461e341e214f35c32fa31d200 Mon Sep 17 00:00:00 2001 From: Huw Davies <huw@codeweavers.com> Date: Tue, 3 Jul 2007 15:21:32 +0100 Subject: [PATCH] winex11.drv: Use global Pictures for the tiles. --- dlls/winex11.drv/xrender.c | 147 +++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 71 deletions(-) diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 33da629648e..846e352925c 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -84,9 +84,6 @@ struct tagXRENDERINFO { int cache_index; Picture pict; - Picture tile_pict; - Pixmap tile_xpm; - COLORREF lastTextColor; }; @@ -602,17 +599,6 @@ void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev) pXRenderFreePicture(gdi_display, physDev->xrender->pict); physDev->xrender->pict = 0; } - if(physDev->xrender->tile_pict) - { - pXRenderFreePicture(gdi_display, physDev->xrender->tile_pict); - physDev->xrender->tile_pict = 0; - } - if(physDev->xrender->tile_xpm) - { - XFreePixmap(gdi_display, physDev->xrender->tile_xpm); - physDev->xrender->tile_xpm = 0; - } - wine_tsx11_unlock(); return; @@ -1071,6 +1057,76 @@ static void SmoothGlyphGray(XImage *image, int x, int y, void *bitmap, XGlyphInf } } +/************************************************************* + * get_tile_pict + * + * Returns an appropiate Picture for tiling the text colour. + * Call and use result within the xrender_cs + */ +static Picture get_tile_pict(enum drawable_depth_type type, int text_pixel) +{ + static struct + { + Pixmap xpm; + Picture pict; + int current_color; + } tiles[2], *tile; + XRenderColor col; + + tile = &tiles[type]; + + if(!tile->xpm) + { + XRenderPictureAttributes pa; + + wine_tsx11_lock(); + tile->xpm = XCreatePixmap(gdi_display, root_window, 1, 1, pict_formats[type]->depth); + + pa.repeat = True; + tile->pict = pXRenderCreatePicture(gdi_display, tile->xpm, pict_formats[type], CPRepeat, &pa); + wine_tsx11_unlock(); + + /* init current_color to something different from text_pixel */ + tile->current_color = ~text_pixel; + + if(type == mono_drawable) + { + /* for a 1bpp bitmap we always need a 1 in the tile */ + col.red = col.green = col.blue = 0; + col.alpha = 0xffff; + wine_tsx11_lock(); + pXRenderFillRectangle(gdi_display, PictOpSrc, tile->pict, &col, 0, 0, 1, 1); + wine_tsx11_unlock(); + } + } + + if(text_pixel != tile->current_color && type == color_drawable) + { + /* Map 0 -- 0xff onto 0 -- 0xffff */ + int r_shift, r_len; + int g_shift, g_len; + int b_shift, b_len; + + ExamineBitfield (visual->red_mask, &r_shift, &r_len ); + ExamineBitfield (visual->green_mask, &g_shift, &g_len); + ExamineBitfield (visual->blue_mask, &b_shift, &b_len); + + col.red = GetField(text_pixel, r_shift, r_len); + col.red |= col.red << 8; + col.green = GetField(text_pixel, g_shift, g_len); + col.green |= col.green << 8; + col.blue = GetField(text_pixel, b_shift, b_len); + col.blue |= col.blue << 8; + col.alpha = 0x0; + + wine_tsx11_lock(); + pXRenderFillRectangle(gdi_display, PictOpSrc, tile->pict, &col, 0, 0, 1, 1); + wine_tsx11_unlock(); + tile->current_color = text_pixel; + } + return tile->pict; +} + static int XRenderErrorHandler(Display *dpy, XErrorEvent *event, void *arg) { return 1; @@ -1083,7 +1139,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag const RECT *lprect, LPCWSTR wstr, UINT count, const INT *lpDx ) { - XRenderColor col; RGNDATA *data; XGCValues xgcval; int render_op = PictOpOver; @@ -1100,6 +1155,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag double cosEsc, sinEsc; LOGFONTW lf; enum drawable_depth_type depth_type = (physDev->depth == 1) ? mono_drawable : color_drawable; + Picture tile_pict = 0; /* Do we need to disable antialiasing because of palette mode? */ if( !physDev->bitmap || GetObjectW( physDev->bitmap->hbitmap, sizeof(bmp), &bmp ) != sizeof(bmp) ) { @@ -1170,6 +1226,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag DeleteObject( clip_region ); } + EnterCriticalSection(&xrender_cs); + if(X11DRV_XRender_Installed) { if(!physDev->xrender->pict) { XRenderPictureAttributes pa; @@ -1198,68 +1256,15 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag wine_tsx11_unlock(); HeapFree( GetProcessHeap(), 0, data ); } - } - - if(X11DRV_XRender_Installed) { - /* Create a 1x1 pixmap to tile over the font mask */ - if(!physDev->xrender->tile_xpm) { - XRenderPictureAttributes pa; - - XRenderPictFormat *format = pict_formats[depth_type]; - wine_tsx11_lock(); - physDev->xrender->tile_xpm = XCreatePixmap(gdi_display, - root_window, - 1, 1, - format->depth); - pa.repeat = True; - physDev->xrender->tile_pict = pXRenderCreatePicture(gdi_display, - physDev->xrender->tile_xpm, - format, - CPRepeat, &pa); - wine_tsx11_unlock(); - TRACE("Created pixmap of depth %d\n", format->depth); - /* init lastTextColor to something different from textPixel */ - physDev->xrender->lastTextColor = ~physDev->textPixel; - - } - if(physDev->textPixel != physDev->xrender->lastTextColor) { - if(physDev->depth != 1) { - /* Map 0 -- 0xff onto 0 -- 0xffff */ - int r_shift, r_len; - int g_shift, g_len; - int b_shift, b_len; - - ExamineBitfield (visual->red_mask, &r_shift, &r_len ); - ExamineBitfield (visual->green_mask, &g_shift, &g_len); - ExamineBitfield (visual->blue_mask, &b_shift, &b_len); - - col.red = GetField(physDev->textPixel, r_shift, r_len); - col.red |= col.red << 8; - col.green = GetField(physDev->textPixel, g_shift, g_len); - col.green |= col.green << 8; - col.blue = GetField(physDev->textPixel, b_shift, b_len); - col.blue |= col.blue << 8; - col.alpha = 0x0; - } else { /* for a 1bpp bitmap we always need a 1 in the tile */ - col.red = col.green = col.blue = 0; - col.alpha = 0xffff; - } - wine_tsx11_lock(); - pXRenderFillRectangle(gdi_display, PictOpSrc, - physDev->xrender->tile_pict, - &col, 0, 0, 1, 1); - wine_tsx11_unlock(); - physDev->xrender->lastTextColor = physDev->textPixel; - } + tile_pict = get_tile_pict(depth_type, physDev->textPixel); /* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation. */ - if((physDev->depth == 1) && (textPixel == 0)) + if((depth_type == mono_drawable) && (textPixel == 0)) render_op = PictOpOutReverse; /* This gives us 'black' text */ } - EnterCriticalSection(&xrender_cs); entry = glyphsetCache + physDev->xrender->cache_index; if( disable_antialias == FALSE ) aa_type = entry->aa_default; @@ -1325,7 +1330,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag } wine_tsx11_lock(); pXRenderCompositeText16(gdi_display, render_op, - physDev->xrender->tile_pict, + tile_pict, physDev->xrender->pict, formatEntry->font_format, 0, 0, 0, 0, elts, count); -- GitLab