aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/AndroidCodecTest.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/AndroidCodecTest.cpp b/tests/AndroidCodecTest.cpp
index b86a210279..d383713bb9 100644
--- a/tests/AndroidCodecTest.cpp
+++ b/tests/AndroidCodecTest.cpp
@@ -7,7 +7,9 @@
#include "SkAndroidCodec.h"
#include "SkCodec.h"
+#include "SkCodecImageGenerator.h"
#include "SkEncodedImageFormat.h"
+#include "SkPixmapPriv.h"
#include "Resources.h"
#include "Test.h"
@@ -117,3 +119,69 @@ DEF_TEST(AndroidCodec_computeSampleSize, r) {
}
}
}
+
+DEF_TEST(AndroidCodec_orientation, r) {
+ if (GetResourcePath().isEmpty()) {
+ return;
+ }
+
+ for (const char* ext : { "jpg", "webp" })
+ for (char i = '1'; i <= '8'; ++i) {
+ SkString path = SkStringPrintf("images/orientation/%c.%s", i, ext);
+ auto data = GetResourceAsData(path.c_str());
+ auto gen = SkCodecImageGenerator::MakeFromEncodedCodec(data);
+ if (!gen) {
+ ERRORF(r, "failed to decode %s", path.c_str());
+ return;
+ }
+
+ // Dimensions after adjusting for the origin.
+ const SkISize expectedDims = { 100, 80 };
+
+ // SkCodecImageGenerator automatically adjusts for the origin.
+ REPORTER_ASSERT(r, gen->getInfo().dimensions() == expectedDims);
+
+ auto androidCodec = SkAndroidCodec::MakeFromCodec(SkCodec::MakeFromData(data));
+ if (!androidCodec) {
+ ERRORF(r, "failed to decode %s", path.c_str());
+ return;
+ }
+
+ // SkAndroidCodec does not adjust for the origin by default. Dimensions may be reversed.
+ if (SkPixmapPriv::ShouldSwapWidthHeight(androidCodec->codec()->getOrigin())) {
+ auto swappedDims = SkPixmapPriv::SwapWidthHeight(androidCodec->getInfo()).dimensions();
+ REPORTER_ASSERT(r, expectedDims == swappedDims);
+ } else {
+ REPORTER_ASSERT(r, expectedDims == androidCodec->getInfo().dimensions());
+ }
+
+ // Passing kRespect adjusts for the origin.
+ androidCodec = SkAndroidCodec::MakeFromCodec(SkCodec::MakeFromData(std::move(data)),
+ SkAndroidCodec::ExifOrientationBehavior::kRespect);
+ auto info = androidCodec->getInfo();
+ REPORTER_ASSERT(r, info.dimensions() == expectedDims);
+
+ SkBitmap fromGenerator;
+ fromGenerator.allocPixels(info);
+ REPORTER_ASSERT(r, gen->getPixels(info, fromGenerator.getPixels(),
+ fromGenerator.rowBytes()));
+
+ SkBitmap fromAndroidCodec;
+ fromAndroidCodec.allocPixels(info);
+ auto result = androidCodec->getPixels(info, fromAndroidCodec.getPixels(),
+ fromAndroidCodec.rowBytes());
+ REPORTER_ASSERT(r, result == SkCodec::kSuccess);
+
+ for (int i = 0; i < info.width(); ++i)
+ for (int j = 0; j < info.height(); ++j) {
+ SkColor c1 = *fromGenerator .getAddr32(i, j);
+ SkColor c2 = *fromAndroidCodec.getAddr32(i, j);
+ if (c1 != c2) {
+ ERRORF(r, "Bitmaps for %s do not match starting at position %i, %i\n"
+ "\tfromGenerator: %x\tfromAndroidCodec: %x", path.c_str(), i, j,
+ c1, c2);
+ return;
+ }
+ }
+ }
+}