From 9ea45ac6023a68d19a9ff62e724486120cde6f82 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 16 Sep 2011 17:10:41 +0200 Subject: [PATCH] winex11: Use the original unclipped coordinates for XRender blits to avoid rounding errors. --- dlls/winex11.drv/xrender.c | 44 ++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index ce3bc0391bb..f85c5c15445 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2336,10 +2336,10 @@ static void xrender_stretch_blit( struct xrender_physdev *physdev_src, struct xr Drawable drawable, const struct bitblt_coords *src, const struct bitblt_coords *dst ) { - int width = dst->visrect.right - dst->visrect.left; - int height = dst->visrect.bottom - dst->visrect.top; - int x_src = physdev_src->x11dev->dc_rect.left + src->visrect.left; - int y_src = physdev_src->x11dev->dc_rect.top + src->visrect.top; + int width = abs( dst->width ); + int height = abs( dst->height ); + int x_src = physdev_src->x11dev->dc_rect.left + src->x; + int y_src = physdev_src->x11dev->dc_rect.top + src->y; int x_dst, y_dst; Picture src_pict = 0, dst_pict, mask_pict = 0; BOOL use_repeat; @@ -2357,7 +2357,8 @@ static void xrender_stretch_blit( struct xrender_physdev *physdev_src, struct xr { XRenderPictureAttributes pa; - x_dst = y_dst = 0; + x_dst = dst->x; + y_dst = dst->y; pa.repeat = RepeatNone; wine_tsx11_lock(); dst_pict = pXRenderCreatePicture( gdi_display, drawable, physdev_dst->pict_format, CPRepeat, &pa ); @@ -2365,11 +2366,16 @@ static void xrender_stretch_blit( struct xrender_physdev *physdev_src, struct xr } else { - x_dst = physdev_dst->x11dev->dc_rect.left + dst->visrect.left; - y_dst = physdev_dst->x11dev->dc_rect.top + dst->visrect.top; + x_dst = physdev_dst->x11dev->dc_rect.left + dst->x; + y_dst = physdev_dst->x11dev->dc_rect.top + dst->y; dst_pict = get_xrender_picture( physdev_dst ); } + if (src->width < 0) x_src += src->width + 1; + if (src->height < 0) y_src += src->height + 1; + if (dst->width < 0) x_dst += dst->width + 1; + if (dst->height < 0) y_dst += dst->height + 1; + /* mono -> color */ if (physdev_src->format == WXR_FORMAT_MONO && physdev_dst->format != WXR_FORMAT_MONO) { @@ -2463,16 +2469,23 @@ static BOOL xrenderdrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst, { GC tmpGC; Pixmap tmp_pixmap; + struct bitblt_coords tmp; + + /* make coordinates relative to tmp pixmap */ + tmp = *dst; + tmp.x -= tmp.visrect.left; + tmp.y -= tmp.visrect.top; + OffsetRect( &tmp.visrect, -tmp.visrect.left, -tmp.visrect.top ); wine_tsx11_lock(); tmpGC = XCreateGC( gdi_display, physdev_dst->x11dev->drawable, 0, NULL ); XSetSubwindowMode( gdi_display, tmpGC, IncludeInferiors ); XSetGraphicsExposures( gdi_display, tmpGC, False ); - tmp_pixmap = XCreatePixmap( gdi_display, root_window, dst->visrect.right - dst->visrect.left, - dst->visrect.bottom - dst->visrect.top, physdev_dst->x11dev->depth ); + tmp_pixmap = XCreatePixmap( gdi_display, root_window, tmp.visrect.right - tmp.visrect.left, + tmp.visrect.bottom - tmp.visrect.top, physdev_dst->x11dev->depth ); wine_tsx11_unlock(); - xrender_stretch_blit( physdev_src, physdev_dst, tmp_pixmap, src, dst ); + xrender_stretch_blit( physdev_src, physdev_dst, tmp_pixmap, src, &tmp ); execute_rop( physdev_dst->x11dev, tmp_pixmap, tmpGC, &dst->visrect, rop ); wine_tsx11_lock(); @@ -2547,12 +2560,11 @@ static BOOL xrenderdrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst, wine_tsx11_lock(); xrender_blit( PictOpOver, src_pict, mask_pict, dst_pict, - physdev_src->x11dev->dc_rect.left + src->visrect.left, - physdev_src->x11dev->dc_rect.top + src->visrect.top, - physdev_dst->x11dev->dc_rect.left + dst->visrect.left, - physdev_dst->x11dev->dc_rect.top + dst->visrect.top, - xscale, yscale, - dst->visrect.right - dst->visrect.left, dst->visrect.bottom - dst->visrect.top ); + physdev_src->x11dev->dc_rect.left + src->x, + physdev_src->x11dev->dc_rect.top + src->y, + physdev_dst->x11dev->dc_rect.left + dst->x, + physdev_dst->x11dev->dc_rect.top + dst->y, + xscale, yscale, dst->width, dst->height ); if (tmp_pict) pXRenderFreePicture( gdi_display, tmp_pict ); wine_tsx11_unlock();