From 6d43c713401e83373b41681df83d2679c7a0a825 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 17 May 2012 00:48:05 -0700 Subject: [PATCH] Using embedded bitmap rather than raster-drawn cursor. --- Makefile.am | 22 ++++++++------- include/default_pointer.h | 46 ++++++++++++++++++++++++++++++ src/default_pointer.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ src/rdp_pointer.c | 29 ++++++------------- 4 files changed, 136 insertions(+), 30 deletions(-) create mode 100644 include/default_pointer.h create mode 100644 src/default_pointer.c diff --git a/Makefile.am b/Makefile.am index c7069ee..c87f6fa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -44,16 +44,18 @@ lib_LTLIBRARIES = libguac-client-rdp.la libguac_client_rdp_la_SOURCES = src/client.c src/rdp_bitmap.c src/rdp_glyph.c src/rdp_pointer.c src/rdp_gdi.c src/guac_handlers.c src/rdp_cliprdr.c \ src/rdp_keymap.c \ src/rdp_keymap_base.c \ - src/rdp_keymap_en_us.c - -noinst_HEADERS = \ - include/client.h \ - include/guac_handlers.h \ - include/rdp_bitmap.h \ - include/rdp_cliprdr.h \ - include/rdp_gdi.h \ - include/rdp_glyph.h \ - include/rdp_keymap.h \ + src/rdp_keymap_en_us.c \ + src/default_pointer.c + +noinst_HEADERS = \ + include/client.h \ + include/default_pointer.h \ + include/guac_handlers.h \ + include/rdp_bitmap.h \ + include/rdp_cliprdr.h \ + include/rdp_gdi.h \ + include/rdp_glyph.h \ + include/rdp_keymap.h \ include/rdp_pointer.h libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0 diff --git a/include/default_pointer.h b/include/default_pointer.h new file mode 100644 index 0000000..68e0234 --- /dev/null +++ b/include/default_pointer.h @@ -0,0 +1,46 @@ + +/* ***** 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_DEFAULT_POINTER_H +#define _GUAC_RDP_DEFAULT_POINTER_H + +/** + * Embedded 11x16 24-bit RGBA cursor graphic. + */ +extern unsigned char guac_rdp_default_pointer[]; + +#endif diff --git a/src/default_pointer.c b/src/default_pointer.c new file mode 100644 index 0000000..af5a600 --- /dev/null +++ b/src/default_pointer.c @@ -0,0 +1,69 @@ + +/* ***** 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 ***** */ + +/* Macros for prettying up the embedded image. */ +#define X 0x00,0x00,0x00,0xFF +#define O 0xFF,0xFF,0xFF,0xFF +#define _ 0x00,0x00,0x00,0x00 + +/* Embedded pointer graphic */ +unsigned char guac_rdp_default_pointer[] = { + + O,_,_,_,_,_,_,_,_,_,_, + O,O,_,_,_,_,_,_,_,_,_, + O,X,O,_,_,_,_,_,_,_,_, + O,X,X,O,_,_,_,_,_,_,_, + O,X,X,X,O,_,_,_,_,_,_, + O,X,X,X,X,O,_,_,_,_,_, + O,X,X,X,X,X,O,_,_,_,_, + O,X,X,X,X,X,X,O,_,_,_, + O,X,X,X,X,X,X,X,O,_,_, + O,X,X,X,X,X,X,X,X,O,_, + O,X,X,X,X,X,O,O,O,O,O, + O,X,X,O,X,X,O,_,_,_,_, + O,X,O,_,O,X,X,O,_,_,_, + O,O,_,_,O,X,X,O,_,_,_, + O,_,_,_,_,O,X,X,O,_,_, + _,_,_,_,_,O,O,O,O,_,_ + +}; + +/* Undefine image-specific macros */ +#undef X +#undef O +#undef _ + diff --git a/src/rdp_pointer.c b/src/rdp_pointer.c index b8b1f11..be2d5ea 100644 --- a/src/rdp_pointer.c +++ b/src/rdp_pointer.c @@ -42,6 +42,7 @@ #include "client.h" #include "rdp_pointer.h" +#include "default_pointer.h" void guac_rdp_pointer_new(rdpContext* context, rdpPointer* pointer) { @@ -106,26 +107,14 @@ void guac_rdp_pointer_set_default(guac_client* client) { /* Draw to buffer */ guac_layer* cursor = guac_client_alloc_buffer(client); - guac_protocol_send_size(socket, cursor, 110, 160); - - /* Draw cursor */ - guac_protocol_send_start(socket, cursor, 0, 0); - guac_protocol_send_line(socket, cursor, 10, 10); - guac_protocol_send_line(socket, cursor, 6, 10); - guac_protocol_send_line(socket, cursor, 8, 15); - guac_protocol_send_line(socket, cursor, 5, 15); - guac_protocol_send_line(socket, cursor, 3, 11); - guac_protocol_send_line(socket, cursor, 0, 14); - guac_protocol_send_close(socket, cursor); - - /* Fill */ - guac_protocol_send_cfill(socket, GUAC_COMP_OVER, cursor, - 0x00, 0x00, 0x00, 0xFF); - - /* Stroke */ - guac_protocol_send_cstroke(socket, GUAC_COMP_OVER, cursor, - GUAC_LINE_CAP_SQUARE, GUAC_LINE_JOIN_BEVEL, 1, - 0xFF, 0xFF, 0xFF, 0xFF); + + cairo_surface_t* graphic = cairo_image_surface_create_for_data( + guac_rdp_default_pointer, + CAIRO_FORMAT_ARGB32, + 11, 16, 11*4); + + guac_protocol_send_png(socket, GUAC_COMP_OVER, cursor, 0, 0, graphic); + cairo_surface_destroy(graphic); /* Set cursor */ guac_protocol_send_cursor(socket, 0, 0, cursor, 0, 0, 11, 16); -- 1.7.10.4