[lasem] svg_filter: make gaussian blur filter work.



commit 9751d7aef0b24855ff35936b9e214630ef034e6a
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sat Oct 13 23:08:27 2012 +0200

    svg_filter: make gaussian blur filter work.

 src/lsmcairo.c   |   21 +++++++++++++++++++++
 src/lsmcairo.h   |    1 +
 src/lsmsvgview.c |   21 +++++++++++++++++++++
 3 files changed, 43 insertions(+), 0 deletions(-)
---
diff --git a/src/lsmcairo.c b/src/lsmcairo.c
index 1a7e9bb..deeb227 100644
--- a/src/lsmcairo.c
+++ b/src/lsmcairo.c
@@ -25,6 +25,7 @@
 
 #include <lsmcairo.h>
 #include <math.h>
+#include <string.h>
 
 struct _LsmFilterSurface {
 	char *name;
@@ -83,6 +84,26 @@ lsm_filter_surface_new_similar (const char *name, LsmFilterSurface *model)
 	return lsm_filter_surface_new (name, model->x0, model->y0, model->x1, model->y1);
 }
 
+void
+lsm_filter_surface_copy_data (LsmFilterSurface *to, LsmFilterSurface *from)
+{
+	size_t to_size;
+	size_t from_size;
+	void *to_data;
+	void *from_data;
+
+	g_return_if_fail (to != NULL);
+	g_return_if_fail (from != NULL);
+
+	to_size = cairo_image_surface_get_height (to->surface) * cairo_image_surface_get_stride (to->surface);
+	from_size = cairo_image_surface_get_height (from->surface) * cairo_image_surface_get_stride (from->surface);
+	to_data = cairo_image_surface_get_data (to->surface);
+	from_data = cairo_image_surface_get_data (from->surface);
+	
+	if (to_size == from_size)
+		memcpy (to_data, from_data, to_size);
+}
+
 const char *
 lsm_filter_surface_get_name (LsmFilterSurface *surface)
 {
diff --git a/src/lsmcairo.h b/src/lsmcairo.h
index b37e152..8955f4f 100644
--- a/src/lsmcairo.h
+++ b/src/lsmcairo.h
@@ -43,6 +43,7 @@ LsmFilterSurface * 	lsm_filter_surface_new_with_content 	(const char *name,
 								 unsigned int x0, unsigned int y0,
 								 cairo_surface_t *surface);
 LsmFilterSurface *	lsm_filter_surface_new_similar		(const char *name, LsmFilterSurface *model);
+void 			lsm_filter_surface_copy_data 		(LsmFilterSurface *to, LsmFilterSurface *from);
 const char * 		lsm_filter_surface_get_name 		(LsmFilterSurface *surface);
 cairo_surface_t *	lsm_filter_surface_get_cairo_surface	(LsmFilterSurface *surface);
 void 			lsm_filter_surface_unref 		(LsmFilterSurface *filter_surface);
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index a467f1b..2465e41 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1978,18 +1978,39 @@ lsm_svg_view_pop_filter (LsmSvgView *view)
 
 	if (LSM_IS_SVG_FILTER_ELEMENT (filter_element) &&
 	    view->pattern_data->pattern != NULL) {
+		cairo_matrix_t matrix;
+
 		view->filter_surfaces = NULL;
 
 		cairo_pattern_get_surface (view->pattern_data->pattern, &surface);
 		filter_surface = lsm_filter_surface_new_with_content ("SourceGraphic", 0, 0, surface);
+		cairo_pattern_get_matrix (view->pattern_data->pattern, &matrix);
 
 		view->filter_surfaces = g_slist_prepend (view->filter_surfaces, filter_surface);
 
 		lsm_svg_element_force_render (filter_element, view);
 
+#if 1
+		lsm_filter_surface_copy_data (filter_surface, view->filter_surfaces->data);
+
 		cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_NONE);
 		cairo_set_source (view->pattern_data->old_cairo, view->pattern_data->pattern);
 		cairo_paint_with_alpha (view->pattern_data->old_cairo, view->pattern_data->opacity);
+#else
+		/* This is the code that should be used. But unfortunately it doesn't work.
+		 * For some reason, cairo_paint paints nothing. I fail to see why it doesn't, while
+		 * the above code does. */
+		{
+			cairo_pattern_t *pattern;
+
+			pattern = cairo_pattern_create_for_surface (lsm_filter_surface_get_cairo_surface (view->filter_surfaces->data));
+			cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE);
+			cairo_pattern_set_matrix (pattern, &matrix);
+			cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST);
+			cairo_set_source (view->pattern_data->old_cairo, pattern);
+			cairo_paint_with_alpha (view->pattern_data->old_cairo, view->pattern_data->opacity);
+		}
+#endif
 
 		if (view->debug_filter) {
 			GSList *iter;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]