From 1566a41e86f18bd3cc8b35835aa2569b2ae1176a Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 8 Feb 2012 12:11:32 -0800 Subject: [PATCH] Handle primary set surface, handle ephemeral buffers based on xfreerdp's handling. --- src/rdp_bitmap.c | 73 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/src/rdp_bitmap.c b/src/rdp_bitmap.c index 4db1782..c9798b9 100644 --- a/src/rdp_bitmap.c +++ b/src/rdp_bitmap.c @@ -54,10 +54,8 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { - /* Allocate buffer */ guac_client* client = ((rdp_freerdp_context*) context)->client; guac_socket* socket = client->socket; - guac_layer* buffer = guac_client_alloc_buffer(client); /* Convert image data if present */ if (bitmap->data != NULL) { @@ -68,25 +66,46 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { context->instance->settings->color_depth, 32, (HCLRCONV) &guac_rdp_clrconv); - /* Create surface from image data */ - cairo_surface_t* surface = cairo_image_surface_create_for_data( - bitmap->data, CAIRO_FORMAT_RGB24, - bitmap->width, bitmap->height, 4*bitmap->width); + /* If not ephemeral, send to client */ + if (!bitmap->ephemeral) { - /* Send surface to buffer */ - guac_protocol_send_png(socket, GUAC_COMP_SRC, buffer, 0, 0, surface); + /* Allocate buffer */ + guac_layer* buffer = guac_client_alloc_buffer(client); - /* Free surface */ - cairo_surface_destroy(surface); + /* Create surface from image data */ + cairo_surface_t* surface = cairo_image_surface_create_for_data( + bitmap->data, CAIRO_FORMAT_RGB24, + bitmap->width, bitmap->height, 4*bitmap->width); - /* Free image data if actually alloated */ - if (image_buffer != bitmap->data) - free(image_buffer); + /* Send surface to buffer */ + guac_protocol_send_png(socket, GUAC_COMP_SRC, buffer, 0, 0, surface); + + /* Free surface */ + cairo_surface_destroy(surface); + + /* Free image data if actually alloated */ + if (image_buffer != bitmap->data) + free(image_buffer); + + /* Store buffer reference in bitmap */ + ((guac_rdp_bitmap*) bitmap)->layer = buffer; + + } + + /* Otherwise, store converted image in bitmap, free any existing */ + else { + + /* Free existing image, if any */ + if (image_buffer != bitmap->data) + free(bitmap->data); + + /* Store converted image in bitmap */ + bitmap->data = image_buffer; + + } } - /* Store buffer reference in bitmap */ - ((guac_rdp_bitmap*) bitmap)->layer = buffer; } void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) { @@ -94,12 +113,16 @@ void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_socket* socket = client->socket; - /* Copy image data from buffer to visible layer */ - guac_protocol_send_copy(socket, - ((guac_rdp_bitmap*) bitmap)->layer, - 0, 0, bitmap->width, bitmap->height, - GUAC_COMP_OVER, - GUAC_DEFAULT_LAYER, bitmap->left, bitmap->top); + /* If not ephemeral, copy image data from buffer to visible layer */ + if (!bitmap->ephemeral) + guac_protocol_send_copy(socket, + ((guac_rdp_bitmap*) bitmap)->layer, + 0, 0, bitmap->width, bitmap->height, + GUAC_COMP_OVER, + GUAC_DEFAULT_LAYER, bitmap->left, bitmap->top); + + /* Otherwise, buffer apparently should not be drawn ... */ + } void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap) { @@ -110,8 +133,12 @@ void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap) { void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, boolean primary) { guac_client* client = ((rdp_freerdp_context*) context)->client; - ((rdp_guac_client_data*) client->data)->current_surface - = ((guac_rdp_bitmap*) bitmap)->layer; + if (primary) + ((rdp_guac_client_data*) client->data)->current_surface + = GUAC_DEFAULT_LAYER; + else + ((rdp_guac_client_data*) client->data)->current_surface + = ((guac_rdp_bitmap*) bitmap)->layer; } void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, uint8* data, int width, int height, int bpp, int length, boolean compressed) { -- 1.7.10.4