Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Unified Diff: src/effects/SkArithmeticMode.cpp

Issue 204543006: New option for arithmetic mode (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Added background texture check Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/effects/SkArithmeticMode.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkArithmeticMode.cpp
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
index 034ea376743d614eb63360bc4ba25717459748e8..41cc2667416e34a572246874d80fc54bdbcfd8d2 100644
--- a/src/effects/SkArithmeticMode.cpp
+++ b/src/effects/SkArithmeticMode.cpp
@@ -22,8 +22,9 @@ static const bool gUseUnpremul = false;
class SkArithmeticMode_scalar : public SkXfermode {
public:
- static SkArithmeticMode_scalar* Create(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) {
- return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4));
+ static SkArithmeticMode_scalar* Create(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4,
+ bool enforcePMColor) {
+ return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4, enforcePMColor));
}
virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
@@ -37,11 +38,12 @@ public:
#endif
private:
- SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) {
+ SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, bool enforcePMColor) {
fK[0] = k1;
fK[1] = k2;
fK[2] = k3;
fK[3] = k4;
+ fEnforcePMColor = enforcePMColor;
}
SkArithmeticMode_scalar(SkReadBuffer& buffer) : INHERITED(buffer) {
@@ -49,6 +51,7 @@ private:
fK[1] = buffer.readScalar();
fK[2] = buffer.readScalar();
fK[3] = buffer.readScalar();
+ fEnforcePMColor = buffer.readBool();
}
virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {
@@ -57,8 +60,10 @@ private:
buffer.writeScalar(fK[1]);
buffer.writeScalar(fK[2]);
buffer.writeScalar(fK[3]);
+ buffer.writeBool(fEnforcePMColor);
}
SkScalar fK[4];
+ bool fEnforcePMColor;
typedef SkXfermode INHERITED;
};
@@ -145,11 +150,13 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[],
} else {
a = arith(k1, k2, k3, k4, SkGetPackedA32(sc), SkGetPackedA32(dc));
r = arith(k1, k2, k3, k4, SkGetPackedR32(sc), SkGetPackedR32(dc));
- r = SkMin32(r, a);
g = arith(k1, k2, k3, k4, SkGetPackedG32(sc), SkGetPackedG32(dc));
- g = SkMin32(g, a);
b = arith(k1, k2, k3, k4, SkGetPackedB32(sc), SkGetPackedB32(dc));
- b = SkMin32(b, a);
+ if (fEnforcePMColor) {
+ r = SkMin32(r, a);
+ g = SkMin32(g, a);
+ b = SkMin32(b, a);
+ }
}
// apply antialias coverage if necessary
@@ -168,7 +175,7 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[],
g = SkAlphaMul(g, scale);
b = SkAlphaMul(b, scale);
}
- dst[i] = SkPackARGB32(a, r, g, b);
+ dst[i] = fEnforcePMColor ? SkPackARGB32(a, r, g, b) : SkPackARGB32NoCheck(a, r, g, b);
}
}
}
@@ -178,10 +185,9 @@ void SkArithmeticMode_scalar::toString(SkString* str) const {
str->append("SkArithmeticMode_scalar: ");
for (int i = 0; i < 4; ++i) {
str->appendScalar(fK[i]);
- if (i < 3) {
- str->append(" ");
- }
+ str->append(" ");
}
+ str->appendS32(fEnforcePMColor ? 1 : 0);
}
#endif
@@ -198,7 +204,8 @@ static int32_t toDot8(SkScalar x) {
#endif
SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2,
- SkScalar k3, SkScalar k4) {
+ SkScalar k3, SkScalar k4,
+ bool enforcePMColor) {
if (fitsInBits(k1, 8) && fitsInBits(k2, 16) &&
fitsInBits(k2, 16) && fitsInBits(k2, 24)) {
@@ -219,7 +226,7 @@ SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2,
return SkNEW_ARGS(SkArithmeticMode_linear, (i2, i3, i4));
#endif
}
- return SkArithmeticMode_scalar::Create(k1, k2, k3, k4);
+ return SkArithmeticMode_scalar::Create(k1, k2, k3, k4, enforcePMColor);
}
@@ -242,8 +249,11 @@ public:
virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
+ static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps);
+
private:
GrGLUniformManager::UniformHandle fKUni;
+ bool fEnforcePMColor;
typedef GrGLEffect INHERITED;
};
@@ -252,8 +262,10 @@ private:
class GrArithmeticEffect : public GrEffect {
public:
- static GrEffectRef* Create(float k1, float k2, float k3, float k4, GrTexture* background) {
- AutoEffectUnref effect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, background)));
+ static GrEffectRef* Create(float k1, float k2, float k3, float k4, bool enforcePMColor,
+ GrTexture* background) {
+ AutoEffectUnref effect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, enforcePMColor,
+ background)));
return CreateEffectRef(effect);
}
@@ -271,12 +283,15 @@ public:
float k2() const { return fK2; }
float k3() const { return fK3; }
float k4() const { return fK4; }
+ bool enforcePMColor() const { return fEnforcePMColor; }
private:
virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
- GrArithmeticEffect(float k1, float k2, float k3, float k4, GrTexture* background);
+ GrArithmeticEffect(float k1, float k2, float k3, float k4, bool enforcePMColor,
+ GrTexture* background);
float fK1, fK2, fK3, fK4;
+ bool fEnforcePMColor;
GrCoordTransform fBackgroundTransform;
GrTextureAccess fBackgroundAccess;
@@ -288,8 +303,8 @@ private:
///////////////////////////////////////////////////////////////////////////////
GrArithmeticEffect::GrArithmeticEffect(float k1, float k2, float k3, float k4,
- GrTexture* background)
- : fK1(k1), fK2(k2), fK3(k3), fK4(k4) {
+ bool enforcePMColor, GrTexture* background)
+ : fK1(k1), fK2(k2), fK3(k3), fK4(k4), fEnforcePMColor(enforcePMColor) {
if (background) {
fBackgroundTransform.reset(kLocal_GrCoordSet, background);
this->addCoordTransform(&fBackgroundTransform);
@@ -309,6 +324,7 @@ bool GrArithmeticEffect::onIsEqual(const GrEffect& sBase) const {
fK2 == s.fK2 &&
fK3 == s.fK3 &&
fK4 == s.fK4 &&
+ fEnforcePMColor == s.fEnforcePMColor &&
backgroundTexture() == s.backgroundTexture();
}
@@ -325,7 +341,8 @@ void GrArithmeticEffect::getConstantColorComponents(GrColor* color, uint32_t* va
GrGLArithmeticEffect::GrGLArithmeticEffect(const GrBackendEffectFactory& factory,
const GrDrawEffect& drawEffect)
- : INHERITED(factory) {
+ : INHERITED(factory),
+ fEnforcePMColor(true) {
}
GrGLArithmeticEffect::~GrGLArithmeticEffect() {
@@ -374,7 +391,7 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
if (gUseUnpremul) {
builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
- } else {
+ } else if (fEnforcePMColor) {
builder->fsCodeAppendf("\t\t%s.rgb = min(%s.rgb, %s.a);\n", outputColor, outputColor, outputColor);
}
}
@@ -382,6 +399,17 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
void GrGLArithmeticEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) {
const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>();
uman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4());
+ fEnforcePMColor = arith.enforcePMColor();
+}
+
+GrGLEffect::EffectKey GrGLArithmeticEffect::GenKey(const GrDrawEffect& drawEffect,
+ const GrGLCaps&) {
+ const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>();
+ EffectKey key = arith.enforcePMColor() ? 1 : 0;
+ if (arith.backgroundTexture()) {
+ key |= 2;
+ }
+ return key;
}
GrEffectRef* GrArithmeticEffect::TestCreate(SkRandom* rand,
@@ -392,8 +420,10 @@ GrEffectRef* GrArithmeticEffect::TestCreate(SkRandom* rand,
float k2 = rand->nextF();
float k3 = rand->nextF();
float k4 = rand->nextF();
+ bool enforcePMColor = rand->nextBool();
- AutoEffectUnref gEffect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, NULL)));
+ AutoEffectUnref gEffect(SkNEW_ARGS(GrArithmeticEffect,
+ (k1, k2, k3, k4, enforcePMColor, NULL)));
return CreateEffectRef(gEffect);
}
@@ -405,6 +435,7 @@ bool SkArithmeticMode_scalar::asNewEffect(GrEffectRef** effect, GrTexture* backg
SkScalarToFloat(fK[1]),
SkScalarToFloat(fK[2]),
SkScalarToFloat(fK[3]),
+ fEnforcePMColor,
background);
}
return true;
« no previous file with comments | « include/effects/SkArithmeticMode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698