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,6 +66,12 @@ 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);
/* If not ephemeral, send to client */
if (!bitmap->ephemeral) {
/* Allocate buffer */
guac_layer* buffer = guac_client_alloc_buffer(client);
/* Create surface from image data */ /* Create surface from image data */
cairo_surface_t* surface = cairo_image_surface_create_for_data( cairo_surface_t* surface = cairo_image_surface_create_for_data(
bitmap->data, CAIRO_FORMAT_RGB24, bitmap->data, CAIRO_FORMAT_RGB24,
@ -83,10 +87,25 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
if (image_buffer != bitmap->data) if (image_buffer != bitmap->data)
free(image_buffer); free(image_buffer);
}
/* Store buffer reference in bitmap */ /* Store buffer reference in bitmap */
((guac_rdp_bitmap*) bitmap)->layer = buffer; ((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;
}
}
} }
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 */
if (!bitmap->ephemeral)
guac_protocol_send_copy(socket, guac_protocol_send_copy(socket,
((guac_rdp_bitmap*) bitmap)->layer, ((guac_rdp_bitmap*) bitmap)->layer,
0, 0, bitmap->width, bitmap->height, 0, 0, bitmap->width, bitmap->height,
GUAC_COMP_OVER, GUAC_COMP_OVER,
GUAC_DEFAULT_LAYER, bitmap->left, bitmap->top); 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,6 +133,10 @@ 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;
if (primary)
((rdp_guac_client_data*) client->data)->current_surface
= GUAC_DEFAULT_LAYER;
else
((rdp_guac_client_data*) client->data)->current_surface ((rdp_guac_client_data*) client->data)->current_surface
= ((guac_rdp_bitmap*) bitmap)->layer; = ((guac_rdp_bitmap*) bitmap)->layer;
} }