[lasem] svg: implement get_extents for <path>



commit 601236955defda379bf5dd267301eeb996de0fa9
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Aug 8 11:35:21 2010 +0200

    svg: implement get_extents for <path>

 src/lsmsvgelement.c     |   29 +++++++++++++++++++----------
 src/lsmsvgpathelement.c |   15 ++++++++++++---
 src/lsmsvguseelement.c  |   11 ++++++++++-
 src/lsmsvgview.c        |   25 +++++++++++++++++++++++++
 src/lsmsvgview.h        |    4 ++++
 5 files changed, 70 insertions(+), 14 deletions(-)
---
diff --git a/src/lsmsvgelement.c b/src/lsmsvgelement.c
index 10efdaa..8e6160d 100644
--- a/src/lsmsvgelement.c
+++ b/src/lsmsvgelement.c
@@ -171,7 +171,7 @@ lsm_svg_element_force_render (LsmSvgElement *element, LsmSvgView *view)
 }
 
 static void
-_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+_get_extents (LsmSvgElement *element, LsmSvgView *view, LsmExtents *extents)
 {
 	LsmDomNode *node;
 	gboolean first_child = TRUE;
@@ -179,16 +179,20 @@ _get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
 
 	lsm_debug ("render", "[LsmSvgElement::_get_extents]");
 
-	for (node = LSM_DOM_NODE (self)->first_child; node != NULL; node = node->next_sibling) {
+	for (node = LSM_DOM_NODE (element)->first_child; node != NULL; node = node->next_sibling) {
 		if (LSM_IS_SVG_ELEMENT (node)) {
 			LsmExtents child_extents;
+			LsmSvgElement *child_element;
 
-			lsm_svg_element_get_extents (LSM_SVG_ELEMENT (node), view, &child_extents);
+			child_element = LSM_SVG_ELEMENT (node);
+
+			lsm_svg_element_get_extents (child_element, view, &child_extents);
+
+			if (!lsm_svg_matrix_is_identity (&child_element->transform.matrix))
+				lsm_svg_matrix_transform_bounding_box (&child_element->transform.matrix,
+								       &extents->x1, &extents->y1,
+								       &extents->x2, &extents->y2);
 
-			if (!lsm_svg_matrix_is_identity (&self->transform.matrix))
-				lsm_svg_matrix_transform_bounding_box (&self->transform.matrix,
-								       &child_extents.x1, &child_extents.y1,
-								       &child_extents.x2, &child_extents.y2);
 			if (first_child) {
 				element_extents = child_extents;
 				first_child = FALSE;
@@ -217,9 +221,14 @@ lsm_svg_element_get_extents (LsmSvgElement *element, LsmSvgView *view, LsmExtent
 	if (element_class->get_extents != NULL) {
 		element_class->get_extents (element, view, extents);
 
-		lsm_debug ("measure", "LsmSvgElement::get_extents] Exents for '%s' = %g,%g %g,%g",
-			   lsm_dom_node_get_node_name (LSM_DOM_NODE (element)),
-			   extents->x1, extents->y1, extents->x2, extents->y2);
+		if (element->id.value != NULL)
+			lsm_debug ("measure", "LsmSvgElement::get_extents] Extents for '%s' = %g,%g %g,%g",
+				   element->id.value,
+				   extents->x1, extents->y1, extents->x2, extents->y2);
+		else
+			lsm_debug ("measure", "LsmSvgElement::get_extents] Extents for <%s> = %g,%g %g,%g",
+				   lsm_dom_node_get_node_name (LSM_DOM_NODE (element)),
+				   extents->x1, extents->y1, extents->x2, extents->y2);
 	} else {
 		extents->x1 = 0.0;
 		extents->y1 = 0.0;
diff --git a/src/lsmsvgpathelement.c b/src/lsmsvgpathelement.c
index d82679f..652134f 100644
--- a/src/lsmsvgpathelement.c
+++ b/src/lsmsvgpathelement.c
@@ -39,15 +39,23 @@ lsm_svg_path_element_get_node_name (LsmDomNode *node)
 static void
 lsm_svg_path_element_render (LsmSvgElement *self, LsmSvgView *view)
 {
-	LsmSvgPathElement *path;
-
-	path = LSM_SVG_PATH_ELEMENT (self);
+	LsmSvgPathElement *path = LSM_SVG_PATH_ELEMENT (self);
 
 	lsm_debug ("render", "[LsmSvgPathElement::render]");
 
 	lsm_svg_view_show_path (view, path->d.value);
 }
 
+static void
+lsm_svg_path_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+{
+	LsmSvgPathElement *path = LSM_SVG_PATH_ELEMENT (self);
+
+	lsm_svg_view_calculate_path_extents (view, path->d.value,
+					     &extents->x1, &extents->y1,
+					     &extents->x2, &extents->y2);
+}
+
 /* LsmSvgPathElement implementation */
 
 LsmDomNode *
@@ -91,6 +99,7 @@ lsm_svg_path_element_class_init (LsmSvgPathElementClass *s_rect_class)
 	d_node_class->get_node_name = lsm_svg_path_element_get_node_name;
 
 	s_element_class->render = lsm_svg_path_element_render;
+	s_element_class->get_extents = lsm_svg_path_element_get_extents;
 	s_element_class->attribute_manager = lsm_attribute_manager_duplicate (s_element_class->attribute_manager);
 
 	lsm_attribute_manager_add_attributes (s_element_class->attribute_manager,
diff --git a/src/lsmsvguseelement.c b/src/lsmsvguseelement.c
index 55bc2e0..f040ed1 100644
--- a/src/lsmsvguseelement.c
+++ b/src/lsmsvguseelement.c
@@ -122,10 +122,19 @@ lsm_svg_use_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExten
 	y = lsm_svg_view_normalize_length (view, &use_element->y.length,
 					   LSM_SVG_LENGTH_DIRECTION_VERTICAL);
 
+	lsm_svg_element_get_extents (LSM_SVG_ELEMENT (element), view, extents);
+
+	if (!lsm_svg_matrix_is_identity (&LSM_SVG_ELEMENT (element)->transform.matrix))
+		lsm_svg_matrix_transform_bounding_box (&LSM_SVG_ELEMENT (element)->transform.matrix,
+						       &extents->x1, &extents->y1,
+						       &extents->x2, &extents->y2);
+
 	lsm_svg_matrix_init_translate (&matrix, x, y);
 	lsm_svg_view_push_matrix (view, &matrix);
 
-	lsm_svg_element_get_extents (LSM_SVG_ELEMENT (element), view, extents);
+	lsm_svg_matrix_transform_bounding_box (&matrix,
+					       &extents->x1, &extents->y1,
+					       &extents->x2, &extents->y2);
 
 	lsm_svg_view_pop_matrix (view);
 }
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index f5872ac..727f466 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1151,6 +1151,31 @@ lsm_svg_view_show_path (LsmSvgView *view,
 }
 
 void
+lsm_svg_view_calculate_path_extents (LsmSvgView *view,
+				     const char *path,
+				     double *x1, double *y1,
+				     double *x2, double *y2)
+{
+	double xx1, yy1, xx2, yy2;
+
+	g_return_if_fail (LSM_IS_SVG_VIEW (view));
+
+	cairo_new_path (view->dom_view.cairo);
+	_emit_svg_path (view->dom_view.cairo, path);
+	cairo_path_extents (view->dom_view.cairo, &xx1, &yy1, &xx2, &yy2);
+	cairo_new_path (view->dom_view.cairo);
+
+	if (x1 != NULL)
+		*x1 = xx1;
+	if (y1 != NULL)
+		*y1 = yy1;
+	if (x2 != NULL)
+		*x2 = xx2;
+	if (y2 != NULL)
+		*y2 = yy2;
+}
+
+void
 lsm_svg_view_show_line (LsmSvgView *view, double x1, double y1, double x2, double y2)
 {
 	g_return_if_fail (LSM_IS_SVG_VIEW (view));
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index 7cd85a4..ae873fc 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -83,6 +83,10 @@ double 		lsm_svg_view_normalize_length 		(LsmSvgView *view, const LsmSvgLength *
 const LsmBox *	lsm_svg_view_get_pattern_extents	(LsmSvgView *view);
 const LsmBox *	lsm_svg_view_get_clip_extents		(LsmSvgView *view);
 
+void		lsm_svg_view_calculate_path_extents	(LsmSvgView *view, const char *path,
+							 double *x1, double *y1,
+							 double *x2, double *y2);
+
 void 		lsm_svg_view_create_radial_gradient 	(LsmSvgView *view, double cx, double cy,
 							                   double r, double fx, double fy);
 void 		lsm_svg_view_create_linear_gradient 	(LsmSvgView *view, double x1, double y1,



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