From 2869b367cb200bc8c2fa8674e8333bafff09a62c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 22 Jun 2011 01:06:55 -0400 Subject: libfreerdp-gdi: decode.c fix for RemoteFX clipping regions --- libfreerdp-gdi/decode.c | 58 +++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/libfreerdp-gdi/decode.c b/libfreerdp-gdi/decode.c index f0ee140..1c1ad75 100644 --- a/libfreerdp-gdi/decode.c +++ b/libfreerdp-gdi/decode.c @@ -30,25 +30,27 @@ #include "decode.h" -void gdi_decode_bitmap_data(GDI *gdi, int x, int y, uint8 * data, uint32 length) +int gdi_decode_bitmap_data_ex(GDI *gdi, uint16 x, uint16 y, uint8 * data, int size) { int i, tx, ty; + uint8* bitmapData; + uint32 bitmapDataLength; RFX_MESSAGE * message; - message = rfx_process_message((RFX_CONTEXT *) gdi->rfx_context, data, length); + /* BITMAP_DATA_EX */ + /* bpp (1 byte) */ + /* reserved1 (1 byte) */ + /* reserved2 (1 byte) */ + /* codecID (1 byte) */ + /* width (2 bytes) */ + /* height (2 bytes) */ + bitmapDataLength = GET_UINT32(data, 8); /* bitmapDataLength (4 bytes) */ + bitmapData = data + 12; /* bitmapData */ - if (message->num_rects > 1) - { - printf("warning: more than one clipping region\n"); - } - - for (i = 0; i < message->num_rects; i++) - { - tx = message->rects[i].x + x; - ty = message->rects[i].y + y; - gdi_SetClipRgn(gdi->primary->hdc, tx, ty, message->rects[i].width, message->rects[i].height); - } + /* decode bitmap data */ + message = rfx_process_message((RFX_CONTEXT *) gdi->rfx_context, bitmapData, bitmapDataLength); + /* blit each tile */ for (i = 0; i < message->num_tiles; i++) { tx = message->tiles[i]->x + x; @@ -62,32 +64,32 @@ void gdi_decode_bitmap_data(GDI *gdi, int x, int y, uint8 * data, uint32 length) } rfx_message_free(gdi->rfx_context, message); + + return bitmapDataLength + 12; } int gdi_decode_surface_bits(GDI *gdi, uint8 * data, int size) { - int destLeft; - int destTop; - uint32 bitmapDataLength; + int length; + uint16 destLeft; + uint16 destTop; + uint16 destRight; + uint16 destBottom; /* SURFCMD_STREAM_SURF_BITS */ /* cmdType (2 bytes) */ destLeft = GET_UINT16(data, 2); /* destLeft (2 bytes) */ destTop = GET_UINT16(data, 4); /* destTop (2 bytes) */ - /* destRight (2 bytes) */ - /* destBottom (2 bytes) */ + destRight = GET_UINT16(data, 6); /* destRight (2 bytes) */ + destBottom = GET_UINT16(data, 8); /* destBottom (2 bytes) */ - /* BITMAP_DATA_EX */ - /* bpp (1 byte) */ - /* reserved1 (1 byte) */ - /* reserved2 (1 byte) */ - /* codecID (1 byte) */ - /* width (2 bytes) */ - /* height (2 bytes) */ - bitmapDataLength = GET_UINT32(data, 18); /* bitmapDataLength (4 bytes) */ - gdi_decode_bitmap_data(gdi, destLeft, destTop, data + 22, bitmapDataLength); /* bitmapData*/ + /* set clipping region */ + gdi_SetClipRgn(gdi->primary->hdc, destLeft, destTop, destRight - destLeft, destBottom - destTop); + + /* decode extended bitmap data */ + length = gdi_decode_bitmap_data_ex(gdi, destLeft, destTop, data + 10, size - 10) + 10; - return 22 + bitmapDataLength; + return length; } int gdi_decode_frame_marker(GDI *gdi, uint8 * data, int size) -- cgit v1.2.3