mirror of
https://github.com/brl/mutter.git
synced 2024-12-24 20:12:06 +00:00
theme: Use cairo for TINT operations with alpha
https://bugzilla.gnome.org/show_bug.cgi?id=662962
This commit is contained in:
parent
4c2c1c4dd2
commit
23f086da8a
@ -3405,42 +3405,6 @@ draw_op_as_pixbuf (const MetaDrawOp *op,
|
|||||||
|
|
||||||
switch (op->type)
|
switch (op->type)
|
||||||
{
|
{
|
||||||
case META_DRAW_TINT:
|
|
||||||
{
|
|
||||||
GdkRGBA color;
|
|
||||||
guint32 rgba;
|
|
||||||
gboolean has_alpha;
|
|
||||||
|
|
||||||
meta_color_spec_render (op->data.rectangle.color_spec,
|
|
||||||
context,
|
|
||||||
&color);
|
|
||||||
|
|
||||||
has_alpha =
|
|
||||||
op->data.tint.alpha_spec &&
|
|
||||||
(op->data.tint.alpha_spec->n_alphas > 1 ||
|
|
||||||
op->data.tint.alpha_spec->alphas[0] != 0xff);
|
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
|
|
||||||
has_alpha,
|
|
||||||
8, width, height);
|
|
||||||
|
|
||||||
if (!has_alpha)
|
|
||||||
{
|
|
||||||
rgba = GDK_COLOR_RGBA (color);
|
|
||||||
|
|
||||||
gdk_pixbuf_fill (pixbuf, rgba);
|
|
||||||
}
|
|
||||||
else if (op->data.tint.alpha_spec->n_alphas == 1)
|
|
||||||
{
|
|
||||||
rgba = GDK_COLOR_RGBA (color);
|
|
||||||
rgba &= ~0xff;
|
|
||||||
rgba |= op->data.tint.alpha_spec->alphas[0];
|
|
||||||
|
|
||||||
gdk_pixbuf_fill (pixbuf, rgba);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case META_DRAW_IMAGE:
|
case META_DRAW_IMAGE:
|
||||||
{
|
{
|
||||||
if (op->data.image.colorize_spec)
|
if (op->data.image.colorize_spec)
|
||||||
@ -3483,6 +3447,7 @@ draw_op_as_pixbuf (const MetaDrawOp *op,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case META_DRAW_TINT:
|
||||||
case META_DRAW_ICON:
|
case META_DRAW_ICON:
|
||||||
case META_DRAW_LINE:
|
case META_DRAW_LINE:
|
||||||
case META_DRAW_RECTANGLE:
|
case META_DRAW_RECTANGLE:
|
||||||
@ -3801,42 +3766,24 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op,
|
|||||||
case META_DRAW_TINT:
|
case META_DRAW_TINT:
|
||||||
{
|
{
|
||||||
int rx, ry, rwidth, rheight;
|
int rx, ry, rwidth, rheight;
|
||||||
gboolean needs_alpha;
|
|
||||||
|
|
||||||
needs_alpha = op->data.tint.alpha_spec &&
|
|
||||||
(op->data.tint.alpha_spec->n_alphas > 1 ||
|
|
||||||
op->data.tint.alpha_spec->alphas[0] != 0xff);
|
|
||||||
|
|
||||||
rx = parse_x_position_unchecked (op->data.tint.x, env);
|
rx = parse_x_position_unchecked (op->data.tint.x, env);
|
||||||
ry = parse_y_position_unchecked (op->data.tint.y, env);
|
ry = parse_y_position_unchecked (op->data.tint.y, env);
|
||||||
rwidth = parse_size_unchecked (op->data.tint.width, env);
|
rwidth = parse_size_unchecked (op->data.tint.width, env);
|
||||||
rheight = parse_size_unchecked (op->data.tint.height, env);
|
rheight = parse_size_unchecked (op->data.tint.height, env);
|
||||||
|
|
||||||
if (!needs_alpha)
|
|
||||||
{
|
|
||||||
meta_color_spec_render (op->data.tint.color_spec,
|
meta_color_spec_render (op->data.tint.color_spec,
|
||||||
style_gtk, &color);
|
style_gtk, &color);
|
||||||
|
|
||||||
|
if (op->data.tint.alpha_spec &&
|
||||||
|
op->data.tint.alpha_spec->n_alphas == 1)
|
||||||
|
color.alpha = op->data.tint.alpha_spec->alphas[0];
|
||||||
|
|
||||||
gdk_cairo_set_source_rgba (cr, &color);
|
gdk_cairo_set_source_rgba (cr, &color);
|
||||||
|
|
||||||
cairo_rectangle (cr, rx, ry, rwidth, rheight);
|
cairo_rectangle (cr, rx, ry, rwidth, rheight);
|
||||||
cairo_fill (cr);
|
cairo_fill (cr);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
GdkPixbuf *pixbuf;
|
|
||||||
|
|
||||||
pixbuf = draw_op_as_pixbuf (op, style_gtk, info,
|
|
||||||
rwidth, rheight);
|
|
||||||
|
|
||||||
if (pixbuf)
|
|
||||||
{
|
|
||||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, rx, ry);
|
|
||||||
cairo_paint (cr);
|
|
||||||
|
|
||||||
g_object_unref (G_OBJECT (pixbuf));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case META_DRAW_GRADIENT:
|
case META_DRAW_GRADIENT:
|
||||||
|
Loading…
Reference in New Issue
Block a user