change pixelref to not inherit from SkFlattenable

If I can "inline" MallocPixelRef unflatten, then I think we can delete this code. The only caller today should be unflattening in the legacy path for bitmaps.

R=robertphillips@google.com

Author: reed@google.com

Review URL: https://codereview.chromium.org/320873003
diff --git a/include/core/SkMallocPixelRef.h b/include/core/SkMallocPixelRef.h
index 2db81bb..5415e01 100644
--- a/include/core/SkMallocPixelRef.h
+++ b/include/core/SkMallocPixelRef.h
@@ -82,18 +82,21 @@
                                    SkColorTable*) SK_OVERRIDE;
     };
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMallocPixelRef)
+#endif
 
 protected:
     // The ownPixels version of this constructor is deprecated.
     SkMallocPixelRef(const SkImageInfo&, void* addr, size_t rb, SkColorTable*,
                      bool ownPixels);
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SkMallocPixelRef(SkReadBuffer& buffer);
+#endif
     virtual ~SkMallocPixelRef();
 
     virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
     virtual void onUnlockPixels() SK_OVERRIDE;
-    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
     virtual size_t getAllocatedSizeInBytes() const SK_OVERRIDE;
 
 private:
diff --git a/include/core/SkPixelRef.h b/include/core/SkPixelRef.h
index 842f493..a997993 100644
--- a/include/core/SkPixelRef.h
+++ b/include/core/SkPixelRef.h
@@ -31,6 +31,13 @@
 //    #define SK_IGNORE_PIXELREF_SETPRELOCKED
 #endif
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
+    // we only support unflattening, not flattening
+    #define SK_PIXELREF_BASECLASS   SkFlattenable
+#else
+    #define SK_PIXELREF_BASECLASS   SkRefCnt
+#endif
+
 class SkColorTable;
 class SkData;
 struct SkIRect;
@@ -46,7 +53,7 @@
 
     This class can be shared/accessed between multiple threads.
 */
-class SK_API SkPixelRef : public SkFlattenable {
+class SK_API SkPixelRef : public SK_PIXELREF_BASECLASS {
 public:
     SK_DECLARE_INST_COUNT(SkPixelRef)
 
@@ -250,7 +257,9 @@
     virtual void globalUnref();
 #endif
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DEFINE_FLATTENABLE_TYPE(SkPixelRef)
+#endif
 
     // Register a listener that may be called the next time our generation ID changes.
     //
@@ -324,7 +333,6 @@
 
     // serialization
     SkPixelRef(SkReadBuffer&, SkBaseMutex*);
-    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
 
     // only call from constructor. Flags this to always be locked, removing
     // the need to grab the mutex and call onLockPixels/onUnlockPixels.
@@ -363,7 +371,11 @@
     friend class SkBitmap;  // only for cloneGenID
     void cloneGenID(const SkPixelRef&);
 
-    typedef SkFlattenable INHERITED;
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
+    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE { sk_throw(); }
+#endif
+
+    typedef SK_PIXELREF_BASECLASS INHERITED;
 };
 
 class SkPixelRefFactory : public SkRefCnt {
diff --git a/include/core/SkReadBuffer.h b/include/core/SkReadBuffer.h
index b792be3..5db8634 100644
--- a/include/core/SkReadBuffer.h
+++ b/include/core/SkReadBuffer.h
@@ -17,7 +17,6 @@
 #include "SkPath.h"
 #include "SkPathEffect.h"
 #include "SkPicture.h"
-#include "SkPixelRef.h"
 #include "SkRasterizer.h"
 #include "SkReadBuffer.h"
 #include "SkReader32.h"
@@ -119,7 +118,6 @@
     SkImageFilter* readImageFilter() { return this->readFlattenable<SkImageFilter>(); }
     SkMaskFilter*  readMaskFilter()  { return this->readFlattenable<SkMaskFilter>(); }
     SkPathEffect*  readPathEffect()  { return this->readFlattenable<SkPathEffect>(); }
-    SkPixelRef*    readPixelRef()    { return this->readFlattenable<SkPixelRef>(); }
     SkRasterizer*  readRasterizer()  { return this->readFlattenable<SkRasterizer>(); }
     SkShader*      readShader()      { return this->readFlattenable<SkShader>(); }
     SkXfermode*    readXfermode()    { return this->readFlattenable<SkXfermode>(); }
diff --git a/include/gpu/SkGrPixelRef.h b/include/gpu/SkGrPixelRef.h
index 36802a0..5599fb7 100644
--- a/include/gpu/SkGrPixelRef.h
+++ b/include/gpu/SkGrPixelRef.h
@@ -51,7 +51,9 @@
     // override from SkPixelRef
     virtual GrTexture* getTexture() SK_OVERRIDE;
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DECLARE_UNFLATTENABLE_OBJECT()
+#endif
 
 protected:
     // overrides from SkPixelRef
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 316878b..e525ea2 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -1292,6 +1292,7 @@
 };
 
 void SkBitmap::legacyUnflatten(SkReadBuffer& buffer) {
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     this->reset();
 
     SkImageInfo info;
@@ -1317,7 +1318,7 @@
                 origin.fX = buffer.readInt();
                 origin.fY = buffer.readInt();
                 size_t offset = origin.fY * rowBytes + origin.fX * info.bytesPerPixel();
-                SkPixelRef* pr = buffer.readPixelRef();
+                SkPixelRef* pr = buffer.readFlattenable<SkPixelRef>();
                 if (!buffer.validate((NULL == pr) ||
                        (pr->getAllocatedSizeInBytes() >= (offset + this->getSafeSize())))) {
                     origin.setZero();
@@ -1332,6 +1333,9 @@
                 sk_throw();
         }
     }
+#else
+    sk_throw();
+#endif
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkMallocPixelRef.cpp b/src/core/SkMallocPixelRef.cpp
index d51fb7c..447083a 100644
--- a/src/core/SkMallocPixelRef.cpp
+++ b/src/core/SkMallocPixelRef.cpp
@@ -200,21 +200,7 @@
     return this->info().getSafeSize(fRB);
 }
 
-void SkMallocPixelRef::flatten(SkWriteBuffer& buffer) const {
-    this->INHERITED::flatten(buffer);
-
-    buffer.write32(SkToU32(fRB));
-
-    // TODO: replace this bulk write with a chunky one that can trim off any
-    // trailing bytes on each scanline (in case rowbytes > width*size)
-    size_t size = this->info().getSafeSize(fRB);
-    buffer.writeByteArray(fStorage, size);
-    buffer.writeBool(fCTable != NULL);
-    if (fCTable) {
-        fCTable->writeToBuffer(buffer);
-    }
-}
-
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
 SkMallocPixelRef::SkMallocPixelRef(SkReadBuffer& buffer)
     : INHERITED(buffer, NULL)
     , fReleaseProc(sk_free_releaseproc)
@@ -237,6 +223,7 @@
 
     this->setPreLocked(fStorage, fRB, fCTable);
 }
+#endif
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp
index 829c3f1..3664dfa 100644
--- a/src/core/SkPixelRef.cpp
+++ b/src/core/SkPixelRef.cpp
@@ -108,6 +108,7 @@
     fPreLocked = false;
 }
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
 static SkImageInfo read_info(SkReadBuffer& buffer) {
     SkImageInfo info;
     info.unflatten(buffer);
@@ -130,6 +131,7 @@
     fUniqueGenerationID = false;  // Conservatively assuming the original still exists.
     fPreLocked = false;
 }
+#endif
 
 SkPixelRef::~SkPixelRef() {
     this->callGenIDChangeListeners();
@@ -159,23 +161,6 @@
 #endif
 }
 
-void SkPixelRef::flatten(SkWriteBuffer& buffer) const {
-    this->INHERITED::flatten(buffer);
-    fInfo.flatten(buffer);
-    buffer.writeBool(fIsImmutable);
-    // We write the gen ID into the picture for within-process recording. This
-    // is safe since the same genID will never refer to two different sets of
-    // pixels (barring overflow). However, each process has its own "namespace"
-    // of genIDs. So for cross-process recording we write a zero which will
-    // trigger assignment of a new genID in playback.
-    if (buffer.isCrossProcess()) {
-        buffer.writeUInt(0);
-    } else {
-        buffer.writeUInt(fGenerationID);
-        fUniqueGenerationID = false;  // Conservative, a copy is probably about to exist.
-    }
-}
-
 bool SkPixelRef::lockPixels(LockRec* rec) {
     SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount);
 
diff --git a/src/core/SkScaledImageCache.cpp b/src/core/SkScaledImageCache.cpp
index a030248..eda4871 100644
--- a/src/core/SkScaledImageCache.cpp
+++ b/src/core/SkScaledImageCache.cpp
@@ -183,7 +183,9 @@
     SkOneShotDiscardablePixelRef(const SkImageInfo&, SkDiscardableMemory*, size_t rowBytes);
     ~SkOneShotDiscardablePixelRef();
 
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DECLARE_UNFLATTENABLE_OBJECT()
+#endif
 
 protected:
     virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
diff --git a/src/lazy/SkCachingPixelRef.h b/src/lazy/SkCachingPixelRef.h
index 9fc71c3..193fe45 100644
--- a/src/lazy/SkCachingPixelRef.h
+++ b/src/lazy/SkCachingPixelRef.h
@@ -48,12 +48,15 @@
     virtual SkData* onRefEncodedData() SK_OVERRIDE {
         return fImageGenerator->refEncodedData();
     }
+
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     // No need to flatten this object. When flattening an SkBitmap,
     // SkWriteBuffer will check the encoded data and write that
     // instead.
     // Future implementations of SkWriteBuffer will need to
     // special case for onRefEncodedData as well.
     SK_DECLARE_UNFLATTENABLE_OBJECT()
+#endif
 
 private:
     SkImageGenerator* const fImageGenerator;
diff --git a/src/lazy/SkDiscardablePixelRef.h b/src/lazy/SkDiscardablePixelRef.h
index 52a1d6c..ae955d6 100644
--- a/src/lazy/SkDiscardablePixelRef.h
+++ b/src/lazy/SkDiscardablePixelRef.h
@@ -21,7 +21,9 @@
 class SkDiscardablePixelRef : public SkPixelRef {
 public:
     SK_DECLARE_INST_COUNT(SkDiscardablePixelRef)
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DECLARE_UNFLATTENABLE_OBJECT()
+#endif
 
 protected:
     ~SkDiscardablePixelRef();
diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp
index b08906a..5c693af 100644
--- a/src/ports/SkGlobalInitialization_default.cpp
+++ b/src/ports/SkGlobalInitialization_default.cpp
@@ -106,7 +106,9 @@
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMergeImageFilter)
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkColorFilterImageFilter)
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDownSampleImageFilter)
+#ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMallocPixelRef)
+#endif
 
     SkArithmeticMode::InitializeFlattenables();
     SkBlurMaskFilter::InitializeFlattenables();