[lasem] svg_filter: fix SourceAlpha.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] svg_filter: fix SourceAlpha.
- Date: Sun, 14 Oct 2012 18:42:44 +0000 (UTC)
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]