aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-07-26 19:42:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-07-26 19:42:04 -0700
commiteb560284c5a44389cd3f3b304839ea34a3e73398 (patch)
tree52a311e2b7f4b217353fb208b218d85cc5fb36b1
parent6ceef3dd67617c5f4572ada98d5ee85777d2db99 (diff)
add unittests for roundtripping premul
-rw-r--r--tests/ImageTest.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index 34660d84de..dd40f36089 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -938,3 +938,57 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DeferredTextureImage, reporter, ctxInfo) {
}
}
#endif
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void make_all_premul(SkBitmap* bm) {
+ bm->allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
+ for (int a = 0; a < 256; ++a) {
+ for (int r = 0; r < 256; ++r) {
+ // make all valid premul combinations
+ int c = SkTMin(a, r);
+ *bm->getAddr32(a, r) = SkPackARGB32(a, c, c, c);
+ }
+ }
+}
+
+static bool equal(const SkBitmap& a, const SkBitmap& b) {
+ SkASSERT(a.width() == b.width());
+ SkASSERT(a.height() == b.height());
+ for (int y = 0; y < a.height(); ++y) {
+ if (0 != memcmp(a.getAddr32(0, y), b.getAddr32(0, y), a.width() * sizeof(SkPMColor))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+DEF_TEST(image_roundtrip_encode, reporter) {
+ SkBitmap bm0;
+ make_all_premul(&bm0);
+
+ auto img0 = SkImage::MakeFromBitmap(bm0);
+ sk_sp<SkData> data(img0->encode(SkImageEncoder::kPNG_Type, 100));
+ auto img1 = SkImage::MakeFromEncoded(data);
+
+ SkBitmap bm1;
+ bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
+ img1->readPixels(bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0);
+
+ REPORTER_ASSERT(reporter, equal(bm0, bm1));
+}
+
+DEF_TEST(image_roundtrip_premul, reporter) {
+ SkBitmap bm0;
+ make_all_premul(&bm0);
+
+ SkBitmap bm1;
+ bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kUnpremul_SkAlphaType));
+ bm0.readPixels(bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0);
+
+ SkBitmap bm2;
+ bm2.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
+ bm1.readPixels(bm2.info(), bm2.getPixels(), bm2.rowBytes(), 0, 0);
+
+ REPORTER_ASSERT(reporter, equal(bm0, bm2));
+}