Allocate buffers conservatively.

This commit is contained in:
Michael Jumper 2012-04-10 11:04:38 -07:00
parent 7211513001
commit 18a1996f6b

View File

@ -53,16 +53,38 @@
#include "client.h" #include "client.h"
#include "rdp_bitmap.h" #include "rdp_bitmap.h"
void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { void __guac_rdp_cache_bitmap(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;
/* Allocate buffer */ /* Cache image data if present */
guac_layer* buffer = guac_client_alloc_buffer(client); if (bitmap->data != NULL) {
/* Store buffer reference in bitmap */ /* Allocate buffer */
((guac_rdp_bitmap*) bitmap)->layer = buffer; guac_layer* buffer = guac_client_alloc_buffer(client);
/* 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);
/* Send surface to buffer */
guac_protocol_send_png(socket,
GUAC_COMP_SRC, buffer, 0, 0, surface);
/* Free surface */
cairo_surface_destroy(surface);
/* Store buffer reference in bitmap */
((guac_rdp_bitmap*) bitmap)->layer = buffer;
}
}
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) {
@ -73,41 +95,27 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
context->instance->settings->color_depth, context->instance->settings->color_depth,
32, ((rdp_freerdp_context*) context)->clrconv); 32, ((rdp_freerdp_context*) context)->clrconv);
/* If not ephemeral, store cached image, and free image data */ /* Free existing image, if any */
if (!bitmap->ephemeral) { if (image_buffer != bitmap->data)
free(bitmap->data);
/* Create surface from image data */ /* Store converted image in bitmap */
cairo_surface_t* surface = cairo_image_surface_create_for_data( bitmap->data = image_buffer;
image_buffer, CAIRO_FORMAT_RGB24,
bitmap->width, bitmap->height, 4*bitmap->width);
/* Send surface to buffer */ /* If not ephemeral, store cached image */
guac_protocol_send_png(socket, if (!bitmap->ephemeral)
GUAC_COMP_SRC, buffer, 0, 0, surface); __guac_rdp_cache_bitmap(context, bitmap);
/* Free surface */ else
cairo_surface_destroy(surface); /* No corresponding layer */
((guac_rdp_bitmap*) bitmap)->layer = NULL;
/* Free image data if actually alloated */
if (image_buffer != bitmap->data)
free(image_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;
}
} }
else
/* No corresponding layer */
((guac_rdp_bitmap*) bitmap)->layer = NULL;
} }
void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) { void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) {
@ -118,8 +126,8 @@ void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) {
int width = bitmap->right - bitmap->left + 1; int width = bitmap->right - bitmap->left + 1;
int height = bitmap->bottom - bitmap->top + 1; int height = bitmap->bottom - bitmap->top + 1;
/* If not ephemeral, retrieve from cache */ /* If cached, retrieve from cache */
if (!bitmap->ephemeral) if (((guac_rdp_bitmap*) bitmap)->layer != NULL)
guac_protocol_send_copy(socket, guac_protocol_send_copy(socket,
((guac_rdp_bitmap*) bitmap)->layer, ((guac_rdp_bitmap*) bitmap)->layer,
0, 0, width, height, 0, 0, width, height,
@ -160,9 +168,14 @@ void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, boolean
if (primary) if (primary)
((rdp_guac_client_data*) client->data)->current_surface ((rdp_guac_client_data*) client->data)->current_surface
= GUAC_DEFAULT_LAYER; = GUAC_DEFAULT_LAYER;
else
((rdp_guac_client_data*) client->data)->current_surface else {
= ((guac_rdp_bitmap*) bitmap)->layer;
if (((guac_rdp_bitmap*) bitmap)->layer != NULL)
((rdp_guac_client_data*) client->data)->current_surface
= ((guac_rdp_bitmap*) bitmap)->layer;
}
} }