| Index: src/gpu/GrTextureParamsAdjuster.h
 | 
| diff --git a/src/gpu/GrTextureParamsAdjuster.h b/src/gpu/GrTextureParamsAdjuster.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..c244aaf2df4b1ab2db1032ae4c75e613fa5360c7
 | 
| --- /dev/null
 | 
| +++ b/src/gpu/GrTextureParamsAdjuster.h
 | 
| @@ -0,0 +1,111 @@
 | 
| +/*
 | 
| + * Copyright 2015 Google Inc.
 | 
| + *
 | 
| + * Use of this source code is governed by a BSD-style license that can be
 | 
| + * found in the LICENSE file.
 | 
| + */
 | 
| +
 | 
| +#ifndef GrTextureMaker_DEFINED
 | 
| +#define GrTextureMaker_DEFINED
 | 
| +
 | 
| +#include "GrTextureParams.h"
 | 
| +#include "GrResourceKey.h"
 | 
| +
 | 
| +class GrContext;
 | 
| +class GrTexture;
 | 
| +class GrTextureParams;
 | 
| +class GrUniqueKey;
 | 
| +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.
 | 
| + */
 | 
| +class GrTextureParamsAdjuster {
 | 
| +public:
 | 
| +    struct CopyParams {
 | 
| +        GrTextureParams::FilterMode fFilter;
 | 
| +        int                         fWidth;
 | 
| +        int                         fHeight;
 | 
| +    };
 | 
| +
 | 
| +    GrTextureParamsAdjuster(int width, int height) : fWidth(width), fHeight(height) {}
 | 
| +    virtual ~GrTextureParamsAdjuster() {}
 | 
| +
 | 
| +    int width() const { return fWidth; }
 | 
| +    int height() const { return fHeight; }
 | 
| +
 | 
| +    /** Returns a texture that is safe for use with the params */
 | 
| +    GrTexture* refTextureForParams(GrContext*, const GrTextureParams&);
 | 
| +
 | 
| +protected:
 | 
| +    /** If the original is a inherently texture that can be returned for "free" then return it
 | 
| +        without ref'ing it. Otherwise, return null. */
 | 
| +    virtual GrTexture* peekOriginalTexture() = 0;
 | 
| +
 | 
| +    /**
 | 
| +     *  Return the maker's "original" texture. It is the responsibility of the maker
 | 
| +     *  to make this efficient ... if the texture is being generated, the maker must handle
 | 
| +     *  caching it (if desired).
 | 
| +     */
 | 
| +    virtual GrTexture* refOriginalTexture(GrContext*) = 0;
 | 
| +
 | 
| +    /**
 | 
| +     *  If we need to copy the maker's original texture, the maker 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
 | 
| +     *  initializing the copyKey.
 | 
| +     */
 | 
| +    virtual void makeCopyKey(const CopyParams&, GrUniqueKey* copyKey) = 0;
 | 
| +
 | 
| +    /**
 | 
| +     *  Return a new (uncached) texture that is the stretch of the maker's original.
 | 
| +     *
 | 
| +     *  The base-class handles general logic for this, and only needs access to the following
 | 
| +     *  methods:
 | 
| +     *  - onRefOriginalTexture()
 | 
| +     *  - onGetROBitmap()
 | 
| +     *
 | 
| +     *  Subclass may override this if they can handle creating the texture more directly than
 | 
| +     *  by copying.
 | 
| +     */
 | 
| +    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;
 | 
| +
 | 
| +    /**
 | 
| +     *  Some GPUs are unreliable w/ very small texture sizes. If we run into that case, this
 | 
| +     *  method will be called (in service of onGenerateParamsTexture) to return a raster version
 | 
| +     *  of the original texture.
 | 
| +     */
 | 
| +    virtual bool getROBitmap(SkBitmap*) = 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;
 | 
| +};
 | 
| +
 | 
| +#endif
 | 
| 
 |