mirror of https://github.com/FreeRDP/FreeRDP
libfreerdp-core: start implementing server-side drawing orders
This commit is contained in:
parent
43fe216179
commit
95c5ea86b0
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue