From 4f79c53f4c6b4aee43aded23118e9d2067bfdb2f Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Fri, 30 May 2008 13:00:52 +0200 Subject: [PATCH] [draw] Add alpha channel support Signed-off-by: Julien Danjou --- awesomerc.5.txt | 8 ++++++ common/draw.c | 69 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/awesomerc.5.txt b/awesomerc.5.txt index bb222ee1..73a1e669 100644 --- a/awesomerc.5.txt +++ b/awesomerc.5.txt @@ -28,6 +28,14 @@ object with type "object_type". include::apidocgen.txt[] +COLORS FORMAT +------------- +Colors format in *awesome* are either standard X color names +(blue, darkblue, lightred, etc) or hexadecimal formatted colors (#rrggbb). +By using hexadecimal format, you can also specifies an alpha channel: +that means that #00ff00 will draw pure green, but #00ff00aa will set the +alpha channel to `aa' and will blend the green with the color under it. + SEE ALSO -------- awesome(1) awesome-client(1) diff --git a/common/draw.c b/common/draw.c index 9ef292b7..22f96928 100644 --- a/common/draw.c +++ b/common/draw.c @@ -348,10 +348,11 @@ draw_text(draw_context_t *ctx, font_t *font, if(parser_data.shadow.offset) { - cairo_set_source_rgb(ctx->cr, - parser_data.shadow.color.red / 65535.0, - parser_data.shadow.color.green / 65535.0, - parser_data.shadow.color.blue / 65535.0); + cairo_set_source_rgba(ctx->cr, + parser_data.shadow.color.red / 65535.0, + parser_data.shadow.color.green / 65535.0, + parser_data.shadow.color.blue / 65535.0, + parser_data.shadow.color.alpha / 65535.0); cairo_move_to(ctx->cr, x + parser_data.shadow.offset, y + parser_data.shadow.offset); pango_cairo_update_layout(ctx->cr, ctx->layout); pango_cairo_show_layout(ctx->cr, ctx->layout); @@ -359,10 +360,11 @@ draw_text(draw_context_t *ctx, font_t *font, cairo_move_to(ctx->cr, x, y); - cairo_set_source_rgb(ctx->cr, - fg->red / 65535.0, - fg->green / 65535.0, - fg->blue / 65535.0); + cairo_set_source_rgba(ctx->cr, + fg->red / 65535.0, + fg->green / 65535.0, + fg->blue / 65535.0, + fg->alpha / 65535.0); pango_cairo_update_layout(ctx->cr, ctx->layout); pango_cairo_show_layout(ctx->cr, ctx->layout); @@ -386,7 +388,11 @@ draw_setup_cairo_color_source(draw_context_t *ctx, area_t rect, /* no need for a real pattern: */ if(!pcolor_end && !pcolor_center) - cairo_set_source_rgb(ctx->cr, pcolor->red / 65535.0, pcolor->green / 65535.0, pcolor->blue / 65535.0); + cairo_set_source_rgba(ctx->cr, + pcolor->red / 65535.0, + pcolor->green / 65535.0, + pcolor->blue / 65535.0, + pcolor->alpha / 65535.0); else { pat = cairo_pattern_create_linear(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); @@ -424,10 +430,11 @@ draw_rectangle(draw_context_t *ctx, area_t geometry, float line_width, bool fill cairo_set_line_width(ctx->cr, line_width); cairo_set_miter_limit(ctx->cr, 10.0); cairo_set_line_join(ctx->cr, CAIRO_LINE_JOIN_MITER); - cairo_set_source_rgb(ctx->cr, - color.red / 65535.0, - color.green / 65535.0, - color.blue / 65535.0); + cairo_set_source_rgba(ctx->cr, + color.red / 65535.0, + color.green / 65535.0, + color.blue / 65535.0, + color.alpha / 65535.0); if(filled) { cairo_rectangle(ctx->cr, geometry.x, geometry.y, @@ -647,7 +654,11 @@ void draw_circle(draw_context_t *ctx, int x, int y, int r, bool filled, xcolor_t color) { cairo_set_line_width(ctx->cr, 1.0); - cairo_set_source_rgb(ctx->cr, color.red / 65535.0, color.green / 65535.0, color.blue / 65535.0); + cairo_set_source_rgba(ctx->cr, + color.red / 65535.0, + color.green / 65535.0, + color.blue / 65535.0, + color.alpha / 65535.0); cairo_new_sub_path(ctx->cr); /* don't draw from the old reference point to.. */ @@ -1017,15 +1028,40 @@ xcolor_new(xcb_connection_t *conn, int phys_screen, const char *colstr, xcolor_t unsigned long colnum; uint16_t red, green, blue; ssize_t len; + char *buf; if(!(len = a_strlen(colstr))) return false; /* The color is given in RGB value */ - if(colstr[0] == '#' && len == 7) + if(colstr[0] == '#') { errno = 0; - colnum = strtoul(&colstr[1], NULL, 16); + if(len == 7) + { + colnum = strtoul(&colstr[1], NULL, 16); + color->alpha = 0xffff; + } + /* we have alpha */ + else if(len == 9) + { + buf = a_strndup(colstr + 1, 6); + colnum = strtoul(buf, NULL, 16); + p_delete(&buf); + color->alpha = RGB_COLOR_8_TO_16(strtoul(&colstr[7], NULL, 16)); + printf("%d alpha\n", color->alpha); + if(errno != 0) + { + warn("awesome: error, invalid color '%s'", colstr); + return false; + } + } + else + { + warn("awesome: error, invalid color '%s'", colstr); + return false; + } + if(errno != 0) { warn("awesome: error, invalid color '%s'", colstr); @@ -1068,6 +1104,7 @@ xcolor_new(xcb_connection_t *conn, int phys_screen, const char *colstr, xcolor_t color->red = named_color->visual_red; color->green = named_color->visual_green; color->blue = named_color->visual_blue; + color->alpha = 0xffff; p_delete(&named_color); return true;