18f34372f7e97482e5e61ab298b7edaa008ba2f4creed/* 28f34372f7e97482e5e61ab298b7edaa008ba2f4creed * Copyright 2015 Google Inc. 38f34372f7e97482e5e61ab298b7edaa008ba2f4creed * 48f34372f7e97482e5e61ab298b7edaa008ba2f4creed * Use of this source code is governed by a BSD-style license that can be 58f34372f7e97482e5e61ab298b7edaa008ba2f4creed * found in the LICENSE file. 68f34372f7e97482e5e61ab298b7edaa008ba2f4creed */ 78f34372f7e97482e5e61ab298b7edaa008ba2f4creed 88f34372f7e97482e5e61ab298b7edaa008ba2f4creed#ifndef SkImageCacherator_DEFINED 98f34372f7e97482e5e61ab298b7edaa008ba2f4creed#define SkImageCacherator_DEFINED 108f34372f7e97482e5e61ab298b7edaa008ba2f4creed 118f34372f7e97482e5e61ab298b7edaa008ba2f4creed#include "SkImageGenerator.h" 12d5c448fd857a77a375886bc1a8da83a7f1bf32fereed#include "SkMutex.h" 13d5c448fd857a77a375886bc1a8da83a7f1bf32fereed#include "SkTemplates.h" 148f34372f7e97482e5e61ab298b7edaa008ba2f4creed 158f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass GrContext; 16045802dbb7202b52f5fd2758d725f39c156a6165bsalomonclass GrTextureParams; 17045802dbb7202b52f5fd2758d725f39c156a6165bsalomonclass GrUniqueKey; 188f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass SkBitmap; 193b0d532df72db806c255cad98538fcbb4d9678a8fmalitaclass SkImage; 208f34372f7e97482e5e61ab298b7edaa008ba2f4creed 218f34372f7e97482e5e61ab298b7edaa008ba2f4creed/* 228f34372f7e97482e5e61ab298b7edaa008ba2f4creed * Internal class to manage caching the output of an ImageGenerator. 238f34372f7e97482e5e61ab298b7edaa008ba2f4creed */ 248f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass SkImageCacherator { 258f34372f7e97482e5e61ab298b7edaa008ba2f4creedpublic: 268f34372f7e97482e5e61ab298b7edaa008ba2f4creed // Takes ownership of the generator 27935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed static SkImageCacherator* NewFromGenerator(SkImageGenerator*, const SkIRect* subset = nullptr); 288f4fe37b1cb7c98577d76e7004f35929664e251ereed 29935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed const SkImageInfo& info() const { return fInfo; } 30935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed uint32_t uniqueID() const { return fUniqueID; } 318f34372f7e97482e5e61ab298b7edaa008ba2f4creed 328f34372f7e97482e5e61ab298b7edaa008ba2f4creed /** 338f34372f7e97482e5e61ab298b7edaa008ba2f4creed * On success (true), bitmap will point to the pixels for this generator. If this returns 348f34372f7e97482e5e61ab298b7edaa008ba2f4creed * false, the bitmap will be reset to empty. 353b0d532df72db806c255cad98538fcbb4d9678a8fmalita * 363b0d532df72db806c255cad98538fcbb4d9678a8fmalita * If not NULL, the client will be notified (->notifyAddedToCache()) when resources are 373b0d532df72db806c255cad98538fcbb4d9678a8fmalita * added to the cache on its behalf. 388f34372f7e97482e5e61ab298b7edaa008ba2f4creed */ 39095530389d8211895309107a4f74beefacce638creed bool lockAsBitmap(SkBitmap*, const SkImage* client, 40095530389d8211895309107a4f74beefacce638creed SkImage::CachingHint = SkImage::kAllow_CachingHint); 418f34372f7e97482e5e61ab298b7edaa008ba2f4creed 428f34372f7e97482e5e61ab298b7edaa008ba2f4creed /** 438f34372f7e97482e5e61ab298b7edaa008ba2f4creed * Returns a ref() on the texture produced by this generator. The caller must call unref() 4496fcdcc219d2a0d3579719b84b28bede76efba64halcanary * when it is done. Will return nullptr on failure. 458f34372f7e97482e5e61ab298b7edaa008ba2f4creed * 463b0d532df72db806c255cad98538fcbb4d9678a8fmalita * If not NULL, the client will be notified (->notifyAddedToCache()) when resources are 473b0d532df72db806c255cad98538fcbb4d9678a8fmalita * added to the cache on its behalf. 483b0d532df72db806c255cad98538fcbb4d9678a8fmalita * 498f4fe37b1cb7c98577d76e7004f35929664e251ereed * The caller is responsible for calling texture->unref() when they are done. 508f34372f7e97482e5e61ab298b7edaa008ba2f4creed */ 51095530389d8211895309107a4f74beefacce638creed GrTexture* lockAsTexture(GrContext*, const GrTextureParams&, const SkImage* client, 52095530389d8211895309107a4f74beefacce638creed SkImage::CachingHint = SkImage::kAllow_CachingHint); 538f34372f7e97482e5e61ab298b7edaa008ba2f4creed 54d5c448fd857a77a375886bc1a8da83a7f1bf32fereed /** 55d5c448fd857a77a375886bc1a8da83a7f1bf32fereed * If the underlying src naturally is represented by an encoded blob (in SkData), this returns 56d5c448fd857a77a375886bc1a8da83a7f1bf32fereed * a ref to that data. If not, it returns null. 5705dd251e5e135626d170b9e77eb64729bd482169reed * 5805dd251e5e135626d170b9e77eb64729bd482169reed * If a GrContext is specified, then the caller is only interested in gpu-specific encoded 5905dd251e5e135626d170b9e77eb64729bd482169reed * formats, so others (e.g. PNG) can just return nullptr. 60d5c448fd857a77a375886bc1a8da83a7f1bf32fereed */ 6105dd251e5e135626d170b9e77eb64729bd482169reed SkData* refEncoded(GrContext*); 62d5c448fd857a77a375886bc1a8da83a7f1bf32fereed 636868c3fccf65d297a64919a7cb74f09780c845c3reed // Only return true if the generate has already been cached. 646868c3fccf65d297a64919a7cb74f09780c845c3reed bool lockAsBitmapOnlyIfAlreadyCached(SkBitmap*); 656868c3fccf65d297a64919a7cb74f09780c845c3reed // Call the underlying generator directly 666868c3fccf65d297a64919a7cb74f09780c845c3reed bool directGeneratePixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRB, 676868c3fccf65d297a64919a7cb74f09780c845c3reed int srcX, int srcY); 686868c3fccf65d297a64919a7cb74f09780c845c3reed 698f34372f7e97482e5e61ab298b7edaa008ba2f4creedprivate: 70935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed SkImageCacherator(SkImageGenerator*, const SkImageInfo&, const SkIPoint&, uint32_t uniqueID); 718f4fe37b1cb7c98577d76e7004f35929664e251ereed 72d5c448fd857a77a375886bc1a8da83a7f1bf32fereed bool generateBitmap(SkBitmap*); 73095530389d8211895309107a4f74beefacce638creed bool tryLockAsBitmap(SkBitmap*, const SkImage*, SkImage::CachingHint); 74856e9d921462136da8562f8f122d42e114cd4710reed#if SK_SUPPORT_GPU 75045802dbb7202b52f5fd2758d725f39c156a6165bsalomon // Returns the texture. If the cacherator is generating the texture and wants to cache it, 76045802dbb7202b52f5fd2758d725f39c156a6165bsalomon // it should use the passed in key (if the key is valid). 77095530389d8211895309107a4f74beefacce638creed GrTexture* lockTexture(GrContext*, const GrUniqueKey& key, const SkImage* client, 78095530389d8211895309107a4f74beefacce638creed SkImage::CachingHint); 79856e9d921462136da8562f8f122d42e114cd4710reed#endif 808f34372f7e97482e5e61ab298b7edaa008ba2f4creed 81d5c448fd857a77a375886bc1a8da83a7f1bf32fereed class ScopedGenerator { 82d5c448fd857a77a375886bc1a8da83a7f1bf32fereed SkImageCacherator* fCacher; 83d5c448fd857a77a375886bc1a8da83a7f1bf32fereed public: 84d5c448fd857a77a375886bc1a8da83a7f1bf32fereed ScopedGenerator(SkImageCacherator* cacher) : fCacher(cacher) { 85d5c448fd857a77a375886bc1a8da83a7f1bf32fereed fCacher->fMutexForGenerator.acquire(); 86d5c448fd857a77a375886bc1a8da83a7f1bf32fereed } 87d5c448fd857a77a375886bc1a8da83a7f1bf32fereed ~ScopedGenerator() { 88d5c448fd857a77a375886bc1a8da83a7f1bf32fereed fCacher->fMutexForGenerator.release(); 89d5c448fd857a77a375886bc1a8da83a7f1bf32fereed } 90d5c448fd857a77a375886bc1a8da83a7f1bf32fereed SkImageGenerator* operator->() const { return fCacher->fNotThreadSafeGenerator; } 91d5c448fd857a77a375886bc1a8da83a7f1bf32fereed operator SkImageGenerator*() const { return fCacher->fNotThreadSafeGenerator; } 92d5c448fd857a77a375886bc1a8da83a7f1bf32fereed }; 93d5c448fd857a77a375886bc1a8da83a7f1bf32fereed 94d5c448fd857a77a375886bc1a8da83a7f1bf32fereed SkMutex fMutexForGenerator; 95d5c448fd857a77a375886bc1a8da83a7f1bf32fereed SkAutoTDelete<SkImageGenerator> fNotThreadSafeGenerator; 96d5c448fd857a77a375886bc1a8da83a7f1bf32fereed 97935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed const SkImageInfo fInfo; 98935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed const SkIPoint fOrigin; 99935d6cfaa78b6be75c9fcc596805f0f9b8da972ereed const uint32_t fUniqueID; 100856e9d921462136da8562f8f122d42e114cd4710reed 1011cf6f9b6b51bcf09d93142ba40d6c331c21f50a6bsalomon friend class GrImageTextureMaker; 1028f34372f7e97482e5e61ab298b7edaa008ba2f4creed}; 1038f34372f7e97482e5e61ab298b7edaa008ba2f4creed 1048f34372f7e97482e5e61ab298b7edaa008ba2f4creed#endif 105