diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2016-07-07 18:48:05 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2016-07-07 18:48:05 +0300 |
commit | 1f0212d9d91c4cf588ec7c4fe968c72ea8152978 (patch) | |
tree | 1bfc85b51a0929b508c2d5286490f4acc1cd7514 | |
parent | fc1a21eafe14cd6c675d7a04da5a4fc7654565a1 (diff) | |
download | metacity-1f0212d9d91c4cf588ec7c4fe968c72ea8152978.tar.gz |
libmetacity: use cairo to draw tint
-rw-r--r-- | libmetacity/meta-draw-op.c | 41 | ||||
-rw-r--r-- | libmetacity/meta-gradient-spec-private.h | 9 | ||||
-rw-r--r-- | libmetacity/meta-gradient-spec.c | 71 |
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); + } } |