Index: src/effects/gradients/SkGradientShaderPriv.h |
diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h |
index 184ef8e88375c6d8dad48dd71588cce1c9f22299..a9989a292c9ca757627583111b686411ecc3f7cc 100644 |
--- a/src/effects/gradients/SkGradientShaderPriv.h |
+++ b/src/effects/gradients/SkGradientShaderPriv.h |
@@ -101,8 +101,52 @@ public: |
SkGradientShaderBase(const Descriptor& desc); |
virtual ~SkGradientShaderBase(); |
- virtual bool setContext(const SkBitmap&, const SkPaint&, const SkMatrix&) SK_OVERRIDE; |
- virtual uint32_t getFlags() SK_OVERRIDE { return fFlags; } |
+ class GradientShaderCache { |
+ public: |
+ GradientShaderCache(U8CPU alpha); |
+ ~GradientShaderCache(); |
+ |
+ const uint16_t* getCache16(const SkGradientShaderBase& shader); |
+ const SkPMColor* getCache32(const SkGradientShaderBase& shader); |
+ |
+ SkMallocPixelRef* getCache32PixelRef() const { return fCache32PixelRef; } |
+ private: |
+ uint16_t* fCache16; // working ptr. If this is NULL, we need to recompute the cache values |
+ SkPMColor* fCache32; // working ptr. If this is NULL, we need to recompute the cache values |
+ |
+ uint16_t* fCache16Storage; // storage for fCache16, allocated on demand |
+ SkMallocPixelRef* fCache32PixelRef; |
+ unsigned fCacheAlpha; // the alpha value we used when we computed the cache. |
+ // larger than 8bits so we can store uninitialized value |
+ |
+ static void Build16bitCache(uint16_t[], SkColor c0, SkColor c1, int count); |
+ static void Build32bitCache(SkPMColor[], SkColor c0, SkColor c1, int count, |
+ U8CPU alpha, uint32_t gradFlags); |
+ }; |
+ |
+ virtual bool validContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix, |
+ SkMatrix* totalInverse = NULL) const SK_OVERRIDE; |
+ // TODO(dominikg): DELETE |
+ virtual SkShader::Context* createContext(const SkBitmap&, const SkPaint&, const SkMatrix&, |
+ void* storage) const SK_OVERRIDE { return NULL; } |
+ virtual size_t contextSize() const SK_OVERRIDE; |
+ |
+ class GradientShaderBaseContext : public SkShader::Context { |
+ public: |
+ GradientShaderBaseContext(const SkGradientShaderBase& shader, const SkBitmap& device, |
+ const SkPaint& paint, const SkMatrix& matrix); |
+ ~GradientShaderBaseContext() {} |
+ protected: |
+ SkMatrix fDstToIndex; |
+ SkMatrix::MapXYProc fDstToIndexProc; |
+ uint8_t fDstToIndexClass; |
+ uint8_t fFlags; |
+ |
+ GradientShaderCache fCache; |
+ |
+ typedef SkShader::Context INHERITED; |
+ }; |
+ |
virtual bool isOpaque() const SK_OVERRIDE; |
void getGradientTableBitmap(SkBitmap*) const; |
@@ -136,13 +180,9 @@ protected: |
SkUnitMapper* fMapper; |
SkMatrix fPtsToUnit; // set by subclass |
- SkMatrix fDstToIndex; |
- SkMatrix::MapXYProc fDstToIndexProc; |
TileMode fTileMode; |
TileProc fTileProc; |
int fColorCount; |
- uint8_t fDstToIndexClass; |
- uint8_t fFlags; |
uint8_t fGradFlags; |
struct Rec { |
@@ -151,9 +191,6 @@ protected: |
}; |
Rec* fRecs; |
- const uint16_t* getCache16() const; |
- const SkPMColor* getCache32() const; |
- |
void commonAsAGradient(GradientInfo*) const; |
private: |
@@ -166,17 +203,6 @@ private: |
SkColor* fOrigColors; // original colors, before modulation by paint in setContext |
bool fColorsAreOpaque; |
- mutable uint16_t* fCache16; // working ptr. If this is NULL, we need to recompute the cache values |
- mutable SkPMColor* fCache32; // working ptr. If this is NULL, we need to recompute the cache values |
- |
- mutable uint16_t* fCache16Storage; // storage for fCache16, allocated on demand |
- mutable SkMallocPixelRef* fCache32PixelRef; |
- mutable unsigned fCacheAlpha; // the alpha value we used when we computed the cache. larger than 8bits so we can store uninitialized value |
- |
- static void Build16bitCache(uint16_t[], SkColor c0, SkColor c1, int count); |
- static void Build32bitCache(SkPMColor[], SkColor c0, SkColor c1, int count, |
- U8CPU alpha, uint32_t gradFlags); |
- void setCacheAlpha(U8CPU alpha) const; |
void initCommon(); |
typedef SkShader INHERITED; |