Huw Davies : winex11.drv: Use global Pictures for the tiles.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 4 06:56:49 CDT 2007
Module: wine
Branch: master
Commit: bd2fe1a2fa06212461e341e214f35c32fa31d200
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bd2fe1a2fa06212461e341e214f35c32fa31d200
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Jul 3 15:21:32 2007 +0100
winex11.drv: Use global Pictures for the tiles.
---
dlls/winex11.drv/xrender.c | 147 +++++++++++++++++++++++---------------------
1 files changed, 76 insertions(+), 71 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 33da629..846e352 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);
More information about the wine-cvs
mailing list