diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 06b97a9..90cf13a 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -98,7 +98,7 @@
     return dst;
 }
 
-//  kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc] 
+//  kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc]
 static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) {
 #if 0
     // this is the old, more-correct way, but it doesn't guarantee that dst==255
@@ -335,7 +335,7 @@
     if (0 == dst) {
         return src;
     }
-    
+
     int sa = SkGetPackedA32(src);
     int da = SkGetPackedA32(dst);
     int a = srcover_byte(sa, da);
@@ -531,7 +531,7 @@
                           const SK_RESTRICT SkAlpha aa[])
 {
     SkASSERT(dst && src && count >= 0);
-    
+
     if (NULL == aa) {
         for (int i = count - 1; i >= 0; --i) {
             SkPMColor dstC = SkPixel4444ToPixel32(dst[i]);
@@ -642,7 +642,7 @@
                               const SK_RESTRICT SkPMColor src[], int count,
                               const SK_RESTRICT SkAlpha aa[]) {
     SkASSERT(dst && src && count >= 0);
-    
+
     SkXfermodeProc proc = fProc;
 
     if (NULL != proc) {
@@ -739,7 +739,7 @@
         }
         return true;
     }
-    
+
     virtual Factory getFactory() { return CreateProc; }
     virtual void flatten(SkFlattenableWriteBuffer& buffer) {
         this->INHERITED::flatten(buffer);
@@ -748,6 +748,10 @@
         buffer.write32(fDstCoeff);
     }
 
+    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+        return SkNEW_ARGS(SkProcCoeffXfermode, (buffer));
+    }
+
 protected:
     SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer)
             : INHERITED(buffer) {
@@ -755,13 +759,11 @@
         fSrcCoeff = (Coeff)buffer.readU32();
         fDstCoeff = (Coeff)buffer.readU32();
     }
-    
+
 private:
     Mode    fMode;
     Coeff   fSrcCoeff, fDstCoeff;
-    
-    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
-    return SkNEW_ARGS(SkProcCoeffXfermode, (buffer)); }
+
 
     typedef SkProcXfermode INHERITED;
 };
@@ -808,16 +810,17 @@
             }
         }
     }
-    
+
     virtual Factory getFactory() { return CreateProc; }
 
+    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+        return SkNEW_ARGS(SkClearXfermode, (buffer));
+    }
+
 private:
     SkClearXfermode(SkFlattenableReadBuffer& buffer)
         : SkProcCoeffXfermode(buffer) {}
-    
-    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
-        return SkNEW_ARGS(SkClearXfermode, (buffer));
-    }
+
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -868,34 +871,35 @@
             }
         }
     }
-    
+
     virtual Factory getFactory() { return CreateProc; }
 
+    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+        return SkNEW_ARGS(SkSrcXfermode, (buffer));
+    }
+
 private:
     SkSrcXfermode(SkFlattenableReadBuffer& buffer)
         : SkProcCoeffXfermode(buffer) {}
-    
-    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
-        return SkNEW_ARGS(SkSrcXfermode, (buffer));
-    }
+
 };
 
 class SkDstInXfermode : public SkProcCoeffXfermode {
 public:
     SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode) {}
-    
+
     virtual void xfer32(SK_RESTRICT SkPMColor dst[],
                         const SK_RESTRICT SkPMColor src[], int count,
                         const SK_RESTRICT SkAlpha aa[]) {
         SkASSERT(dst && src);
-        
+
         if (count <= 0) {
             return;
         }
         if (NULL != aa) {
             return this->INHERITED::xfer32(dst, src, count, aa);
         }
-        
+
         do {
             unsigned a = SkGetPackedA32(*src);
             *dst = SkAlphaMulQ(*dst, SkAlpha255To256(a));
@@ -903,35 +907,35 @@
             src++;
         } while (--count != 0);
     }
-    
+
     virtual Factory getFactory() { return CreateProc; }
-    
-private:
-    SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
-    
+
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkDstInXfermode, (buffer));
     }
-    
+
+private:
+    SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
+
     typedef SkProcCoeffXfermode INHERITED;
 };
 
 class SkDstOutXfermode : public SkProcCoeffXfermode {
 public:
     SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mode) {}
-    
+
     virtual void xfer32(SK_RESTRICT SkPMColor dst[],
                         const SK_RESTRICT SkPMColor src[], int count,
                         const SK_RESTRICT SkAlpha aa[]) {
         SkASSERT(dst && src);
-        
+
         if (count <= 0) {
             return;
         }
         if (NULL != aa) {
             return this->INHERITED::xfer32(dst, src, count, aa);
         }
-        
+
         do {
             unsigned a = SkGetPackedA32(*src);
             *dst = SkAlphaMulQ(*dst, SkAlpha255To256(255 - a));
@@ -939,17 +943,17 @@
             src++;
         } while (--count != 0);
     }
-    
+
     virtual Factory getFactory() { return CreateProc; }
-    
-private:
-    SkDstOutXfermode(SkFlattenableReadBuffer& buffer)
-        : INHERITED(buffer) {}
-    
+
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkDstOutXfermode, (buffer));
     }
-    
+
+private:
+    SkDstOutXfermode(SkFlattenableReadBuffer& buffer)
+        : INHERITED(buffer) {}
+
     typedef SkProcCoeffXfermode INHERITED;
 };
 
@@ -987,18 +991,18 @@
 
 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) {
     SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
-    
+
     if ((unsigned)mode >= (unsigned)kModeCount) {
         // illegal mode parameter
         return false;
     }
-    
+
     const ProcCoeff& rec = gProcCoeffs[mode];
-    
+
     if (CANNOT_USE_COEFF == rec.fSC) {
         return false;
     }
-    
+
     SkASSERT(CANNOT_USE_COEFF != rec.fDC);
     if (src) {
         *src = rec.fSC;
@@ -1080,7 +1084,7 @@
 
 static uint16_t srcatop_modeproc16(SkPMColor src, uint16_t dst) {
     unsigned isa = 255 - SkGetPackedA32(src);
-    
+
     return SkPackRGB16(
            SkPacked32ToR16(src) + SkAlphaMulAlpha(SkGetPackedR16(dst), isa),
            SkPacked32ToG16(src) + SkAlphaMulAlpha(SkGetPackedG16(dst), isa),
@@ -1194,3 +1198,18 @@
     return proc16;
 }
 
+static SkFlattenable::Registrar
+    gSkProcCoeffXfermodeReg("SkProcCoeffXfermode",
+                            SkProcCoeffXfermode::CreateProc);
+
+static SkFlattenable::Registrar
+    gSkClearXfermodeReg("SkClearXfermode", SkClearXfermode::CreateProc);
+
+static SkFlattenable::Registrar
+    gSkSrcXfermodeReg("SkSrcXfermode", SkSrcXfermode::CreateProc);
+
+static SkFlattenable::Registrar
+    gSkDstInXfermodeReg("SkDstInXfermode", SkDstInXfermode::CreateProc);
+
+static SkFlattenable::Registrar
+    gSkDstOutXfermodeReg("SkDstOutXfermode", SkDstOutXfermode::CreateProc);
diff --git a/src/effects/SkAvoidXfermode.cpp b/src/effects/SkAvoidXfermode.cpp
index 97bfeae..de3fe28 100644
--- a/src/effects/SkAvoidXfermode.cpp
+++ b/src/effects/SkAvoidXfermode.cpp
@@ -2,16 +2,16 @@
 **
 ** Copyright 2006, The Android Open Source Project
 **
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
 **
-**     http://www.apache.org/licenses/LICENSE-2.0 
+**     http://www.apache.org/licenses/LICENSE-2.0
 **
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
 
@@ -19,7 +19,7 @@
 #include "SkColorPriv.h"
 
 SkAvoidXfermode::SkAvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode)
-{    
+{
     if (tolerance > 255) {
         tolerance = 255;
     }
@@ -66,7 +66,7 @@
     unsigned dr = SkAbs32(SkGetPackedR16(c) - r);
     unsigned dg = SkAbs32(SkGetPackedG16(c) - g) >> (SK_G16_BITS - SK_R16_BITS);
     unsigned db = SkAbs32(SkGetPackedB16(c) - b);
-    
+
     return SkMax32(dr, SkMax32(dg, db));
 }
 
@@ -76,11 +76,11 @@
     SkASSERT(r <= 0xF);
     SkASSERT(g <= 0xF);
     SkASSERT(b <= 0xF);
-    
+
     unsigned dr = SkAbs32(SkGetPackedR4444(c) - r);
     unsigned dg = SkAbs32(SkGetPackedG4444(c) - g);
     unsigned db = SkAbs32(SkGetPackedB4444(c) - b);
-    
+
     return SkMax32(dr, SkMax32(dg, db));
 }
 
@@ -94,7 +94,7 @@
     unsigned dr = SkAbs32(SkGetPackedR32(c) - r);
     unsigned dg = SkAbs32(SkGetPackedG32(c) - g);
     unsigned db = SkAbs32(SkGetPackedB32(c) - b);
-    
+
     return SkMax32(dr, SkMax32(dg, db));
 }
 
@@ -128,9 +128,9 @@
     unsigned    opB = SkColorGetB(fOpColor);
     uint32_t    mul = fDistMul;
     uint32_t    sub = (fDistMul - (1 << 14)) << 8;
-    
+
     int MAX, mask;
-    
+
     if (kTargetColor_Mode == fMode) {
         mask = -1;
         MAX = 255;
@@ -138,17 +138,17 @@
         mask = 0;
         MAX = 0;
     }
-    
+
     for (int i = 0; i < count; i++) {
         int d = color_dist32(dst[i], opR, opG, opB);
         // now reverse d if we need to
         d = MAX + (d ^ mask) - mask;
         SkASSERT((unsigned)d <= 255);
         d = Accurate255To256(d);
-        
+
         d = scale_dist_14(d, mul, sub);
         SkASSERT(d <= 256);
-        
+
         if (d > 0) {
             if (NULL != aa) {
                 d = SkAlphaMul(d, Accurate255To256(*aa++));
@@ -181,7 +181,7 @@
     uint32_t    sub = (fDistMul - (1 << 14)) << SK_R16_BITS;
 
     int MAX, mask;
-    
+
     if (kTargetColor_Mode == fMode) {
         mask = -1;
         MAX = 31;
@@ -220,9 +220,9 @@
     unsigned    opB = SkColorGetB(fOpColor) >> 4;
     uint32_t    mul = fDistMul;
     uint32_t    sub = (fDistMul - (1 << 14)) << 4;
-    
+
     int MAX, mask;
-    
+
     if (kTargetColor_Mode == fMode) {
         mask = -1;
         MAX = 15;
@@ -230,7 +230,7 @@
         mask = 0;
         MAX = 0;
     }
-    
+
     for (int i = 0; i < count; i++) {
         int d = color_dist4444(dst[i], opR, opG, opB);
         // now reverse d if we need to
@@ -240,7 +240,7 @@
         d += d >> 3;
         d = scale_dist_14(d, mul, sub);
         SkASSERT(d <= 16);
-        
+
         if (d > 0) {
             if (NULL != aa) {
                 d = SkAlphaMul(d, Accurate255To256(*aa++));
@@ -258,3 +258,5 @@
     // override in subclass
 }
 
+static SkFlattenable::Registrar
+    gSkAvoidXfermodeReg("SkAvoidXfermode", SkAvoidXfermode::CreateProc);
diff --git a/src/effects/SkColorFilters.cpp b/src/effects/SkColorFilters.cpp
index 64445a9..0f8e227 100644
--- a/src/effects/SkColorFilters.cpp
+++ b/src/effects/SkColorFilters.cpp
@@ -37,7 +37,7 @@
 
         fPMColor = SkPreMultiplyColor(fColor);
     };
-    
+
     virtual bool asColorMode(SkColor* color, SkXfermode::Mode* mode) {
         if (ILLEGAL_XFERMODE_MODE == fMode) {
             return false;
@@ -58,10 +58,11 @@
 
 protected:
     virtual void flatten(SkFlattenableWriteBuffer& buffer) {
+        this->INHERITED::flatten(buffer);
         buffer.write32(fColor);
         buffer.write32(fMode);
     }
-    
+
     SkModeColorFilter(SkFlattenableReadBuffer& buffer) {
         fColor = buffer.readU32();
         fMode = (SkXfermode::Mode)buffer.readU32();
@@ -75,6 +76,8 @@
 private:
     SkColor             fColor;
     SkXfermode::Mode    fMode;
+
+    typedef SkColorFilter INHERITED;
 };
 
 class Src_SkModeColorFilter : public SkModeColorFilter {
@@ -100,17 +103,17 @@
         sk_memset16(result, SkPixel32ToPixel16(fPMColor), count);
     }
 
+    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+        return SkNEW_ARGS(Src_SkModeColorFilter, (buffer));
+    }
+
 protected:
     virtual Factory getFactory() { return CreateProc; }
 
     Src_SkModeColorFilter(SkFlattenableReadBuffer& buffer)
         : INHERITED(buffer) {}
-    
-private:
-    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
-        return SkNEW_ARGS(Src_SkModeColorFilter, (buffer));
-    }
 
+private:
     typedef SkModeColorFilter INHERITED;
 };
 
@@ -128,7 +131,7 @@
             return 0;
         }
     }
-    
+
     virtual void filterSpan(const SkPMColor shader[], int count,
                             SkPMColor result[]) {
         if (NULL == fColor32Proc) {
@@ -142,18 +145,19 @@
         SkASSERT(this->getFlags() & kHasFilter16_Flag);
         sk_memset16(result, SkPixel32ToPixel16(fPMColor), count);
     }
-        
-protected:
-    virtual Factory getFactory() { return CreateProc;  }
-    
-    SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer)
-        : INHERITED(buffer), fColor32Proc(NULL) {}
-    
-private:
+
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SrcOver_SkModeColorFilter, (buffer));
     }
-    
+
+protected:
+    virtual Factory getFactory() { return CreateProc;  }
+
+    SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer)
+        : INHERITED(buffer), fColor32Proc(NULL) {}
+
+private:
+
     SkBlitRow::ColorProc fColor32Proc;
 
     typedef SkModeColorFilter INHERITED;
@@ -167,14 +171,14 @@
         fProc = SkXfermode::GetProc(mode);
         fProc16 = SkXfermode::GetProc16(mode, color);
     }
-    
+
     Proc_SkModeColorFilter(SkColor color,
                            SkXfermodeProc proc, SkXfermodeProc16 proc16)
             : INHERITED(color, ILLEGAL_XFERMODE_MODE) {
         fProc = proc;
         fProc16 = proc16;
     }
-    
+
     virtual uint32_t getFlags() {
         return fProc16 ? (kAlphaUnchanged_Flag | kHasFilter16_Flag) : 0;
     }
@@ -188,27 +192,31 @@
             result[i] = proc(color, shader[i]);
         }
     }
-    
+
     virtual void filterSpan16(const uint16_t shader[], int count,
                               uint16_t result[]) {
         SkASSERT(this->getFlags() & kHasFilter16_Flag);
-        
+
         SkPMColor        color = fPMColor;
         SkXfermodeProc16 proc16 = fProc16;
-        
+
         for (int i = 0; i < count; i++) {
             result[i] = proc16(color, shader[i]);
         }
     }
-    
+
+    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+        return SkNEW_ARGS(Proc_SkModeColorFilter, (buffer));
+    }
+
 protected:
     virtual void flatten(SkFlattenableWriteBuffer& buffer) {
         this->INHERITED::flatten(buffer);
         buffer.writeFunctionPtr((void*)fProc);
         buffer.writeFunctionPtr((void*)fProc16);
     }
-    
-    virtual Factory getFactory() { 
+
+    virtual Factory getFactory() {
         return CreateProc;
     }
 
@@ -218,13 +226,9 @@
     }
 
 private:
-    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
-        return SkNEW_ARGS(Proc_SkModeColorFilter, (buffer));
-    }
-
     SkXfermodeProc   fProc;
     SkXfermodeProc16 fProc16;
-    
+
     typedef SkModeColorFilter INHERITED;
 };
 
@@ -267,7 +271,7 @@
             (0xFF == alpha && SkXfermode::kDstIn_Mode == mode)) {
         return NULL;
     }
-        
+
     switch (mode) {
         case SkXfermode::kSrc_Mode:
             return SkNEW_ARGS(Src_SkModeColorFilter, (color));
@@ -307,7 +311,7 @@
         unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
         unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
         unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
-        
+
         unsigned addR = SkColorGetR(fAdd);
         unsigned addG = SkColorGetG(fAdd);
         unsigned addB = SkColorGetB(fAdd);
@@ -316,7 +320,7 @@
             SkPMColor c = shader[i];
             if (c) {
                 unsigned a = SkGetPackedA32(c);
-                unsigned scaleA = SkAlpha255To256(a);                
+                unsigned scaleA = SkAlpha255To256(a);
                 unsigned r = pin(SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA), a);
                 unsigned g = pin(SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA), a);
                 unsigned b = pin(SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA), a);
@@ -328,10 +332,11 @@
 
 protected:
     virtual void flatten(SkFlattenableWriteBuffer& buffer) {
+        this->INHERITED::flatten(buffer);
         buffer.write32(fMul);
         buffer.write32(fAdd);
     }
-    
+
     virtual Factory getFactory() {
         return CreateProc;
     }
@@ -340,13 +345,15 @@
         fMul = buffer.readU32();
         fAdd = buffer.readU32();
     }
-    
+
     SkColor fMul, fAdd;
 
 private:
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkLightingColorFilter, (buffer));
     }
+
+    typedef SkColorFilter INHERITED;
 };
 
 class SkLightingColorFilter_JustAdd : public SkLightingColorFilter {
@@ -364,7 +371,7 @@
             SkPMColor c = shader[i];
             if (c) {
                 unsigned a = SkGetPackedA32(c);
-                unsigned scaleA = SkAlpha255To256(a);                
+                unsigned scaleA = SkAlpha255To256(a);
                 unsigned r = pin(SkGetPackedR32(c) + SkAlphaMul(addR, scaleA), a);
                 unsigned g = pin(SkGetPackedG32(c) + SkAlphaMul(addG, scaleA), a);
                 unsigned b = pin(SkGetPackedB32(c) + SkAlphaMul(addB, scaleA), a);
@@ -384,6 +391,7 @@
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer)  {
         return SkNEW_ARGS(SkLightingColorFilter_JustAdd, (buffer));
     }
+
     typedef SkLightingColorFilter INHERITED;
 };
 
@@ -397,7 +405,7 @@
         unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
         unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
         unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
-        
+
         for (int i = 0; i < count; i++) {
             SkPMColor c = shader[i];
             if (c) {
@@ -416,7 +424,7 @@
 
     SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer)
         : INHERITED(buffer) {}
-    
+
 private:
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkLightingColorFilter_JustMul, (buffer));
@@ -435,7 +443,7 @@
         SkASSERT(SkColorGetR(mul) == SkColorGetG(mul));
         SkASSERT(SkColorGetR(mul) == SkColorGetB(mul));
     }
-    
+
     virtual uint32_t getFlags() {
         return this->INHERITED::getFlags() | (kAlphaUnchanged_Flag | kHasFilter16_Flag);
     }
@@ -462,7 +470,7 @@
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkLightingColorFilter_SingleMul, (buffer));
     }
-    
+
     typedef SkLightingColorFilter INHERITED;
 };
 
@@ -470,22 +478,22 @@
 public:
     SkLightingColorFilter_NoPin(SkColor mul, SkColor add)
     : INHERITED(mul, add) {}
-    
+
     virtual void filterSpan(const SkPMColor shader[], int count,
                             SkPMColor result[]) {
         unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
         unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
         unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
-        
+
         unsigned addR = SkColorGetR(fAdd);
         unsigned addG = SkColorGetG(fAdd);
         unsigned addB = SkColorGetB(fAdd);
-        
+
         for (int i = 0; i < count; i++) {
             SkPMColor c = shader[i];
             if (c) {
                 unsigned a = SkGetPackedA32(c);
-                unsigned scaleA = SkAlpha255To256(a);                
+                unsigned scaleA = SkAlpha255To256(a);
                 unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA);
                 unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA);
                 unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA);
@@ -494,18 +502,18 @@
             result[i] = c;
         }
     }
-    
+
 protected:
     virtual Factory getFactory() { return CreateProc; }
-    
+
     SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer)
         : INHERITED(buffer) {}
-    
+
 private:
     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
         return SkNEW_ARGS(SkLightingColorFilter_NoPin, (buffer));
     }
-    
+
     typedef SkLightingColorFilter INHERITED;
 };
 
@@ -520,7 +528,7 @@
     }
 
     virtual void flatten(SkFlattenableWriteBuffer& buffer) {}
-    
+
     virtual Factory getFactory() {
         return CreateProc;
     }
@@ -560,3 +568,14 @@
     return SkNEW_ARGS(SkLightingColorFilter, (mul, add));
 }
 
+static SkFlattenable::Registrar
+    gSrcColorFilterReg("Src_SkModeColorFilterReg",
+                       Src_SkModeColorFilter::CreateProc);
+
+static SkFlattenable::Registrar
+    gSrcOverColorFilterReg("SrcOver_SkModeColorFilterReg",
+                       SrcOver_SkModeColorFilter::CreateProc);
+
+static SkFlattenable::Registrar
+    gProcColorFilterReg("Proc_SkModeColorFilterReg",
+                       Proc_SkModeColorFilter::CreateProc);
diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
index 07c8d2f..9270052 100644
--- a/src/effects/SkColorMatrixFilter.cpp
+++ b/src/effects/SkColorMatrixFilter.cpp
@@ -18,7 +18,7 @@
     const int32_t* SK_RESTRICT array = state->fArray;
     const int shift = state->fShift;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = rowmul4(&array[0], r, g, b, a) >> shift;
     result[1] = rowmul4(&array[5], r, g, b, a) >> shift;
     result[2] = rowmul4(&array[10], r, g, b, a) >> shift;
@@ -29,7 +29,7 @@
                       unsigned r, unsigned g, unsigned b, unsigned a) {
     const int32_t* SK_RESTRICT array = state->fArray;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = rowmul4(&array[0], r, g, b, a) >> 16;
     result[1] = rowmul4(&array[5], r, g, b, a) >> 16;
     result[2] = rowmul4(&array[10], r, g, b, a) >> 16;
@@ -41,7 +41,7 @@
     const int32_t* SK_RESTRICT array = state->fArray;
     const int shift = state->fShift;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = rowmul3(&array[0], r, g, b) >> shift;
     result[1] = rowmul3(&array[5], r, g, b) >> shift;
     result[2] = rowmul3(&array[10], r, g, b) >> shift;
@@ -52,7 +52,7 @@
                         unsigned r, unsigned g, unsigned b, unsigned a) {
     const int32_t* SK_RESTRICT array = state->fArray;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = rowmul3(&array[0], r, g, b) >> 16;
     result[1] = rowmul3(&array[5], r, g, b) >> 16;
     result[2] = rowmul3(&array[10], r, g, b) >> 16;
@@ -64,7 +64,7 @@
     const int32_t* SK_RESTRICT array = state->fArray;
     const int shift = state->fShift;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     // cast to (int) to keep the expression signed for the shift
     result[0] = (array[0] * (int)r + array[4]) >> shift;
     result[1] = (array[6] * (int)g + array[9]) >> shift;
@@ -76,7 +76,7 @@
                        unsigned r, unsigned g, unsigned b, unsigned a) {
     const int32_t* SK_RESTRICT array = state->fArray;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     // cast to (int) to keep the expression signed for the shift
     result[0] = (array[0] * (int)r + array[4]) >> 16;
     result[1] = (array[6] * (int)g + array[9]) >> 16;
@@ -89,7 +89,7 @@
     const int32_t* SK_RESTRICT array = state->fArray;
     const int shift = state->fShift;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = r + (array[4] >> shift);
     result[1] = g + (array[9] >> shift);
     result[2] = b + (array[14] >> shift);
@@ -100,7 +100,7 @@
                   unsigned r, unsigned g, unsigned b, unsigned a) {
     const int32_t* SK_RESTRICT array = state->fArray;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     result[0] = r + (array[4] >> 16);
     result[1] = g + (array[9] >> 16);
     result[2] = b + (array[14] >> 16);
@@ -117,7 +117,7 @@
         // fState is undefined, but that is OK, since we shouldn't look at it
         return;
     }
-    
+
     int32_t* SK_RESTRICT array = fState.fArray;
 
     int i;
@@ -129,7 +129,7 @@
         value = SkAbs32(value);
         max = SkMax32(max, value);
     }
-    
+
     /*  All of fArray[] values must fit in 23 bits, to safely allow me to
         multiply them by 8bit unsigned values, and get a signed answer without
         overflow. This means clz needs to be 9 or bigger
@@ -146,7 +146,7 @@
         }
         one >>= bits;
     }
-    
+
     // check if we have to munge Alpha
     int32_t changesAlpha = (array[15] | array[16] | array[17] |
                             (array[18] - one) | array[19]);
@@ -224,36 +224,36 @@
     Proc proc = fProc;
     State* state = &fState;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     if (NULL == proc) {
         if (src != dst) {
             memcpy(dst, src, count * sizeof(SkPMColor));
         }
         return;
     }
-    
+
     const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable();
 
     for (int i = 0; i < count; i++) {
         SkPMColor c = src[i];
-        
+
         unsigned r = SkGetPackedR32(c);
         unsigned g = SkGetPackedG32(c);
         unsigned b = SkGetPackedB32(c);
         unsigned a = SkGetPackedA32(c);
-        
+
         // need our components to be un-premultiplied
         if (255 != a) {
             SkUnPreMultiply::Scale scale = table[a];
             r = SkUnPreMultiply::ApplyScale(scale, r);
             g = SkUnPreMultiply::ApplyScale(scale, g);
             b = SkUnPreMultiply::ApplyScale(scale, b);
-            
+
             SkASSERT(r <= 255);
             SkASSERT(g <= 255);
             SkASSERT(b <= 255);
         }
-        
+
         proc(state, r, g, b, a);
 
         r = pin(result[0], SK_R32_MASK);
@@ -278,7 +278,7 @@
     Proc   proc = fProc;
     State* state = &fState;
     int32_t* SK_RESTRICT result = state->fResult;
-    
+
     if (NULL == proc) {
         if (src != dst) {
             memcpy(dst, src, count * sizeof(uint16_t));
@@ -288,18 +288,18 @@
 
     for (int i = 0; i < count; i++) {
         uint16_t c = src[i];
-        
+
         // expand to 8bit components (since our matrix translate is 8bit biased
         unsigned r = SkPacked16ToR32(c);
         unsigned g = SkPacked16ToG32(c);
         unsigned b = SkPacked16ToB32(c);
-        
+
         proc(state, r, g, b, 0);
-        
+
         r = pin(result[0], SK_R32_MASK);
         g = pin(result[1], SK_G32_MASK);
         b = pin(result[2], SK_B32_MASK);
-        
+
         // now packed it back down to 16bits (hmmm, could dither...)
         dst[i] = SkPack888ToRGB16(r, g, b);
     }
@@ -314,17 +314,20 @@
     buffer.writeMul4(&fState, sizeof(fState));
     buffer.write32(fFlags);
 }
-    
+
 SkFlattenable::Factory SkColorMatrixFilter::getFactory() { return CreateProc;  }
-    
+
 SkColorMatrixFilter::SkColorMatrixFilter(SkFlattenableReadBuffer& buffer)
         : INHERITED(buffer) {
     fProc = (Proc)buffer.readFunctionPtr();
     buffer.read(&fState, sizeof(fState));
     fFlags = buffer.readU32();
 }
-    
+
 SkFlattenable* SkColorMatrixFilter::CreateProc(SkFlattenableReadBuffer& buf) {
     return SkNEW_ARGS(SkColorMatrixFilter, (buf));
 }
 
+static SkFlattenable::Registrar
+  gSkColorMatrixFilterReg("SkColorMatrixFilter",
+                          SkColorMatrixFilter::CreateProc);
diff --git a/src/effects/SkPixelXorXfermode.cpp b/src/effects/SkPixelXorXfermode.cpp
index 0fb0494..f4a74ee 100644
--- a/src/effects/SkPixelXorXfermode.cpp
+++ b/src/effects/SkPixelXorXfermode.cpp
@@ -43,3 +43,6 @@
     return SkNEW_ARGS(SkPixelXorXfermode, (rb));
 }
 
+static SkFlattenable::Registrar
+    gSkPixelXorXfermodeReg("SkPixelXorXfermode",
+                           SkPixelXorXfermode::CreateProc);
