diff options
author | junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-09 15:48:03 +0000 |
---|---|---|
committer | junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-09 15:48:03 +0000 |
commit | b6e161937bc890f0aa12ac5e27415d4d260ea6e0 (patch) | |
tree | 20eb36fe7eb473f2ba4e1d6a1dd3b399ebf26fdb /src/effects/SkGradientShader.cpp | |
parent | e23f194bf9747267b9dd42e238dfe217ed585c03 (diff) |
Adding isOpaque method to skia shader classes
REVIEW=http://codereview.appspot.com/5451102/
TEST=unit test ShaderOpacity
git-svn-id: http://skia.googlecode.com/svn/trunk@2840 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/SkGradientShader.cpp')
-rw-r--r-- | src/effects/SkGradientShader.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp index bc7f8a3a68..af357a624b 100644 --- a/src/effects/SkGradientShader.cpp +++ b/src/effects/SkGradientShader.cpp @@ -119,6 +119,7 @@ public: // overrides virtual bool setContext(const SkBitmap&, const SkPaint&, const SkMatrix&) SK_OVERRIDE; virtual uint32_t getFlags() SK_OVERRIDE { return fFlags; } + virtual bool isOpaque() const SK_OVERRIDE; protected: Gradient_Shader(SkFlattenableReadBuffer& ); @@ -161,7 +162,8 @@ private: kStorageSize = kColorStorageCount * (sizeof(SkColor) + sizeof(Rec)) }; SkColor fStorage[(kStorageSize + 3) >> 2]; - SkColor* fOrigColors; + 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 @@ -174,6 +176,7 @@ private: static void Build32bitCache(SkPMColor[], SkColor c0, SkColor c1, int count, U8CPU alpha); void setCacheAlpha(U8CPU alpha) const; + void initCommon(); typedef SkShader INHERITED; }; @@ -302,7 +305,7 @@ Gradient_Shader::Gradient_Shader(const SkColor colors[], const SkScalar pos[], } } } - fFlags = 0; + this->initCommon(); } Gradient_Shader::Gradient_Shader(SkFlattenableReadBuffer& buffer) : @@ -336,7 +339,7 @@ Gradient_Shader::Gradient_Shader(SkFlattenableReadBuffer& buffer) : } } SkReadMatrix(&buffer, &fPtsToUnit); - fFlags = 0; + this->initCommon(); } Gradient_Shader::~Gradient_Shader() { @@ -350,6 +353,15 @@ Gradient_Shader::~Gradient_Shader() { SkSafeUnref(fMapper); } +void Gradient_Shader::initCommon() { + fFlags = 0; + unsigned colorAlpha = 0xFF; + for (int i = 0; i < fColorCount; i++) { + colorAlpha &= SkColorGetA(fOrigColors[i]); + } + fColorsAreOpaque = colorAlpha == 0xFF; +} + void Gradient_Shader::flatten(SkFlattenableWriteBuffer& buffer) { this->INHERITED::flatten(buffer); buffer.writeFlattenable(fMapper); @@ -366,6 +378,10 @@ void Gradient_Shader::flatten(SkFlattenableWriteBuffer& buffer) { SkWriteMatrix(&buffer, fPtsToUnit); } +bool Gradient_Shader::isOpaque() const { + return fColorsAreOpaque; +} + bool Gradient_Shader::setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix) { @@ -384,23 +400,14 @@ bool Gradient_Shader::setContext(const SkBitmap& device, // now convert our colors in to PMColors unsigned paintAlpha = this->getPaintAlpha(); - unsigned colorAlpha = 0xFF; - - // FIXME: record colorAlpha in constructor, since this is not affected - // by setContext() - for (int i = 0; i < fColorCount; i++) { - SkColor src = fOrigColors[i]; - unsigned sa = SkColorGetA(src); - colorAlpha &= sa; - } fFlags = this->INHERITED::getFlags(); - if ((colorAlpha & paintAlpha) == 0xFF) { + if (fColorsAreOpaque && paintAlpha == 0xFF) { fFlags |= kOpaqueAlpha_Flag; } // we can do span16 as long as our individual colors are opaque, // regardless of the paint's alpha - if (0xFF == colorAlpha) { + if (fColorsAreOpaque) { fFlags |= kHasSpan16_Flag; } |