summaryrefslogtreecommitdiffstats
path: root/src/sp-pattern.cpp
diff options
context:
space:
mode:
authorShlomi Fish <shlomif@shlomifish.org>2016-09-15 17:03:32 +0000
committerShlomi Fish <shlomif@shlomifish.org>2016-09-15 17:03:32 +0000
commit3bb19d6df3b7d4e9c2518484e62997f9150d5f5d (patch)
tree3ac3c8748744b75c468d8c55d8eec27b841cfbb0 /src/sp-pattern.cpp
parentRefactor == true (diff)
parent[Bug #459914] Non-ascii (ja) charactors aren't displayed properly in Handle t... (diff)
downloadinkscape-3bb19d6df3b7d4e9c2518484e62997f9150d5f5d.tar.gz
inkscape-3bb19d6df3b7d4e9c2518484e62997f9150d5f5d.zip
Merged.
(bzr r15100.1.17)
Diffstat (limited to 'src/sp-pattern.cpp')
-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;