| Index: tests/ImageTest.cpp
|
| diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
|
| index 7bce8e5a5d2425ee421727297b3406487a7c6129..2bc2accf8f2a1c4d4c82bde445cee2835d95d8f7 100644
|
| --- a/tests/ImageTest.cpp
|
| +++ b/tests/ImageTest.cpp
|
| @@ -10,6 +10,7 @@
|
| #include "SkData.h"
|
| #include "SkDevice.h"
|
| #include "SkImageEncoder.h"
|
| +#include "SkImageGenerator.h"
|
| #include "SkImage_Base.h"
|
| #include "SkPicture.h"
|
| #include "SkPictureRecorder.h"
|
| @@ -21,13 +22,9 @@
|
| #include "Test.h"
|
|
|
| #if SK_SUPPORT_GPU
|
| -#include "GrContextFactory.h"
|
| -#include "GrTest.h"
|
| +#include "GrContext.h"
|
| #include "gl/GrGLInterface.h"
|
| #include "gl/GrGLUtil.h"
|
| -#else
|
| -class GrContextFactory;
|
| -class GrContext;
|
| #endif
|
|
|
| static void assert_equal(skiatest::Reporter* reporter, SkImage* a, const SkIRect* subsetA,
|
| @@ -61,51 +58,99 @@ static void assert_equal(skiatest::Reporter* reporter, SkImage* a, const SkIRect
|
| REPORTER_ASSERT(reporter, !memcmp(pmapA.addr32(0, y), pmapB.addr32(0, y), widthBytes));
|
| }
|
| }
|
| -
|
| -static SkImage* make_image(GrContext* ctx, int w, int h, const SkIRect& ir) {
|
| - const SkImageInfo info = SkImageInfo::MakeN32(w, h, kOpaque_SkAlphaType);
|
| - SkAutoTUnref<SkSurface> surface(ctx ?
|
| - SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted, info) :
|
| - SkSurface::NewRaster(info));
|
| - SkCanvas* canvas = surface->getCanvas();
|
| +static void draw_image_test_pattern(SkCanvas* canvas) {
|
| canvas->clear(SK_ColorWHITE);
|
| -
|
| SkPaint paint;
|
| paint.setColor(SK_ColorBLACK);
|
| - canvas->drawRect(SkRect::Make(ir), paint);
|
| + canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
|
| +}
|
| +static SkImage* create_image() {
|
| + const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
|
| + draw_image_test_pattern(surface->getCanvas());
|
| return surface->newImageSnapshot();
|
| }
|
| +static SkData* create_image_data(SkImageInfo* info) {
|
| + *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
|
| + const size_t rowBytes = info->minRowBytes();
|
| + SkAutoTUnref<SkData> data(SkData::NewUninitialized(rowBytes * info->height()));
|
| + {
|
| + SkBitmap bm;
|
| + bm.installPixels(*info, data->writable_data(), rowBytes);
|
| + SkCanvas canvas(bm);
|
| + draw_image_test_pattern(&canvas);
|
| + }
|
| + return data.release();
|
| +}
|
| +static SkImage* create_data_image() {
|
| + SkImageInfo info;
|
| + SkAutoTUnref<SkData> data(create_image_data(&info));
|
| + return SkImage::NewRasterData(info, data, info.minRowBytes());
|
| +}
|
| +// Want to ensure that our Release is called when the owning image is destroyed
|
| +struct RasterDataHolder {
|
| + RasterDataHolder() : fReleaseCount(0) {}
|
| + SkAutoTUnref<SkData> fData;
|
| + int fReleaseCount;
|
| + static void Release(const void* pixels, void* context) {
|
| + RasterDataHolder* self = static_cast<RasterDataHolder*>(context);
|
| + self->fReleaseCount++;
|
| + self->fData.reset();
|
| + }
|
| +};
|
| +static SkImage* create_rasterproc_image(RasterDataHolder* dataHolder) {
|
| + SkASSERT(dataHolder);
|
| + SkImageInfo info;
|
| + SkAutoTUnref<SkData> data(create_image_data(&info));
|
| + dataHolder->fData.reset(SkRef(data.get()));
|
| + return SkImage::NewFromRaster(info, data->data(), info.minRowBytes(),
|
| + RasterDataHolder::Release, dataHolder);
|
| +}
|
| +static SkImage* create_codec_image() {
|
| + SkImageInfo info;
|
| + SkAutoTUnref<SkData> data(create_image_data(&info));
|
| + SkBitmap bitmap;
|
| + bitmap.installPixels(info, data->writable_data(), info.minRowBytes());
|
| + SkAutoTUnref<SkData> src(
|
| + SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 100));
|
| + return SkImage::NewFromEncoded(src);
|
| +}
|
| +#if SK_SUPPORT_GPU
|
| +static SkImage* create_gpu_image(GrContext* context) {
|
| + const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted,
|
| + info));
|
| + draw_image_test_pattern(surface->getCanvas());
|
| + return surface->newImageSnapshot();
|
| +}
|
| +#endif
|
|
|
| -static void test_encode(skiatest::Reporter* reporter, GrContext* ctx) {
|
| +static void test_encode(skiatest::Reporter* reporter, SkImage* image) {
|
| const SkIRect ir = SkIRect::MakeXYWH(5, 5, 10, 10);
|
| - SkAutoTUnref<SkImage> orig(make_image(ctx, 20, 20, ir));
|
| - SkAutoTUnref<SkData> origEncoded(orig->encode());
|
| + SkAutoTUnref<SkData> origEncoded(image->encode());
|
| REPORTER_ASSERT(reporter, origEncoded);
|
| REPORTER_ASSERT(reporter, origEncoded->size() > 0);
|
|
|
| SkAutoTUnref<SkImage> decoded(SkImage::NewFromEncoded(origEncoded));
|
| REPORTER_ASSERT(reporter, decoded);
|
| - assert_equal(reporter, orig, nullptr, decoded);
|
| + assert_equal(reporter, image, nullptr, decoded);
|
|
|
| // Now see if we can instantiate an image from a subset of the surface/origEncoded
|
|
|
| decoded.reset(SkImage::NewFromEncoded(origEncoded, &ir));
|
| REPORTER_ASSERT(reporter, decoded);
|
| - assert_equal(reporter, orig, &ir, decoded);
|
| + assert_equal(reporter, image, &ir, decoded);
|
| }
|
|
|
| -DEF_TEST(Image_Encode_Cpu, reporter) {
|
| - test_encode(reporter, nullptr);
|
| +DEF_TEST(ImageEncode, reporter) {
|
| + SkAutoTUnref<SkImage> image(create_image());
|
| + test_encode(reporter, image);
|
| }
|
|
|
| #if SK_SUPPORT_GPU
|
| -DEF_GPUTEST(Image_Encode_Gpu, reporter, factory) {
|
| - GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (!ctx) {
|
| - REPORTER_ASSERT(reporter, false);
|
| - return;
|
| - }
|
| - test_encode(reporter, ctx);
|
| +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageEncode_Gpu, reporter, context) {
|
| + SkAutoTUnref<SkImage> image(create_gpu_image(context));
|
| + test_encode(reporter, image);
|
| }
|
| #endif
|
|
|
| @@ -141,8 +186,7 @@ private:
|
| // Test that SkImage encoding observes custom pixel serializers.
|
| DEF_TEST(Image_Encode_Serializer, reporter) {
|
| MockSerializer serializer([]() -> SkData* { return SkData::NewWithCString(kSerializedData); });
|
| - const SkIRect ir = SkIRect::MakeXYWH(5, 5, 10, 10);
|
| - SkAutoTUnref<SkImage> image(make_image(nullptr, 20, 20, ir));
|
| + SkAutoTUnref<SkImage> image(create_image());
|
| SkAutoTUnref<SkData> encoded(image->encode(&serializer));
|
| SkAutoTUnref<SkData> reference(SkData::NewWithCString(kSerializedData));
|
|
|
| @@ -288,13 +332,6 @@ DEF_TEST(image_newfrombitmap, reporter) {
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
| #if SK_SUPPORT_GPU
|
|
|
| -static SkImage* make_gpu_image(GrContext* ctx, const SkImageInfo& info, SkColor color) {
|
| - const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted;
|
| - SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, budgeted, info, 0));
|
| - surface->getCanvas()->drawColor(color);
|
| - return surface->newImageSnapshot();
|
| -}
|
| -
|
| #include "SkBitmapCache.h"
|
|
|
| /*
|
| @@ -305,15 +342,9 @@ static SkImage* make_gpu_image(GrContext* ctx, const SkImageInfo& info, SkColor
|
| * but we don't have that facility (at the moment) so we use a little internal knowledge
|
| * of *how* the raster version is cached, and look for that.
|
| */
|
| -DEF_GPUTEST(SkImage_Gpu2Cpu, reporter, factory) {
|
| - GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (!ctx) {
|
| - REPORTER_ASSERT(reporter, false);
|
| - return;
|
| - }
|
| -
|
| - const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
|
| - SkAutoTUnref<SkImage> image(make_gpu_image(ctx, info, SK_ColorRED));
|
| +DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_Gpu2Cpu, reporter, context) {
|
| + SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
|
| + SkAutoTUnref<SkImage> image(create_gpu_image(context));
|
| const uint32_t uniqueID = image->uniqueID();
|
|
|
| SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
|
| @@ -362,38 +393,24 @@ DEF_TEST(ImageFromIndex8Bitmap, r) {
|
| REPORTER_ASSERT(r, img.get() != nullptr);
|
| }
|
|
|
| -// TODO: The tests below were moved from SurfaceTests and should be reformatted.
|
| -
|
| -enum ImageType {
|
| - kRasterCopy_ImageType,
|
| - kRasterData_ImageType,
|
| - kRasterProc_ImageType,
|
| - kGpu_ImageType,
|
| - kCodec_ImageType,
|
| -};
|
| -
|
| -#include "SkImageGenerator.h"
|
| -
|
| class EmptyGenerator : public SkImageGenerator {
|
| public:
|
| EmptyGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
|
| };
|
|
|
| -static void test_empty_image(skiatest::Reporter* reporter) {
|
| +DEF_TEST(ImageEmpty, reporter) {
|
| const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_SkAlphaType);
|
| -
|
| REPORTER_ASSERT(reporter, nullptr == SkImage::NewRasterCopy(info, nullptr, 0));
|
| REPORTER_ASSERT(reporter, nullptr == SkImage::NewRasterData(info, nullptr, 0));
|
| REPORTER_ASSERT(reporter, nullptr == SkImage::NewFromRaster(info, nullptr, 0, nullptr, nullptr));
|
| REPORTER_ASSERT(reporter, nullptr == SkImage::NewFromGenerator(new EmptyGenerator));
|
| }
|
|
|
| -static void test_image(skiatest::Reporter* reporter) {
|
| +DEF_TEST(ImageDataRef, reporter) {
|
| SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
|
| size_t rowBytes = info.minRowBytes();
|
| size_t size = info.getSafeSize(rowBytes);
|
| SkData* data = SkData::NewUninitialized(size);
|
| -
|
| REPORTER_ASSERT(reporter, data->unique());
|
| SkImage* image = SkImage::NewRasterData(info, data, rowBytes);
|
| REPORTER_ASSERT(reporter, !data->unique());
|
| @@ -402,62 +419,6 @@ static void test_image(skiatest::Reporter* reporter) {
|
| data->unref();
|
| }
|
|
|
| -// Want to ensure that our Release is called when the owning image is destroyed
|
| -struct ReleaseDataContext {
|
| - skiatest::Reporter* fReporter;
|
| - SkData* fData;
|
| -
|
| - static void Release(const void* pixels, void* context) {
|
| - ReleaseDataContext* state = (ReleaseDataContext*)context;
|
| - REPORTER_ASSERT(state->fReporter, state->fData);
|
| - state->fData->unref();
|
| - state->fData = nullptr;
|
| - }
|
| -};
|
| -
|
| -static SkImage* create_image(skiatest::Reporter* reporter,
|
| - ImageType imageType, GrContext* context, SkColor color,
|
| - ReleaseDataContext* releaseContext) {
|
| - const SkPMColor pmcolor = SkPreMultiplyColor(color);
|
| - const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
|
| - const size_t rowBytes = info.minRowBytes();
|
| - const size_t size = rowBytes * info.height();
|
| -
|
| - SkAutoTUnref<SkData> data(SkData::NewUninitialized(size));
|
| - void* addr = data->writable_data();
|
| - sk_memset32((SkPMColor*)addr, pmcolor, SkToInt(size >> 2));
|
| -
|
| - switch (imageType) {
|
| - case kRasterCopy_ImageType:
|
| - return SkImage::NewRasterCopy(info, addr, rowBytes);
|
| - case kRasterData_ImageType:
|
| - return SkImage::NewRasterData(info, data, rowBytes);
|
| - case kRasterProc_ImageType:
|
| - SkASSERT(releaseContext);
|
| - releaseContext->fData = SkRef(data.get());
|
| - return SkImage::NewFromRaster(info, addr, rowBytes,
|
| - ReleaseDataContext::Release, releaseContext);
|
| - case kGpu_ImageType: {
|
| - SkAutoTUnref<SkSurface> surf(
|
| - SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info, 0));
|
| - surf->getCanvas()->clear(color);
|
| - return surf->newImageSnapshot();
|
| - }
|
| - case kCodec_ImageType: {
|
| - SkBitmap bitmap;
|
| - bitmap.installPixels(info, addr, rowBytes);
|
| - SkAutoTUnref<SkData> src(
|
| - SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 100));
|
| - return SkImage::NewFromEncoded(src);
|
| - }
|
| - }
|
| - SkASSERT(false);
|
| - return nullptr;
|
| -}
|
| -
|
| -static void set_pixels(SkPMColor pixels[], int count, SkPMColor color) {
|
| - sk_memset32(pixels, color, count);
|
| -}
|
| static bool has_pixels(const SkPMColor pixels[], int count, SkPMColor expected) {
|
| for (int i = 0; i < count; ++i) {
|
| if (pixels[i] != expected) {
|
| @@ -467,8 +428,8 @@ static bool has_pixels(const SkPMColor pixels[], int count, SkPMColor expected)
|
| return true;
|
| }
|
|
|
| -static void test_image_readpixels(skiatest::Reporter* reporter, SkImage* image,
|
| - SkPMColor expected) {
|
| +static void test_read_pixels(skiatest::Reporter* reporter, SkImage* image) {
|
| + const SkPMColor expected = SkPreMultiplyColor(SK_ColorWHITE);
|
| const SkPMColor notExpected = ~expected;
|
|
|
| const int w = 2, h = 2;
|
| @@ -488,29 +449,51 @@ static void test_image_readpixels(skiatest::Reporter* reporter, SkImage* image,
|
| REPORTER_ASSERT(reporter, !image->readPixels(info, pixels, rowBytes, 0, image->height()));
|
|
|
| // top-left should succeed
|
| - set_pixels(pixels, w*h, notExpected);
|
| + sk_memset32(pixels, notExpected, w*h);
|
| REPORTER_ASSERT(reporter, image->readPixels(info, pixels, rowBytes, 0, 0));
|
| REPORTER_ASSERT(reporter, has_pixels(pixels, w*h, expected));
|
|
|
| // bottom-right should succeed
|
| - set_pixels(pixels, w*h, notExpected);
|
| + sk_memset32(pixels, notExpected, w*h);
|
| REPORTER_ASSERT(reporter, image->readPixels(info, pixels, rowBytes,
|
| image->width() - w, image->height() - h));
|
| REPORTER_ASSERT(reporter, has_pixels(pixels, w*h, expected));
|
|
|
| // partial top-left should succeed
|
| - set_pixels(pixels, w*h, notExpected);
|
| + sk_memset32(pixels, notExpected, w*h);
|
| REPORTER_ASSERT(reporter, image->readPixels(info, pixels, rowBytes, -1, -1));
|
| REPORTER_ASSERT(reporter, pixels[3] == expected);
|
| REPORTER_ASSERT(reporter, has_pixels(pixels, w*h - 1, notExpected));
|
|
|
| // partial bottom-right should succeed
|
| - set_pixels(pixels, w*h, notExpected);
|
| + sk_memset32(pixels, notExpected, w*h);
|
| REPORTER_ASSERT(reporter, image->readPixels(info, pixels, rowBytes,
|
| image->width() - 1, image->height() - 1));
|
| REPORTER_ASSERT(reporter, pixels[0] == expected);
|
| REPORTER_ASSERT(reporter, has_pixels(&pixels[1], w*h - 1, notExpected));
|
| }
|
| +DEF_TEST(ImageReadPixels, reporter) {
|
| + SkAutoTUnref<SkImage> image(create_image());
|
| + test_read_pixels(reporter, image);
|
| +
|
| + image.reset(create_data_image());
|
| + test_read_pixels(reporter, image);
|
| +
|
| + RasterDataHolder dataHolder;
|
| + image.reset(create_rasterproc_image(&dataHolder));
|
| + test_read_pixels(reporter, image);
|
| + image.reset();
|
| + REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
|
| +
|
| + image.reset(create_codec_image());
|
| + test_read_pixels(reporter, image);
|
| +}
|
| +#if SK_SUPPORT_GPU
|
| +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageReadPixels_Gpu, reporter, context) {
|
| + SkAutoTUnref<SkImage> image(create_gpu_image(context));
|
| + test_read_pixels(reporter, image);
|
| +}
|
| +#endif
|
|
|
| static void check_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image,
|
| const SkBitmap& bitmap, SkImage::LegacyBitmapMode mode) {
|
| @@ -531,149 +514,117 @@ static void check_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* ima
|
| REPORTER_ASSERT(reporter, imageColor == *bitmap.getAddr32(0, 0));
|
| }
|
|
|
| -static void test_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image) {
|
| +static void test_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image, SkImage::LegacyBitmapMode mode) {
|
| + SkBitmap bitmap;
|
| + REPORTER_ASSERT(reporter, image->asLegacyBitmap(&bitmap, mode));
|
| + check_legacy_bitmap(reporter, image, bitmap, mode);
|
| +
|
| + // Test subsetting to exercise the rowBytes logic.
|
| + SkBitmap tmp;
|
| + REPORTER_ASSERT(reporter, bitmap.extractSubset(&tmp, SkIRect::MakeWH(image->width() / 2,
|
| + image->height() / 2)));
|
| + SkAutoTUnref<SkImage> subsetImage(SkImage::NewFromBitmap(tmp));
|
| + REPORTER_ASSERT(reporter, subsetImage);
|
| +
|
| + SkBitmap subsetBitmap;
|
| + REPORTER_ASSERT(reporter, subsetImage->asLegacyBitmap(&subsetBitmap, mode));
|
| + check_legacy_bitmap(reporter, subsetImage, subsetBitmap, mode);
|
| +}
|
| +DEF_TEST(ImageLegacyBitmap, reporter) {
|
| const SkImage::LegacyBitmapMode modes[] = {
|
| SkImage::kRO_LegacyBitmapMode,
|
| SkImage::kRW_LegacyBitmapMode,
|
| };
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) {
|
| - SkBitmap bitmap;
|
| - REPORTER_ASSERT(reporter, image->asLegacyBitmap(&bitmap, modes[i]));
|
| - check_legacy_bitmap(reporter, image, bitmap, modes[i]);
|
| -
|
| - // Test subsetting to exercise the rowBytes logic.
|
| - SkBitmap tmp;
|
| - REPORTER_ASSERT(reporter, bitmap.extractSubset(&tmp, SkIRect::MakeWH(image->width() / 2,
|
| - image->height() / 2)));
|
| - SkAutoTUnref<SkImage> subsetImage(SkImage::NewFromBitmap(tmp));
|
| - REPORTER_ASSERT(reporter, subsetImage);
|
| -
|
| - SkBitmap subsetBitmap;
|
| - REPORTER_ASSERT(reporter, subsetImage->asLegacyBitmap(&subsetBitmap, modes[i]));
|
| - check_legacy_bitmap(reporter, subsetImage, subsetBitmap, modes[i]);
|
| - }
|
| -}
|
| + for (auto& mode : modes) {
|
| + SkAutoTUnref<SkImage> image(create_image());
|
| + test_legacy_bitmap(reporter, image, mode);
|
|
|
| -static void test_imagepeek(skiatest::Reporter* reporter, GrContextFactory* factory) {
|
| - static const struct {
|
| - ImageType fType;
|
| - bool fPeekShouldSucceed;
|
| - const char* fName;
|
| - } gRec[] = {
|
| - { kRasterCopy_ImageType, true, "RasterCopy" },
|
| - { kRasterData_ImageType, true, "RasterData" },
|
| - { kRasterProc_ImageType, true, "RasterProc" },
|
| - { kGpu_ImageType, false, "Gpu" },
|
| - { kCodec_ImageType, false, "Codec" },
|
| - };
|
| + image.reset(create_data_image());
|
| + test_legacy_bitmap(reporter, image, mode);
|
|
|
| - const SkColor color = SK_ColorRED;
|
| - const SkPMColor pmcolor = SkPreMultiplyColor(color);
|
| + RasterDataHolder dataHolder;
|
| + image.reset(create_rasterproc_image(&dataHolder));
|
| + test_legacy_bitmap(reporter, image, mode);
|
| + image.reset();
|
| + REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
|
|
|
| - GrContext* ctx = nullptr;
|
| + image.reset(create_codec_image());
|
| + test_legacy_bitmap(reporter, image, mode);
|
| + }
|
| +}
|
| #if SK_SUPPORT_GPU
|
| - ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (nullptr == ctx) {
|
| - return;
|
| +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageLegacyBitmap_Gpu, reporter, context) {
|
| + const SkImage::LegacyBitmapMode modes[] = {
|
| + SkImage::kRO_LegacyBitmapMode,
|
| + SkImage::kRW_LegacyBitmapMode,
|
| + };
|
| + for (auto& mode : modes) {
|
| + SkAutoTUnref<SkImage> image(create_gpu_image(context));
|
| + test_legacy_bitmap(reporter, image, mode);
|
| }
|
| +}
|
| #endif
|
|
|
| - ReleaseDataContext releaseCtx;
|
| - releaseCtx.fReporter = reporter;
|
| -
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
|
| - SkImageInfo info;
|
| - size_t rowBytes;
|
| -
|
| - releaseCtx.fData = nullptr;
|
| - SkAutoTUnref<SkImage> image(create_image(reporter, gRec[i].fType, ctx, color, &releaseCtx));
|
| - if (!image.get()) {
|
| - SkDebugf("failed to createImage[%d] %s\n", i, gRec[i].fName);
|
| - continue; // gpu may not be enabled
|
| - }
|
| - if (kRasterProc_ImageType == gRec[i].fType) {
|
| - REPORTER_ASSERT(reporter, nullptr != releaseCtx.fData); // we are tracking the data
|
| - } else {
|
| - REPORTER_ASSERT(reporter, nullptr == releaseCtx.fData); // we ignored the context
|
| - }
|
| -
|
| - test_legacy_bitmap(reporter, image);
|
| -
|
| - const void* addr = image->peekPixels(&info, &rowBytes);
|
| - bool success = SkToBool(addr);
|
| - REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success);
|
| - if (success) {
|
| - REPORTER_ASSERT(reporter, 10 == info.width());
|
| - REPORTER_ASSERT(reporter, 10 == info.height());
|
| - REPORTER_ASSERT(reporter, kN32_SkColorType == info.colorType());
|
| - REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.alphaType() ||
|
| - kOpaque_SkAlphaType == info.alphaType());
|
| - REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes);
|
| - REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr);
|
| - }
|
| -
|
| - test_image_readpixels(reporter, image, pmcolor);
|
| +static void test_peek(skiatest::Reporter* reporter, SkImage* image, bool expectPeekSuccess) {
|
| + SkImageInfo info;
|
| + size_t rowBytes;
|
| + const void* addr = image->peekPixels(&info, &rowBytes);
|
| + bool success = SkToBool(addr);
|
| + REPORTER_ASSERT(reporter, expectPeekSuccess == success);
|
| + if (success) {
|
| + REPORTER_ASSERT(reporter, 20 == info.width());
|
| + REPORTER_ASSERT(reporter, 20 == info.height());
|
| + REPORTER_ASSERT(reporter, kN32_SkColorType == info.colorType());
|
| + REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.alphaType() ||
|
| + kOpaque_SkAlphaType == info.alphaType());
|
| + REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes);
|
| + REPORTER_ASSERT(reporter, SkPreMultiplyColor(SK_ColorWHITE) == *(const SkPMColor*)addr);
|
| }
|
| - REPORTER_ASSERT(reporter, nullptr == releaseCtx.fData); // we released the data
|
| }
|
| -#if SK_SUPPORT_GPU
|
| +DEF_TEST(ImagePeek, reporter) {
|
| + SkAutoTUnref<SkImage> image(create_image());
|
| + test_peek(reporter, image, true);
|
|
|
| -struct ReleaseTextureContext {
|
| - ReleaseTextureContext(skiatest::Reporter* reporter) {
|
| - fReporter = reporter;
|
| - fIsReleased = false;
|
| - }
|
| + image.reset(create_data_image());
|
| + test_peek(reporter, image, true);
|
|
|
| - skiatest::Reporter* fReporter;
|
| - bool fIsReleased;
|
| + RasterDataHolder dataHolder;
|
| + image.reset(create_rasterproc_image(&dataHolder));
|
| + test_peek(reporter, image, true);
|
| + image.reset();
|
| + REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
|
|
|
| - void doRelease() {
|
| - REPORTER_ASSERT(fReporter, false == fIsReleased);
|
| - fIsReleased = true;
|
| - }
|
| + image.reset(create_codec_image());
|
| + test_peek(reporter, image, false);
|
| +}
|
| +#if SK_SUPPORT_GPU
|
| +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImagePeek_Gpu, reporter, context) {
|
| + SkAutoTUnref<SkImage> image(create_gpu_image(context));
|
| + test_peek(reporter, image, false);
|
| +}
|
| +#endif
|
|
|
| - static void ReleaseProc(void* context) {
|
| - ((ReleaseTextureContext*)context)->doRelease();
|
| +#if SK_SUPPORT_GPU
|
| +struct TextureReleaseChecker {
|
| + TextureReleaseChecker() : fReleaseCount(0) {}
|
| + int fReleaseCount;
|
| + static void Release(void* self) {
|
| + static_cast<TextureReleaseChecker*>(self)->fReleaseCount++;
|
| }
|
| };
|
| -
|
| -static SkImage* make_desc_image(GrContext* ctx, int w, int h, GrBackendObject texID,
|
| - ReleaseTextureContext* releaseContext) {
|
| - GrBackendTextureDesc desc;
|
| - desc.fConfig = kSkia8888_GrPixelConfig;
|
| - // need to be a rendertarget for now...
|
| - desc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
| - desc.fWidth = w;
|
| - desc.fHeight = h;
|
| - desc.fSampleCnt = 0;
|
| - desc.fTextureHandle = texID;
|
| - return releaseContext
|
| - ? SkImage::NewFromTexture(ctx, desc, kPremul_SkAlphaType,
|
| - ReleaseTextureContext::ReleaseProc, releaseContext)
|
| - : SkImage::NewFromTextureCopy(ctx, desc, kPremul_SkAlphaType);
|
| -}
|
| -
|
| -static void test_image_color(skiatest::Reporter* reporter, SkImage* image, SkPMColor expected) {
|
| +static void check_image_color(skiatest::Reporter* reporter, SkImage* image, SkPMColor expected) {
|
| const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
|
| SkPMColor pixel;
|
| REPORTER_ASSERT(reporter, image->readPixels(info, &pixel, sizeof(pixel), 0, 0));
|
| REPORTER_ASSERT(reporter, pixel == expected);
|
| }
|
| -
|
| -DEF_GPUTEST(SkImage_NewFromTexture, reporter, factory) {
|
| - GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (!ctx) {
|
| - REPORTER_ASSERT(reporter, false);
|
| - return;
|
| - }
|
| - GrTextureProvider* provider = ctx->textureProvider();
|
| -
|
| +DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_NewFromTexture, reporter, context) {
|
| + GrTextureProvider* provider = context->textureProvider();
|
| const int w = 10;
|
| const int h = 10;
|
| SkPMColor storage[w * h];
|
| const SkPMColor expected0 = SkPreMultiplyColor(SK_ColorRED);
|
| sk_memset32(storage, expected0, w * h);
|
| -
|
| GrSurfaceDesc desc;
|
| desc.fFlags = kRenderTarget_GrSurfaceFlag; // needs to be a rendertarget for readpixels();
|
| desc.fOrigin = kDefault_GrSurfaceOrigin;
|
| @@ -681,21 +632,28 @@ DEF_GPUTEST(SkImage_NewFromTexture, reporter, factory) {
|
| desc.fHeight = h;
|
| desc.fConfig = kSkia8888_GrPixelConfig;
|
| desc.fSampleCnt = 0;
|
| -
|
| SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, false, storage, w * 4));
|
| if (!tex) {
|
| REPORTER_ASSERT(reporter, false);
|
| return;
|
| }
|
|
|
| - GrBackendObject srcTex = tex->getTextureHandle();
|
| - ReleaseTextureContext releaseCtx(reporter);
|
| -
|
| - SkAutoTUnref<SkImage> refImg(make_desc_image(ctx, w, h, srcTex, &releaseCtx));
|
| - SkAutoTUnref<SkImage> cpyImg(make_desc_image(ctx, w, h, srcTex, nullptr));
|
| -
|
| - test_image_color(reporter, refImg, expected0);
|
| - test_image_color(reporter, cpyImg, expected0);
|
| + GrBackendTextureDesc backendDesc;
|
| + backendDesc.fConfig = kSkia8888_GrPixelConfig;
|
| + backendDesc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
| + backendDesc.fWidth = w;
|
| + backendDesc.fHeight = h;
|
| + backendDesc.fSampleCnt = 0;
|
| + backendDesc.fTextureHandle = tex->getTextureHandle();
|
| + TextureReleaseChecker releaseChecker;
|
| + SkAutoTUnref<SkImage> refImg(
|
| + SkImage::NewFromTexture(context, backendDesc, kPremul_SkAlphaType,
|
| + TextureReleaseChecker::Release, &releaseChecker));
|
| + SkAutoTUnref<SkImage> cpyImg(SkImage::NewFromTextureCopy(context, backendDesc,
|
| + kPremul_SkAlphaType));
|
| +
|
| + check_image_color(reporter, refImg, expected0);
|
| + check_image_color(reporter, cpyImg, expected0);
|
|
|
| // Now lets jam new colors into our "external" texture, and see if the images notice
|
| const SkPMColor expected1 = SkPreMultiplyColor(SK_ColorBLUE);
|
| @@ -706,18 +664,13 @@ DEF_GPUTEST(SkImage_NewFromTexture, reporter, factory) {
|
| #if 0
|
| // There is no guarantee that refImg sees the new color. We are free to have made a copy. Our
|
| // write pixels call violated the contract with refImg and refImg is now undefined.
|
| - test_image_color(reporter, refImg, expected1);
|
| + check_image_color(reporter, refImg, expected1);
|
| #endif
|
| - test_image_color(reporter, cpyImg, expected0);
|
| + check_image_color(reporter, cpyImg, expected0);
|
|
|
| // Now exercise the release proc
|
| - REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased);
|
| + REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
|
| refImg.reset(nullptr); // force a release of the image
|
| - REPORTER_ASSERT(reporter, releaseCtx.fIsReleased);
|
| + REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
|
| }
|
| #endif
|
| -DEF_GPUTEST(ImageTestsFromSurfaceTestsTODO, reporter, factory) {
|
| - test_image(reporter);
|
| - test_empty_image(reporter);
|
| - test_imagepeek(reporter, factory);
|
| -}
|
|
|