[lasem] svg: implement get_extents for <polygon> and <polyline>.



commit 9b4fbadc8dd321ce9c7ada2918a95ef6421b0d87
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Oct 21 23:41:14 2012 +0200

    svg: implement get_extents for <polygon> and <polyline>.

 src/lsmsvgpolygonelement.c  |   30 ++++++++++++++++++++++++++++++
 src/lsmsvgpolylineelement.c |   30 ++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 0 deletions(-)
---
diff --git a/src/lsmsvgpolygonelement.c b/src/lsmsvgpolygonelement.c
index dae4936..97b8845 100644
--- a/src/lsmsvgpolygonelement.c
+++ b/src/lsmsvgpolygonelement.c
@@ -46,6 +46,35 @@ lsm_svg_polygon_element_render (LsmSvgElement *self, LsmSvgView *view)
 	lsm_svg_view_show_polygon (view, polygon->points.value);
 }
 
+static void
+lsm_svg_polygon_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+{
+	LsmSvgPolygonElement *polygon = LSM_SVG_POLYGON_ELEMENT (self);
+	int count = 0;
+	int n_values;
+	char *str = polygon->points.value;
+	double values[2];
+
+	/* TODO cache polygon extents */
+	do {
+		n_values = lsm_str_parse_double_list (&str, 2, values);
+		if (n_values == 2) {
+			if (count == 0) {
+				extents->x1 = values[0];
+				extents->x2 = values[0];
+				extents->y1 = values[1];
+				extents->y2 = values[1];
+			} else {
+				extents->x1 = MIN (values[0], extents->x1);
+				extents->x2 = MAX (values[0], extents->x2);
+				extents->y1 = MIN (values[1], extents->y1);
+				extents->y2 = MAX (values[1], extents->y2);
+			}
+		}
+		count++;
+	} while (n_values == 2);
+}
+
 /* LsmSvgPolygonElement implementation */
 
 LsmDomNode *
@@ -85,6 +114,7 @@ lsm_svg_polygon_element_class_init (LsmSvgPolygonElementClass *s_rect_class)
 		LSM_SVG_ELEMENT_CATEGORY_BASIC_SHAPE;
 
 	s_element_class->render = lsm_svg_polygon_element_render;
+	s_element_class->get_extents = lsm_svg_polygon_element_get_extents;
 	s_element_class->attribute_manager = lsm_attribute_manager_duplicate (s_element_class->attribute_manager);
 
 	s_element_class->is_shape_element = TRUE;
diff --git a/src/lsmsvgpolylineelement.c b/src/lsmsvgpolylineelement.c
index 60d83b3..8748e84 100644
--- a/src/lsmsvgpolylineelement.c
+++ b/src/lsmsvgpolylineelement.c
@@ -46,6 +46,35 @@ lsm_svg_polyline_element_render (LsmSvgElement *self, LsmSvgView *view)
 	lsm_svg_view_show_polyline (view, polyline->points.value);
 }
 
+static void
+lsm_svg_polyline_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+{
+	LsmSvgPolylineElement *polyline = LSM_SVG_POLYLINE_ELEMENT (self);
+	int count = 0;
+	int n_values;
+	char *str = polyline->points.value;
+	double values[2];
+
+	/* TODO cache polyline extents and share code with polygon */
+	do {
+		n_values = lsm_str_parse_double_list (&str, 2, values);
+		if (n_values == 2) {
+			if (count == 0) {
+				extents->x1 = values[0];
+				extents->x2 = values[0];
+				extents->y1 = values[1];
+				extents->y2 = values[1];
+			} else {
+				extents->x1 = MIN (values[0], extents->x1);
+				extents->x2 = MAX (values[0], extents->x2);
+				extents->y1 = MIN (values[1], extents->y1);
+				extents->y2 = MAX (values[1], extents->y2);
+			}
+		}
+		count++;
+	} while (n_values == 2);
+}
+
 /* LsmSvgPolylineElement implementation */
 
 LsmDomNode *
@@ -85,6 +114,7 @@ lsm_svg_polyline_element_class_init (LsmSvgPolylineElementClass *s_rect_class)
 		LSM_SVG_ELEMENT_CATEGORY_BASIC_SHAPE;
 
 	s_element_class->render = lsm_svg_polyline_element_render;
+	s_element_class->get_extents = lsm_svg_polyline_element_get_extents;
 	s_element_class->attribute_manager = lsm_attribute_manager_duplicate (s_element_class->attribute_manager);
 
 	s_element_class->is_shape_element = TRUE;



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