[lasem] [SVG] Use view_push_viewport from pattern element.



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]