| 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);
|
|
|