diff options
author | Mike Reed <reed@google.com> | 2009-06-05 08:28:19 -0400 |
---|---|---|
committer | Mike Reed <reed@google.com> | 2009-06-05 08:47:36 -0400 |
commit | 79377cbceeea970b663e7934d7cb1f27bb223d98 (patch) | |
tree | 4a4f44a0b57142096b0b6cd553f22906b1cc169f /src/effects/SkGradientShader.cpp | |
parent | b630785db28d3dbd2ef9fa2b15eb7aea0def82e8 (diff) | |
download | external_skia-79377cbceeea970b663e7934d7cb1f27bb223d98.zip external_skia-79377cbceeea970b663e7934d7cb1f27bb223d98.tar.gz external_skia-79377cbceeea970b663e7934d7cb1f27bb223d98.tar.bz2 |
refresh from skia
add isConvex to paths
cache bitmap in gradients for opengl texture
64-bit fixes in views
dumpcanvas now recurses on pictures
Diffstat (limited to 'src/effects/SkGradientShader.cpp')
-rw-r--r-- | src/effects/SkGradientShader.cpp | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp index 6d7c795..696def6 100644 --- a/src/effects/SkGradientShader.cpp +++ b/src/effects/SkGradientShader.cpp @@ -129,6 +129,9 @@ protected: const uint16_t* getCache16(); const SkPMColor* getCache32(); + // called when we kill our cached colors (to be rebuilt later on demand) + virtual void onCacheReset() = 0; + private: enum { kColorStorageCount = 4, // more than this many colors, and we'll use sk_malloc for the space @@ -388,6 +391,8 @@ bool Gradient_Shader::setContext(const SkBitmap& device, fCache16 = NULL; // inval the cache fCache32 = NULL; // inval the cache fCacheAlpha = paintAlpha; // record the new alpha + // inform our subclasses + this->onCacheReset(); } return true; } @@ -606,21 +611,38 @@ public: SkShader::TileMode mode, SkUnitMapper* mapper) : Gradient_Shader(colors, pos, colorCount, mode, mapper) { + fCachedBitmap = NULL; pts_to_unit_matrix(pts, &fPtsToUnit); } + virtual ~Linear_Gradient() { + if (fCachedBitmap) { + SkDELETE(fCachedBitmap); + } + } + virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count); virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count); virtual bool asABitmap(SkBitmap*, SkMatrix*, TileMode*); + virtual void onCacheReset() { + if (fCachedBitmap) { + SkDELETE(fCachedBitmap); + fCachedBitmap = NULL; + } + } static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { return SkNEW_ARGS(Linear_Gradient, (buffer)); } protected: - Linear_Gradient(SkFlattenableReadBuffer& buffer) : Gradient_Shader(buffer) {}; + Linear_Gradient(SkFlattenableReadBuffer& buffer) : Gradient_Shader(buffer) { + fCachedBitmap = NULL; + } virtual Factory getFactory() { return CreateProc; } private: + SkBitmap* fCachedBitmap; // allocated on demand + typedef Gradient_Shader INHERITED; }; @@ -731,10 +753,16 @@ void Linear_Gradient::shadeSpan(int x, int y, SkPMColor dstC[], int count) bool Linear_Gradient::asABitmap(SkBitmap* bitmap, SkMatrix* matrix, TileMode xy[]) { + // we cache our "bitmap", so it's generationID will be const on subsequent + // calls to asABitmap + if (NULL == fCachedBitmap) { + fCachedBitmap = SkNEW(SkBitmap); + fCachedBitmap->setConfig(SkBitmap::kARGB_8888_Config, kCache32Count, 1); + fCachedBitmap->setPixels((void*)this->getCache32(), NULL); + } + if (bitmap) { - bitmap->setConfig(SkBitmap::kARGB_8888_Config, kCache32Count, 1); - bitmap->allocPixels(); // share with shader??? - memcpy(bitmap->getPixels(), this->getCache32(), kCache32Count * 4); + *bitmap = *fCachedBitmap; } if (matrix) { matrix->setScale(SkIntToScalar(kCache32Count), SK_Scalar1); @@ -1155,6 +1183,7 @@ public: protected: Radial_Gradient(SkFlattenableReadBuffer& buffer) : Gradient_Shader(buffer) {}; virtual Factory getFactory() { return CreateProc; } + virtual void onCacheReset() {} private: typedef Gradient_Shader INHERITED; @@ -1179,8 +1208,8 @@ public: protected: Sweep_Gradient(SkFlattenableReadBuffer& buffer) : Gradient_Shader(buffer) {} - virtual Factory getFactory() { return CreateProc; } + virtual void onCacheReset() {} private: typedef Gradient_Shader INHERITED; |