/* * 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 "SkGrPriv.h" class GrContext; class GrTexture; class GrTextureParams; class GrUniqueKey; class SkBitmap; class GrTextureMaker { public: GrTextureMaker(int width, int height) : fWidth(width), fHeight(height) {} virtual ~GrTextureMaker() {} int width() const { return fWidth; } int height() const { return fHeight; } GrTexture* refCachedTexture(GrContext*, SkImageUsageType); GrTexture* refCachedTexture(GrContext*, const GrTextureParams*); protected: /** * Return the maker's "original" unstretched texture. It is the responsibility of the maker * to make this efficient ... if the texture is being generated, the maker must handle * caching it. */ virtual GrTexture* onRefUnstretchedTexture(GrContext*) = 0; /** * If we need to stretch the maker's original texture, the maker is asked to return a key * that identifies its origianl + the stretch parameter. If the maker does not want to cache * the stretched version (e.g. the maker is volatile), this should ignore the key parameter * and return false. */ virtual bool onMakeStretchedKey(const SkGrStretch&, GrUniqueKey* stretchedKey) = 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: * - onRefUnstretchedTexture() * - onGetROBitmap() * * Subclass may override this if they can handle stretching more efficiently. */ virtual GrTexture* onGenerateStretchedTexture(GrContext*, const SkGrStretch&); /** * If a stretched version of the texture is generated, it may be cached (assuming that * onMakeStretchedKey() returns true). In that case, the maker is notified in case it * wants to note that for when the maker is destroyed. */ virtual void onNotifyStretchCached(const GrUniqueKey& stretchedKey) = 0; /** * Some GPUs are unreliable w/ very small texture sizes. If we run into that case, this * method will be called (in service of onGenerateStretchedTexture) to return a raster version * of the original texture. */ virtual bool onGetROBitmap(SkBitmap*) = 0; private: const int fWidth; const int fHeight; }; #endif