[lasem] svg: implement get_extents for <ellipse> and <line>.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] svg: implement get_extents for <ellipse> and <line>.
- Date: Sun, 21 Oct 2012 21:31:18 +0000 (UTC)
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]