summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-07-07 18:48:05 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-07-07 18:48:05 +0300
commit1f0212d9d91c4cf588ec7c4fe968c72ea8152978 (patch)
tree1bfc85b51a0929b508c2d5286490f4acc1cd7514
parentfc1a21eafe14cd6c675d7a04da5a4fc7654565a1 (diff)
downloadmetacity-1f0212d9d91c4cf588ec7c4fe968c72ea8152978.tar.gz
libmetacity: use cairo to draw tint
-rw-r--r--libmetacity/meta-draw-op.c41
-rw-r--r--libmetacity/meta-gradient-spec-private.h9
-rw-r--r--libmetacity/meta-gradient-spec.c71
3 files changed, 53 insertions, 68 deletions
diff --git a/libmetacity/meta-draw-op.c b/libmetacity/meta-draw-op.c
index 4d3ba5be..e3740eda 100644
--- a/libmetacity/meta-draw-op.c
+++ b/libmetacity/meta-draw-op.c
@@ -395,18 +395,6 @@ draw_op_as_pixbuf (const MetaDrawOp *op,
switch (op->type)
{
- case META_DRAW_TINT:
- {
- GdkRGBA color;
-
- meta_color_spec_render (op->data.rectangle.color_spec,
- context, &color);
-
- pixbuf = meta_alpha_gradient_spec_render (op->data.tint.alpha_spec,
- width, height, color);
- }
- break;
-
case META_DRAW_IMAGE:
{
if (op->data.image.colorize_spec)
@@ -469,6 +457,7 @@ draw_op_as_pixbuf (const MetaDrawOp *op,
FALSE, FALSE);
break;
+ case META_DRAW_TINT:
case META_DRAW_LINE:
case META_DRAW_RECTANGLE:
case META_DRAW_ARC:
@@ -667,37 +656,15 @@ draw_op_draw_with_env (const MetaDrawOp *op,
case META_DRAW_TINT:
{
int rx, ry, rwidth, rheight;
- gboolean needs_alpha;
-
- needs_alpha = meta_alpha_gradient_spec_needs_alpha (op->data.tint.alpha_spec);
rx = meta_draw_spec_parse_x_position (op->data.tint.x, env);
ry = meta_draw_spec_parse_y_position (op->data.tint.y, env);
rwidth = meta_draw_spec_parse_size (op->data.tint.width, env);
rheight = meta_draw_spec_parse_size (op->data.tint.height, env);
- if (!needs_alpha)
- {
- meta_color_spec_render (op->data.tint.color_spec, context, &color);
- gdk_cairo_set_source_rgba (cr, &color);
-
- cairo_rectangle (cr, rx, ry, rwidth, rheight);
- cairo_fill (cr);
- }
- else
- {
- GdkPixbuf *pixbuf;
-
- pixbuf = draw_op_as_pixbuf (op, context, info, rwidth, rheight);
-
- if (pixbuf)
- {
- gdk_cairo_set_source_pixbuf (cr, pixbuf, rx, ry);
- cairo_paint (cr);
-
- g_object_unref (G_OBJECT (pixbuf));
- }
- }
+ meta_color_spec_render (op->data.tint.color_spec, context, &color);
+ meta_alpha_gradient_spec_render (op->data.tint.alpha_spec, color, cr,
+ rx, ry, rwidth, rheight);
}
break;
diff --git a/libmetacity/meta-gradient-spec-private.h b/libmetacity/meta-gradient-spec-private.h
index b3416e2e..31503dc7 100644
--- a/libmetacity/meta-gradient-spec-private.h
+++ b/libmetacity/meta-gradient-spec-private.h
@@ -77,10 +77,13 @@ GdkPixbuf *meta_alpha_gradient_spec_apply_alpha (MetaAlphaGradientSp
gboolean force_copy);
G_GNUC_INTERNAL
-GdkPixbuf *meta_alpha_gradient_spec_render (MetaAlphaGradientSpec *spec,
+void meta_alpha_gradient_spec_render (MetaAlphaGradientSpec *spec,
+ GdkRGBA color,
+ cairo_t *cr,
+ gint x,
+ gint y,
gint width,
- gint height,
- GdkRGBA color);
+ gint height);
G_END_DECLS
diff --git a/libmetacity/meta-gradient-spec.c b/libmetacity/meta-gradient-spec.c
index 70affdd6..3bc6c1b4 100644
--- a/libmetacity/meta-gradient-spec.c
+++ b/libmetacity/meta-gradient-spec.c
@@ -261,42 +261,57 @@ meta_alpha_gradient_spec_apply_alpha (MetaAlphaGradientSpec *spec,
return pixbuf;
}
-GdkPixbuf *
+void
meta_alpha_gradient_spec_render (MetaAlphaGradientSpec *spec,
+ GdkRGBA color,
+ cairo_t *cr,
+ gint x,
+ gint y,
gint width,
- gint height,
- GdkRGBA color)
+ gint height)
{
- gboolean has_alpha;
- GdkPixbuf *pixbuf;
- guint32 rgba;
-
- has_alpha = spec && (spec->n_alphas > 1 || spec->alphas[0] != 0xff);
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, 8, width, height);
-
- rgba = 0xff;
- rgba |= (gint) (color.red * 255) << 24;
- rgba |= (gint) (color.green * 255) << 16;
- rgba |= (gint) (color.blue * 255) << 8;
-
- if (!has_alpha)
+ if (!spec || spec->n_alphas == 1)
{
- gdk_pixbuf_fill (pixbuf, rgba);
- }
- else if (spec->n_alphas == 1)
- {
- rgba &= ~0xff;
- rgba |= spec->alphas[0];
+ if (spec)
+ color.alpha = spec->alphas[0] / 255.0;
- gdk_pixbuf_fill (pixbuf, rgba);
+ gdk_cairo_set_source_rgba (cr, &color);
+ cairo_rectangle (cr, x, y, width, height);
+ cairo_fill (cr);
}
else
{
- gdk_pixbuf_fill (pixbuf, rgba);
+ cairo_pattern_t *pattern;
+ gint n_alphas;
+ gint i;
- meta_gradient_add_alpha (pixbuf, spec->alphas, spec->n_alphas,
- spec->type);
- }
+ /* Hardcoded in meta-theme-metacity.c */
+ g_assert (spec->type == META_GRADIENT_HORIZONTAL);
- return pixbuf;
+ pattern = cairo_pattern_create_linear (0, 0, 1, 0);
+ n_alphas = spec->n_alphas;
+
+ for (i = 0; i < n_alphas; i++)
+ cairo_pattern_add_color_stop_rgba (pattern, i / (gfloat) (n_alphas - 1),
+ color.red, color.green, color.blue,
+ spec->alphas[i] / 255.0);
+
+ if (cairo_pattern_status (pattern) != CAIRO_STATUS_SUCCESS)
+ {
+ cairo_pattern_destroy (pattern);
+ return;
+ }
+
+ cairo_save (cr);
+ cairo_rectangle (cr, x, y, width, height);
+
+ cairo_translate (cr, x, y);
+ cairo_scale (cr, width, height);
+
+ cairo_set_source (cr, pattern);
+ cairo_fill (cr);
+
+ cairo_pattern_destroy (pattern);
+ cairo_restore (cr);
+ }
}