| Index: src/core/SkImageCacherator.cpp | 
| diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp | 
| index cd5ae57699b2ea52e186b88f4063e37496113bb4..71afc0e68aa7a29608e82ebcc887b10f03f5d10e 100644 | 
| --- a/src/core/SkImageCacherator.cpp | 
| +++ b/src/core/SkImageCacherator.cpp | 
| @@ -204,7 +204,9 @@ public: | 
| }; | 
|  | 
| static GrTexture* set_key_and_return(GrTexture* tex, const GrUniqueKey& key) { | 
| -    tex->resourcePriv().setUniqueKey(key); | 
| +    if (key.isValid()) { | 
| +        tex->resourcePriv().setUniqueKey(key); | 
| +    } | 
| return tex; | 
| } | 
|  | 
| @@ -217,24 +219,16 @@ static GrTexture* set_key_and_return(GrTexture* tex, const GrUniqueKey& key) { | 
| *  4. Ask the generator to return YUV planes, which the GPU can convert | 
| *  5. Ask the generator to return RGB(A) data, which the GPU can convert | 
| */ | 
| -GrTexture* SkImageCacherator::lockUnstretchedTexture(GrContext* ctx, const SkImage* client) { | 
| -    // textures (at least the texture-key) only support 16bit dimensions, so abort early | 
| -    // if we're too big. | 
| -    if (fInfo.width() > 0xFFFF || fInfo.height() > 0xFFFF) { | 
| -        return nullptr; | 
| -    } | 
| - | 
| -    GrUniqueKey key; | 
| -    const GrTextureParams& noStretchParams = GrTextureParams::ClampNoFilter(); | 
| -    GrMakeKeyFromImageID(&key, fUniqueID, SkIRect::MakeWH(fInfo.width(), fInfo.height()), | 
| -                         *ctx->caps(), noStretchParams); | 
| - | 
| +GrTexture* SkImageCacherator::lockTexture(GrContext* ctx, const GrUniqueKey& key, | 
| +                                          const SkImage* client) { | 
| // 1. Check the cache for a pre-existing one | 
| -    if (GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key)) { | 
| -        return tex; | 
| +    if (key.isValid()) { | 
| +        if (GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key)) { | 
| +            return tex; | 
| +        } | 
| } | 
|  | 
| -    // 2. Ask the genreator to natively create one | 
| +    // 2. Ask the generator to natively create one | 
| { | 
| ScopedGenerator generator(this); | 
| SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); | 
| @@ -267,54 +261,64 @@ GrTexture* SkImageCacherator::lockUnstretchedTexture(GrContext* ctx, const SkIma | 
| // 5. Ask the generator to return RGB(A) data, which the GPU can convert | 
| SkBitmap bitmap; | 
| if (this->tryLockAsBitmap(&bitmap, client)) { | 
| -        return GrRefCachedBitmapTexture(ctx, bitmap, noStretchParams); | 
| +        GrTexture* tex = GrUploadBitmapToTexture(ctx, bitmap); | 
| +        if (tex) { | 
| +            return set_key_and_return(tex, key); | 
| +        } | 
| } | 
| return nullptr; | 
| } | 
|  | 
| /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|  | 
| -#include "GrTextureMaker.h" | 
| +#include "GrTextureParamsAdjuster.h" | 
|  | 
| -class Cacherator_GrTextureMaker : public GrTextureMaker { | 
| +class Cacherator_GrTextureParamsAdjuster : public GrTextureParamsAdjuster { | 
| public: | 
| -    Cacherator_GrTextureMaker(SkImageCacherator* cacher, const SkImage* client, | 
| -                              const GrUniqueKey& unstretchedKey) | 
| +    Cacherator_GrTextureParamsAdjuster(SkImageCacherator* cacher, const SkImage* client) | 
| : INHERITED(cacher->info().width(), cacher->info().height()) | 
| , fCacher(cacher) | 
| , fClient(client) | 
| -        , fUnstretchedKey(unstretchedKey) | 
| -    {} | 
| +    { | 
| +        if (client) { | 
| +            GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(), | 
| +                                 SkIRect::MakeWH(this->width(), this->height())); | 
| +        } | 
| +    } | 
|  | 
| protected: | 
| +    GrTexture* peekOriginalTexture() override { return nullptr; } | 
| + | 
| // TODO: consider overriding this, for the case where the underlying generator might be | 
| //       able to efficiently produce a "stretched" texture natively (e.g. picture-backed) | 
| -//    GrTexture* onGenerateStretchedTexture(GrContext*, const SkGrStretch&) override; | 
| +    //    GrTexture* generateTextureForParams(GrContext*, const SkGrStretch&) override; | 
|  | 
| -    GrTexture* onRefUnstretchedTexture(GrContext* ctx) override { | 
| -        return fCacher->lockUnstretchedTexture(ctx, fClient); | 
| +    GrTexture* refOriginalTexture(GrContext* ctx) override { | 
| +        return fCacher->lockTexture(ctx, fOriginalKey, fClient); | 
| } | 
|  | 
| -    bool onMakeStretchedKey(const SkGrStretch& stretch, GrUniqueKey* stretchedKey) override { | 
| -        return GrMakeStretchedKey(fUnstretchedKey, stretch, stretchedKey); | 
| +    void makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) override { | 
| +        if (fOriginalKey.isValid()) { | 
| +            MakeCopyKeyFromOrigKey(fOriginalKey, stretch, paramsCopyKey); | 
| +        } | 
| } | 
|  | 
| -    void onNotifyStretchCached(const GrUniqueKey& stretchedKey) override { | 
| +    void didCacheCopy(const GrUniqueKey& copyKey) override { | 
| if (fClient) { | 
| as_IB(fClient)->notifyAddedToCache(); | 
| } | 
| } | 
|  | 
| -    bool onGetROBitmap(SkBitmap* bitmap) override { | 
| +    bool getROBitmap(SkBitmap* bitmap) override { | 
| return fCacher->lockAsBitmap(bitmap, fClient); | 
| } | 
|  | 
| private: | 
| SkImageCacherator*      fCacher; | 
| const SkImage*          fClient; | 
| -    const GrUniqueKey       fUnstretchedKey; | 
| +    GrUniqueKey             fOriginalKey; | 
|  | 
| -    typedef GrTextureMaker INHERITED; | 
| +    typedef GrTextureParamsAdjuster INHERITED; | 
| }; | 
|  | 
| GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParams& params, | 
| @@ -323,12 +327,7 @@ GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParam | 
| return nullptr; | 
| } | 
|  | 
| -    GrUniqueKey key; | 
| -    GrMakeKeyFromImageID(&key, this->uniqueID(), | 
| -                         SkIRect::MakeWH(this->info().width(), this->info().height()), | 
| -                         *ctx->caps(), GrTextureParams::ClampNoFilter()); | 
| - | 
| -    return Cacherator_GrTextureMaker(this, client, key).refCachedTexture(ctx, params); | 
| +    return Cacherator_GrTextureParamsAdjuster(this, client).refTextureForParams(ctx, params); | 
| } | 
|  | 
| #else | 
|  |