From 186f7b04956a1742f185a4ca69b44b52bc50e7fc Mon Sep 17 00:00:00 2001 From: halcanary Date: Tue, 12 Aug 2014 08:04:58 -0700 Subject: [PATCH] SkImage::NewFromGenerator(SkImageGenerator*), and a unit test. R=reed@google.com Author: halcanary@google.com Review URL: https://codereview.chromium.org/465823003 --- gyp/core.gyp | 1 + include/core/SkImage.h | 8 ++++++ src/image/SkImage_Raster.cpp | 13 ++++++++++ tests/CachedDecodingPixelRefTest.cpp | 39 ++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/gyp/core.gyp b/gyp/core.gyp index 64cc79bf5b..afbc78a4ce 100644 --- a/gyp/core.gyp +++ b/gyp/core.gyp @@ -20,6 +20,7 @@ '../include/ports', '../include/utils', '../include/xml', + '../include/images', '../src/core', '../src/sfnt', '../src/image', diff --git a/include/core/SkImage.h b/include/core/SkImage.h index 581129e720..1316e2b595 100644 --- a/include/core/SkImage.h +++ b/include/core/SkImage.h @@ -16,6 +16,7 @@ class SkData; class SkCanvas; +class SkImageGenerator; class SkPaint; class GrContext; class GrTexture; @@ -47,6 +48,13 @@ public: */ static SkImage* NewTexture(const SkBitmap&); + /** + * Construct a new SkImage based on the given ImageGenerator. + * This function will always take ownership of the passed + * ImageGenerator. Returns NULL on error. + */ + static SkImage* NewFromGenerator(SkImageGenerator*); + int width() const { return fWidth; } int height() const { return fHeight; } uint32_t uniqueID() const { return fUniqueID; } diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index e4768af0ac..a1cd602a07 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -10,6 +10,7 @@ #include "SkBitmap.h" #include "SkCanvas.h" #include "SkData.h" +#include "SkDecodingImageGenerator.h" #include "SkMallocPixelRef.h" class SkImage_Raster : public SkImage_Base { @@ -69,6 +70,10 @@ public: SkShader::TileMode, const SkMatrix* localMatrix) const SK_OVERRIDE; + SkImage_Raster(const SkBitmap& bm) + : INHERITED(bm.width(), bm.height()) + , fBitmap(bm) {} + private: SkImage_Raster() : INHERITED(0, 0) {} @@ -198,6 +203,14 @@ SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t ro return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes)); } +SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) { + SkBitmap bitmap; + if (!SkInstallDiscardablePixelRef(generator, &bitmap)) { + return NULL; + } + return SkNEW_ARGS(SkImage_Raster, (bitmap)); +} + SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, size_t rowBytes) { return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes)); diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp index 8de7da79a2..b409987392 100644 --- a/tests/CachedDecodingPixelRefTest.cpp +++ b/tests/CachedDecodingPixelRefTest.cpp @@ -322,3 +322,42 @@ DEF_TEST(DiscardableAndCachingPixelRef, reporter) { check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, kSkDiscardable_PixelRefType, globalPool); } + +//////////////////////////////////////////////////////////////////////////////// + +DEF_TEST(Image_NewFromGenerator, r) { + TestImageGenerator::TestType testTypes[] = { + TestImageGenerator::kFailGetInfo_TestType, + TestImageGenerator::kFailGetPixels_TestType, + TestImageGenerator::kSucceedGetPixels_TestType, + }; + for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) { + TestImageGenerator::TestType test = testTypes[i]; + SkImageGenerator* gen = SkNEW_ARGS(TestImageGenerator, (test, r)); + SkAutoTUnref image(SkImage::NewFromGenerator(gen)); + if (TestImageGenerator::kFailGetInfo_TestType == test) { + REPORTER_ASSERT(r, NULL == image.get()); + continue; + } + if (NULL == image.get()) { + ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed [" + SK_SIZE_T_SPECIFIER "]", i); + continue; + } + REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width()); + REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height()); + + SkBitmap bitmap; + SkAssertResult(bitmap.allocN32Pixels(TestImageGenerator::Width(), + TestImageGenerator::Height())); + SkCanvas canvas(bitmap); + canvas.clear(SK_ColorMAGENTA); + image->draw(&canvas, 0, 0, NULL); + SkColor color = bitmap.getColor(0, 0); + if (TestImageGenerator::kSucceedGetPixels_TestType == test) { + REPORTER_ASSERT(r, TestImageGenerator::Color() == color); + } else { + REPORTER_ASSERT(r, SK_ColorMAGENTA == color); + } + } +}