[lasem] svg: implement get_extents for <ellipse> and <line>.



commit 7a69271764de7ca9c8655bc533e8b0d76aa47784
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Oct 21 23:30:50 2012 +0200

    svg: implement get_extents for <ellipse> and <line>.

 src/lsmsvgcircleelement.c  |   16 ++++++++++------
 src/lsmsvgellipseelement.c |   29 +++++++++++++++++++++++++----
 src/lsmsvglineelement.c    |   30 ++++++++++++++++++++++++++----
 3 files changed, 61 insertions(+), 14 deletions(-)
---
diff --git a/src/lsmsvgcircleelement.c b/src/lsmsvgcircleelement.c
index 0c34e4a..6b1e727 100644
--- a/src/lsmsvgcircleelement.c
+++ b/src/lsmsvgcircleelement.c
@@ -40,14 +40,20 @@ lsm_svg_circle_element_get_node_name (LsmDomNode *node)
 /* LsmSvgGraphic implementation */
 
 static void
+_normalize_length (LsmSvgCircleElement *circle, LsmSvgView *view, double *cx, double *cy, double *r)
+{
+	*cx = lsm_svg_view_normalize_length (view, &circle->cx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+	*cy = lsm_svg_view_normalize_length (view, &circle->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+	*r  = lsm_svg_view_normalize_length (view, &circle->r.length,  LSM_SVG_LENGTH_DIRECTION_DIAGONAL);
+}
+
+static void
 lsm_svg_circle_element_render (LsmSvgElement *self, LsmSvgView *view)
 {
 	LsmSvgCircleElement *circle = LSM_SVG_CIRCLE_ELEMENT (self);
 	double cx, cy, r;
 
-	cx = lsm_svg_view_normalize_length (view, &circle->cx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	cy = lsm_svg_view_normalize_length (view, &circle->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
-	r  = lsm_svg_view_normalize_length (view, &circle->r.length,  LSM_SVG_LENGTH_DIRECTION_DIAGONAL);
+	_normalize_length (circle, view, &cx,&cy,&r);
 
 	lsm_debug_render ("[LsmSvgCircleElement::render] cx = %g, cy = %g, r = %g", cx, cy, r);
 
@@ -60,9 +66,7 @@ lsm_svg_circle_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmEx
 	LsmSvgCircleElement *circle = LSM_SVG_CIRCLE_ELEMENT (self);
 	double cx, cy, r;
 
-	cx = lsm_svg_view_normalize_length (view, &circle->cx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	cy = lsm_svg_view_normalize_length (view, &circle->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
-	r  = lsm_svg_view_normalize_length (view, &circle->r.length,  LSM_SVG_LENGTH_DIRECTION_DIAGONAL);
+	_normalize_length (circle, view, &cx,&cy,&r);
 
 	extents->x1 = cx - r;
 	extents->y1 = cy - r;
diff --git a/src/lsmsvgellipseelement.c b/src/lsmsvgellipseelement.c
index 6c99d61..e8a1dab 100644
--- a/src/lsmsvgellipseelement.c
+++ b/src/lsmsvgellipseelement.c
@@ -39,19 +39,39 @@ lsm_svg_ellipse_element_get_node_name (LsmDomNode *node)
 /* LsmSvgGraphic implementation */
 
 static void
+_normalize_length (LsmSvgEllipseElement *ellipse, LsmSvgView *view, double *cx, double *cy, double *rx, double *ry)
+{
+	*cx = lsm_svg_view_normalize_length (view, &ellipse->cx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+	*cy = lsm_svg_view_normalize_length (view, &ellipse->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+	*rx = lsm_svg_view_normalize_length (view, &ellipse->rx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+	*ry = lsm_svg_view_normalize_length (view, &ellipse->ry.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+}
+
+static void
 lsm_svg_ellipse_element_render (LsmSvgElement *self, LsmSvgView *view)
 {
 	LsmSvgEllipseElement *ellipse = LSM_SVG_ELLIPSE_ELEMENT (self);
 	double cx, cy, rx, ry;
 
-	cx = lsm_svg_view_normalize_length (view, &ellipse->cx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	cy = lsm_svg_view_normalize_length (view, &ellipse->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
-	rx = lsm_svg_view_normalize_length (view, &ellipse->rx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	ry = lsm_svg_view_normalize_length (view, &ellipse->ry.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+	_normalize_length (ellipse, view, &cx, &cy, &rx, &ry);
 
 	lsm_svg_view_show_ellipse (view, cx, cy, rx, ry);
 }
 
+static void
+lsm_svg_ellipse_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+{
+	LsmSvgEllipseElement *ellipse = LSM_SVG_ELLIPSE_ELEMENT (self);
+	double cx, cy, rx, ry;
+
+	_normalize_length (ellipse, view, &cx, &cy, &rx, &ry);
+
+	extents->x1 = cx - rx;
+	extents->y1 = cy - ry;
+	extents->x2 = cx + rx;
+	extents->y2 = cy + ry;
+}
+
 /* LsmSvgEllipseElement implementation */
 
 LsmDomNode *
@@ -125,6 +145,7 @@ lsm_svg_ellipse_element_class_init (LsmSvgEllipseElementClass *s_rect_class)
 		LSM_SVG_ELEMENT_CATEGORY_BASIC_SHAPE;
 
 	s_element_class->render = lsm_svg_ellipse_element_render;
+	s_element_class->get_extents = lsm_svg_ellipse_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/lsmsvglineelement.c b/src/lsmsvglineelement.c
index b467708..4c2ab5c 100644
--- a/src/lsmsvglineelement.c
+++ b/src/lsmsvglineelement.c
@@ -40,21 +40,42 @@ lsm_svg_line_element_get_node_name (LsmDomNode *node)
 /* LsmSvgGraphic implementation */
 
 static void
+_normalize_length (LsmSvgLineElement *line, LsmSvgView *view, double *x1, double *y1, double *x2, double *y2)
+{
+	*x1 = lsm_svg_view_normalize_length (view, &line->x1.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+	*y1 = lsm_svg_view_normalize_length (view, &line->y1.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+	*x2 = lsm_svg_view_normalize_length (view, &line->x2.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+	*y2 = lsm_svg_view_normalize_length (view, &line->y2.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+
+}
+
+static void
 lsm_svg_line_element_render (LsmSvgElement *self, LsmSvgView *view)
 {
 	LsmSvgLineElement *line = LSM_SVG_LINE_ELEMENT (self);
 	double x1, y1, x2, y2;
 
-	x1 = lsm_svg_view_normalize_length (view, &line->x1.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	y1 = lsm_svg_view_normalize_length (view, &line->y1.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
-	x2 = lsm_svg_view_normalize_length (view, &line->x2.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
-	y2 = lsm_svg_view_normalize_length (view, &line->y2.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+	_normalize_length (line, view, &x1, &y1, &x2, &y2);
 
 	lsm_debug_render ("[LsmSvgLineElement::render] %g, %g, %g, %g", x1, y1, x2, y2);
 
 	lsm_svg_view_show_line (view, x1, y1, x2, y2);
 }
 
+static void
+lsm_svg_line_element_get_extents (LsmSvgElement *self, LsmSvgView *view, LsmExtents *extents)
+{
+	LsmSvgLineElement *line = LSM_SVG_LINE_ELEMENT (self);
+	double x1, y1, x2, y2;
+
+	_normalize_length (line, view, &x1, &y1, &x2, &y2);
+
+	extents->x1 = MIN (x1, x2);
+	extents->y1 = MIN (y1, y2);
+	extents->x2 = MAX (x1, x2);
+	extents->y2 = MAX (y1, y2);
+}
+
 /* LsmSvgLineElement implementation */
 
 LsmDomNode *
@@ -119,6 +140,7 @@ lsm_svg_line_element_class_init (LsmSvgLineElementClass *s_rect_class)
 		LSM_SVG_ELEMENT_CATEGORY_BASIC_SHAPE;
 
 	s_element_class->render = lsm_svg_line_element_render;
+	s_element_class->get_extents = lsm_svg_line_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]