diff options
author | 2013-01-17 16:50:08 +0000 | |
---|---|---|
committer | 2013-01-17 16:50:08 +0000 | |
commit | 68b58c95384dd6c2fd389a5b4bbf8fc468819454 (patch) | |
tree | 53cf3d959de9fa42a6b064d05580203c1b84065b /src/effects | |
parent | e8cc6e8071935339a06548b13a0668b56a7540f5 (diff) |
Remove default implementation of GrEffect::isEqual. Make GrSingleTextureEffect abstract.
Review URL: https://codereview.appspot.com/7142049
git-svn-id: http://skia.googlecode.com/svn/trunk@7254 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkBlendImageFilter.cpp | 9 | ||||
-rw-r--r-- | src/effects/SkColorMatrixFilter.cpp | 10 | ||||
-rw-r--r-- | src/effects/SkDisplacementMapEffect.cpp | 12 | ||||
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 27 | ||||
-rw-r--r-- | src/effects/SkMagnifierImageFilter.cpp | 16 | ||||
-rw-r--r-- | src/effects/SkMatrixConvolutionImageFilter.cpp | 7 | ||||
-rw-r--r-- | src/effects/SkMorphologyImageFilter.cpp | 14 | ||||
-rw-r--r-- | src/effects/SkTableColorFilter.cpp | 7 | ||||
-rw-r--r-- | src/effects/gradients/SkGradientShader.cpp | 18 | ||||
-rw-r--r-- | src/effects/gradients/SkGradientShaderPriv.h | 18 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.cpp | 15 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointRadialGradient.cpp | 15 |
12 files changed, 102 insertions, 66 deletions
diff --git a/src/effects/SkBlendImageFilter.cpp b/src/effects/SkBlendImageFilter.cpp index 5a93b479d2..43915b3a79 100644 --- a/src/effects/SkBlendImageFilter.cpp +++ b/src/effects/SkBlendImageFilter.cpp @@ -152,7 +152,6 @@ public: virtual ~GrBlendEffect(); - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; const GrBackendEffectFactory& getFactory() const; SkBlendImageFilter::Mode mode() const { return fMode; } @@ -162,6 +161,8 @@ public: void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GrBlendEffect(SkBlendImageFilter::Mode mode, GrTexture* foreground, GrTexture* background); GrTextureAccess fForegroundAccess; GrTextureAccess fBackgroundAccess; @@ -245,9 +246,11 @@ GrBlendEffect::GrBlendEffect(SkBlendImageFilter::Mode mode, GrBlendEffect::~GrBlendEffect() { } -bool GrBlendEffect::isEqual(const GrEffect& sBase) const { +bool GrBlendEffect::onIsEqual(const GrEffect& sBase) const { const GrBlendEffect& s = static_cast<const GrBlendEffect&>(sBase); - return INHERITED::isEqual(sBase) && fMode == s.fMode; + return fForegroundAccess.getTexture() == s.fForegroundAccess.getTexture() && + fBackgroundAccess.getTexture() == s.fBackgroundAccess.getTexture() && + fMode == s.fMode; } const GrBackendEffectFactory& GrBlendEffect::getFactory() const { diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp index 0fb438d2f4..06fb4efed0 100644 --- a/src/effects/SkColorMatrixFilter.cpp +++ b/src/effects/SkColorMatrixFilter.cpp @@ -336,11 +336,6 @@ public: return GrTBackendEffectFactory<ColorMatrixEffect>::getInstance(); } - virtual bool isEqual(const GrEffect& s) const { - const ColorMatrixEffect& cme = static_cast<const ColorMatrixEffect&>(s); - return cme.fMatrix == fMatrix; - } - virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE { // We only bother to check whether the alpha channel will be constant. If SkColorMatrix had @@ -456,6 +451,11 @@ public: private: ColorMatrixEffect(const SkColorMatrix& matrix) : fMatrix(matrix) {} + virtual bool onIsEqual(const GrEffect& s) const { + const ColorMatrixEffect& cme = static_cast<const ColorMatrixEffect&>(s); + return cme.fMatrix == fMatrix; + } + SkColorMatrix fMatrix; typedef GrGLEffect INHERITED; diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 9a67ac36c7..17abe28b18 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -245,7 +245,6 @@ public: virtual ~GrDisplacementMapEffect(); - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; const GrBackendEffectFactory& getFactory() const; SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const { return fXChannelSelector; } @@ -259,6 +258,8 @@ public: void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkScalar scale, GrTexture* displacement, GrTexture* color); @@ -360,10 +361,13 @@ GrDisplacementMapEffect::GrDisplacementMapEffect( GrDisplacementMapEffect::~GrDisplacementMapEffect() { } -bool GrDisplacementMapEffect::isEqual(const GrEffect& sBase) const { +bool GrDisplacementMapEffect::onIsEqual(const GrEffect& sBase) const { const GrDisplacementMapEffect& s = static_cast<const GrDisplacementMapEffect&>(sBase); - return INHERITED::isEqual(sBase) && fXChannelSelector == s.fXChannelSelector && - fYChannelSelector == s.fYChannelSelector && fScale == s.fScale; + return fDisplacementAccess.getTexture() == s.fDisplacementAccess.getTexture() && + fColorAccess.getTexture() == s.fColorAccess.getTexture() && + fXChannelSelector == s.fXChannelSelector && + fYChannelSelector == s.fYChannelSelector && + fScale == s.fScale; } const GrBackendEffectFactory& GrDisplacementMapEffect::getFactory() const { diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index ddb033def3..780a3a42bd 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -307,8 +307,6 @@ public: GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceScale); virtual ~GrLightingEffect(); - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; - const SkLight* light() const { return fLight; } SkScalar surfaceScale() const { return fSurfaceScale; } @@ -318,6 +316,9 @@ public: *validFlags = 0; } +protected: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + private: typedef GrSingleTextureEffect INHERITED; const SkLight* fLight; @@ -342,9 +343,11 @@ public: typedef GrGLDiffuseLightingEffect GLEffect; virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; SkScalar kd() const { return fKD; } + private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GrDiffuseLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceScale, @@ -374,11 +377,12 @@ public: typedef GrGLSpecularLightingEffect GLEffect; virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; SkScalar ks() const { return fKS; } SkScalar shininess() const { return fShininess; } private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GrSpecularLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceScale, @@ -1050,10 +1054,9 @@ GrLightingEffect::~GrLightingEffect() { fLight->unref(); } -bool GrLightingEffect::isEqual(const GrEffect& sBase) const { - const GrLightingEffect& s = - static_cast<const GrLightingEffect&>(sBase); - return INHERITED::isEqual(sBase) && +bool GrLightingEffect::onIsEqual(const GrEffect& sBase) const { + const GrLightingEffect& s = static_cast<const GrLightingEffect&>(sBase); + return this->texture(0) == s.texture(0) && fLight->isEqual(*s.fLight) && fSurfaceScale == s.fSurfaceScale; } @@ -1068,10 +1071,10 @@ const GrBackendEffectFactory& GrDiffuseLightingEffect::getFactory() const { return GrTBackendEffectFactory<GrDiffuseLightingEffect>::getInstance(); } -bool GrDiffuseLightingEffect::isEqual(const GrEffect& sBase) const { +bool GrDiffuseLightingEffect::onIsEqual(const GrEffect& sBase) const { const GrDiffuseLightingEffect& s = static_cast<const GrDiffuseLightingEffect&>(sBase); - return INHERITED::isEqual(sBase) && + return INHERITED::onIsEqual(sBase) && this->kd() == s.kd(); } @@ -1280,10 +1283,10 @@ const GrBackendEffectFactory& GrSpecularLightingEffect::getFactory() const { return GrTBackendEffectFactory<GrSpecularLightingEffect>::getInstance(); } -bool GrSpecularLightingEffect::isEqual(const GrEffect& sBase) const { +bool GrSpecularLightingEffect::onIsEqual(const GrEffect& sBase) const { const GrSpecularLightingEffect& s = static_cast<const GrSpecularLightingEffect&>(sBase); - return INHERITED::isEqual(sBase) && + return INHERITED::onIsEqual(sBase) && this->ks() == s.ks() && this->shininess() == s.shininess(); } diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index e7f266eeff..bcf0baf751 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -48,7 +48,7 @@ public: static const char* Name() { return "Magnifier"; } virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; float x_offset() const { return fXOffset; } float y_offset() const { return fYOffset; } @@ -75,6 +75,8 @@ private: , fXInset(xInset) , fYInset(yInset) {} + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GR_DECLARE_EFFECT_TEST; float fXOffset; @@ -230,10 +232,10 @@ const GrBackendEffectFactory& GrMagnifierEffect::getFactory() const { return GrTBackendEffectFactory<GrMagnifierEffect>::getInstance(); } -bool GrMagnifierEffect::isEqual(const GrEffect& sBase) const { - const GrMagnifierEffect& s = - static_cast<const GrMagnifierEffect&>(sBase); - return (this->fXOffset == s.fXOffset && +bool GrMagnifierEffect::onIsEqual(const GrEffect& sBase) const { + const GrMagnifierEffect& s = static_cast<const GrMagnifierEffect&>(sBase); + return (this->texture(0) == s.texture(0) && + this->fXOffset == s.fXOffset && this->fYOffset == s.fYOffset && this->fXZoom == s.fXZoom && this->fYZoom == s.fYZoom && @@ -241,6 +243,10 @@ bool GrMagnifierEffect::isEqual(const GrEffect& sBase) const { this->fYInset == s.fYInset); } +void GrMagnifierEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { + this->updateConstantColorComponentsForModulation(color, validFlags); +} + #endif //////////////////////////////////////////////////////////////////////////////// diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp index 03b10be041..50933eeeb6 100644 --- a/src/effects/SkMatrixConvolutionImageFilter.cpp +++ b/src/effects/SkMatrixConvolutionImageFilter.cpp @@ -287,7 +287,6 @@ public: virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; private: GrMatrixConvolutionEffect(GrTexture*, @@ -299,6 +298,8 @@ private: TileMode tileMode, bool convolveAlpha); + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + SkISize fKernelSize; float *fKernel; float fGain; @@ -518,10 +519,10 @@ const GrBackendEffectFactory& GrMatrixConvolutionEffect::getFactory() const { return GrTBackendEffectFactory<GrMatrixConvolutionEffect>::getInstance(); } -bool GrMatrixConvolutionEffect::isEqual(const GrEffect& sBase) const { +bool GrMatrixConvolutionEffect::onIsEqual(const GrEffect& sBase) const { const GrMatrixConvolutionEffect& s = static_cast<const GrMatrixConvolutionEffect&>(sBase); - return INHERITED::isEqual(sBase) && + return this->texture(0) == s.texture(0) && fKernelSize == s.kernelSize() && !memcmp(fKernel, s.kernel(), fKernelSize.width() * fKernelSize.height() * sizeof(float)) && fGain == s.gain() && diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index ed30aca8b2..c409435926 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -257,13 +257,15 @@ public: typedef GrGLMorphologyEffect GLEffect; virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; protected: MorphologyType fType; private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + GrMorphologyEffect(GrTexture*, Direction, int radius, MorphologyType); GR_DECLARE_EFFECT_TEST; @@ -399,15 +401,21 @@ const GrBackendEffectFactory& GrMorphologyEffect::getFactory() const { return GrTBackendEffectFactory<GrMorphologyEffect>::getInstance(); } -bool GrMorphologyEffect::isEqual(const GrEffect& sBase) const { +bool GrMorphologyEffect::onIsEqual(const GrEffect& sBase) const { const GrMorphologyEffect& s = static_cast<const GrMorphologyEffect&>(sBase); - return (INHERITED::isEqual(sBase) && + return (this->texture(0) == s.texture(0) && this->radius() == s.radius() && this->direction() == s.direction() && this->type() == s.type()); } +void GrMorphologyEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { + // This is valid because the color components of the result of the kernel all come + // exactly from existing values in the source texture. + this->updateConstantColorComponentsForModulation(color, validFlags); +} + /////////////////////////////////////////////////////////////////////////////// GR_DEFINE_EFFECT_TEST(GrMorphologyEffect); diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp index 0a922e712a..afb4a9926c 100644 --- a/src/effects/SkTableColorFilter.cpp +++ b/src/effects/SkTableColorFilter.cpp @@ -235,13 +235,14 @@ public: static const char* Name() { return "ColorTable"; } virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; - virtual bool isEqual(const GrEffect&) const SK_OVERRIDE; virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; typedef GLColorTableEffect GLEffect; private: + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + explicit ColorTableEffect(GrTexture* texture, unsigned flags); GR_DECLARE_EFFECT_TEST; @@ -344,8 +345,8 @@ const GrBackendEffectFactory& ColorTableEffect::getFactory() const { return GrTBackendEffectFactory<ColorTableEffect>::getInstance(); } -bool ColorTableEffect::isEqual(const GrEffect& sBase) const { - return INHERITED::isEqual(sBase); +bool ColorTableEffect::onIsEqual(const GrEffect& sBase) const { + return this->texture(0) == sBase.texture(0); } void ColorTableEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp index ba72eeadd4..76450245ff 100644 --- a/src/effects/gradients/SkGradientShader.cpp +++ b/src/effects/gradients/SkGradientShader.cpp @@ -829,6 +829,24 @@ GrGradientEffect::~GrGradientEffect() { } } +bool GrGradientEffect::onIsEqual(const GrEffect& effect) const { + const GrGradientEffect& s = static_cast<const GrGradientEffect&>(effect); + return fTextureAccess.getTexture() == s.fTextureAccess.getTexture() && + fTextureAccess.getParams().getTileModeX() == + s.fTextureAccess.getParams().getTileModeX() && + this->useAtlas() == s.useAtlas() && + fYCoord == s.getYCoord() && + fMatrix.cheapEqualTo(s.getMatrix()); +} + +void GrGradientEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { + if (fIsOpaque && (kA_ValidComponentFlag & *validFlags) && 0xff == GrColorUnpackA(*color)) { + *validFlags = kA_ValidComponentFlag; + } else { + *validFlags = 0; + } +} + int GrGradientEffect::RandomGradientParams(SkRandom* random, SkColor colors[], SkScalar** stops, diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h index 27c443814b..18289051b6 100644 --- a/src/effects/gradients/SkGradientShaderPriv.h +++ b/src/effects/gradients/SkGradientShaderPriv.h @@ -238,20 +238,7 @@ public: SkScalar getYCoord() const { return fYCoord; }; const SkMatrix& getMatrix() const { return fMatrix;} - virtual bool isEqual(const GrEffect& effect) const SK_OVERRIDE { - const GrGradientEffect& s = static_cast<const GrGradientEffect&>(effect); - return INHERITED::isEqual(effect) && this->useAtlas() == s.useAtlas() && - fYCoord == s.getYCoord() && fMatrix.cheapEqualTo(s.getMatrix()); - } - - virtual void getConstantColorComponents(GrColor* color, - uint32_t* validFlags) const SK_OVERRIDE { - if (fIsOpaque && (kA_ValidComponentFlag & *validFlags) && 0xff == GrColorUnpackA(*color)) { - *validFlags = kA_ValidComponentFlag; - } else { - *validFlags = 0; - } - } + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; protected: @@ -268,7 +255,10 @@ protected: SkScalar** stops, SkShader::TileMode* tm); + virtual bool onIsEqual(const GrEffect& effect) const SK_OVERRIDE; + private: + GrTextureAccess fTextureAccess; SkScalar fYCoord; GrTextureStripAtlas* fAtlas; diff --git a/src/effects/gradients/SkTwoPointConicalGradient.cpp b/src/effects/gradients/SkTwoPointConicalGradient.cpp index 0a154246c3..23b976a8f8 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient.cpp @@ -383,13 +383,6 @@ public: virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE { return GrTBackendEffectFactory<GrConical2Gradient>::getInstance(); } - virtual bool isEqual(const GrEffect& sBase) const SK_OVERRIDE { - const GrConical2Gradient& s = static_cast<const GrConical2Gradient&>(sBase); - return (INHERITED::isEqual(sBase) && - this->fCenterX1 == s.fCenterX1 && - this->fRadius0 == s.fRadius0 && - this->fDiffRadius == s.fDiffRadius); - } // The radial gradient parameters can collapse to a linear (instead of quadratic) equation. bool isDegenerate() const { return SkScalarAbs(fDiffRadius) == SkScalarAbs(fCenterX1); } @@ -400,6 +393,14 @@ public: typedef GrGLConical2Gradient GLEffect; private: + virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { + const GrConical2Gradient& s = static_cast<const GrConical2Gradient&>(sBase); + return (INHERITED::onIsEqual(sBase) && + this->fCenterX1 == s.fCenterX1 && + this->fRadius0 == s.fRadius0 && + this->fDiffRadius == s.fDiffRadius); + } + GrConical2Gradient(GrContext* ctx, const SkTwoPointConicalGradient& shader, const SkMatrix& matrix, diff --git a/src/effects/gradients/SkTwoPointRadialGradient.cpp b/src/effects/gradients/SkTwoPointRadialGradient.cpp index 0f79a2bec6..4f7351003a 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.cpp +++ b/src/effects/gradients/SkTwoPointRadialGradient.cpp @@ -442,13 +442,6 @@ public: virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE { return GrTBackendEffectFactory<GrRadial2Gradient>::getInstance(); } - virtual bool isEqual(const GrEffect& sBase) const SK_OVERRIDE { - const GrRadial2Gradient& s = static_cast<const GrRadial2Gradient&>(sBase); - return (INHERITED::isEqual(sBase) && - this->fCenterX1 == s.fCenterX1 && - this->fRadius0 == s.fRadius0 && - this->fPosRoot == s.fPosRoot); - } // The radial gradient parameters can collapse to a linear (instead of quadratic) equation. bool isDegenerate() const { return SK_Scalar1 == fCenterX1; } @@ -459,6 +452,14 @@ public: typedef GrGLRadial2Gradient GLEffect; private: + virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { + const GrRadial2Gradient& s = static_cast<const GrRadial2Gradient&>(sBase); + return (INHERITED::isEqual(sBase) && + this->fCenterX1 == s.fCenterX1 && + this->fRadius0 == s.fRadius0 && + this->fPosRoot == s.fPosRoot); + } + GrRadial2Gradient(GrContext* ctx, const SkTwoPointRadialGradient& shader, const SkMatrix& matrix, |