libfreerdp-core: preparing memblt and bitmap cache

This commit is contained in:
Marc-André Moreau
2011-09-11 23:35:33 -04:00
parent c7599ce5a3
commit cb8f3dced9
8 changed files with 54 additions and 20 deletions

View File

@@ -541,7 +541,7 @@ void xf_gdi_cache_bitmap_v2(rdpUpdate* update, CACHE_BITMAP_V2_ORDER* cache_bitm
xfInfo* xfi = GET_XFI(update);
bitmap_v2_put(xfi->cache->bitmap_v2, cache_bitmap_v2->cacheId,
cache_bitmap_v2->cacheIndex, cache_bitmap_v2->bitmapDataStream);
cache_bitmap_v2->cacheIndex, cache_bitmap_v2->data);
}
void xf_gdi_cache_color_table(rdpUpdate* update, CACHE_COLOR_TABLE_ORDER* cache_color_table)

View File

@@ -298,8 +298,10 @@ boolean xf_pre_connect(freerdp* instance)
settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = False;
settings->order_support[NEG_LINETO_INDEX] = True;
settings->order_support[NEG_POLYLINE_INDEX] = True;
settings->order_support[NEG_MEMBLT_INDEX] = True;
settings->order_support[NEG_MEMBLT_INDEX] = False;
settings->order_support[NEG_MEM3BLT_INDEX] = False;
settings->order_support[NEG_MEMBLT_V2_INDEX] = False;
settings->order_support[NEG_MEM3BLT_V2_INDEX] = False;
settings->order_support[NEG_SAVEBITMAP_INDEX] = True;
settings->order_support[NEG_GLYPH_INDEX_INDEX] = True;
settings->order_support[NEG_FAST_INDEX_INDEX] = True;

View File

@@ -58,11 +58,16 @@
#define NEG_SCRBLT_INDEX 0x02
#define NEG_MEMBLT_INDEX 0x03
#define NEG_MEM3BLT_INDEX 0x04
#define NEG_ATEXTOUT_INDEX 0x05
#define NEG_AEXTTEXTOUT_INDEX 0x06
#define NEG_DRAWNINEGRID_INDEX 0x07
#define NEG_LINETO_INDEX 0x08
#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09
#define NEG_OPAQUE_RECT_INDEX 0x0A
#define NEG_SAVEBITMAP_INDEX 0x0B
#define NEG_WTEXTOUT_INDEX 0x0C
#define NEG_MEMBLT_V2_INDEX 0x0D
#define NEG_MEM3BLT_V2_INDEX 0x0E
#define NEG_MULTIDSTBLT_INDEX 0x0F
#define NEG_MULTIPATBLT_INDEX 0x10
#define NEG_MULTISCRBLT_INDEX 0x11
@@ -75,6 +80,9 @@
#define NEG_ELLIPSE_SC_INDEX 0x19
#define NEG_ELLIPSE_CB_INDEX 0x1A
#define NEG_GLYPH_INDEX_INDEX 0x1B
#define NEG_GLYPH_WEXTTEXTOUT_INDEX 0x1C
#define NEG_GLYPH_WLONGTEXTOUT_INDEX 0x1D
#define NEG_GLYPH_WLONGEXTTEXTOUT_INDEX 0x1E
/* Glyph Support Level */
#define GLYPH_SUPPORT_NONE 0x0000

View File

@@ -530,6 +530,7 @@ struct _CACHE_BITMAP_V2_ORDER
uint16 cacheIndex;
uint8 bitmapComprHdr[8];
uint8* bitmapDataStream;
uint8* data;
};
typedef struct _CACHE_BITMAP_V2_ORDER CACHE_BITMAP_V2_ORDER;

View File

@@ -79,7 +79,7 @@ rdpBitmapV2* bitmap_v2_new(rdpSettings* settings)
bitmap_v2->maxCells = 5;
settings->bitmap_cache = True;
settings->bitmap_cache = False;
settings->bitmapCacheV2NumCells = 5;
settings->bitmapCacheV2CellInfo[0].numEntries = 600;
settings->bitmapCacheV2CellInfo[0].persistent = False;

View File

@@ -900,7 +900,7 @@ void rdp_write_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings*
rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CACHE_HOST_SUPPORT);
}
void rdp_write_bitmap_cache_cell_info(STREAM* s, uint16 numEntries, boolean persistent)
void rdp_write_bitmap_cache_cell_info(STREAM* s, BITMAP_CACHE_V2_CELL_INFO* cellInfo)
{
uint32 info;
@@ -909,8 +909,7 @@ void rdp_write_bitmap_cache_cell_info(STREAM* s, uint16 numEntries, boolean pers
* is used to indicate a persistent bitmap cache.
*/
info = numEntries & persistent;
info = cellInfo->numEntries || (cellInfo->persistent << 31);
stream_write_uint32(s, info);
}
@@ -955,12 +954,12 @@ void rdp_write_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings)
stream_write_uint16(s, cacheFlags); /* cacheFlags (2 bytes) */
stream_write_uint8(s, 0); /* pad2 (1 byte) */
stream_write_uint8(s, 5); /* numCellCaches (1 byte) */
rdp_write_bitmap_cache_cell_info(s, 600, 0); /* bitmapCache0CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, 600, 0); /* bitmapCache1CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, 2048, 0); /* bitmapCache2CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, 4096, 0); /* bitmapCache3CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, 2048, 0); /* bitmapCache4CellInfo (4 bytes) */
stream_write_uint8(s, settings->bitmapCacheV2NumCells); /* numCellCaches (1 byte) */
rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[0]); /* bitmapCache0CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[1]); /* bitmapCache1CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[2]); /* bitmapCache2CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[3]); /* bitmapCache3CellInfo (4 bytes) */
rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[4]); /* bitmapCache4CellInfo (4 bytes) */
stream_write_zero(s, 12); /* pad3 (12 bytes) */
rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CACHE_V2);

View File

@@ -18,6 +18,7 @@
*/
#include "window.h"
#include "bitmap.h"
#include <freerdp/api.h>
#include "orders.h"
@@ -1359,6 +1360,9 @@ void update_read_cache_bitmap_order(STREAM* s, CACHE_BITMAP_ORDER* cache_bitmap_
void update_read_cache_bitmap_v2_order(STREAM* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, boolean compressed, uint16 flags)
{
boolean status;
uint16 dstSize;
uint8* srcData;
uint8 bitsPerPixelId;
cache_bitmap_v2_order->cacheId = flags & 0x0003;
@@ -1389,20 +1393,40 @@ void update_read_cache_bitmap_v2_order(STREAM* s, CACHE_BITMAP_V2_ORDER* cache_b
if (compressed)
{
if (cache_bitmap_v2_order->flags & CBR2_NO_BITMAP_COMPRESSION_HDR)
{
stream_seek(s, cache_bitmap_v2_order->bitmapLength); /* bitmapDataStream */
}
else
if (!(cache_bitmap_v2_order->flags & CBR2_NO_BITMAP_COMPRESSION_HDR))
{
uint8* bitmapComprHdr = (uint8*) &(cache_bitmap_v2_order->bitmapComprHdr);
stream_read(s, bitmapComprHdr, 8); /* bitmapComprHdr (8 bytes) */
stream_seek(s, cache_bitmap_v2_order->bitmapLength); /* bitmapDataStream */
}
dstSize = cache_bitmap_v2_order->bitmapLength;
cache_bitmap_v2_order->data = (uint8*) xmalloc(dstSize);
stream_get_mark(s, srcData);
stream_seek(s, cache_bitmap_v2_order->bitmapLength);
status = bitmap_decompress(srcData, cache_bitmap_v2_order->data, cache_bitmap_v2_order->bitmapWidth,
cache_bitmap_v2_order->bitmapHeight, cache_bitmap_v2_order->bitmapLength,
cache_bitmap_v2_order->bitmapBpp, cache_bitmap_v2_order->bitmapBpp);
if (status != True)
printf("bitmap decompression failed, bpp:%d\n", cache_bitmap_v2_order->bitmapBpp);
}
else
{
stream_seek(s, cache_bitmap_v2_order->bitmapLength); /* bitmapDataStream */
int y;
int offset;
int scanline;
stream_get_mark(s, srcData);
dstSize = cache_bitmap_v2_order->bitmapLength;
cache_bitmap_v2_order->data = (uint8*) xmalloc(dstSize);
scanline = cache_bitmap_v2_order->bitmapWidth * (cache_bitmap_v2_order->bitmapBpp / 8);
for (y = 0; y < cache_bitmap_v2_order->bitmapHeight; y++)
{
offset = (cache_bitmap_v2_order->bitmapHeight - y - 1) * scanline;
stream_read(s, &cache_bitmap_v2_order->data[offset], scanline);
}
}
}

View File

@@ -100,7 +100,7 @@ rdpSettings* settings_new()
settings->frame_marker = False;
settings->bitmap_cache_v3 = False;
settings->bitmap_cache = True;
settings->bitmap_cache = False;
settings->persistent_bitmap_cache = False;
settings->glyphSupportLevel = GLYPH_SUPPORT_NONE;