[lasem] svg: implement get_extents for <path>
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] svg: implement get_extents for <path>
- Date: Sun, 8 Aug 2010 13:27:29 +0000 (UTC)
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]