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,17 +53,39 @@
#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;
/* Cache image data if present */
if (bitmap->data != NULL) {
/* Allocate buffer */ /* Allocate buffer */
guac_layer* buffer = guac_client_alloc_buffer(client); 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 */ /* Store buffer reference in bitmap */
((guac_rdp_bitmap*) bitmap)->layer = buffer; ((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,30 +95,6 @@ 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 */
if (!bitmap->ephemeral) {
/* Create surface from image data */
cairo_surface_t* surface = cairo_image_surface_create_for_data(
image_buffer, 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);
/* 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 */ /* Free existing image, if any */
if (image_buffer != bitmap->data) if (image_buffer != bitmap->data)
free(bitmap->data); free(bitmap->data);
@ -104,10 +102,20 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
/* Store converted image in bitmap */ /* Store converted image in bitmap */
bitmap->data = image_buffer; bitmap->data = image_buffer;
} /* If not ephemeral, store cached image */
if (!bitmap->ephemeral)
__guac_rdp_cache_bitmap(context, bitmap);
else
/* No corresponding layer */
((guac_rdp_bitmap*) bitmap)->layer = NULL;
} }
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,12 +168,17 @@ 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
else {
if (((guac_rdp_bitmap*) bitmap)->layer != NULL)
((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;
} }
}
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) {
int size = width * height * (bpp + 7) / 8; int size = width * height * (bpp + 7) / 8;