| Index: src/core/SkXfermode.cpp
|
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
|
| index 32a544c2af3f02914199035af32dcb31174d1ed0..fb1726808fe55a39e3adb3a6aabc1b44cbd0bdb4 100644
|
| --- a/src/core/SkXfermode.cpp
|
| +++ b/src/core/SkXfermode.cpp
|
| @@ -775,6 +775,7 @@ void SkXfermode::xferA8(SkAlpha* SK_RESTRICT dst,
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| +#ifdef SK_SUPPORT_LEGACY_PROCXFERMODE
|
|
|
| void SkProcXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| const SkPMColor* SK_RESTRICT src, int count,
|
| @@ -884,6 +885,7 @@ void SkProcXfermode::toString(SkString* str) const {
|
| }
|
| #endif
|
|
|
| +#endif
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| #if SK_SUPPORT_GPU
|
| @@ -1358,11 +1360,10 @@ SkProcCoeffXfermode::SkProcCoeffXfermode(SkReadBuffer& buffer) : INHERITED(buffe
|
| fMode = (SkXfermode::Mode)mode32;
|
|
|
| const ProcCoeff& rec = gProcCoeffs[fMode];
|
| + fProc = rec.fProc;
|
| // these may be valid, or may be CANNOT_USE_COEFF
|
| fSrcCoeff = rec.fSC;
|
| fDstCoeff = rec.fDC;
|
| - // now update our function-ptr in the super class
|
| - this->INHERITED::setProc(rec.fProc);
|
| }
|
|
|
| bool SkProcCoeffXfermode::asMode(Mode* mode) const {
|
| @@ -1386,6 +1387,93 @@ bool SkProcCoeffXfermode::asCoeff(Coeff* sc, Coeff* dc) const {
|
| return true;
|
| }
|
|
|
| +void SkProcCoeffXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| + const SkPMColor* SK_RESTRICT src, int count,
|
| + const SkAlpha* SK_RESTRICT aa) const {
|
| + SkASSERT(dst && src && count >= 0);
|
| +
|
| + SkXfermodeProc proc = fProc;
|
| +
|
| + if (NULL != proc) {
|
| + if (NULL == aa) {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + dst[i] = proc(src[i], dst[i]);
|
| + }
|
| + } else {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + unsigned a = aa[i];
|
| + if (0 != a) {
|
| + SkPMColor dstC = dst[i];
|
| + SkPMColor C = proc(src[i], dstC);
|
| + if (a != 0xFF) {
|
| + C = SkFourByteInterp(C, dstC, a);
|
| + }
|
| + dst[i] = C;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +void SkProcCoeffXfermode::xfer16(uint16_t* SK_RESTRICT dst,
|
| + const SkPMColor* SK_RESTRICT src, int count,
|
| + const SkAlpha* SK_RESTRICT aa) const {
|
| + SkASSERT(dst && src && count >= 0);
|
| +
|
| + SkXfermodeProc proc = fProc;
|
| +
|
| + if (NULL != proc) {
|
| + if (NULL == aa) {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
|
| + dst[i] = SkPixel32ToPixel16_ToU16(proc(src[i], dstC));
|
| + }
|
| + } else {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + unsigned a = aa[i];
|
| + if (0 != a) {
|
| + SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
|
| + SkPMColor C = proc(src[i], dstC);
|
| + if (0xFF != a) {
|
| + C = SkFourByteInterp(C, dstC, a);
|
| + }
|
| + dst[i] = SkPixel32ToPixel16_ToU16(C);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +void SkProcCoeffXfermode::xferA8(SkAlpha* SK_RESTRICT dst,
|
| + const SkPMColor* SK_RESTRICT src, int count,
|
| + const SkAlpha* SK_RESTRICT aa) const {
|
| + SkASSERT(dst && src && count >= 0);
|
| +
|
| + SkXfermodeProc proc = fProc;
|
| +
|
| + if (NULL != proc) {
|
| + if (NULL == aa) {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + SkPMColor res = proc(src[i], dst[i] << SK_A32_SHIFT);
|
| + dst[i] = SkToU8(SkGetPackedA32(res));
|
| + }
|
| + } else {
|
| + for (int i = count - 1; i >= 0; --i) {
|
| + unsigned a = aa[i];
|
| + if (0 != a) {
|
| + SkAlpha dstA = dst[i];
|
| + SkPMColor res = proc(src[i], dstA << SK_A32_SHIFT);
|
| + unsigned A = SkGetPackedA32(res);
|
| + if (0xFF != a) {
|
| + A = SkAlphaBlend(A, dstA, SkAlpha255To256(a));
|
| + }
|
| + dst[i] = SkToU8(A);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| #if SK_SUPPORT_GPU
|
| bool SkProcCoeffXfermode::asNewEffect(GrEffectRef** effect,
|
| GrTexture* background) const {
|
|
|