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
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index a22035e..3cb0370 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -1343,6 +1343,22 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
+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 df2b974..205edf2 100644
--- a/src/core/SkXfermode_proccoeff.h
+++ b/src/core/SkXfermode_proccoeff.h
@@ -12,8 +12,6 @@
 
 #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 @@
     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;