[draw] Add alpha channel support
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
066bfaacc8
commit
4f79c53f4c
|
@ -28,6 +28,14 @@ object with type "object_type".
|
||||||
|
|
||||||
include::apidocgen.txt[]
|
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
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
awesome(1) awesome-client(1)
|
awesome(1) awesome-client(1)
|
||||||
|
|
|
@ -348,10 +348,11 @@ draw_text(draw_context_t *ctx, font_t *font,
|
||||||
|
|
||||||
if(parser_data.shadow.offset)
|
if(parser_data.shadow.offset)
|
||||||
{
|
{
|
||||||
cairo_set_source_rgb(ctx->cr,
|
cairo_set_source_rgba(ctx->cr,
|
||||||
parser_data.shadow.color.red / 65535.0,
|
parser_data.shadow.color.red / 65535.0,
|
||||||
parser_data.shadow.color.green / 65535.0,
|
parser_data.shadow.color.green / 65535.0,
|
||||||
parser_data.shadow.color.blue / 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);
|
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_update_layout(ctx->cr, ctx->layout);
|
||||||
pango_cairo_show_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_move_to(ctx->cr, x, y);
|
||||||
|
|
||||||
cairo_set_source_rgb(ctx->cr,
|
cairo_set_source_rgba(ctx->cr,
|
||||||
fg->red / 65535.0,
|
fg->red / 65535.0,
|
||||||
fg->green / 65535.0,
|
fg->green / 65535.0,
|
||||||
fg->blue / 65535.0);
|
fg->blue / 65535.0,
|
||||||
|
fg->alpha / 65535.0);
|
||||||
pango_cairo_update_layout(ctx->cr, ctx->layout);
|
pango_cairo_update_layout(ctx->cr, ctx->layout);
|
||||||
pango_cairo_show_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: */
|
/* no need for a real pattern: */
|
||||||
if(!pcolor_end && !pcolor_center)
|
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
|
else
|
||||||
{
|
{
|
||||||
pat = cairo_pattern_create_linear(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height);
|
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_line_width(ctx->cr, line_width);
|
||||||
cairo_set_miter_limit(ctx->cr, 10.0);
|
cairo_set_miter_limit(ctx->cr, 10.0);
|
||||||
cairo_set_line_join(ctx->cr, CAIRO_LINE_JOIN_MITER);
|
cairo_set_line_join(ctx->cr, CAIRO_LINE_JOIN_MITER);
|
||||||
cairo_set_source_rgb(ctx->cr,
|
cairo_set_source_rgba(ctx->cr,
|
||||||
color.red / 65535.0,
|
color.red / 65535.0,
|
||||||
color.green / 65535.0,
|
color.green / 65535.0,
|
||||||
color.blue / 65535.0);
|
color.blue / 65535.0,
|
||||||
|
color.alpha / 65535.0);
|
||||||
if(filled)
|
if(filled)
|
||||||
{
|
{
|
||||||
cairo_rectangle(ctx->cr, geometry.x, geometry.y,
|
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)
|
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_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.. */
|
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;
|
unsigned long colnum;
|
||||||
uint16_t red, green, blue;
|
uint16_t red, green, blue;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
if(!(len = a_strlen(colstr)))
|
if(!(len = a_strlen(colstr)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* The color is given in RGB value */
|
/* The color is given in RGB value */
|
||||||
if(colstr[0] == '#' && len == 7)
|
if(colstr[0] == '#')
|
||||||
{
|
{
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
if(len == 7)
|
||||||
|
{
|
||||||
colnum = strtoul(&colstr[1], NULL, 16);
|
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)
|
if(errno != 0)
|
||||||
{
|
{
|
||||||
warn("awesome: error, invalid color '%s'", colstr);
|
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->red = named_color->visual_red;
|
||||||
color->green = named_color->visual_green;
|
color->green = named_color->visual_green;
|
||||||
color->blue = named_color->visual_blue;
|
color->blue = named_color->visual_blue;
|
||||||
|
color->alpha = 0xffff;
|
||||||
|
|
||||||
p_delete(&named_color);
|
p_delete(&named_color);
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue