Added polyline order (undocumented, id 22)
git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@14 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
d7b51f3e70
commit
23514dce50
94
orders.c
94
orders.c
@ -441,6 +441,93 @@ static void process_triblt(STREAM s, TRIBLT_ORDER *os,
|
|||||||
&os->brush, os->bgcolour, os->fgcolour);
|
&os->brush, os->bgcolour, os->fgcolour);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse a delta co-ordinate in polyline order form */
|
||||||
|
static int parse_delta(uint8 *buffer, int *offset)
|
||||||
|
{
|
||||||
|
int value = buffer[(*offset)++];
|
||||||
|
int two_byte = value & 0x80;
|
||||||
|
|
||||||
|
if (value & 0x40) /* sign bit */
|
||||||
|
value |= ~0x3f;
|
||||||
|
else
|
||||||
|
value &= 0x3f;
|
||||||
|
|
||||||
|
if (two_byte)
|
||||||
|
value = (value << 8) | buffer[(*offset)++];
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process a polyline order */
|
||||||
|
static void process_polyline(STREAM s, POLYLINE_ORDER *os,
|
||||||
|
uint32 present, BOOL delta)
|
||||||
|
{
|
||||||
|
int index, line, data;
|
||||||
|
int x, y, xfrom, yfrom;
|
||||||
|
uint8 flags = 0;
|
||||||
|
PEN pen;
|
||||||
|
|
||||||
|
if (present & 0x01)
|
||||||
|
rdp_in_coord(s, &os->x, delta);
|
||||||
|
|
||||||
|
if (present & 0x02)
|
||||||
|
rdp_in_coord(s, &os->y, delta);
|
||||||
|
|
||||||
|
if (present & 0x04)
|
||||||
|
in_uint8(s, os->flags);
|
||||||
|
|
||||||
|
if (present & 0x10)
|
||||||
|
rdp_in_colour(s, &os->fgcolour);
|
||||||
|
|
||||||
|
if (present & 0x20)
|
||||||
|
in_uint8(s, os->lines);
|
||||||
|
|
||||||
|
if (present & 0x40)
|
||||||
|
{
|
||||||
|
in_uint8(s, os->datasize);
|
||||||
|
in_uint8a(s, os->data, os->datasize);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",
|
||||||
|
os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize);
|
||||||
|
|
||||||
|
DEBUG("Data: ");
|
||||||
|
|
||||||
|
for (index = 0; index < os->datasize; index++)
|
||||||
|
DEBUG("%02x ", os->data[index]);
|
||||||
|
|
||||||
|
DEBUG("\n");
|
||||||
|
|
||||||
|
x = os->x;
|
||||||
|
y = os->y;
|
||||||
|
pen.style = pen.width = 0;
|
||||||
|
pen.colour = os->fgcolour;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
data = ((os->lines - 1) / 4) + 1;
|
||||||
|
for (line = 0; (line < os->lines) && (data < os->datasize); line++)
|
||||||
|
{
|
||||||
|
xfrom = x;
|
||||||
|
yfrom = y;
|
||||||
|
|
||||||
|
if (line % 4 == 0)
|
||||||
|
flags = os->data[index++];
|
||||||
|
|
||||||
|
if ((flags & 0xc0) == 0)
|
||||||
|
flags |= 0xc0; /* none = both */
|
||||||
|
|
||||||
|
if (flags & 0x40)
|
||||||
|
x += parse_delta(os->data, &data);
|
||||||
|
|
||||||
|
if (flags & 0x80)
|
||||||
|
y += parse_delta(os->data, &data);
|
||||||
|
|
||||||
|
ui_line(ROP2_COPY, xfrom, yfrom, x, y, &pen);
|
||||||
|
|
||||||
|
flags <<= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Process a text order */
|
/* Process a text order */
|
||||||
static void process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)
|
static void process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)
|
||||||
{
|
{
|
||||||
@ -515,7 +602,7 @@ static void process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)
|
|||||||
DEBUG("\n");
|
DEBUG("\n");
|
||||||
|
|
||||||
/* Process special cache strings */
|
/* Process special cache strings */
|
||||||
if ((os->length == 2) && (os->text[0] == 0xfe))
|
if ((os->length >= 2) && (os->text[0] == 0xfe))
|
||||||
{
|
{
|
||||||
entry = cache_get_text(os->text[1]);
|
entry = cache_get_text(os->text[1]);
|
||||||
|
|
||||||
@ -824,6 +911,11 @@ void process_orders(STREAM s)
|
|||||||
present, delta);
|
present, delta);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDP_ORDER_POLYLINE:
|
||||||
|
process_polyline(s, &os->polyline,
|
||||||
|
present, delta);
|
||||||
|
break;
|
||||||
|
|
||||||
case RDP_ORDER_TEXT2:
|
case RDP_ORDER_TEXT2:
|
||||||
process_text2(s, &os->text2,
|
process_text2(s, &os->text2,
|
||||||
present, delta);
|
present, delta);
|
||||||
|
16
orders.h
16
orders.h
@ -37,6 +37,7 @@ enum RDP_ORDER_TYPE
|
|||||||
RDP_ORDER_DESKSAVE = 11,
|
RDP_ORDER_DESKSAVE = 11,
|
||||||
RDP_ORDER_MEMBLT = 13,
|
RDP_ORDER_MEMBLT = 13,
|
||||||
RDP_ORDER_TRIBLT = 14,
|
RDP_ORDER_TRIBLT = 14,
|
||||||
|
RDP_ORDER_POLYLINE = 22,
|
||||||
RDP_ORDER_TEXT2 = 27
|
RDP_ORDER_TEXT2 = 27
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -151,6 +152,20 @@ typedef struct _MEMBLT_ORDER
|
|||||||
|
|
||||||
} MEMBLT_ORDER;
|
} MEMBLT_ORDER;
|
||||||
|
|
||||||
|
#define MAX_DATA 256
|
||||||
|
|
||||||
|
typedef struct _POLYLINE_ORDER
|
||||||
|
{
|
||||||
|
uint16 x;
|
||||||
|
uint16 y;
|
||||||
|
uint8 flags;
|
||||||
|
uint8 fgcolour;
|
||||||
|
uint8 lines;
|
||||||
|
uint8 datasize;
|
||||||
|
uint8 data[MAX_DATA];
|
||||||
|
|
||||||
|
} POLYLINE_ORDER;
|
||||||
|
|
||||||
#define MAX_TEXT 256
|
#define MAX_TEXT 256
|
||||||
|
|
||||||
typedef struct _TEXT2_ORDER
|
typedef struct _TEXT2_ORDER
|
||||||
@ -189,6 +204,7 @@ typedef struct _RDP_ORDER_STATE
|
|||||||
DESKSAVE_ORDER desksave;
|
DESKSAVE_ORDER desksave;
|
||||||
MEMBLT_ORDER memblt;
|
MEMBLT_ORDER memblt;
|
||||||
TRIBLT_ORDER triblt;
|
TRIBLT_ORDER triblt;
|
||||||
|
POLYLINE_ORDER polyline;
|
||||||
TEXT2_ORDER text2;
|
TEXT2_ORDER text2;
|
||||||
|
|
||||||
} RDP_ORDER_STATE;
|
} RDP_ORDER_STATE;
|
||||||
|
Loading…
Reference in New Issue
Block a user