summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2016-09-06 10:37:35 +0000
committertavmjong-free <tavmjong@free.fr>2016-09-06 10:37:35 +0000
commit32e9ba119663b9d5800392ba34700053eaaa7f90 (patch)
tree43783302443f1c9d0bd0de8768d337aa19bcab93 /src
parentFix history handling for previous commit. (diff)
downloadinkscape-32e9ba119663b9d5800392ba34700053eaaa7f90.tar.gz
inkscape-32e9ba119663b9d5800392ba34700053eaaa7f90.zip
Improve pattern rendering with large pattern transform.
Partial fix for bug #1465753. (bzr r15108)
Diffstat (limited to 'src')
-rw-r--r--src/sp-pattern.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index 77fa9034d..9d6296a0d 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -670,10 +670,20 @@ cairo_pattern_t *SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b
dc.paint(opacity); // apply opacity
}
- cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw());
// Apply transformation to user space. Also compensate for oversampling.
- ink_cairo_pattern_set_matrix(cp, ps2user.inverse() * pattern_surface.drawingTransform());
+ Geom::Affine raw_transform = ps2user.inverse() * pattern_surface.drawingTransform();
+
+ // Cairo doesn't like large values of x0 and y0. We can replace x0 and y0 by equivalent
+ // values close to zero (since one tile on a grid is the same as another it doesn't
+ // matter which tile is used as the base tile).
+ int w = one_tile[Geom::X].extent();
+ int h = one_tile[Geom::Y].extent();
+ int m = raw_transform[4] / w;
+ int n = raw_transform[5] / h;
+ raw_transform *= Geom::Translate( -m*w, -n*h );
+ cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw());
+ ink_cairo_pattern_set_matrix(cp, raw_transform);
cairo_pattern_set_extend(cp, CAIRO_EXTEND_REPEAT);
return cp;