[lasem] svg_view: fix handling of group opacity.



commit 66d79075c70d8a9fe3708e0b75ef71e73ff49de3
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Mon Oct 15 23:58:10 2012 +0200

    svg_view: fix handling of group opacity.
    
    group opacity attribute was missed in some cases. The drawback of
    this patch is the optimisation of simple shape rendering with group
    opacity < 1.0 is disabled for now.

 src/lsmsvgelement.c |    4 ----
 src/lsmsvgview.c    |   39 ++++++++++++++++-----------------------
 src/lsmsvgview.h    |    3 ---
 3 files changed, 16 insertions(+), 30 deletions(-)
---
diff --git a/src/lsmsvgelement.c b/src/lsmsvgelement.c
index 750a489..91e575b 100644
--- a/src/lsmsvgelement.c
+++ b/src/lsmsvgelement.c
@@ -144,13 +144,9 @@ _render (LsmSvgElement *element, LsmSvgView *view)
 
 	lsm_debug_render ("[LsmSvgElement::_render");
 
-	lsm_svg_view_push_group_opacity (view);
-
 	for (node = LSM_DOM_NODE (element)->first_child; node != NULL; node = node->next_sibling)
 		if (LSM_IS_SVG_ELEMENT (node))
 		    lsm_svg_element_render (LSM_SVG_ELEMENT (node), view);
-
-	lsm_svg_view_pop_group_opacity (view);
 }
 
 static void
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index ecb11f5..1b39f2a 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1068,6 +1068,9 @@ paint (LsmSvgView *view, LsmSvgViewPathInfos *path_infos)
 	cairo = view->dom_view.cairo;
 	style = view->style;
 
+#if 0
+	/* This is disabled for now, as care should be taken in push_composition to
+	 * defer group opacity for simple shape to this function. */
 	if (style->opacity != NULL) {
 		group_opacity = style->opacity->value;
 
@@ -1078,8 +1081,12 @@ paint (LsmSvgView *view, LsmSvgViewPathInfos *path_infos)
 		use_group = FALSE;
 		group_opacity = 1.0;
 	}
+#else
+	use_group = FALSE;
+	group_opacity = 1.0;
+#endif
 
-	/* FIXME Instead of push_group, restrict to the current path bounding box */
+	/* Instead of push_group, we should restrict to the current path bounding box */
 	if (use_group)
 		cairo_push_group (cairo);
 
@@ -1766,28 +1773,6 @@ lsm_svg_view_pop_matrix (LsmSvgView *view)
 	}
 }
 
-void
-lsm_svg_view_push_group_opacity (LsmSvgView *view)
-{
-	g_return_if_fail (LSM_IS_SVG_VIEW (view));
-	g_return_if_fail (view->style != NULL);
-
-	if (view->style->opacity->value < 1.0)
-		cairo_push_group (view->dom_view.cairo);
-}
-
-void
-lsm_svg_view_pop_group_opacity (LsmSvgView *view)
-{
-	g_return_if_fail (LSM_IS_SVG_VIEW (view));
-	g_return_if_fail (view->style != NULL);
-
-	if (view->style->opacity->value < 1.0) {
-		cairo_pop_group_to_source (view->dom_view.cairo);
-		cairo_paint_with_alpha (view->dom_view.cairo, view->style->opacity->value);
-	}
-}
-
 static void
 lsm_svg_view_push_clip (LsmSvgView *view)
 {
@@ -2300,6 +2285,9 @@ lsm_svg_view_push_composition (LsmSvgView *view, LsmSvgStyle *style)
 
 	lsm_log_render ("[SvgView::push_composition]");
 
+	if (view->style->opacity->value < 1.0)
+		cairo_push_group (view->dom_view.cairo);
+
 	if (g_strcmp0 (style->clip_path->value, "none") != 0) {
 		lsm_debug_render ("[LsmSvgView::push_style] Start clip '%s'", style->clip_path->value);
 		lsm_svg_view_push_clip (view);
@@ -2343,6 +2331,11 @@ void lsm_svg_view_pop_composition (LsmSvgView *view)
 	if (g_strcmp0 (view->style->clip_path->value, "none") != 0)
 		lsm_svg_view_pop_clip (view);
 
+	if (view->style->opacity->value < 1.0) {
+		cairo_pop_group_to_source (view->dom_view.cairo);
+		cairo_paint_with_alpha (view->dom_view.cairo, view->style->opacity->value);
+	}
+
 	lsm_svg_view_pop_style (view);
 }
 
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index a23ad3f..7b7124a 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -144,9 +144,6 @@ void 		lsm_svg_view_pop_matrix			(LsmSvgView *view);
 void		lsm_svg_view_push_element		(LsmSvgView *view, const LsmSvgElement *element);
 void		lsm_svg_view_pop_element		(LsmSvgView *view);
 
-void 		lsm_svg_view_push_group_opacity 	(LsmSvgView *view);
-void 		lsm_svg_view_pop_group_opacity 		(LsmSvgView *view);
-
 void		lsm_svg_view_push_style			(LsmSvgView *view, LsmSvgStyle *style);
 void		lsm_svg_view_pop_style			(LsmSvgView *view);
 void		lsm_svg_view_push_composition		(LsmSvgView *view, LsmSvgStyle *style);



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