| Index: src/core/SkImageCacherator.cpp
|
| diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
|
| index 496ca74d9a1870a9195256b9b8cc43cc5f5dc235..6858a4c09e04f5cc0e2a7a016042eb2aa4e54933 100644
|
| --- a/src/core/SkImageCacherator.cpp
|
| +++ b/src/core/SkImageCacherator.cpp
|
| @@ -32,49 +32,55 @@
|
| // see skbug.com/ 4971, 5128, ...
|
| //#define SK_SUPPORT_COMPRESSED_TEXTURES_IN_CACHERATOR
|
|
|
| -SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
|
| - const SkIRect* subset) {
|
| +SkImageCacherator::Validator::Validator(SkImageGenerator* gen, const SkIRect* subset)
|
| + // We are required to take ownership of gen, regardless of whether we instantiate a cacherator
|
| + // or not. On instantiation, the client is responsible for transferring ownership.
|
| + : fGenerator(gen) {
|
| +
|
| if (!gen) {
|
| - return nullptr;
|
| + return;
|
| }
|
|
|
| - // 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;
|
| + fGenerator.reset();
|
| + return;
|
| }
|
|
|
| - uint32_t uniqueID = gen->uniqueID();
|
| + fUniqueID = gen->uniqueID();
|
| const SkIRect bounds = SkIRect::MakeWH(info.width(), info.height());
|
| if (subset) {
|
| if (!bounds.contains(*subset)) {
|
| - return nullptr;
|
| + fGenerator.reset();
|
| + return;
|
| }
|
| if (*subset != bounds) {
|
| // we need a different uniqueID since we really are a subset of the raw generator
|
| - uniqueID = SkNextID::ImageID();
|
| + fUniqueID = SkNextID::ImageID();
|
| }
|
| } else {
|
| 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.release();
|
| + fInfo = info.makeWH(subset->width(), subset->height());
|
| + fOrigin = SkIPoint::Make(subset->x(), subset->y());
|
| +}
|
|
|
| - return new SkImageCacherator(gen, gen->getInfo().makeWH(subset->width(), subset->height()),
|
| - SkIPoint::Make(subset->x(), subset->y()), uniqueID);
|
| +SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
|
| + const SkIRect* subset) {
|
| + Validator validator(gen, subset);
|
| +
|
| + return validator ? new SkImageCacherator(&validator) : nullptr;
|
| }
|
|
|
| -SkImageCacherator::SkImageCacherator(SkImageGenerator* gen, const SkImageInfo& info,
|
| - const SkIPoint& origin, uint32_t uniqueID)
|
| - : fNotThreadSafeGenerator(gen)
|
| - , fInfo(info)
|
| - , fOrigin(origin)
|
| - , fUniqueID(uniqueID)
|
| -{}
|
| +SkImageCacherator::SkImageCacherator(Validator* validator)
|
| + : fNotThreadSafeGenerator(validator->fGenerator.release()) // we take ownership
|
| + , fInfo(validator->fInfo)
|
| + , fOrigin(validator->fOrigin)
|
| + , fUniqueID(validator->fUniqueID)
|
| +{
|
| + SkASSERT(fNotThreadSafeGenerator);
|
| +}
|
|
|
| SkData* SkImageCacherator::refEncoded(GrContext* ctx) {
|
| ScopedGenerator generator(this);
|
|
|