| Index: src/core/SkXfermode.cpp
|
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
|
| index ac5cee4e3592954ba4b8c34e558652fba054934d..922b0c087758eeb09abcb94f3de5d90995344072 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)
|
|
|
| @@ -1375,6 +1376,8 @@ GrEffectRef* XferEffect::TestCreate(SkRandom* rand,
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkProcCoeffXfermode : public SkProcXfermode {
|
| + typedef SkProcXfermode INHERITED;
|
| +
|
| public:
|
| SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode)
|
| : INHERITED(rec.fProc) {
|
| @@ -1438,6 +1441,10 @@ protected:
|
| fDstCoeff = rec.fDC;
|
| // now update our function-ptr in the super class
|
| this->INHERITED::setProc(rec.fProc);
|
| +
|
| + buffer.validate(SkIsValidMode(fMode) &&
|
| + SkIsValidCoeff(fSrcCoeff) &&
|
| + SkIsValidCoeff(fDstCoeff));
|
| }
|
|
|
| virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
|
| @@ -1448,8 +1455,6 @@ protected:
|
| private:
|
| Mode fMode;
|
| Coeff fSrcCoeff, fDstCoeff;
|
| -
|
| - typedef SkProcXfermode INHERITED;
|
| };
|
|
|
| const char* SkXfermode::ModeName(Mode mode) {
|
| @@ -1495,6 +1500,8 @@ void SkProcCoeffXfermode::toString(SkString* str) const {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkClearXfermode : public SkProcCoeffXfermode {
|
| + typedef SkProcCoeffXfermode INHERITED;
|
| +
|
| public:
|
| SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode) {}
|
|
|
| @@ -1507,8 +1514,6 @@ public:
|
| private:
|
| SkClearXfermode(SkFlattenableReadBuffer& buffer)
|
| : SkProcCoeffXfermode(buffer) {}
|
| -
|
| - typedef SkProcCoeffXfermode INHERITED;
|
| };
|
|
|
| void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| @@ -1557,6 +1562,8 @@ void SkClearXfermode::toString(SkString* str) const {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkSrcXfermode : public SkProcCoeffXfermode {
|
| + typedef SkProcCoeffXfermode INHERITED;
|
| +
|
| public:
|
| SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {}
|
|
|
| @@ -1569,8 +1576,6 @@ public:
|
| private:
|
| SkSrcXfermode(SkFlattenableReadBuffer& buffer)
|
| : SkProcCoeffXfermode(buffer) {}
|
| -
|
| - typedef SkProcCoeffXfermode INHERITED;
|
| };
|
|
|
| void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| @@ -1624,6 +1629,8 @@ void SkSrcXfermode::toString(SkString* str) const {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkDstInXfermode : public SkProcCoeffXfermode {
|
| + typedef SkProcCoeffXfermode INHERITED;
|
| +
|
| public:
|
| SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode) {}
|
|
|
| @@ -1634,8 +1641,6 @@ public:
|
|
|
| private:
|
| SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
|
| -
|
| - typedef SkProcCoeffXfermode INHERITED;
|
| };
|
|
|
| void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| @@ -1667,6 +1672,8 @@ void SkDstInXfermode::toString(SkString* str) const {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkDstOutXfermode : public SkProcCoeffXfermode {
|
| + typedef SkProcCoeffXfermode INHERITED;
|
| +
|
| public:
|
| SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mode) {}
|
|
|
| @@ -1678,8 +1685,6 @@ public:
|
| private:
|
| SkDstOutXfermode(SkFlattenableReadBuffer& buffer)
|
| : INHERITED(buffer) {}
|
| -
|
| - typedef SkProcCoeffXfermode INHERITED;
|
| };
|
|
|
| void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
|
| @@ -1710,6 +1715,44 @@ void SkDstOutXfermode::toString(SkString* str) const {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +SkFlattenable::Factory SkProcXfermode::GetFactory(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkClearXfermode:
|
| + return SkClearXfermode::CreateProc;
|
| + case SkFlattenable::kSkDstInXfermode:
|
| + return SkDstInXfermode::CreateProc;
|
| + case SkFlattenable::kSkDstOutXfermode:
|
| + return SkDstOutXfermode::CreateProc;
|
| + case SkFlattenable::kSkProcCoeffXfermode:
|
| + return SkProcCoeffXfermode::CreateProc;
|
| + case SkFlattenable::kSkSrcXfermode:
|
| + return SkSrcXfermode::CreateProc;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +SkFlattenable::TypeCheck SkProcXfermode::GetTypeCheck(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkClearXfermode:
|
| + return SkClearXfermode::IsA;
|
| + case SkFlattenable::kSkDstInXfermode:
|
| + return SkDstInXfermode::IsA;
|
| + case SkFlattenable::kSkDstOutXfermode:
|
| + return SkDstOutXfermode::IsA;
|
| + case SkFlattenable::kSkProcCoeffXfermode:
|
| + return SkProcCoeffXfermode::IsA;
|
| + case SkFlattenable::kSkSrcXfermode:
|
| + return SkSrcXfermode::IsA;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| SkXfermode* SkXfermode::Create(Mode mode) {
|
| SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
|
| SkASSERT((unsigned)mode < kModeCount);
|
|
|