[lasem] [Pattern] Fix pattern content offset when conten units are object bounding box.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: svn-commits-list gnome org
- Subject: [lasem] [Pattern] Fix pattern content offset when conten units are object bounding box.
- Date: Mon, 8 Jun 2009 05:17:21 -0400 (EDT)
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, ¤t_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]