| Index: src/effects/SkArithmeticMode.cpp
|
| diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
|
| index e9dc7824bca5a1fd96c9578042bf5bc6c1393fc5..4ebce110ea5d918a486465441ad3ae0ab688c512 100644
|
| --- a/src/effects/SkArithmeticMode.cpp
|
| +++ b/src/effects/SkArithmeticMode.cpp
|
| @@ -95,44 +95,55 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[],
|
| if ((NULL == aaCoverage) || aaCoverage[i]) {
|
| SkPMColor sc = src[i];
|
| SkPMColor dc = dst[i];
|
| - int sa = SkGetPackedA32(sc);
|
| - int da = SkGetPackedA32(dc);
|
| -
|
| - int srcNeedsUnpremul = needsUnpremul(sa);
|
| - int dstNeedsUnpremul = needsUnpremul(da);
|
|
|
| int a, r, g, b;
|
|
|
| - if (!srcNeedsUnpremul && !dstNeedsUnpremul) {
|
| - a = arith(k1, k2, k3, k4, sa, da);
|
| + if (false) {
|
| + int sa = SkGetPackedA32(sc);
|
| + int da = SkGetPackedA32(dc);
|
| +
|
| + int srcNeedsUnpremul = needsUnpremul(sa);
|
| + int dstNeedsUnpremul = needsUnpremul(da);
|
| +
|
| + if (!srcNeedsUnpremul && !dstNeedsUnpremul) {
|
| + a = arith(k1, k2, k3, k4, sa, da);
|
| + r = arith(k1, k2, k3, k4, SkGetPackedR32(sc), SkGetPackedR32(dc));
|
| + g = arith(k1, k2, k3, k4, SkGetPackedG32(sc), SkGetPackedG32(dc));
|
| + b = arith(k1, k2, k3, k4, SkGetPackedB32(sc), SkGetPackedB32(dc));
|
| + } else {
|
| + int sr = SkGetPackedR32(sc);
|
| + int sg = SkGetPackedG32(sc);
|
| + int sb = SkGetPackedB32(sc);
|
| + if (srcNeedsUnpremul) {
|
| + SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(sa);
|
| + sr = SkUnPreMultiply::ApplyScale(scale, sr);
|
| + sg = SkUnPreMultiply::ApplyScale(scale, sg);
|
| + sb = SkUnPreMultiply::ApplyScale(scale, sb);
|
| + }
|
| +
|
| + int dr = SkGetPackedR32(dc);
|
| + int dg = SkGetPackedG32(dc);
|
| + int db = SkGetPackedB32(dc);
|
| + if (dstNeedsUnpremul) {
|
| + SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(da);
|
| + dr = SkUnPreMultiply::ApplyScale(scale, dr);
|
| + dg = SkUnPreMultiply::ApplyScale(scale, dg);
|
| + db = SkUnPreMultiply::ApplyScale(scale, db);
|
| + }
|
| +
|
| + a = arith(k1, k2, k3, k4, sa, da);
|
| + r = arith(k1, k2, k3, k4, sr, dr);
|
| + g = arith(k1, k2, k3, k4, sg, dg);
|
| + b = arith(k1, k2, k3, k4, sb, db);
|
| + }
|
| + } 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));
|
| - } else {
|
| - int sr = SkGetPackedR32(sc);
|
| - int sg = SkGetPackedG32(sc);
|
| - int sb = SkGetPackedB32(sc);
|
| - if (srcNeedsUnpremul) {
|
| - SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(sa);
|
| - sr = SkUnPreMultiply::ApplyScale(scale, sr);
|
| - sg = SkUnPreMultiply::ApplyScale(scale, sg);
|
| - sb = SkUnPreMultiply::ApplyScale(scale, sb);
|
| - }
|
| -
|
| - int dr = SkGetPackedR32(dc);
|
| - int dg = SkGetPackedG32(dc);
|
| - int db = SkGetPackedB32(dc);
|
| - if (dstNeedsUnpremul) {
|
| - SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(da);
|
| - dr = SkUnPreMultiply::ApplyScale(scale, dr);
|
| - dg = SkUnPreMultiply::ApplyScale(scale, dg);
|
| - db = SkUnPreMultiply::ApplyScale(scale, db);
|
| - }
|
| -
|
| - a = arith(k1, k2, k3, k4, sa, da);
|
| - r = arith(k1, k2, k3, k4, sr, dr);
|
| - g = arith(k1, k2, k3, k4, sg, dg);
|
| - b = arith(k1, k2, k3, k4, sb, db);
|
| + b = SkMin32(b, a);
|
| }
|
|
|
| // apply antialias coverage if necessary
|
| @@ -145,7 +156,7 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[],
|
| }
|
|
|
| // turn the result back into premul
|
| - if (0xFF != a) {
|
| + if (false /* 0xFF != a */) {
|
| int scale = a + (a >> 7);
|
| r = SkAlphaMul(r, scale);
|
| g = SkAlphaMul(g, scale);
|
| @@ -361,15 +372,23 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
|
| builder->fsCodeAppendf("\t\tconst vec4 src = %s;\n", GrGLSLOnesVecf(4));
|
| } else {
|
| builder->fsCodeAppendf("\t\tvec4 src = %s;\n", inputColor);
|
| - builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
|
| + if (false) {
|
| + builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
|
| + }
|
| }
|
|
|
| builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
|
| - builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\n");
|
| + if (false) {
|
| + builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\n");
|
| + }
|
|
|
| builder->fsCodeAppendf("\t\t%s = %s.x * src * dst + %s.y * src + %s.z * dst + %s.w;\n", outputColor, kUni, kUni, kUni, kUni);
|
| builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
|
| - builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
|
| + if (false) {
|
| + builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
|
| + } else {
|
| + builder->fsCodeAppendf("\t\t%s.rgb = min(%s.rgb, %s.a);\n", outputColor, outputColor, outputColor);
|
| + }
|
| }
|
|
|
| void GrGLArithmeticEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) {
|
|
|