Fix color order regression.
[libguac-client-rdp.git] / src / rdp_glyph.c
index c259725..603a104 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,
@@ -149,19 +157,42 @@ void guac_rdp_glyph_begindraw(rdpContext* context,
                 x, y, width, height);
 
         cairo_set_source_rgb(guac_client_data->glyph_cairo,
-                ( bgcolor & 0x0000FF       ) / 255.0,
+                ((bgcolor & 0xFF0000) >> 16) / 255.0,
                 ((bgcolor & 0x00FF00) >> 8 ) / 255.0,
-                ((bgcolor & 0xFF0000) >> 16) / 255.0);
+                ( bgcolor & 0x0000FF       ) / 255.0);
 
         cairo_fill(guac_client_data->glyph_cairo);
 
     }
 
+    /* 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,
+            ((fgcolor & 0xFF0000) >> 16) / 255.0,
             ((fgcolor & 0x00FF00) >> 8 ) / 255.0,
-            ((fgcolor & 0xFF0000) >> 16) / 255.0);
+            ( 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);
+
 }