From 0bb67a0a69084d16924099bd0577a754c24aaf5c Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Thu, 30 Mar 2017 15:42:13 +0200 Subject: [PATCH] improve rdpegfx drawing for software gdi process the region's rectangles individually instead of just copying the extents --- libfreerdp/gdi/gfx.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c index ef8c17eca..49c96c20e 100644 --- a/libfreerdp/gdi/gfx.c +++ b/libfreerdp/gdi/gfx.c @@ -100,7 +100,8 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) UINT16 width, height; UINT32 surfaceX, surfaceY; RECTANGLE_16 surfaceRect; - const RECTANGLE_16* extents; + const RECTANGLE_16* rects; + UINT32 i, nbRects; rdpUpdate* update = gdi->context->update; surfaceX = surface->outputOriginX; surfaceY = surface->outputOriginY; @@ -111,16 +112,19 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) region16_intersect_rect(&(surface->invalidRegion), &(surface->invalidRegion), &surfaceRect); - if (!region16_is_empty(&(surface->invalidRegion))) + if (!(rects = region16_rects(&surface->invalidRegion, &nbRects)) || !nbRects) + return CHANNEL_RC_OK; + + update->BeginPaint(gdi->context); + + for (i = 0; i < nbRects; i++) { - extents = region16_extents(&(surface->invalidRegion)); - nXSrc = extents->left; - nYSrc = extents->top; - nXDst = surfaceX + extents->left; - nYDst = surfaceY + extents->top; - width = extents->right - extents->left; - height = extents->bottom - extents->top; - update->BeginPaint(gdi->context); + nXSrc = rects[i].left; + nYSrc = rects[i].top; + nXDst = surfaceX + nXSrc; + nYDst = surfaceY + nYSrc; + width = rects[i].right - rects[i].left; + height = rects[i].bottom - rects[i].top; if (!freerdp_image_copy(gdi->primary_buffer, gdi->primary->hdc->format, gdi->stride, @@ -130,9 +134,10 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) return CHANNEL_RC_NULL_DATA; gdi_InvalidateRegion(gdi->primary->hdc, nXDst, nYDst, width, height); - update->EndPaint(gdi->context); } + update->EndPaint(gdi->context); + region16_clear(&(surface->invalidRegion)); return CHANNEL_RC_OK; }