Simplify Bitmap a bit

Remove an overly generic function with a simpler specialized one.

Test: builds
Change-Id: I2049968770bfbbf0ef29701467a82e1c2a9e9479
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index df463e2..c0a2443 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -131,15 +131,8 @@
     return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes));
 }
 
-void FreePixelRef(void* addr, void* context) {
-    auto pixelRef = (SkPixelRef*)context;
-    pixelRef->unref();
-}
-
 sk_sp<Bitmap> Bitmap::createFrom(const SkImageInfo& info, SkPixelRef& pixelRef) {
-    pixelRef.ref();
-    return sk_sp<Bitmap>(new Bitmap((void*)pixelRef.pixels(), (void*)&pixelRef, FreePixelRef, info,
-                                    pixelRef.rowBytes()));
+    return sk_sp<Bitmap>(new Bitmap(pixelRef, info));
 }
 
 
@@ -232,14 +225,12 @@
     mPixelStorage.heap.size = size;
 }
 
-Bitmap::Bitmap(void* address, void* context, FreeFunc freeFunc, const SkImageInfo& info,
-               size_t rowBytes)
-        : SkPixelRef(info.width(), info.height(), address, rowBytes)
+Bitmap::Bitmap(SkPixelRef& pixelRef, const SkImageInfo& info)
+        : SkPixelRef(info.width(), info.height(), pixelRef.pixels(), pixelRef.rowBytes())
         , mInfo(validateAlpha(info))
-        , mPixelStorageType(PixelStorageType::External) {
-    mPixelStorage.external.address = address;
-    mPixelStorage.external.context = context;
-    mPixelStorage.external.freeFunc = freeFunc;
+        , mPixelStorageType(PixelStorageType::WrappedPixelRef) {
+    pixelRef.ref();
+    mPixelStorage.wrapped.pixelRef = &pixelRef;
 }
 
 Bitmap::Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, size_t rowBytes)
@@ -268,9 +259,8 @@
 
 Bitmap::~Bitmap() {
     switch (mPixelStorageType) {
-        case PixelStorageType::External:
-            mPixelStorage.external.freeFunc(mPixelStorage.external.address,
-                                            mPixelStorage.external.context);
+        case PixelStorageType::WrappedPixelRef:
+            mPixelStorage.wrapped.pixelRef->unref();
             break;
         case PixelStorageType::Ashmem:
 #ifndef _WIN32 // ashmem not implemented on Windows
@@ -302,19 +292,6 @@
     mHasHardwareMipMap = hasMipMap;
 }
 
-void* Bitmap::getStorage() const {
-    switch (mPixelStorageType) {
-        case PixelStorageType::External:
-            return mPixelStorage.external.address;
-        case PixelStorageType::Ashmem:
-            return mPixelStorage.ashmem.address;
-        case PixelStorageType::Heap:
-            return mPixelStorage.heap.address;
-        case PixelStorageType::Hardware:
-            return nullptr;
-    }
-}
-
 int Bitmap::getAshmemFd() const {
     switch (mPixelStorageType) {
         case PixelStorageType::Ashmem:
diff --git a/libs/hwui/hwui/Bitmap.h b/libs/hwui/hwui/Bitmap.h
index 37e60a0..6ece7ef 100644
--- a/libs/hwui/hwui/Bitmap.h
+++ b/libs/hwui/hwui/Bitmap.h
@@ -32,7 +32,7 @@
 namespace android {
 
 enum class PixelStorageType {
-    External,
+    WrappedPixelRef,
     Heap,
     Ashmem,
     Hardware,
@@ -163,8 +163,7 @@
     static sk_sp<Bitmap> allocateAshmemBitmap(size_t size, const SkImageInfo& i, size_t rowBytes);
 
     Bitmap(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes);
-    Bitmap(void* address, void* context, FreeFunc freeFunc, const SkImageInfo& info,
-           size_t rowBytes);
+    Bitmap(SkPixelRef& pixelRef, const SkImageInfo& info);
     Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, size_t rowBytes);
 #ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
     Bitmap(AHardwareBuffer* buffer, const SkImageInfo& info, size_t rowBytes,
@@ -178,7 +177,6 @@
 #endif
 
     virtual ~Bitmap();
-    void* getStorage() const;
 
     SkImageInfo mInfo;
 
@@ -191,10 +189,8 @@
 
     union {
         struct {
-            void* address;
-            void* context;
-            FreeFunc freeFunc;
-        } external;
+            SkPixelRef* pixelRef;
+        } wrapped;
         struct {
             void* address;
             int fd;