Index: src/core/SkImageCacherator.cpp |
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp |
index 863cc11b1d8f189368c10524fed583bda0014be7..b591b22dd226991a8ccf850a29ed56582ba1e7dd 100644 |
--- a/src/core/SkImageCacherator.cpp |
+++ b/src/core/SkImageCacherator.cpp |
@@ -53,14 +53,19 @@ SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen, |
SkImageCacherator::SkImageCacherator(SkImageGenerator* gen, const SkImageInfo& info, |
const SkIPoint& origin, uint32_t uniqueID) |
- : fGenerator(gen) |
+ : fNotThreadSafeGenerator(gen) |
, fInfo(info) |
, fOrigin(origin) |
, fUniqueID(uniqueID) |
{} |
SkImageCacherator::~SkImageCacherator() { |
- SkDELETE(fGenerator); |
+ SkDELETE(fNotThreadSafeGenerator); |
+} |
+ |
+SkData* SkImageCacherator::refEncoded() { |
+ ScopedGenerator generator(this); |
+ return generator->refEncodedData(); |
} |
static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) { |
@@ -70,17 +75,17 @@ static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) { |
return true; |
} |
-static bool generate_bitmap(SkBitmap* bitmap, const SkImageInfo& info, const SkIPoint& origin, |
- SkImageGenerator* generator) { |
- const size_t rowBytes = info.minRowBytes(); |
- if (!bitmap->tryAllocPixels(info, rowBytes)) { |
+bool SkImageCacherator::generateBitmap(SkBitmap* bitmap) { |
+ const size_t rowBytes = fInfo.minRowBytes(); |
+ if (!bitmap->tryAllocPixels(fInfo, rowBytes)) { |
return false; |
} |
SkASSERT(bitmap->rowBytes() == rowBytes); |
+ ScopedGenerator generator(this); |
const SkImageInfo& genInfo = generator->getInfo(); |
- if (info.dimensions() == genInfo.dimensions()) { |
- SkASSERT(origin.x() == 0 && origin.y() == 0); |
+ if (fInfo.dimensions() == genInfo.dimensions()) { |
+ SkASSERT(fOrigin.x() == 0 && fOrigin.y() == 0); |
// fast-case, no copy needed |
if (!generator->getPixels(bitmap->info(), bitmap->getPixels(), rowBytes)) { |
bitmap->reset(); |
@@ -97,7 +102,7 @@ static bool generate_bitmap(SkBitmap* bitmap, const SkImageInfo& info, const SkI |
return false; |
} |
full.readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), |
- origin.x(), origin.y()); |
+ fOrigin.x(), fOrigin.y()); |
} |
return true; |
} |
@@ -108,7 +113,8 @@ bool SkImageCacherator::tryLockAsBitmap(SkBitmap* bitmap) { |
if (SkBitmapCache::Find(fUniqueID, bitmap)) { |
return check_output_bitmap(*bitmap, fUniqueID); |
} |
- if (!generate_bitmap(bitmap, fInfo, fOrigin, fGenerator)) { |
+ |
+ if (!this->generateBitmap(bitmap)) { |
return false; |
} |
@@ -124,10 +130,13 @@ bool SkImageCacherator::lockAsBitmap(SkBitmap* bitmap) { |
#if SK_SUPPORT_GPU |
// Try to get a texture and read it back to raster (and then cache that with our ID) |
+ SkAutoTUnref<GrTexture> tex; |
- SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
- SkAutoTUnref<GrTexture> tex(fGenerator->generateTexture(nullptr, kUntiled_SkImageUsageType, |
- &subset)); |
+ { |
+ ScopedGenerator generator(this); |
+ SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
+ tex.reset(generator->generateTexture(nullptr, kUntiled_SkImageUsageType, &subset)); |
+ } |
if (!tex) { |
bitmap->reset(); |
return false; |
@@ -165,8 +174,11 @@ GrTexture* SkImageCacherator::tryLockAsTexture(GrContext* ctx, SkImageUsageType |
return tex; // we got a cache hit! |
} |
- SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
- tex = fGenerator->generateTexture(ctx, usage, &subset); |
+ { |
+ ScopedGenerator generator(this); |
+ SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
+ tex = generator->generateTexture(ctx, usage, &subset); |
+ } |
if (tex) { |
tex->resourcePriv().setUniqueKey(key); |
} |
@@ -188,7 +200,7 @@ GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, SkImageUsageType usa |
// Try to get a bitmap and then upload/cache it as a texture |
SkBitmap bitmap; |
- if (!generate_bitmap(&bitmap, fInfo, fOrigin, fGenerator)) { |
+ if (!this->generateBitmap(&bitmap)) { |
return nullptr; |
} |
return GrRefCachedBitmapTexture(ctx, bitmap, usage); |