| Index: src/gpu/GrTextureParamsAdjuster.h
|
| diff --git a/src/gpu/GrTextureParamsAdjuster.h b/src/gpu/GrTextureParamsAdjuster.h
|
| index bc08c71af5959e3053fadb414c0cfee05e0a1fff..c9b90a59ffff31fd57ab8f52a8031259283047d0 100644
|
| --- a/src/gpu/GrTextureParamsAdjuster.h
|
| +++ b/src/gpu/GrTextureParamsAdjuster.h
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "GrTextureParams.h"
|
| #include "GrResourceKey.h"
|
| +#include "SkTLazy.h"
|
|
|
| class GrContext;
|
| class GrTexture;
|
| @@ -20,12 +21,12 @@ class SkBitmap;
|
| /**
|
| * Different GPUs and API extensions have different requirements with respect to what texture
|
| * sampling parameters may be used with textures of various types. This class facilitates making
|
| - * texture compatible with a given GrTextureParams. It abstracts the source of the original data
|
| - * which may be an already existing texture, CPU pixels, a codec, ... so that various sources can
|
| - * be used with common code that scales or copies the data to make it compatible with a
|
| - * GrTextureParams.
|
| + * texture compatible with a given GrTextureParams. There are two immediate subclasses defined
|
| + * below. One is a base class for sources that are inherently texture-backed (e.g. a texture-backed
|
| + * SkImage). It supports subsetting the original texture. The other is for use cases where the
|
| + * source can generate a texture that represents some content (e.g. cpu pixels, SkPicture, ...).
|
| */
|
| -class GrTextureParamsAdjuster {
|
| +class GrTextureProducer : public SkNoncopyable {
|
| public:
|
| struct CopyParams {
|
| GrTextureParams::FilterMode fFilter;
|
| @@ -33,13 +34,85 @@ public:
|
| int fHeight;
|
| };
|
|
|
| - GrTextureParamsAdjuster(int width, int height) : fWidth(width), fHeight(height) {}
|
| - virtual ~GrTextureParamsAdjuster() {}
|
| + virtual ~GrTextureProducer() {}
|
| +
|
| +protected:
|
| + /** Helper for creating a key for a copy from an original key. */
|
| + static void MakeCopyKeyFromOrigKey(const GrUniqueKey& origKey,
|
| + const CopyParams& copyParams,
|
| + GrUniqueKey* copyKey) {
|
| + SkASSERT(!copyKey->isValid());
|
| + if (origKey.isValid()) {
|
| + static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
|
| + GrUniqueKey::Builder builder(copyKey, origKey, kDomain, 3);
|
| + builder[0] = copyParams.fFilter;
|
| + builder[1] = copyParams.fWidth;
|
| + builder[2] = copyParams.fHeight;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * If we need to make a copy in order to be compatible with GrTextureParams producer is asked to
|
| + * return a key that identifies its original content + the CopyParms parameter. If the producer
|
| + * does not want to cache the stretched version (e.g. the producer is volatile), this should
|
| + * simply return without initializing the copyKey.
|
| + */
|
| + virtual void makeCopyKey(const CopyParams&, GrUniqueKey* copyKey) = 0;
|
| +
|
| + /**
|
| + * If a stretched version of the texture is generated, it may be cached (assuming that
|
| + * makeCopyKey() returns true). In that case, the maker is notified in case it
|
| + * wants to note that for when the maker is destroyed.
|
| + */
|
| + virtual void didCacheCopy(const GrUniqueKey& copyKey) = 0;
|
| +
|
| + typedef SkNoncopyable INHERITED;
|
| +};
|
| +
|
| +/** Base class for sources that start out as textures */
|
| +class GrTextureAdjuster : public GrTextureProducer {
|
| +public:
|
| + /** Makes the subset of the texture safe to use with the given texture parameters.
|
| + outOffset will be the top-left corner of the subset if a copy is not made. Otherwise,
|
| + the copy will be tight to the contents and outOffset will be (0, 0). If the copy's size
|
| + does not match subset's dimensions then the contents are scaled to fit the copy.*/
|
| + GrTexture* refTextureSafeForParams(const GrTextureParams&, SkIPoint* outOffset);
|
| +
|
| +protected:
|
| + /** No subset, use the whole texture */
|
| + explicit GrTextureAdjuster(GrTexture* original): fOriginal(original) {}
|
| +
|
| + GrTextureAdjuster(GrTexture* original, const SkIRect& subset);
|
| +
|
| + GrTexture* originalTexture() { return fOriginal; }
|
| +
|
| + /** Returns the subset or null for the whole original texture */
|
| + const SkIRect* subset() { return fSubset.getMaybeNull(); }
|
| +
|
| +private:
|
| + GrTexture* internalRefTextureSafeForParams(GrTexture*, const SkIRect* subset,
|
| + const GrTextureParams&, SkIPoint* outOffset);
|
| + SkTLazy<SkIRect> fSubset;
|
| + GrTexture* fOriginal;
|
| +
|
| + typedef GrTextureProducer INHERITED;
|
| +};
|
| +
|
| +/**
|
| + * Base class for sources that start out as something other than a texture (encoded image,
|
| + * picture, ...).
|
| + */
|
| +class GrTextureMaker : public GrTextureProducer {
|
| +public:
|
| +
|
| + GrTextureMaker(int width, int height) : fWidth(width), fHeight(height) {}
|
|
|
| int width() const { return fWidth; }
|
| int height() const { return fHeight; }
|
|
|
| - /** Returns a texture that is safe for use with the params */
|
| + /** Returns a texture that is safe for use with the params. If the size of the returned texture
|
| + does not match width()/height() then the contents of the original must be scaled to fit
|
| + the texture. */
|
| GrTexture* refTextureForParams(GrContext*, const GrTextureParams&);
|
|
|
| protected:
|
| @@ -51,9 +124,9 @@ protected:
|
| virtual GrTexture* refOriginalTexture(GrContext*) = 0;
|
|
|
| /**
|
| - * If we need to copy the maker's original texture, the maker is asked to return a key
|
| + * If we need to copy the producer's original texture, the producer is asked to return a key
|
| * that identifies its original + the CopyParms parameter. If the maker does not want to cache
|
| - * the stretched version (e.g. the maker is volatile), this should simply return without
|
| + * the stretched version (e.g. the producer is volatile), this should simply return without
|
| * initializing the copyKey.
|
| */
|
| virtual void makeCopyKey(const CopyParams&, GrUniqueKey* copyKey) = 0;
|
| @@ -70,30 +143,11 @@ protected:
|
| */
|
| virtual GrTexture* generateTextureForParams(GrContext*, const CopyParams&);
|
|
|
| - /**
|
| - * If a stretched version of the texture is generated, it may be cached (assuming that
|
| - * onMakeParamsKey() returns true). In that case, the maker is notified in case it
|
| - * wants to note that for when the maker is destroyed.
|
| - */
|
| - virtual void didCacheCopy(const GrUniqueKey& copyKey) = 0;
|
| -
|
| - /** Helper for creating a key for a copy from an original key. */
|
| - static void MakeCopyKeyFromOrigKey(const GrUniqueKey& origKey,
|
| - const CopyParams& copyParams,
|
| - GrUniqueKey* copyKey) {
|
| - SkASSERT(!copyKey->isValid());
|
| - if (origKey.isValid()) {
|
| - static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
|
| - GrUniqueKey::Builder builder(copyKey, origKey, kDomain, 3);
|
| - builder[0] = copyParams.fFilter;
|
| - builder[1] = copyParams.fWidth;
|
| - builder[2] = copyParams.fHeight;
|
| - }
|
| - }
|
| -
|
| private:
|
| const int fWidth;
|
| const int fHeight;
|
| +
|
| + typedef GrTextureProducer INHERITED;
|
| };
|
|
|
| #endif
|
|
|