Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(908)

Unified Diff: src/core/SkXfermode.cpp

Issue 23021015: Initial error handling code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: New serialization method Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698