libfreerdp-core: start implementing server-side drawing orders

This commit is contained in:
Marc-André Moreau 2013-05-06 22:27:19 -04:00
parent 43fe216179
commit 95c5ea86b0
3 changed files with 88 additions and 3 deletions

View File

@ -154,6 +154,7 @@ static INLINE BOOL update_read_coord(wStream* s, INT32* coord, BOOL delta)
{
if (Stream_GetRemainingLength(s) < 1)
return FALSE;
stream_read_BYTE(s, lsi8);
*coord += lsi8;
}
@ -161,9 +162,27 @@ static INLINE BOOL update_read_coord(wStream* s, INT32* coord, BOOL delta)
{
if (Stream_GetRemainingLength(s) < 2)
return FALSE;
stream_read_UINT16(s, lsi16);
*coord = lsi16;
}
return TRUE;
}
static INLINE BOOL update_write_coord(wStream* s, INT32 coord)
{
stream_write_UINT16(s, coord);
return TRUE;
}
static INLINE BOOL update_write_coord_delta(wStream* s, INT32 prevCoord, INT32 nextCoord)
{
INT8 lsi8;
lsi8 = nextCoord - prevCoord;
stream_write_BYTE(s, lsi8);
return TRUE;
}
@ -623,23 +642,59 @@ BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_REC
{
if (Stream_GetRemainingLength(s) < 1)
return FALSE;
stream_read_BYTE(s, byte);
opaque_rect->color = (opaque_rect->color & 0xFFFFFF00) | byte;
}
if (orderInfo->fieldFlags & ORDER_FIELD_06) {
if (orderInfo->fieldFlags & ORDER_FIELD_06)
{
if (Stream_GetRemainingLength(s) < 1)
return FALSE;
stream_read_BYTE(s, byte);
opaque_rect->color = (opaque_rect->color & 0xFFFF00FF) | (byte << 8);
}
if (orderInfo->fieldFlags & ORDER_FIELD_07) {
if (orderInfo->fieldFlags & ORDER_FIELD_07)
{
if (Stream_GetRemainingLength(s) < 1)
return FALSE;
stream_read_BYTE(s, byte);
opaque_rect->color = (opaque_rect->color & 0xFF00FFFF) | (byte << 16);
}
return TRUE;
}
BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect)
{
BYTE byte;
orderInfo->fieldFlags = 0;
orderInfo->fieldFlags |= ORDER_FIELD_01;
update_write_coord(s, opaque_rect->nLeftRect);
orderInfo->fieldFlags |= ORDER_FIELD_02;
update_write_coord(s, opaque_rect->nTopRect);
orderInfo->fieldFlags |= ORDER_FIELD_03;
update_write_coord(s, opaque_rect->nWidth);
orderInfo->fieldFlags |= ORDER_FIELD_04;
update_write_coord(s, opaque_rect->nHeight);
orderInfo->fieldFlags |= ORDER_FIELD_05;
byte = opaque_rect->color & 0x000000FF;
stream_write_BYTE(s, byte);
orderInfo->fieldFlags |= ORDER_FIELD_06;
byte = (opaque_rect->color & 0x0000FF00) >> 8;
stream_write_BYTE(s, byte);
orderInfo->fieldFlags |= ORDER_FIELD_07;
byte = (opaque_rect->color & 0x00FF0000) >> 16;
stream_write_BYTE(s, byte);
return TRUE;
}
@ -722,6 +777,7 @@ BOOL update_read_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCR
BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
{
BYTE byte;
ORDER_FIELD_COORD(1, multi_opaque_rect->nLeftRect);
ORDER_FIELD_COORD(2, multi_opaque_rect->nTopRect);
ORDER_FIELD_COORD(3, multi_opaque_rect->nWidth);

View File

@ -192,6 +192,7 @@ BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* d
BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt);
BOOL update_read_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt);
BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect);
BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect);
BOOL update_read_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid);
BOOL update_read_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt);
BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt);

View File

@ -22,6 +22,7 @@
#endif
#include <winpr/crt.h>
#include <winpr/print.h>
#include <winpr/thread.h>
#include <winpr/collections.h>
@ -57,6 +58,7 @@ BOOL update_recv_orders(rdpUpdate* update, wStream* s)
{
if (!update_recv_order(update, s))
return FALSE;
numberOrders--;
}
@ -592,6 +594,31 @@ static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
}
static void update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect)
{
wStream* s;
BYTE *bm, *em;
ORDER_INFO orderInfo;
rdpRdp* rdp = context->rdp;
orderInfo.fieldFlags = 0;
s = fastpath_update_pdu_init(rdp->fastpath);
bm = Stream_Pointer(s);
Stream_Seek(s, 5);
update_write_opaque_rect_order(s, &orderInfo, opaque_rect);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;
stream_write_UINT16(s, 1); /* numberOrders (2 bytes) */
stream_write_BYTE(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
stream_write_BYTE(s, ORDER_TYPE_OPAQUE_RECT); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.fieldFlags); /* fieldFlags (variable) */
Stream_Pointer(s) = em;
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
}
static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system)
{
wStream* s;
@ -721,6 +748,7 @@ void update_register_server_callbacks(rdpUpdate* update)
update->SurfaceFrameMarker = update_send_surface_frame_marker;
update->SurfaceCommand = update_send_surface_command;
update->primary->ScrBlt = update_send_scrblt;
update->primary->OpaqueRect = update_send_opaque_rect;
update->pointer->PointerSystem = update_send_pointer_system;
update->pointer->PointerColor = update_send_pointer_color;
update->pointer->PointerNew = update_send_pointer_new;
@ -745,7 +773,7 @@ rdpUpdate* update_new(rdpRdp* rdp)
update = (rdpUpdate*) malloc(sizeof(rdpUpdate));
if (update != NULL)
if (update)
{
OFFSCREEN_DELETE_LIST* deleteList;