| Index: src/core/SkXfermode.cpp
|
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
|
| index e50e4f5ce58179cacbea609785d69a27bea8cb4f..7c8c1259a3fa0aa0108b846dc95a80d4b73892d7 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 "SkValidationUtils.h"
|
|
|
| SK_DEFINE_INST_COUNT(SkXfermode)
|
|
|
| @@ -1409,13 +1410,20 @@ public:
|
| 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);
|
| + bool modeIsValid = SkIsValidMode(fMode);
|
| + if (modeIsValid) {
|
| + 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);
|
| + } else {
|
| + fSrcCoeff = fDstCoeff = CANNOT_USE_COEFF;
|
| + }
|
| + buffer.validate(modeIsValid &&
|
| + (SkIsValidCoeff(fSrcCoeff) || (fSrcCoeff == CANNOT_USE_COEFF)) &&
|
| + (SkIsValidCoeff(fDstCoeff) || (fDstCoeff == CANNOT_USE_COEFF)));
|
| }
|
|
|
| virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
|
| @@ -1688,6 +1696,44 @@ void SkDstOutXfermode::toString(SkString* str) const {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +SkFlattenable::Factory SkProcXfermode::GetFactory(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkClearXfermode_Type:
|
| + return SkClearXfermode::CreateProc;
|
| + case SkFlattenable::kSkDstInXfermode_Type:
|
| + return SkDstInXfermode::CreateProc;
|
| + case SkFlattenable::kSkDstOutXfermode_Type:
|
| + return SkDstOutXfermode::CreateProc;
|
| + case SkFlattenable::kSkProcCoeffXfermode_Type:
|
| + return SkProcCoeffXfermode::CreateProc;
|
| + case SkFlattenable::kSkSrcXfermode_Type:
|
| + return SkSrcXfermode::CreateProc;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +SkFlattenable::TypeCheck SkProcXfermode::GetTypeCheck(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkClearXfermode_Type:
|
| + return SkClearXfermode::IsA;
|
| + case SkFlattenable::kSkDstInXfermode_Type:
|
| + return SkDstInXfermode::IsA;
|
| + case SkFlattenable::kSkDstOutXfermode_Type:
|
| + return SkDstOutXfermode::IsA;
|
| + case SkFlattenable::kSkProcCoeffXfermode_Type:
|
| + return SkProcCoeffXfermode::IsA;
|
| + case SkFlattenable::kSkSrcXfermode_Type:
|
| + return SkSrcXfermode::IsA;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| SkXfermode* SkXfermode::Create(Mode mode) {
|
| SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
|
| SkASSERT((unsigned)mode < kModeCount);
|
|
|