Add a test case for a PDF saving bug
Add a minimal embedder test case to illustate the issue in the
associated bug, where a no-op FPDFPageObj_SetMatrix() call causes the
saved PDF to have incorrect transformation matrices.
Bug: pdfium:2132
Change-Id: Ie14770fca6d15ecad40ace52eb2d9ff270d0cb07
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/116931
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/fpdfsdk/fpdf_editimg_embeddertest.cpp b/fpdfsdk/fpdf_editimg_embeddertest.cpp
index 4ae6deb..ebb6452 100644
--- a/fpdfsdk/fpdf_editimg_embeddertest.cpp
+++ b/fpdfsdk/fpdf_editimg_embeddertest.cpp
@@ -173,3 +173,53 @@
EXPECT_FLOAT_EQ(5.0f, matrix.e);
EXPECT_FLOAT_EQ(6.0f, matrix.f);
}
+
+TEST_F(PDFEditImgTest, Bug2132) {
+ constexpr int kExpectedWidth = 200;
+ constexpr int kExpectedHeight = 300;
+ constexpr char kExpectedChecksum[] = "617b1d57c30c516beee86e0781ff7810";
+
+ OpenDocument("bug_2132.pdf");
+ FPDF_PAGE page = LoadPage(0);
+ ASSERT_TRUE(page);
+
+ {
+ ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+ CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
+ kExpectedChecksum);
+ }
+
+ FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, 0);
+ ASSERT_TRUE(image);
+
+ FS_MATRIX matrix;
+ ASSERT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
+ EXPECT_FLOAT_EQ(60.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(30.0f, matrix.d);
+ EXPECT_FLOAT_EQ(0.0f, matrix.e);
+ EXPECT_FLOAT_EQ(270.0f, matrix.f);
+
+ ASSERT_TRUE(FPDFPageObj_SetMatrix(image, &matrix));
+ {
+ ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+ CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
+ kExpectedChecksum);
+ }
+
+ ASSERT_TRUE(FPDFPage_GenerateContent(page));
+ ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
+
+ {
+ ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+ CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
+ kExpectedChecksum);
+ }
+
+ UnloadPage(page);
+
+ // TODO(crbug.com/pdfium/2132): Should be `kExpectedChecksum`.
+ constexpr char kWrongChecksum[] = "d01c62c9ee094f5be545f006148808b5";
+ VerifySavedDocument(kExpectedWidth, kExpectedHeight, kWrongChecksum);
+}
diff --git a/testing/resources/bug_2132.in b/testing/resources/bug_2132.in
new file mode 100644
index 0000000..a5e6f92
--- /dev/null
+++ b/testing/resources/bug_2132.in
@@ -0,0 +1,53 @@
+{{header}}
+{{object 1 0}} <<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+{{object 2 0}} <<
+ /Type /Pages
+ /MediaBox [0 0 200 300]
+ /Count 1
+ /Kids [3 0 R]
+>>
+endobj
+{{object 3 0}} <<
+ /Type /Page
+ /Parent 2 0 R
+ /Contents 4 0 R
+ /Resources <<
+ /XObject <<
+ /Img 5 0 R
+ >>
+ >>
+>>
+endobj
+{{object 4 0}} <<
+ {{streamlen}}
+>>
+stream
+1 0 0 -1 0 300 cm
+q
+60 0 0 -30 0 30 cm
+/Img Do
+Q
+endstream
+endobj
+{{object 5 0}} <<
+ /Type /XObject
+ /Subtype /Image
+ /Width 50
+ /Height 50
+ /BitsPerComponent 8
+ /ColorSpace /DeviceRGB
+ /Filter [/ASCIIHexDecode /FlateDecode]
+ {{streamlen}}
+>>
+stream
+789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc
+endstream
+endobj
+{{xref}}
+{{trailer}}
+{{startxref}}
+%%EOF
diff --git a/testing/resources/bug_2132.pdf b/testing/resources/bug_2132.pdf
new file mode 100644
index 0000000..01dd97b
--- /dev/null
+++ b/testing/resources/bug_2132.pdf
@@ -0,0 +1,65 @@
+%PDF-1.7
+% ò¤ô
+1 0 obj <<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+2 0 obj <<
+ /Type /Pages
+ /MediaBox [0 0 200 300]
+ /Count 1
+ /Kids [3 0 R]
+>>
+endobj
+3 0 obj <<
+ /Type /Page
+ /Parent 2 0 R
+ /Contents 4 0 R
+ /Resources <<
+ /XObject <<
+ /Img 5 0 R
+ >>
+ >>
+>>
+endobj
+4 0 obj <<
+ /Length 49
+>>
+stream
+1 0 0 -1 0 300 cm
+q
+60 0 0 -30 0 30 cm
+/Img Do
+Q
+endstream
+endobj
+5 0 obj <<
+ /Type /XObject
+ /Subtype /Image
+ /Width 50
+ /Height 50
+ /BitsPerComponent 8
+ /ColorSpace /DeviceRGB
+ /Filter [/ASCIIHexDecode /FlateDecode]
+ /Length 71
+>>
+stream
+789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc
+endstream
+endobj
+xref
+0 6
+0000000000 65535 f
+0000000015 00000 n
+0000000068 00000 n
+0000000157 00000 n
+0000000287 00000 n
+0000000387 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 6
+>>
+startxref
+657
+%%EOF