diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2016-09-06 10:37:35 +0000 |
|---|---|---|
| committer | tavmjong-free <tavmjong@free.fr> | 2016-09-06 10:37:35 +0000 |
| commit | 32e9ba119663b9d5800392ba34700053eaaa7f90 (patch) | |
| tree | 43783302443f1c9d0bd0de8768d337aa19bcab93 /src | |
| parent | Fix history handling for previous commit. (diff) | |
| download | inkscape-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.cpp | 14 |
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; |
