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

Unified Diff: ui/gfx/codec/png_codec_unittest.cc

Issue 2943433002: Revert of Remove FORMAT_RGB from gfx::PngCodec (Closed)
Patch Set: Created 3 years, 6 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
« no previous file with comments | « ui/gfx/codec/png_codec.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/codec/png_codec_unittest.cc
diff --git a/ui/gfx/codec/png_codec_unittest.cc b/ui/gfx/codec/png_codec_unittest.cc
index faf665d670847e0536356aa51e075322ad6462f0..b0d1e3de40e98c3dbee5e956c57ef9d93130c065 100644
--- a/ui/gfx/codec/png_codec_unittest.cc
+++ b/ui/gfx/codec/png_codec_unittest.cc
@@ -276,6 +276,34 @@
src_data[i] = i % 255;
}
+TEST(PNGCodec, EncodeDecodeRGB) {
+ const int w = 20, h = 20;
+
+ // create an image with known values
+ std::vector<unsigned char> original;
+ MakeRGBImage(w, h, &original);
+
+ // encode
+ std::vector<unsigned char> encoded;
+ ASSERT_TRUE(PNGCodec::Encode(&original[0], PNGCodec::FORMAT_RGB,
+ Size(w, h), w * 3, false,
+ std::vector<PNGCodec::Comment>(),
+ &encoded));
+
+ // decode, it should have the same size as the original
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(original.size(), decoded.size());
+
+ // Images must be equal
+ ASSERT_TRUE(original == decoded);
+}
+
TEST(PNGCodec, EncodeDecodeRGBA) {
const int w = 20, h = 20;
@@ -379,6 +407,49 @@
}
}
+TEST(PNGCodec, DecodePaletteDiscardAlpha) {
+ const int w = 20, h = 20;
+
+ // create an image with known values
+ std::vector<unsigned char> original;
+ std::vector<png_color> original_palette;
+ std::vector<unsigned char> original_trans_chunk;
+ MakePaletteImage(w, h, &original, &original_palette, &original_trans_chunk);
+
+ // encode
+ std::vector<unsigned char> encoded;
+ ASSERT_TRUE(EncodeImage(original,
+ w, h,
+ COLOR_TYPE_PALETTE,
+ &encoded,
+ PNG_INTERLACE_NONE,
+ &original_palette,
+ &original_trans_chunk));
+
+ // decode
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(decoded.size(), w * h * 3U);
+
+ // Images must be equal
+ for (int y = 0; y < h; ++y) {
+ for (int x = 0; x < w; ++x) {
+ unsigned char palette_pixel = original[y * w + x];
+ png_color& palette_color = original_palette[palette_pixel];
+ unsigned char* rgba_pixel = &decoded[(y * w + x) * 3];
+
+ EXPECT_EQ(palette_color.red, rgba_pixel[0]);
+ EXPECT_EQ(palette_color.green, rgba_pixel[1]);
+ EXPECT_EQ(palette_color.blue, rgba_pixel[2]);
+ }
+ }
+}
+
TEST(PNGCodec, DecodeInterlacedPalette) {
const int w = 20, h = 20;
@@ -439,20 +510,20 @@
std::vector<unsigned char> decoded;
int outw, outh;
ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
- PNGCodec::FORMAT_RGBA, &decoded, &outw, &outh));
- ASSERT_EQ(w, outw);
- ASSERT_EQ(h, outh);
- ASSERT_EQ(decoded.size(), original.size() * 4);
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(decoded.size(), original.size() * 3);
// Images must be equal
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
unsigned char gray_pixel = original[(y * w + x)];
- unsigned char* rgba_pixel = &decoded[(y * w + x) * 4];
+ unsigned char* rgba_pixel = &decoded[(y * w + x) * 3];
EXPECT_EQ(rgba_pixel[0], gray_pixel);
EXPECT_EQ(rgba_pixel[1], gray_pixel);
EXPECT_EQ(rgba_pixel[2], gray_pixel);
- EXPECT_EQ(rgba_pixel[3], 0xff);
}
}
}
@@ -494,6 +565,42 @@
}
}
+TEST(PNGCodec, DecodeGrayscaleWithAlphaDiscardAlpha) {
+ const int w = 20, h = 20;
+
+ // create an image with known values
+ std::vector<unsigned char> original;
+ MakeGrayscaleAlphaImage(w, h, &original);
+
+ // encode
+ std::vector<unsigned char> encoded;
+ ASSERT_TRUE(EncodeImage(original,
+ w, h,
+ COLOR_TYPE_GRAY_ALPHA,
+ &encoded));
+
+ // decode
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(decoded.size(), w * h * 3U);
+
+ // Images must be equal
+ for (int y = 0; y < h; ++y) {
+ for (int x = 0; x < w; ++x) {
+ unsigned char* gray_pixel = &original[(y * w + x) * 2];
+ unsigned char* rgba_pixel = &decoded[(y * w + x) * 3];
+ EXPECT_EQ(rgba_pixel[0], gray_pixel[0]);
+ EXPECT_EQ(rgba_pixel[1], gray_pixel[0]);
+ EXPECT_EQ(rgba_pixel[2], gray_pixel[0]);
+ }
+ }
+}
+
TEST(PNGCodec, DecodeInterlacedGrayscale) {
const int w = 20, h = 20;
@@ -570,6 +677,35 @@
}
}
+TEST(PNGCodec, DecodeInterlacedRGB) {
+ const int w = 20, h = 20;
+
+ // create an image with known values
+ std::vector<unsigned char> original;
+ MakeRGBImage(w, h, &original);
+
+ // encode
+ std::vector<unsigned char> encoded;
+ ASSERT_TRUE(EncodeImage(original,
+ w, h,
+ COLOR_TYPE_RGB,
+ &encoded,
+ PNG_INTERLACE_ADAM7));
+
+ // decode, it should have the same size as the original
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(original.size(), decoded.size());
+
+ // Images must be equal
+ ASSERT_EQ(original, decoded);
+}
+
TEST(PNGCodec, DecodeInterlacedRGBA) {
const int w = 20, h = 20;
@@ -597,6 +733,43 @@
// Images must be equal
ASSERT_EQ(original, decoded);
+}
+
+TEST(PNGCodec, DecodeInterlacedRGBADiscardAlpha) {
+ const int w = 20, h = 20;
+
+ // create an image with known values
+ std::vector<unsigned char> original;
+ MakeRGBAImage(w, h, false, &original);
+
+ // encode
+ std::vector<unsigned char> encoded;
+ ASSERT_TRUE(EncodeImage(original,
+ w, h,
+ COLOR_TYPE_RGBA,
+ &encoded,
+ PNG_INTERLACE_ADAM7));
+
+ // decode
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ ASSERT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(decoded.size(), w * h * 3U);
+
+ // Images must be equal
+ for (int x = 0; x < w; x++) {
+ for (int y = 0; y < h; y++) {
+ unsigned char* orig_px = &original[(y * w + x) * 4];
+ unsigned char* dec_px = &decoded[(y * w + x) * 3];
+ EXPECT_EQ(dec_px[0], orig_px[0]);
+ EXPECT_EQ(dec_px[1], orig_px[1]);
+ EXPECT_EQ(dec_px[2], orig_px[2]);
+ }
+ }
}
TEST(PNGCodec, DecodeInterlacedBGR) {
@@ -739,29 +912,80 @@
// Make some random data (an uncompressed image).
std::vector<unsigned char> original;
- MakeRGBAImage(w, h, false, &original);
-
- // It should fail when given non-PNG compressed data.
+ MakeRGBImage(w, h, &original);
+
+ // It should fail when given non-JPEG compressed data.
std::vector<unsigned char> output;
int outw, outh;
EXPECT_FALSE(PNGCodec::Decode(&original[0], original.size(),
- PNGCodec::FORMAT_RGBA, &output, &outw, &outh));
+ PNGCodec::FORMAT_RGB, &output,
+ &outw, &outh));
// Make some compressed data.
std::vector<unsigned char> compressed;
- ASSERT_TRUE(PNGCodec::Encode(&original[0], PNGCodec::FORMAT_RGBA, Size(w, h),
- w * 4, false, std::vector<PNGCodec::Comment>(),
+ ASSERT_TRUE(PNGCodec::Encode(&original[0], PNGCodec::FORMAT_RGB,
+ Size(w, h), w * 3, false,
+ std::vector<PNGCodec::Comment>(),
&compressed));
// Try decompressing a truncated version.
EXPECT_FALSE(PNGCodec::Decode(&compressed[0], compressed.size() / 2,
- PNGCodec::FORMAT_RGBA, &output, &outw, &outh));
+ PNGCodec::FORMAT_RGB, &output,
+ &outw, &outh));
// Corrupt it and try decompressing that.
for (int i = 10; i < 30; i++)
compressed[i] = i;
EXPECT_FALSE(PNGCodec::Decode(&compressed[0], compressed.size(),
- PNGCodec::FORMAT_RGBA, &output, &outw, &outh));
+ PNGCodec::FORMAT_RGB, &output,
+ &outw, &outh));
+}
+
+TEST(PNGCodec, StripAddAlpha) {
+ const int w = 20, h = 20;
+
+ // These should be the same except one has a 0xff alpha channel.
+ std::vector<unsigned char> original_rgb;
+ MakeRGBImage(w, h, &original_rgb);
+ std::vector<unsigned char> original_rgba;
+ MakeRGBAImage(w, h, false, &original_rgba);
+
+ // Encode RGBA data as RGB.
+ std::vector<unsigned char> encoded;
+ EXPECT_TRUE(PNGCodec::Encode(&original_rgba[0], PNGCodec::FORMAT_RGBA,
+ Size(w, h), w * 4, true,
+ std::vector<PNGCodec::Comment>(),
+ &encoded));
+
+ // Decode the RGB to RGBA.
+ std::vector<unsigned char> decoded;
+ int outw, outh;
+ EXPECT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGBA, &decoded,
+ &outw, &outh));
+
+ // Decoded and reference should be the same (opaque alpha).
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(original_rgba.size(), decoded.size());
+ ASSERT_EQ(original_rgba, decoded);
+
+ // Encode RGBA to RGBA.
+ EXPECT_TRUE(PNGCodec::Encode(&original_rgba[0], PNGCodec::FORMAT_RGBA,
+ Size(w, h), w * 4, false,
+ std::vector<PNGCodec::Comment>(),
+ &encoded));
+
+ // Decode the RGBA to RGB.
+ EXPECT_TRUE(PNGCodec::Decode(&encoded[0], encoded.size(),
+ PNGCodec::FORMAT_RGB, &decoded,
+ &outw, &outh));
+
+ // It should be the same as our non-alpha-channel reference.
+ ASSERT_EQ(w, outw);
+ ASSERT_EQ(h, outh);
+ ASSERT_EQ(original_rgb.size(), decoded.size());
+ ASSERT_EQ(original_rgb, decoded);
}
TEST(PNGCodec, EncodeBGRASkBitmapStridePadded) {
@@ -901,15 +1125,15 @@
const int w = 10, h = 10;
std::vector<unsigned char> original;
- MakeRGBAImage(w, h, true, &original);
+ MakeRGBImage(w, h, &original);
std::vector<unsigned char> encoded;
std::vector<PNGCodec::Comment> comments;
comments.push_back(PNGCodec::Comment("key", "text"));
comments.push_back(PNGCodec::Comment("test", "something"));
comments.push_back(PNGCodec::Comment("have some", "spaces in both"));
- EXPECT_TRUE(PNGCodec::Encode(&original[0], PNGCodec::FORMAT_RGBA, Size(w, h),
- w * 4, false, comments, &encoded));
+ EXPECT_TRUE(PNGCodec::Encode(&original[0], PNGCodec::FORMAT_RGB,
+ Size(w, h), w * 3, false, comments, &encoded));
// Each chunk is of the form length (4 bytes), chunk type (tEXt), data,
// checksum (4 bytes). Make sure we find all of them in the encoded
« no previous file with comments | « ui/gfx/codec/png_codec.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698