summaryrefslogtreecommitdiffstats
path: root/src/sp-pattern.cpp
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-08-03 22:27:38 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-08-03 22:27:38 +0000
commit9df97c14c5c6bf51e1312190c02b8e408aa82ed7 (patch)
treebb3f98e954bf4be1e98158cfbe8c7f8b929bea05 /src/sp-pattern.cpp
parentHandle preserveAspectRatio for images (diff)
downloadinkscape-9df97c14c5c6bf51e1312190c02b8e408aa82ed7.tar.gz
inkscape-9df97c14c5c6bf51e1312190c02b8e408aa82ed7.zip
Fix catastrophic memory leak when rendering a pattern
(bzr r9508.1.42)
Diffstat (limited to 'src/sp-pattern.cpp')
-rw-r--r--src/sp-pattern.cpp9
1 files changed, 3 insertions, 6 deletions
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index 5f0c4aebd..314eada01 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -1067,7 +1067,7 @@ sp_pattern_create_pattern(SPPaintServer *ps,
// for each item in pattern, show it on our arena, add to the group,
// and connect to the release signal in case the item gets deleted
NRArenaItem *cai;
- cai = sp_item_invoke_show (SP_ITEM (child), arena, dkey, SP_ITEM_REFERENCE_FLAGS);
+ cai = sp_item_invoke_show (SP_ITEM (child), arena, dkey, SP_ITEM_SHOW_DISPLAY);
nr_arena_item_append_child (root, cai);
}
}
@@ -1109,15 +1109,11 @@ sp_pattern_create_pattern(SPPaintServer *ps,
}
// TODO: make sure there are no leaks.
- NRPixBlock pb;
- nr_pixblock_setup (&pb, NR_PIXBLOCK_MODE_R8G8B8A8N, one_tile.x0, one_tile.y0,
- one_tile.x1, one_tile.y1, TRUE);
NRGC gc(NULL);
gc.transform = 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, &pb, 0);
+ nr_arena_item_invoke_render (ct, root, &one_tile, NULL, 0);
nr_object_unref(arena);
- nr_pixblock_release(&pb);
if (needs_opacity) {
cairo_pop_group_to_source(ct); // pop raw pattern
@@ -1125,6 +1121,7 @@ sp_pattern_create_pattern(SPPaintServer *ps,
}
cairo_pattern_t *cp = cairo_pattern_create_for_surface(temp);
+ cairo_destroy(ct);
cairo_surface_destroy(temp);
// Apply transformation to user space. Also compensate for oversampling.