Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(554)

Unified Diff: third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp

Issue 1403393004: JPEGImageDecoder RGB565 and downsample support and related Skia imagegenerator changes Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Continued decoding fix and downscale combined Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp
index 514ebcf24035046ee73f3c5be5a4bf4faa782ca8..a4f5de44c6d904c8421b7a142d14925f361e014a 100644
--- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp
@@ -102,6 +102,95 @@ void readYUV(size_t maxDecodedBytes, unsigned* outputYWidth, unsigned* outputYHe
*outputUVHeight = uSize.height();
}
+static inline void compareDiffHelper(int c, int treshold, int &counter)
+{
+ if (c > treshold) {
+ ++counter;
+ }
+}
+
+static inline int max(int x, int y)
+{
+ return x > y ? x : y;
+}
+
+static void comparePixels(const SkBitmap &b1, const SkBitmap &b2, int treshold, int &countAboveTreshold, int componentTreshold, int &countComponentAboveTreshold)
+{
+ countAboveTreshold = 0;
+ countComponentAboveTreshold = 0;
+ for (int i = 0; i < b1.height(); ++i) {
+ for (int j = 0; j < b1.width(); ++j) {
+ SkColor c1 = b1.getColor(i, j);
+ SkColor c2 = b2.getColor(i, j);
+ unsigned a = abs((int)((c1 >> 24) & 0xFF) - (int)((c2 >> 24) & 0xFF));
+ unsigned r = abs((int)((c1 >> 16) & 0xFF) - (int)((c2 >> 16) & 0xFF));
+ unsigned g = abs((int)((c1 >> 8) & 0xFF) - (int)((c2 >> 8) & 0xFF));
+ unsigned b = abs((int)(c1 & 0xFF) - (int)(c2 & 0xFF));
+
+ int diff = a + r + g + b;
+ int c = max(max(a, r), max(g, b));
+ compareDiffHelper(c, componentTreshold, countComponentAboveTreshold);
+ compareDiffHelper(diff, treshold, countAboveTreshold);
+ }
+ }
+}
+
+static bool isNull(const SkBitmap& b)
+{
+ for (int i = 0; i < b.height(); ++i) {
+ for (int j = 0; j < b.width(); ++j) {
+ if (b.getColor(i, j) != 0)
+ return false;
+ }
+ }
+ return true;
+}
+
+static void testRGB565Quality(const char* imageFilePath)
+{
+ RefPtr<SharedBuffer> data = readFile(imageFilePath);
+ ASSERT_TRUE(data);
+
+ OwnPtr<ImageDecoder> decoder = createDecoder();
+ decoder->setData(data.get(), true);
+
+ ImageFrame* frame = decoder->frameBufferAtIndex(0);
+ ASSERT_TRUE(frame);
+
+ OwnPtr<ImageDecoder> decoder565 = createDecoder();
+ decoder565->setData(data.get(), true);
+ ASSERT_TRUE(decoder565->activateDecodeAndScale(ImageFrame::RGB565));
+ ImageFrame* frame565 = decoder565->frameBufferAtIndex(0);
+ ASSERT_TRUE(frame565);
+
+ EXPECT_EQ(frame->getSkBitmap().width(), frame565->getSkBitmap().width());
+ EXPECT_EQ(frame->getSkBitmap().height(), frame565->getSkBitmap().height());
+ EXPECT_EQ(frame565->getSkBitmap().colorType(), kRGB_565_SkColorType);
+ frame->getSkBitmap().lockPixels();
+ frame565->getSkBitmap().lockPixels();
+ ASSERT_FALSE(isNull(frame565->getSkBitmap()));
+#if USE(QCMSLIB)
+ int diffTreshold = 15;
+ int componentDiffTreshold = 7;
+ float allowedDiff = 0.003f;
+ float allowedComponentsDiff = 0.005f;
+#else
+ int diffTreshold = 30;
+ int componentDiffTreshold = 15;
+ float allowedDiff = 0.027f;
+ float allowedComponentsDiff = 0.022f;
+#endif
+ int countAboveTreshold, countComponentAboveTreshold;
+ comparePixels(frame->getSkBitmap(), frame565->getSkBitmap(), diffTreshold, countAboveTreshold, componentDiffTreshold, countComponentAboveTreshold);
+ frame->getSkBitmap().unlockPixels();
+ frame565->getSkBitmap().unlockPixels();
+ // not real quality marker here, just a number to track regression
+ EXPECT_GE(allowedDiff, (float) countAboveTreshold / (float) (frame->getSkBitmap().width() * frame->getSkBitmap().height()))
+ << "Value measured and added when implementing this - once you hit this regressing, just check if all OK and update the value.";
+ EXPECT_GE(allowedComponentsDiff, (float) countComponentAboveTreshold / (float) (frame->getSkBitmap().width() * frame->getSkBitmap().height()))
+ << "Value measured and added when implementing this - once you hit this regressing, just check if all OK and update the value.";
+}
+
// Tests failure on a too big image.
TEST(JPEGImageDecoderTest, tooBig)
{
@@ -284,4 +373,11 @@ TEST(JPEGImageDecoderTest, mergeBuffer)
EXPECT_EQ(hashBitmap(frame->bitmap()), hash);
}
+TEST(JPEGImageDecoderTest, rgb565AndQuality)
+{
+ testRGB565Quality("/LayoutTests/fast/images/resources/cmyk-jpeg.jpg");
+ testRGB565Quality("/LayoutTests/fast/images/resources/ycbcr-with-no-color-profile.jpg");
+ testRGB565Quality("/LayoutTests/fast/images/resources/red-at-12-oclock-with-color-profile.jpg");
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698