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); |