Module: wine Branch: master Commit: 2151272e45de09301e31a1eea7c60550055de768 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2151272e45de09301e31a1eea7...
Author: Vincent Povirk vincent@codeweavers.com Date: Tue Sep 22 13:30:24 2009 -0500
winex11: Re-add the optimization for blending 1x1 pixel bitmaps.
---
dlls/winex11.drv/xrender.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index efa8d02..9280ce3 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);