Handle primary set surface, handle ephemeral buffers based on xfreerdp's handling.

This commit is contained in:
Michael Jumper 2012-02-08 12:11:32 -08:00
parent c9fd83c77b
commit 058c3cf55a

View File

@ -54,10 +54,8 @@
void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
/* Allocate buffer */
guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client* client = ((rdp_freerdp_context*) context)->client;
guac_socket* socket = client->socket; guac_socket* socket = client->socket;
guac_layer* buffer = guac_client_alloc_buffer(client);
/* Convert image data if present */ /* Convert image data if present */
if (bitmap->data != NULL) { if (bitmap->data != NULL) {
@ -68,25 +66,46 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
context->instance->settings->color_depth, context->instance->settings->color_depth,
32, (HCLRCONV) &guac_rdp_clrconv); 32, (HCLRCONV) &guac_rdp_clrconv);
/* Create surface from image data */ /* If not ephemeral, send to client */
cairo_surface_t* surface = cairo_image_surface_create_for_data( if (!bitmap->ephemeral) {
bitmap->data, CAIRO_FORMAT_RGB24,
bitmap->width, bitmap->height, 4*bitmap->width);
/* Send surface to buffer */ /* Allocate buffer */
guac_protocol_send_png(socket, GUAC_COMP_SRC, buffer, 0, 0, surface); guac_layer* buffer = guac_client_alloc_buffer(client);
/* Free surface */ /* Create surface from image data */
cairo_surface_destroy(surface); 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 */ /* Send surface to buffer */
if (image_buffer != bitmap->data) guac_protocol_send_png(socket, GUAC_COMP_SRC, buffer, 0, 0, surface);
free(image_buffer);
/* 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) { 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_client* client = ((rdp_freerdp_context*) context)->client;
guac_socket* socket = client->socket; guac_socket* socket = client->socket;
/* Copy image data from buffer to visible layer */ /* If not ephemeral, copy image data from buffer to visible layer */
guac_protocol_send_copy(socket, if (!bitmap->ephemeral)
((guac_rdp_bitmap*) bitmap)->layer, guac_protocol_send_copy(socket,
0, 0, bitmap->width, bitmap->height, ((guac_rdp_bitmap*) bitmap)->layer,
GUAC_COMP_OVER, 0, 0, bitmap->width, bitmap->height,
GUAC_DEFAULT_LAYER, bitmap->left, bitmap->top); 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) { 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) { void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, boolean primary) {
guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client* client = ((rdp_freerdp_context*) context)->client;
((rdp_guac_client_data*) client->data)->current_surface if (primary)
= ((guac_rdp_bitmap*) bitmap)->layer; ((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) { void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, uint8* data, int width, int height, int bpp, int length, boolean compressed) {