diff options
-rw-r--r-- | src/core/SkXfermode.cpp | 16 | ||||
-rw-r--r-- | src/core/SkXfermode_proccoeff.h | 13 |
2 files changed, 17 insertions, 12 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; diff --git a/src/core/SkXfermode_proccoeff.h b/src/core/SkXfermode_proccoeff.h index df2b974338..205edf2fa0 100644 --- a/src/core/SkXfermode_proccoeff.h +++ b/src/core/SkXfermode_proccoeff.h @@ -12,8 +12,6 @@ struct ProcCoeff { #define CANNOT_USE_COEFF SkXfermode::Coeff(-1) -extern const ProcCoeff gProcCoeffs[]; - class SkProcCoeffXfermode : public SkProcXfermode { public: SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) @@ -37,16 +35,7 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) 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); - } + SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer); virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE; |