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.