[lasem] [SVG] Use view_push_viewport from pattern element.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: svn-commits-list gnome org
- Subject: [lasem] [SVG] Use view_push_viewport from pattern element.
- Date: Mon, 18 May 2009 10:01:59 -0400 (EDT)
commit c439dd1f0a1c3fe4aff79dffdc4408671e768831
Author: Emmanuel Pacaud <emmanuel pacaud lapp in2p3 fr>
Date: Mon May 18 15:28:01 2009 +0200
[SVG] Use view_push_viewport from pattern element.
Fix the pattern position.
---
src/lsmsvgpatternelement.c | 44 +++++++++++++++++++-------------------------
src/lsmsvgpatternelement.h | 1 +
src/lsmsvgview.c | 13 ++++++++++---
src/lsmsvgview.h | 2 +-
4 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index e495f10..5673f10 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -68,6 +68,7 @@ _pattern_element_update (LsmSvgElement *self, LsmSvgStyle *parent_style)
lsm_svg_animated_length_attribute_parse (&pattern->height, &length);
lsm_svg_viewbox_attribute_parse (&pattern->viewbox);
+ lsm_svg_preserve_aspect_ratio_attribute_parse (&pattern->preserve_aspect_ratio);
LSM_SVG_ELEMENT_CLASS (parent_class)->update (self, parent_style);
}
@@ -76,9 +77,9 @@ static void
_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;
+ LsmBox viewport;
is_object_bounding_box = (pattern->units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
@@ -88,25 +89,25 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
lsm_svg_view_push_viewbox (view, &viewbox);
}
- x = lsm_svg_view_normalize_length (view, &pattern->x.length.base,
- LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
- y = lsm_svg_view_normalize_length (view, &pattern->y.length.base,
- LSM_SVG_LENGTH_DIRECTION_VERTICAL);
- width = lsm_svg_view_normalize_length (view, &pattern->width.length.base,
- LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
- height = lsm_svg_view_normalize_length (view, &pattern->height.length.base,
- LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+ viewport.x = lsm_svg_view_normalize_length (view, &pattern->x.length.base,
+ LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+ viewport.y = lsm_svg_view_normalize_length (view, &pattern->y.length.base,
+ LSM_SVG_LENGTH_DIRECTION_VERTICAL);
+ viewport.width = lsm_svg_view_normalize_length (view, &pattern->width.length.base,
+ LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
+ viewport.height = lsm_svg_view_normalize_length (view, &pattern->height.length.base,
+ LSM_SVG_LENGTH_DIRECTION_VERTICAL);
if (is_object_bounding_box)
lsm_svg_view_pop_viewbox (view);
- if (width <= 0.0 || height <= 0.0)
+ if (viewport.width <= 0.0 || viewport.height <= 0.0)
return;
lsm_debug ("[LsmSvgPatternElement::render_paint] Create pattern x = %g, y = %g, w = %g, h = %g",
- x, y, width, height);
+ viewport.x, viewport.y, viewport.width, viewport.height);
- lsm_svg_view_create_surface_pattern (view, width, height,
+ lsm_svg_view_create_surface_pattern (view, &viewport,
pattern->units.value,
pattern->content_units.value,
&pattern->transform.matrix);
@@ -125,24 +126,15 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
is_viewbox_defined = lsm_dom_attribute_is_defined ((LsmDomAttribute *) &pattern->viewbox);
- if (!(is_viewbox_defined) ||
+ 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_view_push_viewport (view, &viewport, is_viewbox_defined ? &pattern->viewbox.value : NULL,
+ &pattern->preserve_aspect_ratio.value);
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);
- }
+ lsm_svg_view_pop_viewport (view);
}
if (is_object_bounding_box) {
@@ -209,6 +201,8 @@ lsm_svg_pattern_element_class_init (LsmSvgPatternElementClass *klass)
offsetof (LsmSvgPatternElement, href));
lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "viewBox",
offsetof (LsmSvgPatternElement, viewbox));
+ lsm_dom_attribute_map_add_attribute (s_element_class->attributes, "preserveAspectRatio",
+ offsetof (LsmSvgPatternElement, preserve_aspect_ratio));
}
G_DEFINE_TYPE (LsmSvgPatternElement, lsm_svg_pattern_element, LSM_TYPE_SVG_GRAPHIC)
diff --git a/src/lsmsvgpatternelement.h b/src/lsmsvgpatternelement.h
index 0d6e6b2..b2c17bd 100644
--- a/src/lsmsvgpatternelement.h
+++ b/src/lsmsvgpatternelement.h
@@ -49,6 +49,7 @@ struct _LsmSvgPatternElement {
LsmDomAttribute href;
LsmSvgViewboxAttribute viewbox;
+ LsmSvgPreserveAspectRatioAttribute preserve_aspect_ratio;
};
struct _LsmSvgPatternElementClass {
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 96834e0..7087217 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -175,18 +175,23 @@ lsm_svg_view_set_gradient_properties (LsmSvgView *view,
void
lsm_svg_view_create_surface_pattern (LsmSvgView *view,
- double width, double height,
+ const LsmBox *viewport,
LsmSvgPatternUnits units,
LsmSvgPatternUnits content_units,
const LsmSvgMatrix *matrix)
{
cairo_surface_t *surface;
cairo_pattern_t *pattern;
+ double width, height;
g_return_if_fail (LSM_IS_SVG_VIEW (view));
+ g_return_if_fail (viewport != NULL);
g_return_if_fail (view->pattern_data != NULL);
g_return_if_fail (view->dom_view.cairo == NULL);
+ width = viewport->width;
+ height = viewport->height;
+
if (units == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX) {
width = width * view->pattern_data->extents.width;
height = height * view->pattern_data->extents.height;
@@ -202,6 +207,8 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
view->dom_view.cairo = cairo_create (surface);
cairo_surface_destroy (surface);
+ cairo_translate (view->dom_view.cairo, -viewport->x, -viewport->y);
+
_set_pattern (view, pattern);
view->pattern_data->units = units;
@@ -211,10 +218,10 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
cairo_matrix_init (&view->pattern_data->matrix,
matrix->a, matrix->b,
matrix->c, matrix->d,
- matrix->e, matrix->f);
+ matrix->e + viewport->x, matrix->f + viewport->y);
cairo_matrix_invert (&view->pattern_data->matrix);
} else
- cairo_matrix_init_identity (&view->pattern_data->matrix);
+ cairo_matrix_init_translate (&view->pattern_data->matrix, -viewport->x, -viewport->y);
}
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index 35a437b..68c7b52 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -77,7 +77,7 @@ void lsm_svg_view_set_gradient_properties (LsmSvgView *view,
LsmSvgPatternUnits units,
const LsmSvgMatrix *matrix);
-void lsm_svg_view_create_surface_pattern (LsmSvgView *view, double width, double height,
+void lsm_svg_view_create_surface_pattern (LsmSvgView *view, const LsmBox *viewport,
LsmSvgPatternUnits units,
LsmSvgPatternUnits content_units,
const LsmSvgMatrix *matrix);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]