From dd9ea3cec5f0f577116d3a0888ec5c7d63b86d1c Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 2 Jan 2012 17:59:52 -0800 Subject: [PATCH] Moved bitmap handler into own files. --- protocols/rdp/Makefile.am | 2 +- protocols/rdp/include/rdp_bitmap.h | 45 ++++++++++++++ protocols/rdp/src/rdp_bitmap.c | 97 ++++++++++++++++++++++++++++++ protocols/rdp/src/rdp_handlers.c | 29 --------- 4 files changed, 143 insertions(+), 30 deletions(-) create mode 100644 protocols/rdp/include/rdp_bitmap.h create mode 100644 protocols/rdp/src/rdp_bitmap.c diff --git a/protocols/rdp/Makefile.am b/protocols/rdp/Makefile.am index c4e42dc4..71583cc2 100644 --- a/protocols/rdp/Makefile.am +++ b/protocols/rdp/Makefile.am @@ -41,7 +41,7 @@ AM_CFLAGS = -Werror -Wall -pedantic -Iinclude lib_LTLIBRARIES = libguac-client-rdp.la -libguac_client_rdp_la_SOURCES = src/client.c src/rdp_handlers.c src/rdp_keymap.c +libguac_client_rdp_la_SOURCES = src/client.c src/rdp_handlers.c src/rdp_keymap.c src/rdp_bitmap.c libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0 diff --git a/protocols/rdp/include/rdp_bitmap.h b/protocols/rdp/include/rdp_bitmap.h new file mode 100644 index 00000000..2314ce8e --- /dev/null +++ b/protocols/rdp/include/rdp_bitmap.h @@ -0,0 +1,45 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-rdp. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef _GUAC_RDP_RDP_BITMAP_H +#define _GUAC_RDP_RDP_BITMAP_H + +#include + +void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap); + +#endif diff --git a/protocols/rdp/src/rdp_bitmap.c b/protocols/rdp/src/rdp_bitmap.c new file mode 100644 index 00000000..c9c321ef --- /dev/null +++ b/protocols/rdp/src/rdp_bitmap.c @@ -0,0 +1,97 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-rdp. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include "client.h" +#include "rdp_bitmap.h" + +static CLRCONV _guac_rdp_clrconv = { + .alpha = 1, + .invert = 0, + .rgb555 = 0, + .palette = NULL +}; + +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) { + + /* Convert image data to 32-bit RGB */ + unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL, + bitmap->width, bitmap->height, + context->instance->settings->color_depth, + 32, (HCLRCONV) &_guac_rdp_clrconv); + + /* 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); + + /* 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; + +} + diff --git a/protocols/rdp/src/rdp_handlers.c b/protocols/rdp/src/rdp_handlers.c index ba786140..2a118e7f 100644 --- a/protocols/rdp/src/rdp_handlers.c +++ b/protocols/rdp/src/rdp_handlers.c @@ -113,35 +113,6 @@ void guac_rdp_ui_end_update(freerdp* inst) { guac_socket_flush(socket); } -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 to 32-bit RGB */ - unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL, - bitmap->width, bitmap->height, - context->instance->settings->color_depth, - 32, (HCLRCONV) &_guac_rdp_clrconv); - - /* 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); - free(image_buffer); - - /* FIXME: What do we do with buffer?? */ - -} - void guac_rdp_ui_paint_bitmap(freerdp* inst, int x, int y, int cx, int cy, int width, int height, uint8* data) { guac_client* client = ((rdp_freerdp_context*) inst->context)->client;