Remove need for readFlattenableT from SkLightingImageFilter.

This will need new picture version.

BUG=
R=reed@android.com, sugoi@google.com, senorblanco@chromium.org, reed@google.com

Author: mtklein@google.com

Review URL: https://codereview.chromium.org/26594008

git-svn-id: http://skia.googlecode.com/svn/trunk/src@11758 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/effects/SkLightingImageFilter.cpp b/effects/SkLightingImageFilter.cpp
index c28b317..a41a8f5 100644
--- a/effects/SkLightingImageFilter.cpp
+++ b/effects/SkLightingImageFilter.cpp
@@ -507,7 +507,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-class SkLight : public SkFlattenable {
+class SkLight : public SkRefCnt {
 public:
     SK_DECLARE_INST_COUNT(SkLight)
 
@@ -526,6 +526,10 @@
     virtual bool requiresFragmentPosition() const = 0;
     virtual SkLight* transform(const SkMatrix& matrix) const = 0;
 
+    // Defined below SkLight's subclasses.
+    void flattenLight(SkFlattenableWriteBuffer& buffer) const;
+    static SkLight* UnflattenLight(SkFlattenableReadBuffer& buffer);
+
 protected:
     SkLight(SkColor color)
       : fColor(SkIntToScalar(SkColorGetR(color)),
@@ -533,17 +537,15 @@
                SkIntToScalar(SkColorGetB(color))) {}
     SkLight(const SkPoint3& color)
       : fColor(color) {}
-    SkLight(SkFlattenableReadBuffer& buffer)
-      : INHERITED(buffer) {
+    SkLight(SkFlattenableReadBuffer& buffer) {
         fColor = readPoint3(buffer);
     }
-    virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
-        INHERITED::flatten(buffer);
-        writePoint3(fColor, buffer);
-    }
+
+    virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const = 0;
+
 
 private:
-    typedef SkFlattenable INHERITED;
+    typedef SkRefCnt INHERITED;
     SkPoint3 fColor;
 };
 
@@ -583,20 +585,18 @@
                fDirection == o.fDirection;
     }
 
-    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDistantLight)
+    SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+        fDirection = readPoint3(buffer);
+    }
 
 protected:
     SkDistantLight(const SkPoint3& direction, const SkPoint3& color)
       : INHERITED(color), fDirection(direction) {
     }
-    SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
-        fDirection = readPoint3(buffer);
-    }
     virtual SkLight* transform(const SkMatrix& matrix) const {
         return new SkDistantLight(direction(), color());
     }
-    virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
-        INHERITED::flatten(buffer);
+    virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
         writePoint3(fDirection, buffer);
     }
 
@@ -646,16 +646,14 @@
         return new SkPointLight(location, color());
     }
 
-    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPointLight)
-
-protected:
     SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
         fLocation = readPoint3(buffer);
     }
+
+protected:
     SkPointLight(const SkPoint3& location, const SkPoint3& color)
      : INHERITED(color), fLocation(location) {}
-    virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
-        INHERITED::flatten(buffer);
+    virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
         writePoint3(fLocation, buffer);
     }
 
@@ -729,9 +727,6 @@
     SkScalar coneScale() const { return fConeScale; }
     const SkPoint3& s() const { return fS; }
 
-    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpotLight)
-
-protected:
     SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
         fLocation = readPoint3(buffer);
         fTarget = readPoint3(buffer);
@@ -741,6 +736,7 @@
         fConeScale = buffer.readScalar();
         fS = readPoint3(buffer);
     }
+protected:
     SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specularExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar coneScale, const SkPoint3& s, const SkPoint3& color)
      : INHERITED(color),
        fLocation(location),
@@ -752,8 +748,7 @@
        fS(s)
     {
     }
-    virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
-        INHERITED::flatten(buffer);
+    virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
         writePoint3(fLocation, buffer);
         writePoint3(fTarget, buffer);
         buffer.writeScalar(fSpecularExponent);
@@ -797,6 +792,29 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
+void SkLight::flattenLight(SkFlattenableWriteBuffer& buffer) const {
+    // Write type first, then baseclass, then subclass.
+    buffer.writeInt(this->type());
+    writePoint3(fColor, buffer);
+    this->onFlattenLight(buffer);
+}
+
+/*static*/ SkLight* SkLight::UnflattenLight(SkFlattenableReadBuffer& buffer) {
+    // Read type first.
+    const SkLight::LightType type = (SkLight::LightType)buffer.readInt();
+    switch (type) {
+        // Each of these constructors must first call SkLight's, so we'll read the baseclass
+        // then subclass, same order as flattenLight.
+        case SkLight::kDistant_LightType: return SkNEW_ARGS(SkDistantLight, (buffer));
+        case SkLight::kPoint_LightType:   return SkNEW_ARGS(SkPointLight, (buffer));
+        case SkLight::kSpot_LightType:    return SkNEW_ARGS(SkSpotLight, (buffer));
+        default:
+            SkDEBUGFAIL("Unknown LightType.");
+            return NULL;
+    }
+}
+///////////////////////////////////////////////////////////////////////////////
+
 SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkImageFilter* input, const CropRect* cropRect)
   : INHERITED(input, cropRect),
     fLight(light),
@@ -865,15 +883,14 @@
 }
 
 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer)
-  : INHERITED(buffer)
-{
-    fLight = buffer.readFlattenableT<SkLight>();
+  : INHERITED(buffer) {
+    fLight = SkLight::UnflattenLight(buffer);
     fSurfaceScale = buffer.readScalar();
 }
 
 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
     this->INHERITED::flatten(buffer);
-    buffer.writeFlattenable(fLight);
+    fLight->flattenLight(buffer);
     buffer.writeScalar(fSurfaceScale);
 }
 
@@ -1562,7 +1579,4 @@
 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
-    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight)
-    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight)
-    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight)
 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END