[lasem] [Pattern] Fix pattern content offset when conten units are object bounding box.



commit 9ebd2ff0c93240ace46020f5d956be2d47ac37af
Author: Emmanuel Pacaud <emmanuel pacaud lapp in2p3 fr>
Date:   Mon Jun 8 11:16:40 2009 +0200

    [Pattern] Fix pattern content offset when conten units are object bounding box.
---
 src/lsmsvgcircleelement.c  |    4 ++++
 src/lsmsvgpatternelement.c |   15 ++++++++++-----
 src/lsmsvgview.c           |   42 ++++++++++++++++++++++++++++++++----------
 3 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/src/lsmsvgcircleelement.c b/src/lsmsvgcircleelement.c
index 669b790..5371a7d 100644
--- a/src/lsmsvgcircleelement.c
+++ b/src/lsmsvgcircleelement.c
@@ -21,6 +21,7 @@
 
 #include <lsmsvgcircleelement.h>
 #include <lsmsvgview.h>
+#include <lsmdebug.h>
 
 static GObjectClass *parent_class;
 
@@ -67,6 +68,9 @@ lsm_svg_circle_element_graphic_render (LsmSvgElement *self, LsmSvgView *view)
 	cy = lsm_svg_view_normalize_length (view, &circle->cy.length.base, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
 	r  = lsm_svg_view_normalize_length (view, &circle->r.length.base,  LSM_SVG_LENGTH_DIRECTION_DIAGONAL);
 
+	lsm_debug ("[LsmSvgCircleElement::graphic_render] cx = %g, cy = %g, r = %g",
+		   cx, cy, r);
+
 	lsm_svg_view_show_circle (view, cx, cy, r);
 }
 
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 0b78c95..f88d104 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -80,6 +80,9 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
 	gboolean is_object_bounding_box;
 	gboolean is_viewbox_defined;
 	LsmBox viewport;
+	const LsmBox *pattern_extents;
+
+	pattern_extents = lsm_svg_view_get_pattern_extents (view);
 
 	is_object_bounding_box = (pattern->units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
 
@@ -116,13 +119,15 @@ _pattern_element_render_paint (LsmSvgElement *self, LsmSvgView *view)
 
 	if (is_object_bounding_box) {
 		LsmSvgMatrix matrix;
-		const LsmBox *viewbox;
+		LsmBox viewbox = {.x = 0.0, .y = .0, .width = 1.0, .height = 1.0};
 
-		viewbox = lsm_svg_view_get_pattern_extents (view);
-		lsm_svg_matrix_init_translate (&matrix, viewbox->x, viewbox->y);
-		lsm_svg_matrix_scale (&matrix, viewbox->width, viewbox->height);
-		lsm_svg_view_push_viewbox (view, viewbox);
+		lsm_svg_matrix_init_scale (&matrix, pattern_extents->width, pattern_extents->height);
+		lsm_svg_matrix_translate (&matrix, -pattern_extents->x, -pattern_extents->y);
+		lsm_svg_view_push_viewbox (view, &viewbox);
 		lsm_svg_view_push_matrix (view, &matrix);
+
+		lsm_debug ("[LsmSvgPatternElement::render_paint] object_bounding_box"
+			   " x_scale = %g, y_scale = %g",pattern_extents->width, pattern_extents->height);
 	}
 
 	is_viewbox_defined = lsm_dom_attribute_is_defined ((LsmDomAttribute *) &pattern->viewbox);
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index ee00a31..826e0e7 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -194,21 +194,28 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
 {
 	cairo_surface_t *surface;
 	cairo_pattern_t *pattern;
-	double width, height;
+	double width, height, x, y;
 
 	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);
 
+	x = viewport->x;
+	y = viewport->y;
 	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;
+		x *= view->pattern_data->extents.width;
+		y *= view->pattern_data->extents.height;
+		width *= view->pattern_data->extents.width;
+		height *= view->pattern_data->extents.height;
 	}
 
+	lsm_debug ("[LsmSvgView::create_pattern] pattern size = %g ,%g",
+		   width, height);
+
 	if (height < 1 || width < 1)
 		return;
 
@@ -219,7 +226,7 @@ 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);
+	cairo_translate (view->dom_view.cairo, -x, -y);
 
 	_set_pattern (view, pattern);
 
@@ -230,10 +237,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 + viewport->x, matrix->f + viewport->y);
+				   matrix->e + x, matrix->f + y);
 		cairo_matrix_invert (&view->pattern_data->matrix);
 	} else
-		cairo_matrix_init_translate (&view->pattern_data->matrix, -viewport->x, -viewport->y);
+		cairo_matrix_init_translate (&view->pattern_data->matrix, -x, -y);
 
 }
 
@@ -815,8 +822,20 @@ lsm_svg_view_push_matrix (LsmSvgView *view, LsmSvgMatrix *matrix)
 
 	view->matrix_stack = g_slist_prepend (view->matrix_stack, ctm);
 
+	lsm_debug ("[LsmSvgView::push_matrix] New transform %g, %g, %g, %g, %g, %g",
+		   matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, matrix->f);
+
 	cairo_matrix_init (&cr_matrix, matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, matrix->f);
 	cairo_transform (view->dom_view.cairo, &cr_matrix);
+
+	{
+		cairo_matrix_t current_ctm;
+		cairo_get_matrix (view->dom_view.cairo, &current_ctm);
+
+		lsm_debug ("[LsmSvgView::push_matrix] Current ctm %g, %g, %g, %g, %g, %g",
+			   current_ctm.xx, current_ctm.xy, current_ctm.yx, current_ctm.yy,
+			   current_ctm.x0, current_ctm.y0);
+	}
 }
 
 void
@@ -971,11 +990,13 @@ _paint_uri (LsmSvgView *view, LsmSvgViewPaintOperation operation, const char *ur
 
 	if (view->pattern_data->pattern) {
 #if 0
-		char *filename;
+		if (LSM_IS_SVG_PATTERN_ELEMENT (element)) {
+			char *filename;
 
-		filename = g_strdup_printf ("%s.png", uri);
-		cairo_surface_write_to_png (cairo_get_target (view->dom_view.cairo), filename);
-		g_free (filename);
+			filename = g_strdup_printf ("%s.png", uri);
+			cairo_surface_write_to_png (cairo_get_target (view->dom_view.cairo), filename);
+			g_free (filename);
+		}
 #endif
 
 		if (LSM_IS_SVG_GRADIENT_ELEMENT (element) &&
@@ -1192,6 +1213,7 @@ lsm_svg_view_show_rectangle (LsmSvgView *view,
 void
 lsm_svg_view_show_circle (LsmSvgView *view, double cx, double cy, double r)
 {
+
 	g_return_if_fail (LSM_IS_SVG_VIEW (view));
 
 	cairo_arc (view->dom_view.cairo, cx, cy, r, 0, 2 * M_PI);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]