diff options
-rw-r--r-- | gm/image_pict.cpp | 59 | ||||
-rw-r--r-- | src/core/SkImageCacherator.cpp | 80 | ||||
-rw-r--r-- | src/core/SkImageCacherator.h | 22 | ||||
-rw-r--r-- | src/image/SkImage_Lazy.cpp | 4 |
4 files changed, 50 insertions, 115 deletions
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp index 904daaebd5..c5e9fcfa9c 100644 --- a/gm/image_pict.cpp +++ b/gm/image_pict.cpp @@ -9,6 +9,7 @@ #include "SkCanvas.h" #include "SkImage.h" #include "SkImageCacherator.h" +#include "SkImage_Base.h" #include "SkMakeUnique.h" #include "SkPictureRecorder.h" #include "SkSurface.h" @@ -286,8 +287,8 @@ class ImageCacheratorGM : public skiagm::GM { SkString fName; std::unique_ptr<SkImageGenerator> (*fFactory)(GrContext*, sk_sp<SkPicture>); sk_sp<SkPicture> fPicture; - std::unique_ptr<SkImageCacherator> fCache; - std::unique_ptr<SkImageCacherator> fCacheSubset; + sk_sp<SkImage> fImage; + sk_sp<SkImage> fImageSubset; public: ImageCacheratorGM(const char suffix[], @@ -316,43 +317,46 @@ protected: void makeCaches(GrContext* ctx) { auto gen = fFactory(ctx, fPicture); SkDEBUGCODE(const uint32_t genID = gen->uniqueID();) - fCache.reset(SkImageCacherator::NewFromGenerator(std::move(gen))); + fImage = SkImage::MakeFromGenerator(std::move(gen)); const SkIRect subset = SkIRect::MakeLTRB(50, 50, 100, 100); gen = fFactory(ctx, fPicture); SkDEBUGCODE(const uint32_t genSubsetID = gen->uniqueID();) - fCacheSubset.reset(SkImageCacherator::NewFromGenerator(std::move(gen), &subset)); + fImageSubset = SkImage::MakeFromGenerator(std::move(gen), &subset); // whole caches should have the same ID as the generator. Subsets should be diff - SkASSERT(fCache->uniqueID() == genID); - SkASSERT(fCacheSubset->uniqueID() != genID); - SkASSERT(fCacheSubset->uniqueID() != genSubsetID); - - SkASSERT(fCache->info().dimensions() == SkISize::Make(100, 100)); - SkASSERT(fCacheSubset->info().dimensions() == SkISize::Make(50, 50)); + SkDEBUGCODE(SkImageCacherator* cache = as_IB(fImage)->peekCacherator();) + SkDEBUGCODE(SkImageCacherator* cacheSubset = as_IB(fImageSubset)->peekCacherator();) + SkASSERT(cache); + SkASSERT(cacheSubset); + SkASSERT(cache->uniqueID() == genID); + SkASSERT(cacheSubset->uniqueID() != genID); + SkASSERT(cacheSubset->uniqueID() != genSubsetID); + + SkASSERT(cache->info().dimensions() == SkISize::Make(100, 100)); + SkASSERT(cacheSubset->info().dimensions() == SkISize::Make(50, 50)); } - static void draw_as_bitmap(SkCanvas* canvas, SkImageCacherator* cache, SkScalar x, SkScalar y) { + static void draw_as_bitmap(SkCanvas* canvas, SkImage* image, SkScalar x, SkScalar y) { SkBitmap bitmap; - cache->lockAsBitmap(canvas->getGrContext(), &bitmap, nullptr, - canvas->imageInfo().colorSpace()); + as_IB(image)->getROPixels(&bitmap, canvas->imageInfo().colorSpace()); canvas->drawBitmap(bitmap, x, y); } - static void draw_as_tex(SkCanvas* canvas, SkImageCacherator* cache, SkScalar x, SkScalar y) { + static void draw_as_tex(SkCanvas* canvas, SkImage* image, SkScalar x, SkScalar y) { #if SK_SUPPORT_GPU sk_sp<SkColorSpace> texColorSpace; sk_sp<GrTextureProxy> proxy( - cache->lockAsTextureProxy(canvas->getGrContext(), GrSamplerParams::ClampBilerp(), - canvas->imageInfo().colorSpace(), &texColorSpace, - nullptr, nullptr)); + as_IB(image)->asTextureProxyRef(canvas->getGrContext(), GrSamplerParams::ClampBilerp(), + canvas->imageInfo().colorSpace(), &texColorSpace, + nullptr)); if (!proxy) { // show placeholder if we have no texture SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); - SkRect r = SkRect::MakeXYWH(x, y, SkIntToScalar(cache->info().width()), - SkIntToScalar(cache->info().width())); + SkRect r = SkRect::MakeXYWH(x, y, SkIntToScalar(image->width()), + SkIntToScalar(image->width())); canvas->drawRect(r, paint); canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), paint); canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint); @@ -360,11 +364,10 @@ protected: } // No API to draw a GrTexture directly, so we cheat and create a private image subclass - sk_sp<SkImage> image(new SkImage_Gpu(canvas->getGrContext(), - cache->uniqueID(), kPremul_SkAlphaType, - std::move(proxy), std::move(texColorSpace), - SkBudgeted::kNo)); - canvas->drawImage(image.get(), x, y); + sk_sp<SkImage> texImage(new SkImage_Gpu(canvas->getGrContext(), image->uniqueID(), + kPremul_SkAlphaType, std::move(proxy), + std::move(texColorSpace), SkBudgeted::kNo)); + canvas->drawImage(texImage.get(), x, y); #endif } @@ -375,11 +378,11 @@ protected: // Draw the tex first, so it doesn't hit a lucky cache from the raster version. This // way we also can force the generateTexture call. - draw_as_tex(canvas, fCache.get(), 310, 0); - draw_as_tex(canvas, fCacheSubset.get(), 310+101, 0); + draw_as_tex(canvas, fImage.get(), 310, 0); + draw_as_tex(canvas, fImageSubset.get(), 310+101, 0); - draw_as_bitmap(canvas, fCache.get(), 150, 0); - draw_as_bitmap(canvas, fCacheSubset.get(), 150+101, 0); + draw_as_bitmap(canvas, fImage.get(), 150, 0); + draw_as_bitmap(canvas, fImageSubset.get(), 150+101, 0); } void onDraw(SkCanvas* canvas) override { diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp index c755f5d4d2..808fdd4554 100644 --- a/src/core/SkImageCacherator.cpp +++ b/src/core/SkImageCacherator.cpp @@ -199,9 +199,9 @@ static bool generate_pixels(SkImageGenerator* gen, const SkPixmap& pmap, int ori return true; } -bool SkImageCacherator::tryLockAsBitmap(SkBitmap* bitmap, const SkImage* client, - SkImage::CachingHint chint, CachedFormat format, - const SkImageInfo& info) { +bool SkImageCacherator::lockAsBitmap(SkBitmap* bitmap, const SkImage* client, + SkImage::CachingHint chint, CachedFormat format, + const SkImageInfo& info) { if (this->lockAsBitmapOnlyIfAlreadyCached(bitmap, format)) { return true; } @@ -243,77 +243,9 @@ bool SkImageCacherator::tryLockAsBitmap(SkBitmap* bitmap, const SkImage* client, *bitmap = tmpBitmap; bitmap->pixelRef()->setImmutableWithID(uniqueID); } - return true; -} - -bool SkImageCacherator::lockAsBitmap(GrContext* context, SkBitmap* bitmap, const SkImage* client, - SkColorSpace* dstColorSpace, - SkImage::CachingHint chint) { - CachedFormat format = this->chooseCacheFormat(dstColorSpace); - SkImageInfo cacheInfo = this->buildCacheInfo(format); - const uint32_t uniqueID = this->getUniqueID(format); - - if (this->tryLockAsBitmap(bitmap, client, chint, format, cacheInfo)) { - return check_output_bitmap(*bitmap, uniqueID); - } - -#if SK_SUPPORT_GPU - if (!context) { - bitmap->reset(); - return false; - } - // Try to get a texture and read it back to raster (and then cache that with our ID) - sk_sp<GrTextureProxy> proxy; - - { - ScopedGenerator generator(fSharedGenerator); - proxy = generator->generateTexture(context, cacheInfo, fOrigin); - } - if (!proxy) { - bitmap->reset(); - return false; - } - - const auto desc = SkBitmapCacheDesc::Make(uniqueID, fInfo.width(), fInfo.height()); - SkBitmapCache::RecPtr rec; - SkPixmap pmap; - if (SkImage::kAllow_CachingHint == chint) { - rec = SkBitmapCache::Alloc(desc, cacheInfo, &pmap); - if (!rec) { - bitmap->reset(); - return false; - } - } else { - if (!bitmap->tryAllocPixels(cacheInfo)) { - bitmap->reset(); - return false; - } - } - - sk_sp<GrSurfaceContext> sContext(context->contextPriv().makeWrappedSurfaceContext( - proxy, - fInfo.refColorSpace())); // src colorSpace - if (!sContext) { - bitmap->reset(); - return false; - } - - if (!sContext->readPixels(pmap.info(), pmap.writable_addr(), pmap.rowBytes(), 0, 0)) { - bitmap->reset(); - return false; - } - - if (rec) { - SkBitmapCache::Add(std::move(rec), bitmap); - if (client) { - as_IB(client)->notifyAddedToCache(); - } - } - return check_output_bitmap(*bitmap, uniqueID); -#else - return false; -#endif + check_output_bitmap(*bitmap, uniqueID); + return true; } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -628,7 +560,7 @@ sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, // 5. Ask the generator to return RGB(A) data, which the GPU can convert SkBitmap bitmap; - if (this->tryLockAsBitmap(&bitmap, client, chint, format, cacheInfo)) { + if (this->lockAsBitmap(&bitmap, client, chint, format, cacheInfo)) { sk_sp<GrTextureProxy> proxy; if (willBeMipped) { proxy = GrGenerateMipMapsAndUploadToTextureProxy(ctx, bitmap, dstColorSpace); diff --git a/src/core/SkImageCacherator.h b/src/core/SkImageCacherator.h index df5e2f6b65..9e869e8db6 100644 --- a/src/core/SkImageCacherator.h +++ b/src/core/SkImageCacherator.h @@ -42,16 +42,6 @@ public: kNumCachedFormats, }; - /** - * On success (true), bitmap will point to the pixels for this generator. If this returns - * false, the bitmap will be reset to empty. - * - * If not NULL, the client will be notified (->notifyAddedToCache()) when resources are - * added to the cache on its behalf. - */ - bool lockAsBitmap(GrContext*, SkBitmap*, const SkImage* client, SkColorSpace* dstColorSpace, - SkImage::CachingHint = SkImage::kAllow_CachingHint); - #if SK_SUPPORT_GPU /** * Returns a ref() on the texture produced by this generator. The caller must call unref() @@ -130,8 +120,16 @@ private: CachedFormat chooseCacheFormat(SkColorSpace* dstColorSpace, const GrCaps* = nullptr); SkImageInfo buildCacheInfo(CachedFormat); - bool tryLockAsBitmap(SkBitmap*, const SkImage*, SkImage::CachingHint, CachedFormat, - const SkImageInfo&); + /** + * On success (true), bitmap will point to the pixels for this generator. If this returns + * false, the bitmap will be reset to empty. + * + * If not NULL, the client will be notified (->notifyAddedToCache()) when resources are + * added to the cache on its behalf. + */ + bool lockAsBitmap(SkBitmap*, const SkImage*, SkImage::CachingHint, CachedFormat, + const SkImageInfo&); + #if SK_SUPPORT_GPU // Returns the texture proxy. If the cacherator is generating the texture and wants to cache it, // it should use the passed in key (if the key is valid). diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index b1f243b151..5fd0f61a53 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -80,7 +80,9 @@ SkData* SkImage_Lazy::onRefEncoded(GrContext* ctx) const { bool SkImage_Lazy::getROPixels(SkBitmap* bitmap, SkColorSpace* dstColorSpace, CachingHint chint) const { - return fCache.lockAsBitmap(nullptr, bitmap, this, dstColorSpace, chint); + SkImageCacherator::CachedFormat cacheFormat = fCache.chooseCacheFormat(dstColorSpace); + SkImageInfo cacheInfo = fCache.buildCacheInfo(cacheFormat); + return fCache.lockAsBitmap(bitmap, this, chint, cacheFormat, cacheInfo); } #if SK_SUPPORT_GPU |