From 2151272e45de09301e31a1eea7c60550055de768 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 22 Sep 2009 13:30:24 -0500 Subject: [PATCH] winex11: Re-add the optimization for blending 1x1 pixel bitmaps. --- dlls/winex11.drv/xrender.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index efa8d02abc4..9280ce3273c 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -1834,14 +1834,10 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid heightSrc = pts[1].y - pts[0].y; if (!widthDst || !heightDst || !widthSrc || !heightSrc) return TRUE; - /* If the source is a 1x1 bitmap, tiling is equivalent to stretching, but - tiling is much faster. Therefore, we do no stretching in this case. */ - repeat_src = widthSrc == 1 && heightSrc == 1; - #ifndef HAVE_XRENDERSETPICTURETRANSFORM - if((widthDst != widthSrc || heightDst != heightSrc) && !repeat_src) + if(widthDst != widthSrc || heightDst != heightSrc) #else - if(!pXRenderSetPictureTransform && !repeat_src) + if(!pXRenderSetPictureTransform) #endif { FIXME("Unable to Stretch, XRenderSetPictureTransform is currently required\n"); @@ -1859,6 +1855,10 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid return FALSE; } + /* If the source is a 1x1 bitmap, tiling is equivalent to stretching, but + tiling is much faster. Therefore, we do no stretching in this case. */ + repeat_src = dib.dsBmih.biWidth == 1 && abs(dib.dsBmih.biHeight) == 1; + if (xSrc < 0 || ySrc < 0 || widthSrc < 0 || heightSrc < 0 || xSrc + widthSrc > dib.dsBmih.biWidth || ySrc + heightSrc > abs(dib.dsBmih.biHeight)) { @@ -1966,7 +1966,10 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid /* Make sure we ALWAYS set the transformation matrix even if we don't need to scale. The reason is * that later on we want to reuse pictures (it can bring a lot of extra performance) and each time * a different transformation matrix might have been used. */ - set_xrender_transformation(src_pict, widthSrc/(double)widthDst, heightSrc/(double)heightDst, 0, 0); + if (repeat_src) + set_xrender_transformation(src_pict, 1.0, 1.0, 0, 0); + else + set_xrender_transformation(src_pict, widthSrc/(double)widthDst, heightSrc/(double)heightDst, 0, 0); pXRenderComposite(gdi_display, PictOpOver, src_pict, 0, dst_pict, 0, 0, 0, 0, xDst + devDst->dc_rect.left, yDst + devDst->dc_rect.top, widthDst, heightDst);