| Index: src/core/SkComposeShader.cpp
|
| diff --git a/src/core/SkComposeShader.cpp b/src/core/SkComposeShader.cpp
|
| index df8215c1a223b5449a3b26edf93214faf4978b6a..28511e3e8b4ebc2d8ca7d911dd7dc7432d6d5c5d 100644
|
| --- a/src/core/SkComposeShader.cpp
|
| +++ b/src/core/SkComposeShader.cpp
|
| @@ -100,20 +100,23 @@ SkShader::Context* SkComposeShader::createContext(const ContextRec& rec, void* s
|
| return NULL;
|
| }
|
|
|
| - // TODO : must fix this to not "cheat" and modify fPaint
|
| - SkAutoAlphaRestore restore(const_cast<SkPaint*>(rec.fPaint), 0xFF);
|
| -
|
| char* aStorage = (char*) storage + sizeof(ComposeShaderContext);
|
| char* bStorage = aStorage + fShaderA->contextSize();
|
|
|
| // we preconcat our localMatrix (if any) with the device matrix
|
| // before calling our sub-shaders
|
| -
|
| SkMatrix tmpM;
|
| tmpM.setConcat(*rec.fMatrix, this->getLocalMatrix());
|
|
|
| + // Our sub-shaders need to see opaque, so by combining them we don't double-alphatize the
|
| + // result. ComposeShader itself will respect the alpha, and post-apply it after calling the
|
| + // sub-shaders.
|
| + SkPaint opaquePaint(*rec.fPaint);
|
| + opaquePaint.setAlpha(0xFF);
|
| +
|
| ContextRec newRec(rec);
|
| newRec.fMatrix = &tmpM;
|
| + newRec.fPaint = &opaquePaint;
|
|
|
| SkShader::Context* contextA = fShaderA->createContext(newRec, aStorage);
|
| SkShader::Context* contextB = fShaderB->createContext(newRec, bStorage);
|
| @@ -148,6 +151,10 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re
|
| SkXfermode* mode = static_cast<const SkComposeShader&>(fShader).fMode;
|
| unsigned scale = SkAlpha255To256(this->getPaintAlpha());
|
|
|
| +#ifdef SK_BUILD_FOR_ANDROID
|
| + scale = 256; // ugh -- maintain old bug/behavior for now
|
| +#endif
|
| +
|
| SkPMColor tmp[TMP_COLOR_COUNT];
|
|
|
| if (NULL == mode) { // implied SRC_OVER
|
| @@ -188,7 +195,7 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re
|
| shaderContextB->shadeSpan(x, y, tmp, n);
|
| mode->xfer32(result, tmp, n, NULL);
|
|
|
| - if (256 == scale) {
|
| + if (256 != scale) {
|
| for (int i = 0; i < n; i++) {
|
| result[i] = SkAlphaMulQ(result[i], scale);
|
| }
|
|
|