[lasem] svg_filter: fix SourceAlpha.



commit 8e5ae941f1bc841df99d78c3223914ea2ca049a8
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Oct 14 20:42:26 2012 +0200

    svg_filter: fix SourceAlpha.

 TODO             |   12 ++++++------
 src/lsmcairo.c   |   15 +++++++++++++++
 src/lsmcairo.h   |    1 +
 src/lsmsvgview.c |   16 +++++++++++++---
 4 files changed, 35 insertions(+), 9 deletions(-)
---
diff --git a/TODO b/TODO
index b1e3a6f..7e44835 100644
--- a/TODO
+++ b/TODO
@@ -1,9 +1,9 @@
 All
 
-â garbage collection in lsm_property_manager
+x garbage collection in lsm_property_manager
 - CSS support
-â gtk-doc support
-â single <lsm.h> include
+x gtk-doc support
+x single <lsm.h> include
 - multithread safety
 
 Mathml
@@ -24,8 +24,8 @@ Mathml
 
 SVG
 
-â check for recursions
-â don't use cairo_stroke for simple text, but pango_cairo_show_layout instead.
+x check for recursions
+x don't use cairo_stroke for simple text, but pango_cairo_show_layout instead.
 - take group opacity into account when stroking or filling with pattern (like what was done for gradient)
 - really implement get_extents for all elements
 - don't ignore an element with visibility != visible when clipping
@@ -36,6 +36,6 @@ SVG
 - add support for arithmetic in feComposite
 - group opacity should happen after filter
 - add support for filter BackgroundImage and BackgroundAlpha 
-- fix SourceAlpha
+x fix SourceAlpha
 
 And many many more things to do...
diff --git a/src/lsmcairo.c b/src/lsmcairo.c
index 21c074c..1a5e28b 100644
--- a/src/lsmcairo.c
+++ b/src/lsmcairo.c
@@ -382,6 +382,21 @@ lsm_filter_surface_offset (LsmFilterSurface *input,
 	cairo_destroy (cairo);
 }
 
+void
+lsm_filter_surface_alpha (LsmFilterSurface *input, LsmFilterSurface *output)
+{
+	cairo_t *cairo;
+
+	g_return_if_fail (input != NULL);
+	g_return_if_fail (output != NULL);
+
+	cairo = cairo_create (output->surface);
+	cairo_set_source_rgb (cairo, 0, 0, 0);
+	cairo_mask_surface (cairo, input->surface, 0, 0);
+
+	cairo_destroy (cairo);
+}
+
 /**
  * lsm_cairo_set_source_pixbuf:
  * @cr: a cairo context
diff --git a/src/lsmcairo.h b/src/lsmcairo.h
index 2f0bdf7..e911409 100644
--- a/src/lsmcairo.h
+++ b/src/lsmcairo.h
@@ -50,6 +50,7 @@ cairo_surface_t *	lsm_filter_surface_get_cairo_surface	(LsmFilterSurface *surfac
 void 			lsm_filter_surface_unref 		(LsmFilterSurface *filter_surface);
 LsmFilterSurface *	lsm_filter_surface_ref 			(LsmFilterSurface *filter_surface);
 
+void 			lsm_filter_surface_alpha 		(LsmFilterSurface *input, LsmFilterSurface *output);
 void 			lsm_filter_surface_blend 		(LsmFilterSurface *input_1,
 								 LsmFilterSurface *input_2,
 								 LsmFilterSurface *output,
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 3111da0..1fe33a8 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1988,9 +1988,6 @@ lsm_svg_view_pop_filter (LsmSvgView *view)
 
 		view->filter_surfaces = g_slist_prepend (view->filter_surfaces, filter_surface);
 
-		filter_surface = lsm_filter_surface_new_with_content ("SourceAlpha", 0, 0, surface);
-		view->filter_surfaces = g_slist_prepend (view->filter_surfaces, filter_surface);
-
 		lsm_svg_element_force_render (filter_element, view);
 
 		if (view->debug_filter) {
@@ -2034,6 +2031,7 @@ static LsmFilterSurface *
 _get_filter_surface (LsmSvgView *view, const char *input)
 {
 	GSList *iter;
+	LsmFilterSurface *source_surface = NULL;
 
 	if (input == NULL)
 		return view->filter_surfaces->data;
@@ -2043,6 +2041,18 @@ _get_filter_surface (LsmSvgView *view, const char *input)
 
 		if (g_strcmp0 (input, lsm_filter_surface_get_name (surface)) == 0)
 			return surface;
+
+		source_surface = surface;
+	}
+
+	if (g_strcmp0 (input, "SourceAlpha") == 0 && source_surface != NULL) {
+		LsmFilterSurface *surface;
+
+		surface = lsm_filter_surface_new_similar ("SourceAlpha", source_surface);
+		lsm_filter_surface_alpha (source_surface, surface);
+		view->filter_surfaces = g_slist_prepend (view->filter_surfaces, surface);	
+
+		return surface;
 	}
 
 	return NULL;



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