Fixed X11 cursor decoding.
authorArmin Novak <armin.novak@gmail.com>
Fri, 9 Sep 2016 06:58:26 +0000 (08:58 +0200)
committerArmin Novak <armin.novak@thincast.com>
Thu, 6 Oct 2016 11:43:11 +0000 (13:43 +0200)
client/X11/xf_graphics.c

index a443cac..7cfc267 100644 (file)
@@ -167,15 +167,18 @@ static BOOL xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap,
 /* Pointer Class */
 static BOOL xf_Pointer_New(rdpContext* context, rdpPointer* pointer)
 {
+#ifdef WITH_XCURSOR
+       UINT32 CursorFormat = PIXEL_FORMAT_RGBA32;
        rdpGdi* gdi;
+       size_t size;
+       XcursorImage ci;
+       xfContext* xfc = (xfContext*) context;
+       xfPointer* xpointer = (xfPointer*)pointer;
 
        if (!context || !pointer || !context->gdi)
                return FALSE;
 
        gdi = context->gdi;
-#ifdef WITH_XCURSOR
-       XcursorImage ci;
-       xfContext* xfc = (xfContext*) context;
        xf_lock_x11(xfc, FALSE);
        ZeroMemory(&ci, sizeof(ci));
        ci.version = XCURSOR_IMAGE_VERSION;
@@ -184,28 +187,27 @@ static BOOL xf_Pointer_New(rdpContext* context, rdpPointer* pointer)
        ci.height = pointer->height;
        ci.xhot = pointer->xPos;
        ci.yhot = pointer->yPos;
-
-       if (!(ci.pixels = (XcursorPixel*) calloc(ci.height,
-                         ci.width * GetBytesPerPixel(gdi->dstFormat))))
+       size = ci.height * ci.width * GetBytesPerPixel(CursorFormat);
+       if (!(ci.pixels = (XcursorPixel*) _aligned_malloc(size, 16)))
        {
                xf_unlock_x11(xfc, FALSE);
                return FALSE;
        }
 
        if (freerdp_image_copy_from_pointer_data(
-               (BYTE*) ci.pixels, gdi->dstFormat,
+           (BYTE*) ci.pixels, CursorFormat,
                0, 0, 0, pointer->width, pointer->height,
                pointer->xorMaskData, pointer->lengthXorMask,
                pointer->andMaskData, pointer->lengthAndMask,
                pointer->xorBpp, &context->gdi->palette) < 0)
        {
-               free(ci.pixels);
+               _aligned_free(ci.pixels);
                xf_unlock_x11(xfc, FALSE);
                return FALSE;
        }
 
-       ((xfPointer*) pointer)->cursor = XcursorImageLoadCursor(xfc->display, &ci);
-       free(ci.pixels);
+       xpointer->cursor = XcursorImageLoadCursor(xfc->display, &ci);
+       _aligned_free(ci.pixels);
        xf_unlock_x11(xfc, FALSE);
 #endif
        return TRUE;