[lasem] svg_filter: make gaussian blur filter work.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] svg_filter: make gaussian blur filter work.
- Date: Sat, 13 Oct 2012 21:08:50 +0000 (UTC)
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]