diff options
author | Alexander Larsson <alexl@redhat.com> | 2015-03-20 14:56:42 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2015-03-21 21:39:15 +0100 |
commit | 8e032622c864c5259786a72ca1b811603ae9ca09 (patch) | |
tree | 0e6fc7d782608d8f902740a792b4fb50b02ddf19 /gtk/gtkcssshadowvalue.c | |
parent | 967cb56275a139942c9df78f46134d3a4e4dd1eb (diff) | |
download | gtk+-8e032622c864c5259786a72ca1b811603ae9ca09.tar.gz |
box-shadow: For top/bottom and left/right parts, repeat a single line
Since these part really are the same in all of the x or y direction
and we don't blur in that direction we can just blur one line and
repeat it during drawing.
https://bugzilla.gnome.org/show_bug.cgi?id=746468
Diffstat (limited to 'gtk/gtkcssshadowvalue.c')
-rw-r--r-- | gtk/gtkcssshadowvalue.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 341844f751..ffdc2b6250 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -328,6 +328,14 @@ gtk_css_shadow_value_start_drawing (const GtkCssValue *shadow, radius = _gtk_css_number_value_get (shadow->radius, 0); clip_radius = _gtk_cairo_blur_compute_pixels (radius); + if (blur_flags & GTK_BLUR_REPEAT) + { + if (!blur_x) + clip_rect.width = 1; + if (!blur_y) + clip_rect.height = 1; + } + /* Create a larger surface to center the blur. */ surface = cairo_surface_create_similar_image (cairo_get_target (cr), CAIRO_FORMAT_A8, @@ -350,6 +358,20 @@ gtk_css_shadow_value_start_drawing (const GtkCssValue *shadow, return blur_cr; } +void +mask_surface_repeat (cairo_t *cr, + cairo_surface_t *surface) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_for_surface (surface); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + static cairo_t * gtk_css_shadow_value_finish_drawing (const GtkCssValue *shadow, cairo_t *cr, @@ -370,7 +392,10 @@ gtk_css_shadow_value_finish_drawing (const GtkCssValue *shadow, _gtk_cairo_blur_surface (surface, radius, blur_flags); gdk_cairo_set_source_rgba (original_cr, _gtk_css_rgba_value_get_rgba (shadow->color)); - cairo_mask_surface (original_cr, surface, 0, 0); + if (blur_flags & GTK_BLUR_REPEAT) + mask_surface_repeat (original_cr, surface); + else + cairo_mask_surface (original_cr, surface, 0, 0); cairo_destroy (cr); @@ -740,7 +765,7 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow, /* Then the sides */ for (i = 0; i < 4; i++) { - GtkBlurFlags blur_flags = 0; + GtkBlurFlags blur_flags = GTK_BLUR_REPEAT; if (i == GTK_CSS_TOP || i == GTK_CSS_BOTTOM) { |