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) {