| Index: src/core/SkXfermode.cpp
|
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
|
| index e50e4f5ce58179cacbea609785d69a27bea8cb4f..675cc5e2e69be50b17e2cf65e4ba240f601d9b98 100644
|
| --- a/src/core/SkXfermode.cpp
|
| +++ b/src/core/SkXfermode.cpp
|
| @@ -12,6 +12,7 @@
|
| #include "SkFlattenableBuffers.h"
|
| #include "SkMathPriv.h"
|
| #include "SkString.h"
|
| +#include "SkXfermode_proccoeff.h"
|
|
|
| SK_DEFINE_INST_COUNT(SkXfermode)
|
|
|
| @@ -631,16 +632,7 @@ static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
|
| return SkPackARGB32(a, r, g, b);
|
| }
|
|
|
| -
|
| -struct ProcCoeff {
|
| - SkXfermodeProc fProc;
|
| - SkXfermode::Coeff fSC;
|
| - SkXfermode::Coeff fDC;
|
| -};
|
| -
|
| -#define CANNOT_USE_COEFF SkXfermode::Coeff(-1)
|
| -
|
| -static const ProcCoeff gProcCoeffs[] = {
|
| +const ProcCoeff gProcCoeffs[] = {
|
| { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff },
|
| { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff },
|
| { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff },
|
| @@ -1352,83 +1344,6 @@ GrEffectRef* XferEffect::TestCreate(SkRandom* rand,
|
| ///////////////////////////////////////////////////////////////////////////////
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -class SkProcCoeffXfermode : public SkProcXfermode {
|
| -public:
|
| - SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode)
|
| - : INHERITED(rec.fProc) {
|
| - fMode = mode;
|
| - // these may be valid, or may be CANNOT_USE_COEFF
|
| - fSrcCoeff = rec.fSC;
|
| - fDstCoeff = rec.fDC;
|
| - }
|
| -
|
| - virtual bool asMode(Mode* mode) const SK_OVERRIDE {
|
| - if (mode) {
|
| - *mode = fMode;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - virtual bool asCoeff(Coeff* sc, Coeff* dc) const SK_OVERRIDE {
|
| - if (CANNOT_USE_COEFF == fSrcCoeff) {
|
| - return false;
|
| - }
|
| -
|
| - if (sc) {
|
| - *sc = fSrcCoeff;
|
| - }
|
| - if (dc) {
|
| - *dc = fDstCoeff;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| -#if SK_SUPPORT_GPU
|
| - virtual bool asNewEffectOrCoeff(GrContext*,
|
| - GrEffectRef** effect,
|
| - Coeff* src,
|
| - Coeff* dst,
|
| - GrTexture* background) const SK_OVERRIDE {
|
| - if (this->asCoeff(src, dst)) {
|
| - return true;
|
| - }
|
| - if (XferEffect::IsSupportedMode(fMode)) {
|
| - if (NULL != effect) {
|
| - *effect = XferEffect::Create(fMode, background);
|
| - SkASSERT(NULL != *effect);
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -#endif
|
| -
|
| - SK_DEVELOPER_TO_STRING()
|
| - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
|
| -
|
| -protected:
|
| - SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
|
| - fMode = (SkXfermode::Mode)buffer.read32();
|
| -
|
| - const ProcCoeff& rec = gProcCoeffs[fMode];
|
| - // 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);
|
| - }
|
| -
|
| - virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
|
| - this->INHERITED::flatten(buffer);
|
| - buffer.write32(fMode);
|
| - }
|
| -
|
| -private:
|
| - Mode fMode;
|
| - Coeff fSrcCoeff, fDstCoeff;
|
| -
|
| - typedef SkProcXfermode INHERITED;
|
| -};
|
|
|
| const char* SkXfermode::ModeName(Mode mode) {
|
| SkASSERT((unsigned) mode <= (unsigned)kLastMode);
|
| @@ -1688,12 +1603,20 @@ void SkDstOutXfermode::toString(SkString* str) const {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +extern SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec, SkXfermode::Mode mode);
|
| +
|
| SkXfermode* SkXfermode::Create(Mode mode) {
|
| SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
|
| SkASSERT((unsigned)mode < kModeCount);
|
|
|
| const ProcCoeff& rec = gProcCoeffs[mode];
|
|
|
| + // check if we have a platform optim for that
|
| + SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode);
|
| + if (xfm != NULL) {
|
| + return xfm;
|
| + }
|
| +
|
| switch (mode) {
|
| case kClear_Mode:
|
| return SkNEW_ARGS(SkClearXfermode, (rec));
|
|
|