[gtk+/wip/blur: 3/8] shadow: add code to render blurred shadows
- From: Andrea Cimitan <acimitan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/blur: 3/8] shadow: add code to render blurred shadows
- Date: Wed, 18 Apr 2012 15:03:30 +0000 (UTC)
commit f02ca4c03446bf3fb68f9932f11a7a1f9a4ee85d
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Tue Apr 17 15:43:58 2012 -0400
shadow: add code to render blurred shadows
Split out the blurred shadow rendering in three steps:
- creation of a surface of the appropriate size - we use the clip
rectangle as a good measurement for the size, since we won't render
out of it anyway
- painting the unblurred shape on the surface - this is responsibility
of the single shadow implementations
- blur the surface and compose the result back on the original cairo_t
This means we can share code between the implementations for the first
and third steps; it also makes the code independent of the rendered
size, so we can avoid passing down a cairo_rectangle_t with e.g. the
icon coordinates.
gtk/gtkcssshadowvalue.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 42 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 2698525..964b856 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -21,6 +21,7 @@
#include "gtkcssshadowvalueprivate.h"
+#include "gtkcairoblurprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
#include "gtkstylecontextprivate.h"
@@ -289,6 +290,47 @@ _gtk_css_shadow_value_compute (GtkCssValue *shadow,
color);
}
+static void
+_gtk_css_shadow_value_blur_surface_create (const GtkCssValue *shadow,
+ cairo_t *original_cr,
+ cairo_t **out_cr,
+ cairo_surface_t **out_surface)
+{
+ cairo_rectangle_int_t clip_rect;
+ gdouble radius;
+
+ gdk_cairo_get_clip_rectangle (original_cr, &clip_rect);
+ radius = _gtk_css_number_value_get (shadow->radius, 0);
+
+ /* Create a larger surface to center the blur. */
+ *out_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+ clip_rect.width + 2 * radius,
+ clip_rect.height + 2 * radius);
+ *out_cr = cairo_create (*out_surface);
+ cairo_translate (*out_cr, radius, radius);
+}
+
+static void
+_gtk_css_shadow_value_blur_surface_paint (const GtkCssValue *shadow,
+ cairo_t *cr,
+ cairo_surface_t *surface)
+{
+ gdouble x, y;
+ gdouble radius;
+
+ radius = _gtk_css_number_value_get (shadow->radius, 0);
+
+ /* Blur the surface. */
+ _gtk_cairo_blur_surface (surface, radius);
+
+ /* Paint the blurred surface to cr. */
+ cairo_get_current_point (cr, &x, &y);
+ cairo_set_source_surface (cr, surface,
+ x - radius,
+ y - radius);
+ cairo_paint (cr);
+}
+
void
_gtk_css_shadow_value_paint_layout (const GtkCssValue *shadow,
cairo_t *cr,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]