Add FPDFEditEmbedderTest.ExtractImageBitmapIgnoresSetMatrix.
Demonstrate another potentially unexpected behavior with
FPDFImageObj_GetBitmap(). Also consolidate a commonly used checksum
value into a constant.
Bug: pdfium:1554
Change-Id: I60327d50c1c1c61bc531c1022bd9cb3c0dfcab10
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/71494
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 2630945..10f950e 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -75,6 +75,9 @@
const char kRedRectangleChecksum[] = "66d02eaa6181e2c069ce2ea99beda497";
+// In embedded_images.pdf.
+const char kEmbeddedImage33Checksum[] = "cb3637934bb3b95a6e4ae1ea9eb9e56e";
+
} // namespace
class FPDFEditEmbedderTest : public EmbedderTest {
@@ -3184,7 +3187,7 @@
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
- CompareBitmap(bitmap.get(), 109, 88, "cb3637934bb3b95a6e4ae1ea9eb9e56e");
+ CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
}
{
@@ -3230,6 +3233,63 @@
UnloadPage(page);
}
+// TODO(crbug.com/pdfium/1554): Fix FPDFImageObj_GetBitmap() to take the matrix
+// into account, or provide a new API to do that.
+TEST_F(FPDFEditEmbedderTest, ExtractImageBitmapIgnoresSetMatrix) {
+ ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
+ FPDF_PAGE page = LoadPage(0);
+ ASSERT_TRUE(page);
+ ASSERT_EQ(39, FPDFPage_CountObjects(page));
+
+ FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 33);
+ ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
+
+ {
+ // Render |obj| as is.
+ ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
+ EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
+ CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
+ }
+
+ // Check the matrix for |obj|.
+ double a;
+ double b;
+ double c;
+ double d;
+ double e;
+ double f;
+ EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
+ EXPECT_DOUBLE_EQ(53.0, a);
+ EXPECT_DOUBLE_EQ(0.0, b);
+ EXPECT_DOUBLE_EQ(0.0, c);
+ EXPECT_DOUBLE_EQ(43.0, d);
+ EXPECT_DOUBLE_EQ(72.0, e);
+ EXPECT_DOUBLE_EQ(646.510009765625, f);
+
+ // Modify the matrix for |obj|.
+ a = 120.0;
+ EXPECT_TRUE(FPDFImageObj_SetMatrix(obj, a, b, c, d, e, f));
+
+ // Make sure the matrix modification took place.
+ EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
+ EXPECT_DOUBLE_EQ(120.0, a);
+ EXPECT_DOUBLE_EQ(0.0, b);
+ EXPECT_DOUBLE_EQ(0.0, c);
+ EXPECT_DOUBLE_EQ(43.0, d);
+ EXPECT_DOUBLE_EQ(72.0, e);
+ EXPECT_DOUBLE_EQ(646.510009765625, f);
+
+ {
+ // Render |obj| again. Note that the FPDFImageObj_SetMatrix() call has no
+ // effect.
+ ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
+ EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
+ CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
+ }
+
+ UnloadPage(page);
+}
+
TEST_F(FPDFEditEmbedderTest, ExtractJBigImageBitmap) {
ASSERT_TRUE(OpenDocument("bug_631912.pdf"));
FPDF_PAGE page = LoadPage(0);
@@ -3292,7 +3352,7 @@
buf.clear();
buf.resize(len);
EXPECT_EQ(28776u, FPDFImageObj_GetImageDataDecoded(obj, buf.data(), len));
- EXPECT_EQ("cb3637934bb3b95a6e4ae1ea9eb9e56e",
+ EXPECT_EQ(kEmbeddedImage33Checksum,
GenerateMD5Base16(reinterpret_cast<uint8_t*>(buf.data()), len));
// Retrieve an image object with DCTDecode-encoded data stream.