Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRDP/FreeRDP-old.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Moreau <marcandre.moreau@gmail.com>2011-06-22 09:06:55 +0400
committerMarc-André Moreau <marcandre.moreau@gmail.com>2011-06-22 09:06:55 +0400
commit2869b367cb200bc8c2fa8674e8333bafff09a62c (patch)
treeff6441fb45f3234790b78a9899479b9310db451e
parentffa3785b7a065cb36c3648c5c1f7a62864ba14a2 (diff)
libfreerdp-gdi: decode.c fix for RemoteFX clipping regions
-rw-r--r--libfreerdp-gdi/decode.c58
1 files 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)