From 90cd2a8a457d1ca39d2f89591fc4c148d2070d3d Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 3 Aug 2016 14:22:55 +0200 Subject: [PATCH] Fixed color pointer. --- client/Windows/wf_graphics.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c index 87e0b4a..aa6fcc5 100644 --- a/client/Windows/wf_graphics.c +++ b/client/Windows/wf_graphics.c @@ -194,6 +194,7 @@ static BOOL wf_Pointer_New(rdpContext* context, const rdpPointer* pointer) HCURSOR hCur; ICONINFO info; rdpGdi* gdi; + BOOL rc = FALSE; if (!context || !pointer) return FALSE; @@ -211,6 +212,9 @@ static BOOL wf_Pointer_New(rdpContext* context, const rdpPointer* pointer) { BYTE* pdata = (BYTE*) _aligned_malloc(pointer->lengthAndMask + pointer->lengthXorMask, 16); + if (!pdata) + goto fail; + CopyMemory(pdata, pointer->andMaskData, pointer->lengthAndMask); CopyMemory(pdata + pointer->lengthAndMask, pointer->xorMaskData, pointer->lengthXorMask); @@ -220,29 +224,43 @@ static BOOL wf_Pointer_New(rdpContext* context, const rdpPointer* pointer) } else { - const UINT32 scanline = pointer->width * pointer->xorBpp / 8; BYTE* pdata = (BYTE*) _aligned_malloc(pointer->lengthAndMask, 16); + if (!pdata) + goto fail; + flip_bitmap(pointer->andMaskData, pdata, (pointer->width + 7) / 8, pointer->height); info.hbmMask = CreateBitmap(pointer->width, pointer->height, 1, 1, pdata); _aligned_free(pdata); - pdata = (BYTE*) _aligned_malloc(pointer->lengthXorMask, 16); - flip_bitmap(pointer->xorMaskData, pdata, scanline, pointer->height); + pdata = (BYTE*) _aligned_malloc(pointer->width * pointer->height * GetBitsPerPixel(gdi->dstFormat), 16); + if (!pdata) + goto fail; + + if (!freerdp_image_copy_from_pointer_data(pdata, gdi->dstFormat, 0, 0, 0, pointer->width, pointer->height, + pointer->xorMaskData, pointer->lengthXorMask, + pointer->andMaskData, pointer->lengthAndMask, pointer->xorBpp, &gdi->palette)) + { + _aligned_free(pdata); + goto fail; + } info.hbmColor = CreateBitmap(pointer->width, pointer->height, 1, - pointer->xorBpp, pdata); + GetBitsPerPixel(gdi->dstFormat), pdata); _aligned_free(pdata); } hCur = CreateIconIndirect(&info); ((wfPointer*) pointer)->cursor = hCur; + rc = TRUE; + +fail: if (info.hbmMask) DeleteObject(info.hbmMask); if (info.hbmColor) DeleteObject(info.hbmColor); - return TRUE; + return rc; } static BOOL wf_Pointer_Free(rdpContext* context, rdpPointer* pointer) -- 2.7.4