formalize generate->bitmap

just move block of code to expose it

BUG=skia:4328
TBR=

Review URL: https://codereview.chromium.org/1334033004
diff --git a/include/core/SkImageGenerator.h b/include/core/SkImageGenerator.h
index c84463d..5b96671 100644
--- a/include/core/SkImageGenerator.h
+++ b/include/core/SkImageGenerator.h
@@ -165,6 +165,23 @@
     static SkImageGenerator* NewFromPicture(const SkISize&, const SkPicture*, const SkMatrix*,
                                             const SkPaint*);
 
+    bool tryGenerateBitmap(SkBitmap* bm) {
+        return this->tryGenerateBitmap(bm, nullptr);
+    }
+    bool tryGenerateBitmap(SkBitmap* bm, const SkImageInfo& info) {
+        return this->tryGenerateBitmap(bm, &info);
+    }
+    void generateBitmap(SkBitmap* bm) {
+        if (!this->tryGenerateBitmap(bm, nullptr)) {
+            sk_throw();
+        }
+    }
+    void generateBitmap(SkBitmap* bm, const SkImageInfo& info) {
+        if (!this->tryGenerateBitmap(bm, &info)) {
+            sk_throw();
+        }
+    }
+
 protected:
     SkImageGenerator(const SkImageInfo& info);
 
@@ -180,6 +197,8 @@
         return nullptr;
     }
 
+    bool tryGenerateBitmap(SkBitmap* bm, const SkImageInfo* optionalInfo);
+
 private:
     const SkImageInfo fInfo;
     const uint32_t fUniqueID;
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
index 8c0e415..bdcd64f 100644
--- a/src/core/SkImageCacherator.cpp
+++ b/src/core/SkImageCacherator.cpp
@@ -70,55 +70,19 @@
     return true;
 }
 
-static void release_malloc_proc(void* pixels, void* ctx) {
-    sk_free(pixels);
-}
-
-static bool generate_a_bitmap(SkBitmap* bitmap, SkImageGenerator* gen, const SkImageInfo& info) {
-    const size_t rowBytes = info.minRowBytes();
-    const size_t pixelSize = info.getSafeSize(rowBytes);
-    if (0 == pixelSize) {
-        return false;
-    }
-
-    SkAutoFree pixelStorage(sk_malloc_flags(pixelSize, 0));
-    void* pixels = pixelStorage.get();
-    if (!pixels) {
-        return false;
-    }
-
-    SkPMColor ctStorage[256];
-    int ctCount = 0;
-
-    if (!gen->getPixels(info, pixels, rowBytes, ctStorage, &ctCount)) {
-        return false;
-    }
-
-    SkAutoTUnref<SkColorTable> ctable;
-    if (ctCount > 0) {
-        SkASSERT(kIndex_8_SkColorType == info.colorType());
-        ctable.reset(new SkColorTable(ctStorage, ctCount));
-    } else {
-        SkASSERT(kIndex_8_SkColorType != info.colorType());
-    }
-
-    return bitmap->installPixels(info, pixelStorage.detach(), rowBytes, ctable,
-                                 release_malloc_proc, nullptr);
-}
-
 bool SkImageCacherator::generateBitmap(SkBitmap* bitmap) {
     ScopedGenerator generator(this);
     const SkImageInfo& genInfo = generator->getInfo();
     if (fInfo.dimensions() == genInfo.dimensions()) {
         SkASSERT(fOrigin.x() == 0 && fOrigin.y() == 0);
         // fast-case, no copy needed
-        return generate_a_bitmap(bitmap, generator, fInfo);
+        return generator->tryGenerateBitmap(bitmap, fInfo);
     } else {
         // need to handle subsetting, so we first generate the full size version, and then
         // "read" from it to get our subset. See skbug.com/4213
 
         SkBitmap full;
-        if (!generate_a_bitmap(&full, generator, genInfo)) {
+        if (!generator->tryGenerateBitmap(&full, genInfo)) {
             return false;
         }
         if (!bitmap->tryAllocPixels(fInfo, nullptr, full.getColorTable())) {
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index 33da50a..6fe9f84 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -125,6 +125,46 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
+#include "SkBitmap.h"
+#include "SkColorTable.h"
+
+static void release_malloc_proc(void* pixels, void* ctx) {
+    sk_free(pixels);
+}
+
+bool SkImageGenerator::tryGenerateBitmap(SkBitmap* bitmap, const SkImageInfo* infoPtr) {
+    const SkImageInfo info = infoPtr ? *infoPtr : this->getInfo();
+    const size_t rowBytes = info.minRowBytes();
+    const size_t pixelSize = info.getSafeSize(rowBytes);
+    if (0 == pixelSize) {
+        return false;
+    }
+
+    SkAutoFree pixelStorage(sk_malloc_flags(pixelSize, 0));
+    void* pixels = pixelStorage.get();
+    if (!pixels) {
+        return false;
+    }
+    
+    SkPMColor ctStorage[256];
+    int ctCount = 0;
+    
+    if (!this->getPixels(info, pixels, rowBytes, ctStorage, &ctCount)) {
+        return false;
+    }
+    
+    SkAutoTUnref<SkColorTable> ctable;
+    if (ctCount > 0) {
+        SkASSERT(kIndex_8_SkColorType == info.colorType());
+        ctable.reset(new SkColorTable(ctStorage, ctCount));
+    } else {
+        SkASSERT(kIndex_8_SkColorType != info.colorType());
+    }
+    
+    return bitmap->installPixels(info, pixelStorage.detach(), rowBytes, ctable,
+                                 release_malloc_proc, nullptr);
+}
+
 #include "SkGraphics.h"
 
 static SkGraphics::ImageGeneratorFromEncodedFactory gFactory;
diff --git a/tools/Resources.cpp b/tools/Resources.cpp
index a2a5902..62b3f9f 100644
--- a/tools/Resources.cpp
+++ b/tools/Resources.cpp
@@ -28,7 +28,8 @@
 bool GetResourceAsBitmap(const char* resource, SkBitmap* dst) {
     SkString resourcePath = GetResourcePath(resource);
     SkAutoTUnref<SkData> resourceData(SkData::NewFromFileName(resourcePath.c_str()));
-    return resourceData && SkInstallDiscardablePixelRef(resourceData, dst);
+    SkAutoTDelete<SkImageGenerator> gen(SkImageGenerator::NewFromEncoded(resourceData));
+    return gen && gen->tryGenerateBitmap(dst);
 }
 
 SkImage* GetResourceAsImage(const char* resource) {