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