[lasem] svg_element: push transform matrix before style.



commit a1e6e2ffc024acdb61180023aae9a951eb5785c7
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Sep 30 22:04:30 2012 +0200

    svg_element: push transform matrix before style.
    
    If style contain a clipPath, tranform matrix must be active before
    the emission of the clip path.

 src/lsmsvgelement.c       |   28 +++++++++++++++++-----------
 src/lsmsvgtransformable.c |    3 +--
 src/lsmsvgview.c          |    6 ++++++
 3 files changed, 24 insertions(+), 13 deletions(-)
---
diff --git a/src/lsmsvgelement.c b/src/lsmsvgelement.c
index 9ea52b4..b8fe96c 100644
--- a/src/lsmsvgelement.c
+++ b/src/lsmsvgelement.c
@@ -153,18 +153,14 @@ _render (LsmSvgElement *element, LsmSvgView *view)
 	lsm_svg_view_pop_group_opacity (view);
 }
 
-void
-lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
+static void
+_transformed_render (LsmSvgElement *element, LsmSvgView *view)
 {
 	LsmSvgElementClass *element_class;
 	const LsmSvgStyle *parent_style;
 	LsmSvgStyle *style;
 
-	g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
-
 	element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
-	if (element_class->render == NULL)
-		return;
 
 	parent_style = lsm_svg_view_get_current_style (view);
 	style = lsm_svg_style_new_inherited (parent_style, &element->property_bag);
@@ -178,10 +174,7 @@ lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
 		lsm_svg_view_push_element (view, element);
 		lsm_svg_view_push_style (view, style);
 
-		if (element_class->transformed_render)
-			element_class->transformed_render (element, view);
-		else
-			element_class->render (element, view);
+		element_class->render (element, view);
 
 		lsm_svg_view_pop_style (view);
 		lsm_svg_view_pop_element (view);
@@ -190,6 +183,19 @@ lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
 	lsm_svg_style_unref (style);
 }
 
+void
+lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
+{
+	LsmSvgElementClass *element_class;
+
+	g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
+
+	element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
+
+	if (element_class->render != NULL)
+		element_class->transformed_render (element, view);
+}
+
 static void
 lsm_svg_element_enable_rendering (LsmSvgElement *element)
 {
@@ -355,7 +361,7 @@ lsm_svg_element_class_init (LsmSvgElementClass *s_element_class)
 
 	s_element_class->render = _render;
 	s_element_class->get_extents = _get_extents;
-	s_element_class->transformed_render = NULL;
+	s_element_class->transformed_render = _transformed_render;
 	s_element_class->transformed_get_extents = NULL;
 	s_element_class->attribute_manager = lsm_attribute_manager_new (G_N_ELEMENTS (lsm_svg_attribute_infos),
 									lsm_svg_attribute_infos);
diff --git a/src/lsmsvgtransformable.c b/src/lsmsvgtransformable.c
index 989bc47..b435d17 100644
--- a/src/lsmsvgtransformable.c
+++ b/src/lsmsvgtransformable.c
@@ -37,7 +37,6 @@ static void
 lsm_svg_transformable_transformed_render (LsmSvgElement *element, LsmSvgView *view)
 {
 	LsmSvgTransformable *transformable = LSM_SVG_TRANSFORMABLE (element);
-	LsmSvgElementClass *element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
 	gboolean is_identity_transform;
 	gboolean is_matrix_invertible = TRUE;
 
@@ -49,7 +48,7 @@ lsm_svg_transformable_transformed_render (LsmSvgElement *element, LsmSvgView *vi
 		is_matrix_invertible = TRUE;
 
 	if (is_matrix_invertible)
-		element_class->render (element, view);
+		LSM_SVG_ELEMENT_CLASS (parent_class)->transformed_render (element, view);
 
 	if (!is_identity_transform)
 		lsm_svg_view_pop_matrix (view);
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 6eb8d7a..bec41d6 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1784,6 +1784,12 @@ lsm_svg_view_push_clip (LsmSvgView *view)
 	view->clip_extents.width  = extents.x2 - extents.x1;
 	view->clip_extents.height = extents.y2 - extents.y1;
 
+	lsm_debug_render ("[LsmSvgView::push_clip] x=%g y=%g w=%g h=%g",
+			  view->clip_extents.x,
+			  view->clip_extents.y,
+			  view->clip_extents.width,
+			  view->clip_extents.height);
+
 	element = lsm_svg_document_get_element_by_url (LSM_SVG_DOCUMENT (view->dom_view.document), url);
 	if (LSM_IS_SVG_CLIP_PATH_ELEMENT (element) &&
 	    !lsm_svg_view_circular_reference_check (view, element)) {



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