[lasem] [SVG] Handle viewbox attribute for pattern elements.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: svn-commits-list gnome org
- Subject: [lasem] [SVG] Handle viewbox attribute for pattern elements.
- Date: Fri, 15 May 2009 17:31:10 -0400 (EDT)
commit 5a99c6e762c4b2d9cfa18ea859756dbb361c753c
Author: Emmanuel Pacaud <emmanuel pacaud lapp in2p3 fr>
Date: Fri May 15 23:30:39 2009 +0200
[SVG] Handle viewbox attribute for pattern elements.
---
src/lsmsvgpatternelement.c | 43 ++++++++++++++++++++++++++++++++++---------
src/lsmsvgpatternelement.h | 6 ++++--
2 files changed, 38 insertions(+), 11 deletions(-)
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 8034a66..e495f10 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -67,6 +67,8 @@ _pattern_element_update (LsmSvgElement *self, LsmSvgStyle *parent_style)
length.type = LSM_SVG_LENGTH_TYPE_PX;
lsm_svg_animated_length_attribute_parse (&pattern->height, &length);
+ lsm_svg_viewbox_attribute_parse (&pattern->viewbox);
+
LSM_SVG_ELEMENT_CLASS (parent_class)->update (self, parent_style);
}
@@ -76,6 +78,7 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
LsmSvgPatternElement *pattern = LSM_SVG_PATTERN_ELEMENT (self);
double x, y, width, height;
gboolean is_object_bounding_box;
+ gboolean is_viewbox_defined;
is_object_bounding_box = (pattern->units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
@@ -120,7 +123,27 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
lsm_svg_view_push_transform (view, &matrix);
}
- LSM_SVG_ELEMENT_CLASS (parent_class)->render (self, view);
+ is_viewbox_defined = lsm_dom_attribute_is_defined ((LsmDomAttribute *) &pattern->viewbox);
+
+ if (!(is_viewbox_defined) ||
+ (is_viewbox_defined && pattern->viewbox.value.width > 0.0 && pattern->viewbox.value.height > 0.0)) {
+ if (is_viewbox_defined) {
+ LsmSvgMatrix matrix;
+
+ lsm_svg_matrix_init_scale (&matrix,
+ width / pattern->viewbox.value.width,
+ height / pattern->viewbox.value.height);
+ lsm_svg_view_push_viewbox (view, &pattern->viewbox.value);
+ lsm_svg_view_push_transform (view, &matrix);
+ }
+
+ LSM_SVG_ELEMENT_CLASS (parent_class)->render (self, view);
+
+ if (is_viewbox_defined) {
+ lsm_svg_view_pop_transform (view);
+ lsm_svg_view_pop_viewbox (view);
+ }
+ }
if (is_object_bounding_box) {
lsm_svg_view_pop_transform (view);
@@ -169,21 +192,23 @@ lsm_svg_pattern_element_class_init (LsmSvgPatternElementClass *klass)
s_element_class->attributes = lsm_dom_attribute_map_duplicate (s_element_class->attributes);
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "x",
- offsetof (LsmSvgPatternElement, x));
+ offsetof (LsmSvgPatternElement, x));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "y",
- offsetof (LsmSvgPatternElement, y));
+ offsetof (LsmSvgPatternElement, y));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "width",
- offsetof (LsmSvgPatternElement, width));
+ offsetof (LsmSvgPatternElement, width));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "height",
- offsetof (LsmSvgPatternElement, height));
+ offsetof (LsmSvgPatternElement, height));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "patternUnits",
- offsetof (LsmSvgPatternElement, units));
+ offsetof (LsmSvgPatternElement, units));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "patternContentUnits",
- offsetof (LsmSvgPatternElement, content_units));
+ offsetof (LsmSvgPatternElement, content_units));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "patternTransform",
- offsetof (LsmSvgPatternElement, transform));
+ offsetof (LsmSvgPatternElement, transform));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "xlink:href",
- offsetof (LsmSvgPatternElement, href));
+ offsetof (LsmSvgPatternElement, href));
+ lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "viewBox",
+ offsetof (LsmSvgPatternElement, viewbox));
}
G_DEFINE_TYPE (LsmSvgPatternElement, lsm_svg_pattern_element, LSM_TYPE_SVG_GRAPHIC)
diff --git a/src/lsmsvgpatternelement.h b/src/lsmsvgpatternelement.h
index 096ed2b..0d6e6b2 100644
--- a/src/lsmsvgpatternelement.h
+++ b/src/lsmsvgpatternelement.h
@@ -43,10 +43,12 @@ struct _LsmSvgPatternElement {
LsmSvgAnimatedLengthAttribute y;
LsmSvgAnimatedLengthAttribute width;
LsmSvgAnimatedLengthAttribute height;
- LsmSvgTransformAttribute transform;
+ LsmSvgTransformAttribute transform;
LsmDomEnumAttribute units;
LsmDomEnumAttribute content_units;
- LsmDomAttribute href;
+ LsmDomAttribute href;
+
+ LsmSvgViewboxAttribute viewbox;
};
struct _LsmSvgPatternElementClass {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]