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 |