Split up SkXfermode::asNewEffectOrCoeff() into asNewEffect(), asCoeff().
R=bsalomon@google.com
Review URL: https://codereview.chromium.org/37593002
git-svn-id: http://skia.googlecode.com/svn/trunk@11926 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h
index db9b0b0..5bf8a22 100644
--- a/include/core/SkXfermode.h
+++ b/include/core/SkXfermode.h
@@ -192,25 +192,20 @@
}
/** A subclass may implement this factory function to work with the GPU backend. It is legal
- to call this with all but the context param NULL to simply test the return value. effect,
- src, and dst must all be NULL or all non-NULL. If effect is non-NULL then the xfermode may
- optionally allocate an effect to return and the caller as *effect. The caller will install
- it and own a ref to it. Since the xfermode may or may not assign *effect, the caller should
- set *effect to NULL beforehand. If the function returns true and *effect is NULL then the
- src and dst coeffs will be applied to the draw. When *effect is non-NULL the coeffs are
- ignored. background specifies the texture to use as the background for compositing, and
- should be accessed in the effect's fragment shader. If NULL, the effect should request
- access to destination color (setWillReadDstColor()), and use that in the fragment shader
- (builder->dstColor()).
+ to call this with all params NULL to simply test the return value. If effect is non-NULL
+ then the xfermode may optionally allocate an effect to return and the caller as *effect.
+ The caller will install it and own a ref to it. Since the xfermode may or may not assign
+ *effect, the caller should set *effect to NULL beforehand. background specifies the
+ texture to use as the background for compositing, and should be accessed in the effect's
+ fragment shader. If NULL, the effect should request access to destination color
+ (setWillReadDstColor()), and use that in the fragment shader (builder->dstColor()).
*/
- virtual bool asNewEffectOrCoeff(GrEffectRef** effect,
- Coeff* src,
- Coeff* dst,
- GrTexture* background = NULL) const;
+ virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background = NULL) const;
- /**
- * The same as calling xfermode->asNewEffect(...), except that this also checks if the xfermode
- * is NULL, and if so, treats it as kSrcOver_Mode.
+ /** Returns true if the xfermode can be expressed as coeffs (src, dst), or as an effect
+ (effect). This helper calls the asCoeff() and asNewEffect() virtuals. If the xfermode is
+ NULL, it is treated as kSrcOver_Mode. It is legal to call this with all params NULL to
+ simply test the return value. effect, src, and dst must all be NULL or all non-NULL.
*/
static bool AsNewEffectOrCoeff(SkXfermode*,
GrEffectRef** effect,
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 75c6529..d2947ee 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -673,8 +673,8 @@
return false;
}
-bool SkXfermode::asNewEffectOrCoeff(GrEffectRef**, Coeff* src, Coeff* dst, GrTexture*) const {
- return this->asCoeff(src, dst);
+bool SkXfermode::asNewEffect(GrEffectRef** effect, GrTexture* background) const {
+ return false;
}
bool SkXfermode::AsNewEffectOrCoeff(SkXfermode* xfermode,
@@ -684,8 +684,10 @@
GrTexture* background) {
if (NULL == xfermode) {
return ModeAsCoeff(kSrcOver_Mode, src, dst);
+ } else if (xfermode->asCoeff(src, dst)) {
+ return true;
} else {
- return xfermode->asNewEffectOrCoeff(effect, src, dst, background);
+ return xfermode->asNewEffect(effect, background);
}
}
@@ -1363,13 +1365,8 @@
}
#if SK_SUPPORT_GPU
-bool SkProcCoeffXfermode::asNewEffectOrCoeff(GrEffectRef** effect,
- Coeff* src,
- Coeff* dst,
- GrTexture* background) const {
- if (this->asCoeff(src, dst)) {
- return true;
- }
+bool SkProcCoeffXfermode::asNewEffect(GrEffectRef** effect,
+ GrTexture* background) const {
if (XferEffect::IsSupportedMode(fMode)) {
if (NULL != effect) {
*effect = XferEffect::Create(fMode, background);
diff --git a/src/core/SkXfermode_proccoeff.h b/src/core/SkXfermode_proccoeff.h
index bba8b39..df2b974 100644
--- a/src/core/SkXfermode_proccoeff.h
+++ b/src/core/SkXfermode_proccoeff.h
@@ -29,10 +29,8 @@
virtual bool asCoeff(Coeff* sc, Coeff* dc) const SK_OVERRIDE;
#if SK_SUPPORT_GPU
- virtual bool asNewEffectOrCoeff(GrEffectRef** effect,
- Coeff* src,
- Coeff* dst,
- GrTexture* background) const SK_OVERRIDE;
+ virtual bool asNewEffect(GrEffectRef** effect,
+ GrTexture* background) const SK_OVERRIDE;
#endif
SK_DEVELOPER_TO_STRING()
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
index 7c4428c..3c445ab 100644
--- a/src/effects/SkArithmeticMode.cpp
+++ b/src/effects/SkArithmeticMode.cpp
@@ -36,7 +36,7 @@
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar)
#if SK_SUPPORT_GPU
- virtual bool asNewEffectOrCoeff(GrEffectRef** effect, Coeff*, Coeff*, GrTexture* background) const SK_OVERRIDE;
+ virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background) const SK_OVERRIDE;
#endif
private:
@@ -408,10 +408,7 @@
GR_DEFINE_EFFECT_TEST(GrArithmeticEffect);
-bool SkArithmeticMode_scalar::asNewEffectOrCoeff(GrEffectRef** effect,
- Coeff*,
- Coeff*,
- GrTexture* background) const {
+bool SkArithmeticMode_scalar::asNewEffect(GrEffectRef** effect, GrTexture* background) const {
if (effect) {
*effect = GrArithmeticEffect::Create(SkScalarToFloat(fK[0]),
SkScalarToFloat(fK[1]),