Fix transparent glyphs
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Fri, 6 Apr 2012 05:55:46 +0000 (22:55 -0700)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Fri, 6 Apr 2012 05:55:46 +0000 (22:55 -0700)
include/client.h
src/client.c
src/rdp_glyph.c

index 246834f..306dbce 100644 (file)
@@ -55,12 +55,24 @@ typedef struct rdp_guac_client_data {
     int mouse_button_mask;
 
     /**
-     * Cairo surface which will receive all drawn glyphs.
+     * Cairo surface which will receive all TRANSPARENT glyphs.
+     */
+    cairo_surface_t* trans_glyph_surface;
+
+    /**
+     * Cairo surface which will receive all OPAQUE glyphs.
+     */
+    cairo_surface_t* opaque_glyph_surface;
+
+    /**
+     * The current Cairo surface which will receive all drawn glyphs,
+     * depending on whether we are currently drawing transparent or
+     * opaque glyphs.
      */
     cairo_surface_t* glyph_surface;
 
     /**
-     * Cairo instance for drawing to glyph surface.
+     * Cairo instance for drawing to the current glyph surface.
      */
     cairo_t* glyph_cairo;
 
index e71d839..8a87d05 100644 (file)
@@ -393,12 +393,12 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
     guac_protocol_send_size(client->socket, GUAC_DEFAULT_LAYER,
             settings->width, settings->height);
 
-    /* Create glyph surface and cairo instance */
-    guac_client_data->glyph_surface = cairo_image_surface_create(
+    /* Create glyph surfaces */
+    guac_client_data->opaque_glyph_surface = cairo_image_surface_create(
             CAIRO_FORMAT_RGB24, settings->width, settings->height);
 
-    guac_client_data->glyph_cairo = cairo_create(
-        guac_client_data->glyph_surface);
+    guac_client_data->trans_glyph_surface = cairo_image_surface_create(
+            CAIRO_FORMAT_ARGB32, settings->width, settings->height);
 
     /* Success */
     return 0;
index c259725..3e939f6 100644 (file)
@@ -139,6 +139,14 @@ void guac_rdp_glyph_begindraw(rdpContext* context,
     /* Fill background with color if specified */
     if (width != 0 && height != 0) {
 
+        /* Prepare for opaque glyphs */
+        guac_client_data->glyph_surface = 
+            guac_client_data->opaque_glyph_surface;
+
+        /* Create cairo instance */
+        guac_client_data->glyph_cairo = cairo_create(
+            guac_client_data->glyph_surface);
+
         /* Convert background color */
         bgcolor = freerdp_color_convert_var(bgcolor,
                 context->instance->settings->color_depth, 32,
@@ -157,6 +165,29 @@ void guac_rdp_glyph_begindraw(rdpContext* context,
 
     }
 
+    /* Otherwise, prepare for transparent glyphs  */
+    else {
+
+        /* Select transparent glyph surface */
+        guac_client_data->glyph_surface = 
+            guac_client_data->trans_glyph_surface;
+
+        guac_client_data->glyph_cairo = cairo_create(
+            guac_client_data->glyph_surface);
+
+        /* Clear surface */
+        cairo_set_operator(guac_client_data->glyph_cairo,
+            CAIRO_OPERATOR_SOURCE);
+
+        cairo_set_source_rgba(guac_client_data->glyph_cairo, 0, 0, 0, 0);
+        cairo_paint(guac_client_data->glyph_cairo);
+
+        /* Restore operator */
+        cairo_set_operator(guac_client_data->glyph_cairo,
+            CAIRO_OPERATOR_OVER);
+
+    }
+
     /* Prepare for glyph drawing */
     cairo_set_source_rgb(guac_client_data->glyph_cairo,
             ( fgcolor & 0x0000FF       ) / 255.0,
@@ -193,5 +224,8 @@ void guac_rdp_glyph_enddraw(rdpContext* context,
     /* Destroy surface */
     cairo_surface_destroy(surface);
 
+    /* Destroy cairo instance */
+    cairo_destroy(guac_client_data->glyph_cairo);
+
 }