GUAC-852: Add bitmap_decompress implementation (partial stub - will not work with older FreeRDP).

This commit is contained in:
Michael Jumper 2014-11-20 14:58:14 -08:00
parent 450db1657e
commit e2c28d9240

View File

@ -77,7 +77,7 @@ void guac_rdp_cache_bitmap(rdpContext* context, rdpBitmap* bitmap) {
void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
/* Convert image data if present */ /* Convert image data if present */
if (bitmap->data != NULL) { if (bitmap->data != NULL && bitmap->bpp != 32) {
/* Convert image data to 32-bit RGB */ /* Convert image data to 32-bit RGB */
unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL, unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL,
@ -185,6 +185,30 @@ void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, BOOL pri
} }
static void bitmap_decompress(rdpContext* context,
BYTE* srcData, int size, int srcBpp, int width, int height,
BYTE* dstData) {
rdpCodecs* codecs = context->codecs;
guac_client* client = ((rdp_freerdp_context*) context)->client;
/* Decode as interleaved if less than 32 bits per pixel */
if (srcBpp < 32) {
freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED);
interleaved_decompress(codecs->interleaved, srcData, size, srcBpp,
&dstData, PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height, NULL);
}
/* Otherwise, decode as planar */
else {
freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR);
planar_decompress(codecs->planar, srcData, size,
&dstData, PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height, TRUE);
guac_client_log(client, GUAC_LOG_DEBUG, "Decompressed planar.");
}
}
#ifdef LEGACY_RDPBITMAP #ifdef LEGACY_RDPBITMAP
void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data,
int width, int height, int bpp, int length, BOOL compressed) { int width, int height, int bpp, int length, BOOL compressed) {
@ -193,21 +217,18 @@ void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* d
int width, int height, int bpp, int length, BOOL compressed, int codec_id) { int width, int height, int bpp, int length, BOOL compressed, int codec_id) {
#endif #endif
int size = width * height * (bpp + 7) / 8; int size = width * height * 4;
if (bitmap->data == NULL) bitmap->data = (UINT8*) _aligned_malloc(size, 16);
bitmap->data = (UINT8*) malloc(size);
else
bitmap->data = (UINT8*) realloc(bitmap->data, size);
if (compressed) if (compressed)
bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp); bitmap_decompress(context, data, length, bpp, width, height, bitmap->data);
else else
freerdp_image_flip(data, bitmap->data, width, height, bpp); freerdp_image_flip(data, bitmap->data, width, height, bpp);
bitmap->compressed = FALSE; bitmap->compressed = FALSE;
bitmap->length = size; bitmap->length = size;
bitmap->bpp = bpp; bitmap->bpp = 32;
} }