aboutsummaryrefslogtreecommitdiffstats
path: root/src/effects/SkGradientShader.cpp
diff options
context:
space:
mode:
authorMike Reed <reed@google.com>2009-06-05 08:28:19 -0400
committerMike Reed <reed@google.com>2009-06-05 08:47:36 -0400
commit79377cbceeea970b663e7934d7cb1f27bb223d98 (patch)
tree4a4f44a0b57142096b0b6cd553f22906b1cc169f /src/effects/SkGradientShader.cpp
parentb630785db28d3dbd2ef9fa2b15eb7aea0def82e8 (diff)
downloadexternal_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.cpp39
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;