From f62d00445e548fd1b78eab8fc9ff3f646be228b6 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 27 Oct 2016 22:59:16 +0200 Subject: [PATCH] Fixed surface alignment. --- client/X11/xf_gfx.c | 7 +++++-- libfreerdp/gdi/gfx.c | 12 ++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/client/X11/xf_gfx.c b/client/X11/xf_gfx.c index 6f205bd..c046d42 100644 --- a/client/X11/xf_gfx.c +++ b/client/X11/xf_gfx.c @@ -232,8 +232,11 @@ static UINT xf_CreateSurface(RdpgfxClientContext* context, if (xfc->scanline_pad > 0) { - surface->gdi.scanline += (xfc->scanline_pad / 8); - surface->gdi.scanline -= (surface->gdi.scanline % (xfc->scanline_pad / 8)); + const UINT32 align = xfc->scanline_pad / 8; + const UINT32 pad = align - (surface->gdi.scanline % align); + + if (align != pad) + surface->gdi.scanline += pad; } size = surface->gdi.scanline * surface->gdi.height; diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c index 5c9c759..94b78e0 100644 --- a/libfreerdp/gdi/gfx.c +++ b/libfreerdp/gdi/gfx.c @@ -698,8 +698,16 @@ static UINT gdi_CreateSurface(RdpgfxClientContext* context, return ERROR_INTERNAL_ERROR; } - surface->scanline = (surface->width + (surface->width % 4)) * 4; - surface->data = (BYTE*) calloc(1, surface->scanline * surface->height); + surface->scanline = surface->width * 4; + { + const UINT32 align = 16; + const UINT32 pad = align - (surface->scanline % align); + + if (align != pad) + surface->scanline += pad; + + surface->data = (BYTE*) calloc(1, surface->scanline * surface->height); + } if (!surface->data) { -- 2.7.4