diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-08-03 22:39:37 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-08-03 22:39:37 +0000 |
| commit | 6e5865f22577b2aea99ec3f78d9b869bc367da28 (patch) | |
| tree | 6fd18e5c52e81bce2f3b3439638314cc4707ffac /src | |
| parent | Fix catastrophic memory leak when rendering a pattern (diff) | |
| download | inkscape-6e5865f22577b2aea99ec3f78d9b869bc367da28.tar.gz inkscape-6e5865f22577b2aea99ec3f78d9b869bc367da28.zip | |
Fix pattern viewBox
(bzr r9508.1.43)
Diffstat (limited to 'src')
| -rw-r--r-- | src/sp-pattern.cpp | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp index 314eada01..074873d5b 100644 --- a/src/sp-pattern.cpp +++ b/src/sp-pattern.cpp @@ -1028,6 +1028,7 @@ sp_pattern_create_pattern(SPPaintServer *ps, { SPPattern *pat = SP_PATTERN (ps); Geom::Matrix ps2user; + Geom::Matrix vb2ps = Geom::identity(); bool needs_opacity = (1.0 - opacity) >= 1e-3; bool visible = opacity >= 1e-3; @@ -1039,19 +1040,16 @@ sp_pattern_create_pattern(SPPaintServer *ps, gdouble tmp_y = pattern_height (pat) / (pattern_viewBox(pat)->y1 - pattern_viewBox(pat)->y0); // FIXME: preserveAspectRatio must be taken into account here too! - Geom::Matrix vb2ps (tmp_x, 0.0, 0.0, tmp_y, pattern_x(pat) - pattern_viewBox(pat)->x0 * tmp_x, pattern_y(pat) - pattern_viewBox(pat)->y0 * tmp_y); - - ps2user = vb2ps * pattern_patternTransform(pat); - } else { - /* No viewbox, have to parse units */ - ps2user = pattern_patternTransform(pat); - if (pattern_patternContentUnits (pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { - /* BBox to user coordinate system */ - Geom::Matrix bbox2user (bbox->x1 - bbox->x0, 0.0, 0.0, bbox->y1 - bbox->y0, bbox->x0, bbox->y0); - ps2user *= bbox2user; - } - ps2user = Geom::Translate (pattern_x (pat), pattern_y (pat)) * ps2user; + vb2ps = Geom::Matrix(tmp_x, 0.0, 0.0, tmp_y, pattern_x(pat) - pattern_viewBox(pat)->x0 * tmp_x, pattern_y(pat) - pattern_viewBox(pat)->y0 * tmp_y); + } + + ps2user = pattern_patternTransform(pat); + if (!pat->viewBox_set && pattern_patternContentUnits (pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { + /* BBox to user coordinate system */ + Geom::Matrix bbox2user (bbox->x1 - bbox->x0, 0.0, 0.0, bbox->y1 - bbox->y0, bbox->x0, bbox->y0); + ps2user *= bbox2user; } + ps2user = Geom::Translate (pattern_x (pat), pattern_y (pat)) * ps2user; /* Create arena */ NRArena *arena = NRArena::create(); @@ -1110,7 +1108,7 @@ sp_pattern_create_pattern(SPPaintServer *ps, // TODO: make sure there are no leaks. NRGC gc(NULL); - gc.transform = Geom::identity(); + gc.transform = vb2ps;//Geom::identity(); nr_arena_item_invoke_update (root, NULL, &gc, NR_ARENA_ITEM_STATE_ALL, NR_ARENA_ITEM_STATE_ALL); nr_arena_item_invoke_render (ct, root, &one_tile, NULL, 0); nr_object_unref(arena); |
