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 08:17:35 +0400
committerMarc-André Moreau <marcandre.moreau@gmail.com>2011-06-22 08:17:35 +0400
commit3ccc01ff6a03fdb238cde2e414722013f5f81097 (patch)
treeb9bafcea94d9c710a2c10000b1efcb0f55d7544e
parent39e4883a7e03d7672f8e90cc5d2a804b0d5626c7 (diff)
libfreerdp-gdi: refactoring of surface commands in decode.c
-rw-r--r--include/freerdp/constants/ui.h2
-rw-r--r--libfreerdp-gdi/decode.c73
-rw-r--r--libfreerdp-gdi/decode.h4
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 */