libfreerdp-core: fix some order parsing bugs

This commit is contained in:
Marc-André Moreau 2011-08-03 03:29:56 -04:00
parent b4437a783c
commit abaa1752bf
4 changed files with 408 additions and 168 deletions

View File

@ -266,44 +266,6 @@ typedef struct
uint8 operation;
} SAVE_BITMAP_ORDER;
typedef struct
{
uint8 cacheId;
uint16 fDrawing;
uint32 backColor;
uint32 foreColor;
sint16 bkLeft;
sint16 bkTop;
sint16 bkRight;
sint16 bkBottom;
sint16 opLeft;
sint16 opTop;
sint16 opRight;
sint16 opBottom;
uint16 x;
uint16 y;
uint8* data;
} FAST_INDEX_ORDER;
typedef struct
{
uint8 cacheId;
uint16 fDrawing;
uint32 backColor;
uint32 foreColor;
sint16 bkLeft;
sint16 bkTop;
sint16 bkRight;
sint16 bkBottom;
sint16 opLeft;
sint16 opTop;
sint16 opRight;
sint16 opBottom;
uint16 x;
uint16 y;
uint8* data;
} FAST_GLYPH_ORDER;
typedef struct
{
uint8 cacheId;
@ -330,6 +292,46 @@ typedef struct
uint8* data;
} GLYPH_INDEX_ORDER;
typedef struct
{
uint8 cacheId;
uint8 flAccel;
uint8 ulCharInc;
uint32 backColor;
uint32 foreColor;
sint16 bkLeft;
sint16 bkTop;
sint16 bkRight;
sint16 bkBottom;
sint16 opLeft;
sint16 opTop;
sint16 opRight;
sint16 opBottom;
uint16 x;
uint16 y;
uint8* data;
} FAST_INDEX_ORDER;
typedef struct
{
uint8 cacheId;
uint8 flAccel;
uint8 ulCharInc;
uint32 backColor;
uint32 foreColor;
sint16 bkLeft;
sint16 bkTop;
sint16 bkRight;
sint16 bkBottom;
sint16 opLeft;
sint16 opTop;
sint16 opRight;
sint16 opBottom;
uint16 x;
uint16 y;
uint8* data;
} FAST_GLYPH_ORDER;
typedef struct
{
sint16 xStart;
@ -440,6 +442,7 @@ typedef struct
uint16 y;
uint16 cx;
uint16 cy;
uint16 cb;
uint8* aj;
} GLYPH_DATA;
@ -458,6 +461,7 @@ typedef struct
sint16 y;
uint16 cx;
uint16 cy;
uint16 cb;
uint8* aj;
} GLYPH_DATA_V2;
@ -473,11 +477,11 @@ typedef struct
typedef struct
{
uint8 cacheEntry;
uint8 iBitmapFormat;
uint8 bpp;
uint8 cx;
uint8 cy;
uint8 style;
uint8 iBytes;
uint8 length;
uint8* brushData;
} CACHE_BRUSH_ORDER;
@ -659,9 +663,9 @@ typedef void (*pcPolyline)(rdpUpdate* update, POLYLINE_ORDER* polyline);
typedef void (*pcMemBlt)(rdpUpdate* update, MEMBLT_ORDER* memblt);
typedef void (*pcMem3Blt)(rdpUpdate* update, MEM3BLT_ORDER* memblt);
typedef void (*pcSaveBitmap)(rdpUpdate* update, SAVE_BITMAP_ORDER* save_bitmap);
typedef void (*pcGlyphIndex)(rdpUpdate* update, GLYPH_INDEX_ORDER* glyph_index);
typedef void (*pcFastIndex)(rdpUpdate* update, FAST_INDEX_ORDER* fast_index);
typedef void (*pcFastGlyph)(rdpUpdate* update, FAST_GLYPH_ORDER* fast_glyph);
typedef void (*pcGlyphIndex)(rdpUpdate* update, GLYPH_INDEX_ORDER* glyph_index);
typedef void (*pcPolygonSC)(rdpUpdate* update, POLYGON_SC_ORDER* polygon_sc);
typedef void (*pcPolygonCB)(rdpUpdate* update, POLYGON_CB_ORDER* polygon_cb);
typedef void (*pcEllipseSC)(rdpUpdate* update, ELLIPSE_SC_ORDER* ellipse_sc);
@ -717,9 +721,9 @@ struct rdp_update
pcMemBlt MemBlt;
pcMem3Blt Mem3Blt;
pcSaveBitmap SaveBitmap;
pcGlyphIndex GlyphIndex;
pcFastIndex FastIndex;
pcFastGlyph FastGlyph;
pcGlyphIndex GlyphIndex;
pcPolygonSC PolygonSC;
pcPolygonCB PolygonCB;
pcEllipseSC EllipseSC;
@ -766,9 +770,9 @@ struct rdp_update
MEMBLT_ORDER memblt;
MEM3BLT_ORDER mem3blt;
SAVE_BITMAP_ORDER save_bitmap;
GLYPH_INDEX_ORDER glyph_index;
FAST_INDEX_ORDER fast_index;
FAST_GLYPH_ORDER fast_glyph;
GLYPH_INDEX_ORDER glyph_index;
POLYGON_SC_ORDER polygon_sc;
POLYGON_CB_ORDER polygon_cb;
ELLIPSE_SC_ORDER ellipse_sc;

View File

@ -120,6 +120,11 @@ uint8 CBR23_BPP[] =
0, 0, 0, 8, 16, 24, 32
};
uint8 BMF_BPP[] =
{
0, 1, 0, 8, 16, 24, 32
};
void update_read_coord(STREAM* s, sint16* coord, boolean delta)
{
sint8 byte;
@ -160,7 +165,20 @@ void update_read_colorref(STREAM* s, uint32* color)
stream_seek_uint8(s);
}
void update_read_2byte_unsigned_encoding(STREAM* s, uint16* value)
void update_read_color_quad(STREAM* s, uint32* color)
{
uint8 byte;
stream_read_uint8(s, byte);
*color = (byte << 16);
stream_read_uint8(s, byte);
*color |= (byte << 8);
stream_read_uint8(s, byte);
*color |= byte;
stream_seek_uint8(s);
}
void update_read_2byte_unsigned(STREAM* s, uint16* value)
{
uint8 byte;
@ -178,6 +196,30 @@ void update_read_2byte_unsigned_encoding(STREAM* s, uint16* value)
}
}
void update_read_2byte_signed(STREAM* s, sint16* value)
{
uint8 byte;
boolean negative;
stream_read_uint8(s, byte);
negative = (byte & 0x02) ? True : False;
if (byte & 0x01)
{
*value = (byte & 0x3F) << 16;
stream_read_uint8(s, byte);
*value |= byte;
}
else
{
*value = byte;
}
if (negative)
*value *= -1;
}
/* Primary Drawing Orders */
void update_read_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt)
@ -298,7 +340,20 @@ void update_read_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, OPAQUE_RECT
void update_read_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid)
{
if (orderInfo->fieldFlags & ORDER_FIELD_01)
update_read_coord(s, &draw_nine_grid->srcLeft, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
update_read_coord(s, &draw_nine_grid->srcTop, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_03)
update_read_coord(s, &draw_nine_grid->srcRight, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_04)
update_read_coord(s, &draw_nine_grid->srcBottom, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_05)
stream_read_uint16(s, draw_nine_grid->bitmapId);
}
void update_read_multi_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt)
@ -323,10 +378,12 @@ void update_read_multi_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DSTB
if (orderInfo->fieldFlags & ORDER_FIELD_06)
stream_read_uint8(s, multi_dstblt->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_07)
{
stream_read_uint16(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_multi_patblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt)
{
@ -371,10 +428,12 @@ void update_read_multi_patblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_PATB
if (orderInfo->fieldFlags & ORDER_FIELD_13)
stream_read_uint8(s, multi_patblt->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_14)
{
stream_read_uint16(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_multi_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt)
{
@ -404,10 +463,12 @@ void update_read_multi_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_SCRB
if (orderInfo->fieldFlags & ORDER_FIELD_08)
stream_read_uint8(s, multi_scrblt->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_09)
{
stream_read_uint16(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_multi_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
{
@ -447,14 +508,40 @@ void update_read_multi_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, MULTI
if (orderInfo->fieldFlags & ORDER_FIELD_08)
stream_read_uint8(s, multi_opaque_rect->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_09)
{
stream_read_uint16(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_multi_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid)
{
uint16 cbData;
if (orderInfo->fieldFlags & ORDER_FIELD_01)
update_read_coord(s, &multi_draw_nine_grid->srcLeft, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
update_read_coord(s, &multi_draw_nine_grid->srcTop, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_03)
update_read_coord(s, &multi_draw_nine_grid->srcRight, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_04)
update_read_coord(s, &multi_draw_nine_grid->srcBottom, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_05)
stream_read_uint16(s, multi_draw_nine_grid->bitmapId);
if (orderInfo->fieldFlags & ORDER_FIELD_06)
stream_read_uint8(s, multi_draw_nine_grid->nDeltaEntries);
if (orderInfo->fieldFlags & ORDER_FIELD_07)
{
stream_read_uint16(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_line_to_order(STREAM* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to)
@ -509,10 +596,12 @@ void update_read_polyline_order(STREAM* s, ORDER_INFO* orderInfo, POLYLINE_ORDER
if (orderInfo->fieldFlags & ORDER_FIELD_05)
stream_read_uint8(s, polyline->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_06)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_memblt_order(STREAM* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt)
{
@ -616,6 +705,80 @@ void update_read_save_bitmap_order(STREAM* s, ORDER_INFO* orderInfo, SAVE_BITMAP
stream_read_uint8(s, save_bitmap->operation);
}
void update_read_glyph_index_order(STREAM* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index)
{
uint8 cbData;
if (orderInfo->fieldFlags & ORDER_FIELD_01)
stream_read_uint8(s, glyph_index->cacheId);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
stream_read_uint8(s, glyph_index->flAccel);
if (orderInfo->fieldFlags & ORDER_FIELD_03)
stream_read_uint8(s, glyph_index->ulCharInc);
if (orderInfo->fieldFlags & ORDER_FIELD_04)
stream_read_uint8(s, glyph_index->fOpRedundant);
if (orderInfo->fieldFlags & ORDER_FIELD_05)
update_read_color(s, &glyph_index->backColor);
if (orderInfo->fieldFlags & ORDER_FIELD_06)
update_read_color(s, &glyph_index->foreColor);
if (orderInfo->fieldFlags & ORDER_FIELD_07)
stream_read_uint16(s, glyph_index->bkLeft);
if (orderInfo->fieldFlags & ORDER_FIELD_08)
stream_read_uint16(s, glyph_index->bkTop);
if (orderInfo->fieldFlags & ORDER_FIELD_09)
stream_read_uint16(s, glyph_index->bkRight);
if (orderInfo->fieldFlags & ORDER_FIELD_10)
stream_read_uint16(s, glyph_index->bkBottom);
if (orderInfo->fieldFlags & ORDER_FIELD_11)
stream_read_uint16(s, glyph_index->opLeft);
if (orderInfo->fieldFlags & ORDER_FIELD_12)
stream_read_uint16(s, glyph_index->opTop);
if (orderInfo->fieldFlags & ORDER_FIELD_13)
stream_read_uint16(s, glyph_index->opRight);
if (orderInfo->fieldFlags & ORDER_FIELD_14)
stream_read_uint16(s, glyph_index->opBottom);
if (orderInfo->fieldFlags & ORDER_FIELD_15)
stream_read_uint8(s, glyph_index->brushOrgX);
if (orderInfo->fieldFlags & ORDER_FIELD_16)
stream_read_uint8(s, glyph_index->brushOrgY);
if (orderInfo->fieldFlags & ORDER_FIELD_17)
stream_read_uint8(s, glyph_index->brushStyle);
if (orderInfo->fieldFlags & ORDER_FIELD_18)
stream_read_uint8(s, glyph_index->brushHatch);
if (orderInfo->fieldFlags & ORDER_FIELD_19)
stream_read(s, glyph_index->brushExtra, 7);
if (orderInfo->fieldFlags & ORDER_FIELD_20)
stream_read_uint16(s, glyph_index->x);
if (orderInfo->fieldFlags & ORDER_FIELD_21)
stream_read_uint16(s, glyph_index->y);
if (orderInfo->fieldFlags & ORDER_FIELD_22)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_fast_index_order(STREAM* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index)
{
uint8 cbData;
@ -624,7 +787,10 @@ void update_read_fast_index_order(STREAM* s, ORDER_INFO* orderInfo, FAST_INDEX_O
stream_read_uint8(s, fast_index->cacheId);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
stream_read_uint16(s, fast_index->fDrawing);
{
stream_read_uint8(s, fast_index->ulCharInc);
stream_read_uint8(s, fast_index->flAccel);
}
if (orderInfo->fieldFlags & ORDER_FIELD_03)
update_read_color(s, &fast_index->backColor);
@ -662,10 +828,12 @@ void update_read_fast_index_order(STREAM* s, ORDER_INFO* orderInfo, FAST_INDEX_O
if (orderInfo->fieldFlags & ORDER_FIELD_14)
update_read_coord(s, &fast_index->y, orderInfo->deltaCoordinates);
/* bytes */
if (orderInfo->fieldFlags & ORDER_FIELD_15)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_fast_glyph_order(STREAM* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph)
{
@ -675,7 +843,10 @@ void update_read_fast_glyph_order(STREAM* s, ORDER_INFO* orderInfo, FAST_GLYPH_O
stream_read_uint8(s, fast_glyph->cacheId);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
stream_read_uint16(s, fast_glyph->fDrawing);
{
stream_read_uint8(s, fast_glyph->ulCharInc);
stream_read_uint8(s, fast_glyph->flAccel);
}
if (orderInfo->fieldFlags & ORDER_FIELD_03)
update_read_color(s, &fast_glyph->backColor);
@ -713,81 +884,11 @@ void update_read_fast_glyph_order(STREAM* s, ORDER_INFO* orderInfo, FAST_GLYPH_O
if (orderInfo->fieldFlags & ORDER_FIELD_14)
update_read_coord(s, &fast_glyph->y, orderInfo->deltaCoordinates);
/* bytes */
if (orderInfo->fieldFlags & ORDER_FIELD_15)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
void update_read_glyph_index_order(STREAM* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index)
{
uint8 cbData;
if (orderInfo->fieldFlags & ORDER_FIELD_01)
stream_read_uint8(s, glyph_index->cacheId);
if (orderInfo->fieldFlags & ORDER_FIELD_02)
stream_read_uint8(s, glyph_index->flAccel);
if (orderInfo->fieldFlags & ORDER_FIELD_03)
stream_read_uint8(s, glyph_index->ulCharInc);
if (orderInfo->fieldFlags & ORDER_FIELD_04)
stream_read_uint8(s, glyph_index->fOpRedundant);
if (orderInfo->fieldFlags & ORDER_FIELD_05)
update_read_color(s, &glyph_index->backColor);
if (orderInfo->fieldFlags & ORDER_FIELD_06)
update_read_color(s, &glyph_index->foreColor);
if (orderInfo->fieldFlags & ORDER_FIELD_07)
update_read_coord(s, &glyph_index->bkLeft, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_08)
update_read_coord(s, &glyph_index->bkTop, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_09)
update_read_coord(s, &glyph_index->bkRight, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_10)
update_read_coord(s, &glyph_index->bkBottom, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_10)
update_read_coord(s, &glyph_index->opLeft, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_11)
update_read_coord(s, &glyph_index->opTop, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_12)
update_read_coord(s, &glyph_index->opRight, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_13)
update_read_coord(s, &glyph_index->opBottom, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_14)
stream_read_uint8(s, glyph_index->brushOrgX);
if (orderInfo->fieldFlags & ORDER_FIELD_15)
stream_read_uint8(s, glyph_index->brushOrgY);
if (orderInfo->fieldFlags & ORDER_FIELD_16)
stream_read_uint8(s, glyph_index->brushStyle);
if (orderInfo->fieldFlags & ORDER_FIELD_17)
stream_read_uint8(s, glyph_index->brushHatch);
if (orderInfo->fieldFlags & ORDER_FIELD_18)
stream_read(s, glyph_index->brushExtra, 7);
if (orderInfo->fieldFlags & ORDER_FIELD_19)
update_read_coord(s, &glyph_index->x, orderInfo->deltaCoordinates);
if (orderInfo->fieldFlags & ORDER_FIELD_20)
update_read_coord(s, &glyph_index->y, orderInfo->deltaCoordinates);
/* bytes */
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
void update_read_polygon_sc_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc)
@ -812,10 +913,12 @@ void update_read_polygon_sc_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_SC_O
if (orderInfo->fieldFlags & ORDER_FIELD_06)
stream_read_uint8(s, polygon_sc->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_07)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_polygon_cb_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb)
{
@ -851,16 +954,18 @@ void update_read_polygon_cb_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_CB_O
if (orderInfo->fieldFlags & ORDER_FIELD_10)
stream_read_uint8(s, polygon_cb->brushHatch);
if (orderInfo->fieldFlags & ORDER_FIELD_12)
if (orderInfo->fieldFlags & ORDER_FIELD_11)
stream_read(s, polygon_cb->brushExtra, 7);
if (orderInfo->fieldFlags & ORDER_FIELD_13)
if (orderInfo->fieldFlags & ORDER_FIELD_12)
stream_read_uint8(s, polygon_cb->nDeltaEntries);
/* codeDeltaList */
if (orderInfo->fieldFlags & ORDER_FIELD_13)
{
stream_read_uint8(s, cbData);
stream_seek(s, cbData);
}
}
void update_read_ellipse_sc_order(STREAM* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc)
{
@ -974,7 +1079,7 @@ void update_read_cache_bitmap_v2_order(STREAM* s, CACHE_BITMAP_V2_ORDER* cache_b
stream_read_uint8(s, cache_bitmap_v2_order->bitmapWidth); /* bitmapWidth (1 byte) */
stream_read_uint8(s, cache_bitmap_v2_order->bitmapHeight); /* bitmapHeight (1 byte) */
stream_read_uint8(s, cache_bitmap_v2_order->bitmapLength); /* bitmapLength (2 bytes) */
update_read_2byte_unsigned_encoding(s, &cache_bitmap_v2_order->cacheIndex); /* cacheIndex */
update_read_2byte_unsigned(s, &cache_bitmap_v2_order->cacheIndex); /* cacheIndex */
if (compressed)
{
@ -1010,24 +1115,126 @@ void update_read_cache_bitmap_v3_order(STREAM* s, CACHE_BITMAP_V3_ORDER* cache_b
stream_read_uint32(s, cache_bitmap_v3_order->key2); /* key2 (4 bytes) */
}
void update_read_cache_color_table_order(STREAM* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order)
void update_read_cache_color_table_order(STREAM* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order, uint16 flags)
{
int i;
uint32* colorTable;
stream_read_uint8(s, cache_color_table_order->cacheIndex); /* cacheIndex (1 byte) */
stream_read_uint8(s, cache_color_table_order->numberColors); /* numberColors (2 bytes) */
colorTable = cache_color_table_order->colorTable;
if (colorTable == NULL)
colorTable = (uint32*) xmalloc(cache_color_table_order->numberColors * 4);
else
colorTable = (uint32*) xrealloc(colorTable, cache_color_table_order->numberColors * 4);
for (i = 0; i < cache_color_table_order->numberColors; i++)
{
update_read_color_quad(s, &colorTable[i]);
}
void update_read_cache_glyph_order(STREAM* s, CACHE_GLYPH_ORDER* cache_glyph_order)
{
cache_color_table_order->colorTable = colorTable;
}
void update_read_cache_glyph_v2_order(STREAM* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order)
void update_read_cache_glyph_order(STREAM* s, CACHE_GLYPH_ORDER* cache_glyph_order, uint16 flags)
{
int i;
int size;
GLYPH_DATA* glyph;
stream_read_uint8(s, cache_glyph_order->cacheId); /* cacheId (1 byte) */
stream_read_uint8(s, cache_glyph_order->cGlyphs); /* cGlyphs (1 byte) */
size = cache_glyph_order->cGlyphs * sizeof(GLYPH_DATA);
if (cache_glyph_order->glyphData == NULL)
cache_glyph_order->glyphData = (GLYPH_DATA*) xmalloc(size);
else
cache_glyph_order->glyphData = (GLYPH_DATA*) xrealloc(cache_glyph_order->glyphData, size);
for (i = 0; i < cache_glyph_order->cGlyphs; i++)
{
glyph = &cache_glyph_order->glyphData[i];
stream_read_uint16(s, glyph->cacheIndex);
stream_read_uint16(s, glyph->x);
stream_read_uint16(s, glyph->y);
stream_read_uint16(s, glyph->cx);
stream_read_uint16(s, glyph->cy);
glyph->cb = ((glyph->cx + 7) / 8) * glyph->cy;
glyph->cb += glyph->cb % 4;
if (glyph->aj == NULL)
glyph->aj = (uint8*) xmalloc(glyph->cb);
else
glyph->aj = (uint8*) xrealloc(glyph->aj, glyph->cb);
stream_read(s, glyph->aj, glyph->cb);
}
}
void update_read_cache_brush_order(STREAM* s, CACHE_BRUSH_ORDER* cache_brush_order)
void update_read_cache_glyph_v2_order(STREAM* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order, uint16 flags)
{
int i;
int size;
GLYPH_DATA_V2* glyph;
cache_glyph_v2_order->cacheId = (flags & 0x000F);
cache_glyph_v2_order->flags = (flags & 0x00F0) >> 4;
cache_glyph_v2_order->cGlyphs = (flags & 0xFF00) >> 8;
size = cache_glyph_v2_order->cGlyphs * sizeof(GLYPH_DATA_V2);
if (cache_glyph_v2_order->glyphData == NULL)
cache_glyph_v2_order->glyphData = (GLYPH_DATA_V2*) xmalloc(size);
else
cache_glyph_v2_order->glyphData = (GLYPH_DATA_V2*) xrealloc(cache_glyph_v2_order->glyphData, size);
for (i = 0; i < cache_glyph_v2_order->cGlyphs; i++)
{
glyph = &cache_glyph_v2_order->glyphData[i];
stream_read_uint16(s, glyph->cacheIndex);
update_read_2byte_signed(s, &glyph->x);
update_read_2byte_signed(s, &glyph->y);
update_read_2byte_unsigned(s, &glyph->cx);
update_read_2byte_unsigned(s, &glyph->cy);
glyph->cb = ((glyph->cx + 7) / 8) * glyph->cy;
glyph->cb += glyph->cb % 4;
if (glyph->aj == NULL)
glyph->aj = (uint8*) xmalloc(glyph->cb);
else
glyph->aj = (uint8*) xrealloc(glyph->aj, glyph->cb);
stream_read(s, glyph->aj, glyph->cb);
}
}
void update_read_cache_brush_order(STREAM* s, CACHE_BRUSH_ORDER* cache_brush_order, uint16 flags)
{
uint8 iBitmapFormat;
stream_read_uint8(s, cache_brush_order->cacheEntry); /* cacheEntry (1 byte) */
stream_read_uint8(s, iBitmapFormat); /* iBitmapFormat (1 byte) */
cache_brush_order->bpp = BMF_BPP[iBitmapFormat];
stream_read_uint8(s, cache_brush_order->cx); /* cx (1 byte) */
stream_read_uint8(s, cache_brush_order->cy); /* cy (1 byte) */
stream_read_uint8(s, cache_brush_order->style); /* style (1 byte) */
stream_read_uint8(s, cache_brush_order->length); /* iBytes (1 byte) */
if (cache_brush_order->brushData == NULL)
cache_brush_order->brushData = (uint8*) xmalloc(cache_brush_order->length);
else
cache_brush_order->brushData = (uint8*) xrealloc(cache_brush_order->brushData, cache_brush_order->length);
stream_read(s, cache_brush_order->brushData, cache_brush_order->length);
}
/* Alternate Secondary Drawing Orders */
@ -1250,9 +1457,9 @@ void update_recv_primary_order(rdpUpdate* update, STREAM* s, uint8 flags)
orderInfo->deltaCoordinates = (flags & ORDER_DELTA_COORDINATES) ? True : False;
if (orderInfo->orderType < PRIMARY_DRAWING_ORDER_COUNT)
printf("%s Primary Drawing Order (%d)\n", PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType);
printf("%s Primary Drawing Order (0x%02X)\n", PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType);
else
printf("Unknown Primary Drawing Order (%d)\n", orderInfo->orderType);
printf("Unknown Primary Drawing Order (0x%02X)\n", orderInfo->orderType);
switch (orderInfo->orderType)
{
@ -1331,6 +1538,11 @@ void update_recv_primary_order(rdpUpdate* update, STREAM* s, uint8 flags)
IFCALL(update->SaveBitmap, update, &update->save_bitmap);
break;
case ORDER_TYPE_GLYPH_INDEX:
update_read_glyph_index_order(s, orderInfo, &(update->glyph_index));
IFCALL(update->GlyphIndex, update, &update->glyph_index);
break;
case ORDER_TYPE_FAST_INDEX:
update_read_fast_index_order(s, orderInfo, &(update->fast_index));
IFCALL(update->FastIndex, update, &update->fast_index);
@ -1341,11 +1553,6 @@ void update_recv_primary_order(rdpUpdate* update, STREAM* s, uint8 flags)
IFCALL(update->FastGlyph, update, &update->fast_glyph);
break;
case ORDER_TYPE_GLYPH_INDEX:
update_read_glyph_index_order(s, orderInfo, &(update->glyph_index));
IFCALL(update->GlyphIndex, update, &update->glyph_index);
break;
case ORDER_TYPE_POLYGON_SC:
update_read_polygon_sc_order(s, orderInfo, &(update->polygon_sc));
IFCALL(update->PolygonSC, update, &update->polygon_sc);
@ -1390,9 +1597,9 @@ void update_recv_secondary_order(rdpUpdate* update, STREAM* s, uint8 flags)
next += orderLength;
if (orderType < SECONDARY_DRAWING_ORDER_COUNT)
printf("%s Secondary Drawing Order (%d)\n", SECONDARY_DRAWING_ORDER_STRINGS[orderType], orderType);
printf("%s Secondary Drawing Order (0x%02X)\n", SECONDARY_DRAWING_ORDER_STRINGS[orderType], orderType);
else
printf("Unknown Secondary Drawing Order (%d)\n", orderType);
printf("Unknown Secondary Drawing Order (0x%02X)\n", orderType);
switch (orderType)
{
@ -1422,25 +1629,25 @@ void update_recv_secondary_order(rdpUpdate* update, STREAM* s, uint8 flags)
break;
case ORDER_TYPE_CACHE_COLOR_TABLE:
update_read_cache_color_table_order(s, &(update->cache_color_table_order));
update_read_cache_color_table_order(s, &(update->cache_color_table_order), extraFlags);
IFCALL(update->CacheColorTable, update, &(update->cache_color_table_order));
break;
case ORDER_TYPE_CACHE_GLYPH:
if (update->glyph_v2)
{
update_read_cache_glyph_v2_order(s, &(update->cache_glyph_v2_order));
update_read_cache_glyph_v2_order(s, &(update->cache_glyph_v2_order), extraFlags);
IFCALL(update->CacheGlyph, update, &(update->cache_glyph_order));
}
else
{
update_read_cache_glyph_order(s, &(update->cache_glyph_order));
update_read_cache_glyph_order(s, &(update->cache_glyph_order), extraFlags);
IFCALL(update->CacheGlyphV2, update, &(update->cache_glyph_v2_order));
}
break;
case ORDER_TYPE_CACHE_BRUSH:
update_read_cache_brush_order(s, &(update->cache_brush_order));
update_read_cache_brush_order(s, &(update->cache_brush_order), extraFlags);
IFCALL(update->CacheBrush, update, &(update->cache_brush_order));
break;
@ -1458,9 +1665,9 @@ void update_recv_altsec_order(rdpUpdate* update, STREAM* s, uint8 flags)
orderType = flags >>= 2; /* orderType is in higher 6 bits of flags field */
if (orderType < ALTSEC_DRAWING_ORDER_COUNT)
printf("%s Alternate Secondary Drawing Order (%d)\n", ALTSEC_DRAWING_ORDER_STRINGS[orderType], orderType);
printf("%s Alternate Secondary Drawing Order (0x%02X)\n", ALTSEC_DRAWING_ORDER_STRINGS[orderType], orderType);
else
printf("Unknown Alternate Secondary Drawing Order: %d\n", orderType);
printf("Unknown Alternate Secondary Drawing Order: 0x%02X\n", orderType);
switch (orderType)
{

View File

@ -89,6 +89,14 @@
#define CBR3_IGNORABLE_FLAG 0x08
#define CBR3_DO_NOT_CACHE 0x10
#define SO_FLAG_DEFAULT_PLACEMENT 0x01
#define SO_HORIZONTAL 0x02
#define SO_VERTICAL 0x04
#define SO_REVERSED 0x08
#define SO_ZERO_BEARINGS 0x10
#define SO_CHAR_INC_EQUAL_BM_BASE 0x20
#define SO_MAXEXT_EQUAL_BM_SIDE 0x40
/* Order Classes */
#define ORDER_PRIMARY_CLASS 0x01
#define ORDER_SECONDARY_CLASS 0x03

View File

@ -1190,6 +1190,27 @@ void gdi_multi_opaque_rect(rdpUpdate* update, MULTI_OPAQUE_RECT_ORDER* multi_opa
}
void gdi_line_to(rdpUpdate* update, LINE_TO_ORDER* line_to)
{
int cx, cy;
uint32 color;
HGDI_PEN hPen;
GDI *gdi = GET_GDI(update);
cx = line_to->nXEnd - line_to->nXStart + 1;
cy = line_to->nYEnd - line_to->nYStart + 1;
color = gdi_color_convert(line_to->penColor, gdi->srcBpp, 32, gdi->clrconv);
hPen = gdi_CreatePen(line_to->penStyle, line_to->penWidth, (GDI_COLOR) color);
gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen);
gdi_SetROP2(gdi->drawing->hdc, line_to->bRop2);
gdi_MoveToEx(gdi->drawing->hdc, line_to->nXStart, line_to->nYStart, NULL);
gdi_LineTo(gdi->drawing->hdc, line_to->nXEnd, line_to->nYEnd);
gdi_DeleteObject((HGDIOBJECT) hPen);
}
/**
* Register GDI callbacks with libfreerdp.
* @param inst current instance
@ -1211,14 +1232,14 @@ void gdi_register_update_callbacks(rdpUpdate* update)
update->MultiScrBlt = NULL;
update->MultiOpaqueRect = gdi_multi_opaque_rect;
update->MultiDrawNineGrid = NULL;
update->LineTo = NULL;
update->LineTo = gdi_line_to;
update->Polyline = NULL;
update->MemBlt = NULL;
update->Mem3Blt = NULL;
update->SaveBitmap = NULL;
update->GlyphIndex = NULL;
update->FastIndex = NULL;
update->FastGlyph = NULL;
update->GlyphIndex = NULL;
update->PolygonSC = NULL;
update->PolygonCB = NULL;
update->EllipseSC = NULL;