Handle primary set surface, handle ephemeral buffers based on xfreerdp's handling.
This commit is contained in:
parent
c9fd83c77b
commit
058c3cf55a
@ -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,6 +66,12 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
|
||||
context->instance->settings->color_depth,
|
||||
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 */
|
||||
cairo_surface_t* surface = cairo_image_surface_create_for_data(
|
||||
bitmap->data, CAIRO_FORMAT_RGB24,
|
||||
@ -83,10 +87,25 @@ void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) {
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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 */
|
||||
/* 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,6 +133,10 @@ 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user