aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkXfermode.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-11-21 21:05:06 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-11-21 21:05:06 +0000
commit52314f82ba8696e957e70eabde672b6470fedf7a (patch)
tree79358e7189c883eb02e6aa32824232b8a0ea3554 /src/core/SkXfermode.cpp
parent56d11f6a2f78d29423c666ed3b9b367ecf6f1288 (diff)
move SkProcCoeffXfermode unflatten constructor into .cpp, and range-check its mode
BUG= Review URL: https://codereview.chromium.org/79543009 git-svn-id: http://skia.googlecode.com/svn/trunk@12355 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkXfermode.cpp')
-rw-r--r--src/core/SkXfermode.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index a22035e804..3cb03703bb 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -1343,6 +1343,22 @@ GrEffectRef* XferEffect::TestCreate(SkRandom* rand,
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
+SkProcCoeffXfermode::SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+ uint32_t mode32 = buffer.read32() % SK_ARRAY_COUNT(gProcCoeffs);
+ if (mode32 >= SK_ARRAY_COUNT(gProcCoeffs)) {
+ // out of range, just set to something harmless
+ mode32 = SkXfermode::kSrcOut_Mode;
+ }
+ fMode = (SkXfermode::Mode)mode32;
+
+ 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 SkProcCoeffXfermode::asMode(Mode* mode) const {
if (mode) {
*mode = fMode;