| Index: tests/ImageTest.cpp
|
| diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
|
| index d271966979a036325841658011bf5ca18e706edc..30e477ab53edbcb5508c8200a837ad1feaf2902e 100644
|
| --- a/tests/ImageTest.cpp
|
| +++ b/tests/ImageTest.cpp
|
| @@ -10,8 +10,11 @@
|
| #include "SkDevice.h"
|
| #include "SkImageEncoder.h"
|
| #include "SkImage_Base.h"
|
| +#include "SkPicture.h"
|
| +#include "SkPictureRecorder.h"
|
| #include "SkPixelSerializer.h"
|
| #include "SkRRect.h"
|
| +#include "SkStream.h"
|
| #include "SkSurface.h"
|
| #include "SkUtils.h"
|
| #include "Test.h"
|
| @@ -110,31 +113,75 @@ namespace {
|
| const char* kSerializedData = "serialized";
|
|
|
| class MockSerializer : public SkPixelSerializer {
|
| +public:
|
| + MockSerializer(SkData* (*func)()) : fFunc(func), fDidEncode(false) { }
|
| +
|
| + bool didEncode() const { return fDidEncode; }
|
| +
|
| protected:
|
| bool onUseEncodedData(const void*, size_t) override {
|
| return false;
|
| }
|
|
|
| SkData* onEncodePixels(const SkImageInfo&, const void*, size_t) override {
|
| - return SkData::NewWithCString(kSerializedData);
|
| + fDidEncode = true;
|
| + return fFunc();
|
| }
|
| +
|
| +private:
|
| + SkData* (*fFunc)();
|
| + bool fDidEncode;
|
| +
|
| + typedef SkPixelSerializer INHERITED;
|
| };
|
|
|
| } // anonymous namespace
|
|
|
| // Test that SkImage encoding observes custom pixel serializers.
|
| DEF_TEST(Image_Encode_Serializer, reporter) {
|
| - MockSerializer serializer;
|
| + 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<SkData> encoded(image->encode(&serializer));
|
| SkAutoTUnref<SkData> reference(SkData::NewWithCString(kSerializedData));
|
|
|
| + REPORTER_ASSERT(reporter, serializer.didEncode());
|
| REPORTER_ASSERT(reporter, encoded);
|
| REPORTER_ASSERT(reporter, encoded->size() > 0);
|
| REPORTER_ASSERT(reporter, encoded->equals(reference));
|
| }
|
|
|
| +// Test that image encoding failures do not break picture serialization/deserialization.
|
| +DEF_TEST(Image_Serialize_Encoding_Failure, reporter) {
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(100, 100));
|
| + surface->getCanvas()->clear(SK_ColorGREEN);
|
| + SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
|
| + REPORTER_ASSERT(reporter, image);
|
| +
|
| + SkPictureRecorder recorder;
|
| + SkCanvas* canvas = recorder.beginRecording(100, 100);
|
| + canvas->drawImage(image, 0, 0);
|
| + SkAutoTUnref<SkPicture> picture(recorder.endRecording());
|
| + REPORTER_ASSERT(reporter, picture);
|
| + REPORTER_ASSERT(reporter, picture->approximateOpCount() > 0);
|
| +
|
| + MockSerializer emptySerializer([]() -> SkData* { return SkData::NewEmpty(); });
|
| + MockSerializer nullSerializer([]() -> SkData* { return nullptr; });
|
| + MockSerializer* serializers[] = { &emptySerializer, &nullSerializer };
|
| +
|
| + for (size_t i = 0; i < SK_ARRAY_COUNT(serializers); ++i) {
|
| + SkDynamicMemoryWStream wstream;
|
| + REPORTER_ASSERT(reporter, !serializers[i]->didEncode());
|
| + picture->serialize(&wstream, serializers[i]);
|
| + REPORTER_ASSERT(reporter, serializers[i]->didEncode());
|
| +
|
| + SkAutoTDelete<SkStream> rstream(wstream.detachAsStream());
|
| + SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rstream));
|
| + REPORTER_ASSERT(reporter, deserialized);
|
| + REPORTER_ASSERT(reporter, deserialized->approximateOpCount() > 0);
|
| + }
|
| +}
|
| +
|
| DEF_TEST(Image_NewRasterCopy, reporter) {
|
| const SkPMColor red = SkPackARGB32(0xFF, 0xFF, 0, 0);
|
| const SkPMColor green = SkPackARGB32(0xFF, 0, 0xFF, 0);
|
|
|