]> git.sur5r.net Git - i3/i3/commitdiff
Allow text drawing to use the alpha channel.
authorIngo Bürk <ingo.buerk@tngtech.com>
Wed, 7 Oct 2015 09:03:18 +0000 (11:03 +0200)
committerIngo Bürk <ingo.buerk@tngtech.com>
Wed, 7 Oct 2015 20:10:47 +0000 (22:10 +0200)
We pass alpha channel information to the current text drawing code
and use it if it is available. The previous behavior of using full
opacity for RGB format colors is preserved.

libi3/font.c
libi3/get_colorpixel.c

index 8bdf3d600fd0ab95210012dd26d324413a05d553..e14bb08034bb6515f6da2ef0f345df59bec4ddea 100644 (file)
@@ -29,6 +29,7 @@ static xcb_visualtype_t *root_visual_type;
 static double pango_font_red;
 static double pango_font_green;
 static double pango_font_blue;
+static double pango_font_alpha;
 
 /* Necessary to track whether the dpi changes and trigger a LOG() message,
  * which is more easily visible to users. */
@@ -123,7 +124,8 @@ static void draw_text_pango(const char *text, size_t text_len,
         pango_layout_set_text(layout, text, text_len);
 
     /* Do the drawing */
-    cairo_set_source_rgb(cr, pango_font_red, pango_font_green, pango_font_blue);
+    cairo_set_source_rgba(cr, pango_font_red, pango_font_green, pango_font_blue, pango_font_alpha);
+    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
     pango_cairo_update_layout(cr, layout);
     pango_layout_get_pixel_size(layout, NULL, &height);
     /* Center the piece of text vertically if its height is smaller than the
@@ -332,6 +334,7 @@ void set_font_colors(xcb_gcontext_t gc, uint32_t foreground, uint32_t background
             pango_font_red = ((foreground >> 16) & 0xff) / 255.0;
             pango_font_green = ((foreground >> 8) & 0xff) / 255.0;
             pango_font_blue = (foreground & 0xff) / 255.0;
+            pango_font_alpha = ((foreground >> 24) & 0xff) / 255.0;
             break;
 #endif
         default:
index 44ad295d5fc48378a3651dba78bfaea3949f5780..3a62a8e4949d42e7333a6c50201422ccb868934b 100644 (file)
@@ -7,6 +7,7 @@
  */
 #include <stdlib.h>
 #include <stdint.h>
+#include <string.h>
 
 #include "libi3.h"
 
  *
  */
 uint32_t get_colorpixel(const char *hex) {
-    char strgroups[3][3] = {{hex[1], hex[2], '\0'},
-                            {hex[3], hex[4], '\0'},
-                            {hex[5], hex[6], '\0'}};
+    char alpha[2];
+    if (strlen(hex) == strlen("#rrggbbaa")) {
+        alpha[0] = hex[7];
+        alpha[1] = hex[8];
+    } else {
+        alpha[0] = alpha[1] = 'F';
+    }
+
+    char strgroups[4][3] = {
+        {hex[1], hex[2], '\0'},
+        {hex[3], hex[4], '\0'},
+        {hex[5], hex[6], '\0'},
+        {alpha[0], alpha[1], '\0'}};
     uint8_t r = strtol(strgroups[0], NULL, 16);
     uint8_t g = strtol(strgroups[1], NULL, 16);
     uint8_t b = strtol(strgroups[2], NULL, 16);
+    uint8_t a = strtol(strgroups[3], NULL, 16);
 
-    /* We set the first 8 bits high to have 100% opacity in case of a 32 bit
-     * color depth visual. */
-    return (0xFF << 24) | (r << 16 | g << 8 | b);
+    return (a << 24) | (r << 16 | g << 8 | b);
 }