aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkImageCacherator.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-09-14 09:59:28 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-14 09:59:28 -0700
commit3a100d3e4de7a640d558352c544724801ab842f3 (patch)
tree8b6a50d9451b1561ee36eba7ef15b2b206dc5954 /src/core/SkImageCacherator.cpp
parent56f38fb7a9ccd1c0e04ea4896ef7724836836671 (diff)
we must own/free the generator, even if we fail to return a cacherator
Diffstat (limited to 'src/core/SkImageCacherator.cpp')
-rw-r--r--src/core/SkImageCacherator.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
index bdcd64f56d..b138853e61 100644
--- a/src/core/SkImageCacherator.cpp
+++ b/src/core/SkImageCacherator.cpp
@@ -27,6 +27,10 @@ SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
if (!gen) {
return nullptr;
}
+
+ // We are required to take ownership of gen, regardless of if we return a cacherator or not
+ SkAutoTDelete<SkImageGenerator> genHolder(gen);
+
const SkImageInfo& info = gen->getInfo();
if (info.isEmpty()) {
return nullptr;
@@ -46,6 +50,10 @@ SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
subset = &bounds;
}
+ // Now that we know we can hand-off the generator (to be owned by the cacherator) we can
+ // release our holder. (we DONT want to delete it here anymore)
+ genHolder.detach();
+
return new SkImageCacherator(gen, gen->getInfo().makeWH(subset->width(), subset->height()),
SkIPoint::Make(subset->x(), subset->y()), uniqueID);
}