diff options
author | Marc-André Moreau <marcandre.moreau@gmail.com> | 2011-06-22 08:17:35 +0400 |
---|---|---|
committer | Marc-André Moreau <marcandre.moreau@gmail.com> | 2011-06-22 08:17:35 +0400 |
commit | 3ccc01ff6a03fdb238cde2e414722013f5f81097 (patch) | |
tree | b9bafcea94d9c710a2c10000b1efcb0f55d7544e | |
parent | 39e4883a7e03d7672f8e90cc5d2a804b0d5626c7 (diff) |
libfreerdp-gdi: refactoring of surface commands in decode.c
-rw-r--r-- | include/freerdp/constants/ui.h | 2 | ||||
-rw-r--r-- | libfreerdp-gdi/decode.c | 73 | ||||
-rw-r--r-- | libfreerdp-gdi/decode.h | 4 |
3 files changed, 61 insertions, 18 deletions
diff --git a/include/freerdp/constants/ui.h b/include/freerdp/constants/ui.h index 02c17e9..61db60c 100644 --- a/include/freerdp/constants/ui.h +++ b/include/freerdp/constants/ui.h @@ -54,7 +54,7 @@ #define PERF_ENABLE_DESKTOP_COMPOSITION 0x00000100 /* Surface Command */ -#define CMDTYPE_SET_SURFACE_BITS 0x0001 +#define CMDTYPE_SET_SURFACE_BITS 0x0001 #define CMDTYPE_FRAME_MARKER 0x0004 #define CMDTYPE_STREAM_SURFACE_BITS 0x0006 diff --git a/libfreerdp-gdi/decode.c b/libfreerdp-gdi/decode.c index a26072b..f0ee140 100644 --- a/libfreerdp-gdi/decode.c +++ b/libfreerdp-gdi/decode.c @@ -30,7 +30,7 @@ #include "decode.h" -void gdi_decode_frame(GDI *gdi, int x, int y, uint8 * data, uint32 length) +void gdi_decode_bitmap_data(GDI *gdi, int x, int y, uint8 * data, uint32 length) { int i, tx, ty; RFX_MESSAGE * message; @@ -64,38 +64,81 @@ void gdi_decode_frame(GDI *gdi, int x, int y, uint8 * data, uint32 length) rfx_message_free(gdi->rfx_context, message); } -void gdi_decode_data(GDI *gdi, uint8 * data, int data_size) +int gdi_decode_surface_bits(GDI *gdi, uint8 * data, int size) { - int size; int destLeft; int destTop; + uint32 bitmapDataLength; + + /* 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) */ + + /* 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*/ + + return 22 + bitmapDataLength; +} + +int gdi_decode_frame_marker(GDI *gdi, uint8 * data, int size) +{ + uint16 frameAction; + uint32 frameId; + + frameAction = GET_UINT16(data, 0); /* frameAction */ + frameId = GET_UINT32(data, 2); /* frameId */ + + switch (frameAction) + { + case SURFACECMD_FRAMEACTION_BEGIN: + break; + + case SURFACECMD_FRAMEACTION_END: + break; + + default: + break; + } + + return 8; +} + +void gdi_decode_data(GDI *gdi, uint8 * data, int size) +{ + int cmdLength; uint16 cmdType; - uint32 length; - while (data_size > 0) + while (size > 0) { - cmdType = GET_UINT16(data, 0); + cmdType = GET_UINT16(data, 0); /* cmdType */ switch (cmdType) { case CMDTYPE_SET_SURFACE_BITS: case CMDTYPE_STREAM_SURFACE_BITS: - destLeft = GET_UINT16(data, 2); - destTop = GET_UINT16(data, 4); - length = GET_UINT32(data, 18); - gdi_decode_frame(gdi, destLeft, destTop, data + 22, length); - size = 22 + length; + cmdLength = gdi_decode_surface_bits(gdi, data, size); break; case CMDTYPE_FRAME_MARKER: - size = 8; + cmdLength = gdi_decode_frame_marker(gdi, data, size); break; default: - size = 2; + cmdLength = 2; break; } - data_size -= size; - data += size; + + size -= cmdLength; + data += cmdLength; } } diff --git a/libfreerdp-gdi/decode.h b/libfreerdp-gdi/decode.h index ccadb29..408241a 100644 --- a/libfreerdp-gdi/decode.h +++ b/libfreerdp-gdi/decode.h @@ -25,7 +25,7 @@ #include "gdi.h" -void gdi_decode_frame(GDI *gdi, int x, int y, uint8 * data, uint32 length); -void gdi_decode_data(GDI *gdi, uint8 * data, int data_size); +void gdi_decode_bitmap_data(GDI *gdi, int x, int y, uint8 * data, uint32 length); +void gdi_decode_data(GDI *gdi, uint8 * data, int size); #endif /* __DECODE_H */ |