Vincent Povirk : winex11.drv: Optimize AlphaBlend of 1x1 source bitmaps.
Alexandre Julliard
julliard at winehq.org
Thu May 21 09:35:51 CDT 2009
Module: wine
Branch: master
Commit: 9eaf6a29fe1e8c0a3d346996fe89d67aba8a43a0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9eaf6a29fe1e8c0a3d346996fe89d67aba8a43a0
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed May 20 11:23:38 2009 -0500
winex11.drv: Optimize AlphaBlend of 1x1 source bitmaps.
---
dlls/winex11.drv/xrender.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index c00601c..afe60cd 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1631,6 +1631,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
BOOL top_down = FALSE;
RGNDATA *rgndata;
enum drawable_depth_type dst_depth_type = (devDst->depth == 1) ? mono_drawable : color_drawable;
+ int repeat_src;
if(!X11DRV_XRender_Installed) {
FIXME("Unable to AlphaBlend without Xrender\n");
@@ -1657,10 +1658,14 @@ 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)
+ if((widthDst != widthSrc || heightDst != heightSrc) && !repeat_src)
#else
- if(!pXRenderSetPictureTransform)
+ if(!pXRenderSetPictureTransform && !repeat_src)
#endif
{
FIXME("Unable to Stretch, XRenderSetPictureTransform is currently required\n");
@@ -1751,6 +1756,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
TRACE("src_format %p\n", src_format);
pa.subwindow_mode = IncludeInferiors;
+ pa.repeat = repeat_src ? RepeatNormal : RepeatNone;
/* FIXME use devDst->xrender->pict ? */
dst_pict = pXRenderCreatePicture(gdi_display,
@@ -1769,7 +1775,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
src_pict = pXRenderCreatePicture(gdi_display,
xpm, src_format,
- CPSubwindowMode, &pa);
+ CPSubwindowMode|CPRepeat, &pa);
TRACE("src_pict %08lx\n", src_pict);
if (rgndata)
@@ -1782,7 +1788,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
}
#ifdef HAVE_XRENDERSETPICTURETRANSFORM
- if(widthDst != widthSrc || heightDst != heightSrc) {
+ if(!repeat_src && (widthDst != widthSrc || heightDst != heightSrc)) {
double xscale = widthSrc/(double)widthDst;
double yscale = heightSrc/(double)heightDst;
XTransform xform = {{
More information about the wine-cvs
mailing list