[lasem] svg_view: optimise group opacity in case of filter.



commit 4461928304db803d6c120e6f8bed7d3477f72257
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Tue Oct 16 00:11:16 2012 +0200

    svg_view: optimise group opacity in case of filter.
    
    As we create a temporary surface for the filters, handle group
    opacity when compositing this surface to the canvas. It allows to avoid
    a push_group call.

 src/lsmsvgview.c |   36 ++++++++++++++++++++++++++----------
 1 files changed, 26 insertions(+), 10 deletions(-)
---
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 1b39f2a..e358c27 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -2000,7 +2000,7 @@ lsm_svg_view_pop_filter (LsmSvgView *view)
 			cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE);
 			cairo_pattern_set_matrix (pattern, &matrix);
 			cairo_set_source (view->pattern_data->old_cairo, pattern);
-			cairo_paint (view->pattern_data->old_cairo);
+			cairo_paint_with_alpha (view->pattern_data->old_cairo, view->style->opacity->value);
 		}
 
 		for (iter = view->filter_surfaces; iter != NULL; iter = iter->next)
@@ -2278,6 +2278,10 @@ lsm_svg_view_push_style (LsmSvgView *view, LsmSvgStyle *style)
 void
 lsm_svg_view_push_composition (LsmSvgView *view, LsmSvgStyle *style)
 {
+	gboolean do_filter;
+	gboolean do_mask;
+	gboolean do_clip;
+
 	g_return_if_fail (LSM_IS_SVG_VIEW (view));
 	g_return_if_fail (style != NULL);
 
@@ -2285,20 +2289,24 @@ lsm_svg_view_push_composition (LsmSvgView *view, LsmSvgStyle *style)
 
 	lsm_log_render ("[SvgView::push_composition]");
 
-	if (view->style->opacity->value < 1.0)
+	do_clip = (g_strcmp0 (style->clip_path->value, "none") != 0);
+	do_mask = (g_strcmp0 (style->mask->value, "none") != 0);
+	do_filter = (g_strcmp0 (style->filter->value, "none") != 0);
+
+	if (view->style->opacity->value < 1.0 && !do_filter)
 		cairo_push_group (view->dom_view.cairo);
 
-	if (g_strcmp0 (style->clip_path->value, "none") != 0) {
+	if (do_clip) {
 		lsm_debug_render ("[LsmSvgView::push_style] Start clip '%s'", style->clip_path->value);
 		lsm_svg_view_push_clip (view);
 	}
 
-	if (g_strcmp0 (style->mask->value, "none") != 0) {
+	if (do_mask) {
 		lsm_debug_render ("[LsmSvgView::push_style] Start mask '%s'", style->mask->value);
 		lsm_svg_view_push_mask (view);
 	}
 
-	if (g_strcmp0 (style->filter->value, "none") != 0) {
+	if (do_filter) {
 		lsm_debug_render ("[LsmSvgView::push_style] Start filter '%s'", style->filter->value);
 		lsm_svg_view_push_filter (view);
 	}
@@ -2317,21 +2325,29 @@ void lsm_svg_view_pop_style (LsmSvgView *view)
 
 void lsm_svg_view_pop_composition (LsmSvgView *view)
 {
+	gboolean do_filter;
+	gboolean do_mask;
+	gboolean do_clip;
+
 	g_return_if_fail (LSM_IS_SVG_VIEW (view));
+	g_return_if_fail (view->style != NULL);
 
 	lsm_log_render ("[SvgView::pop_composition]");
 
-	if (g_strcmp0 (view->style->filter->value, "none") != 0) {
+	do_clip = (g_strcmp0 (view->style->clip_path->value, "none") != 0);
+	do_mask = (g_strcmp0 (view->style->mask->value, "none") != 0);
+	do_filter = (g_strcmp0 (view->style->filter->value, "none") != 0);
+
+	if (do_filter)
 		lsm_svg_view_pop_filter (view);
-	}
 
-	if (g_strcmp0 (view->style->mask->value, "none") != 0)
+	if (do_mask)
 		lsm_svg_view_pop_mask (view);
 
-	if (g_strcmp0 (view->style->clip_path->value, "none") != 0)
+	if (do_clip)
 		lsm_svg_view_pop_clip (view);
 
-	if (view->style->opacity->value < 1.0) {
+	if (view->style->opacity->value < 1.0 && !do_filter) {
 		cairo_pop_group_to_source (view->dom_view.cairo);
 		cairo_paint_with_alpha (view->dom_view.cairo, view->style->opacity->value);
 	}



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