Add a test to show FPDFImageObj_GetBitmap() does not handle masks. Make a copy of testing/resources/pixel/matte.in and the corresponding generated PDF for use by embedder tests. Add a test to extract the images from it. Show that they are all the same, even though they are different when rendered in the PDF. Bug: pdfium:1554 Change-Id: Iced360086b21c0d93a3baeebb95615546c8e6fa3 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/71094 Reviewed-by: Daniel Hosseinian <dhoss@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index cffeb7c..8c75afc 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -3241,6 +3241,28 @@ UnloadPage(page); } +// TODO(crbug.com/pdfium/1554): Fix FPDFImageObj_GetBitmap() to take /SMask into +// account, or provide a new API to do that. +TEST_F(FPDFEditEmbedderTest, ExtractSMaskBitmap) { + ASSERT_TRUE(OpenDocument("matte.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + constexpr int kExpectedObjects = 4; + ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page)); + + for (int i = 0; i < kExpectedObjects; ++i) { + FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i); + ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj)); + ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj)); + ASSERT_TRUE(bitmap); + EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get())); + CompareBitmap(bitmap.get(), 50, 50, "46c9a1dbe0b44765ce46017ad629a2fe"); + } + + UnloadPage(page); +} + TEST_F(FPDFEditEmbedderTest, GetImageData) { EXPECT_TRUE(OpenDocument("embedded_images.pdf")); FPDF_PAGE page = LoadPage(0);
diff --git a/testing/resources/matte.in b/testing/resources/matte.in new file mode 100644 index 0000000..57d8e13 --- /dev/null +++ b/testing/resources/matte.in
@@ -0,0 +1,172 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 100 150] + /Contents [4 0 R] + /Resources << + /XObject << + /Mask 5 0 R + /NoMask 7 0 R + /MaskTooFewComps 9 0 R + /MaskTooManyComps 11 0 R + >> + >> +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +40 0 0 60 0 0 cm +/Mask Do +Q +q +40 0 0 60 50 0 cm +/NoMask Do +Q +q +40 0 0 60 0 90 cm +/MaskTooFewComps Do +Q +q +40 0 0 60 50 90 cm +/MaskTooManyComps Do +Q +endstream +endobj +{{object 5 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 6 0 R + {{streamlen}} +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +{{object 6 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2 1] + {{streamlen}} +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +{{object 7 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 8 0 R + {{streamlen}} +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +{{object 8 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + {{streamlen}} +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +{{object 9 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 10 0 R + {{streamlen}} +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +{{object 10 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2] + {{streamlen}} +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +{{object 11 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 12 0 R + {{streamlen}} +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +{{object 12 0}} << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2 1 0.5] + {{streamlen}} +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF
diff --git a/testing/resources/matte.pdf b/testing/resources/matte.pdf new file mode 100644 index 0000000..05d1ecd --- /dev/null +++ b/testing/resources/matte.pdf
@@ -0,0 +1,191 @@ +%PDF-1.7 +% ò¤ô +1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +endobj +2 0 obj << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 100 150] + /Contents [4 0 R] + /Resources << + /XObject << + /Mask 5 0 R + /NoMask 7 0 R + /MaskTooFewComps 9 0 R + /MaskTooManyComps 11 0 R + >> + >> +>> +endobj +4 0 obj << + /Length 149 +>> +stream +q +40 0 0 60 0 0 cm +/Mask Do +Q +q +40 0 0 60 50 0 cm +/NoMask Do +Q +q +40 0 0 60 0 90 cm +/MaskTooFewComps Do +Q +q +40 0 0 60 50 90 cm +/MaskTooManyComps Do +Q +endstream +endobj +5 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 6 0 R + /Length 71 +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +6 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2 1] + /Length 71 +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +7 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 8 0 R + /Length 71 +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +8 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Length 71 +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +9 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 10 0 R + /Length 71 +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +10 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2] + /Length 71 +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +11 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceRGB + /Filter [/ASCIIHexDecode /FlateDecode] + /SMask 12 0 R + /Length 71 +>> +stream +789cedc2310d00000c03a07f2aaab3ea7bcf03842655555555555555f5bf01cc7818dc +endstream +endobj +12 0 obj << + /Type /XObject + /Subtype /Image + /Width 50 + /Height 50 + /BitsPerComponent 8 + /ColorSpace /DeviceGray + /Filter [/ASCIIHexDecode /FlateDecode] + /Matte [0.0 0.2 1 0.5] + /Length 71 +>> +stream +789cabaa1a05a3808e4061148c027a028351300ae809a246c128a027e0020065c9c90d +endstream +endobj +xref +0 13 +0000000000 65535 f +0000000015 00000 n +0000000068 00000 n +0000000131 00000 n +0000000370 00000 n +0000000571 00000 n +0000000856 00000 n +0000001148 00000 n +0000001433 00000 n +0000001704 00000 n +0000001990 00000 n +0000002281 00000 n +0000002568 00000 n +trailer << + /Root 1 0 R + /Size 13 +>> +startxref +2865 +%%EOF