From dc7ec035a6962b788e75f4beaa4cf8fbddd83d39 Mon Sep 17 00:00:00 2001 From: thestig Date: Mon, 21 Nov 2016 15:32:52 -0800 Subject: Add a regression test for rasterizing PDFs. BUG=chromium:667012 Review-Url: https://codereview.chromium.org/2508203007 --- fpdfsdk/fpdfedit_embeddertest.cpp | 82 ++++++++++++++++++++++++++++++++++++++ testing/resources/black.pdf | Bin 0 -> 923 bytes 2 files changed, 82 insertions(+) create mode 100644 testing/resources/black.pdf diff --git a/fpdfsdk/fpdfedit_embeddertest.cpp b/fpdfsdk/fpdfedit_embeddertest.cpp index 1f96b89677..40bed3a565 100644 --- a/fpdfsdk/fpdfedit_embeddertest.cpp +++ b/fpdfsdk/fpdfedit_embeddertest.cpp @@ -15,6 +15,7 @@ class FPDFEditEmbeddertest : public EmbedderTest, public TestSaver {}; namespace { + const char kExpectedPDF[] = "%PDF-1.7\r\n" "%\xA1\xB3\xC5\xD7\r\n" @@ -54,6 +55,23 @@ const char kExpectedPDF[] = "startxref\r\n" "379\r\n" "%%EOF\r\n"; + +int GetBlockFromString(void* param, + unsigned long pos, + unsigned char* buf, + unsigned long size) { + std::string* new_file = static_cast(param); + if (!new_file || pos + size < pos) + return 0; + + unsigned long file_size = new_file->size(); + if (pos + size > file_size) + return 0; + + memcpy(buf, new_file->data() + pos, size); + return 1; +} + } // namespace TEST_F(FPDFEditEmbeddertest, EmptyCreation) { @@ -71,3 +89,67 @@ TEST_F(FPDFEditEmbeddertest, EmptyCreation) { std::string(kExpectedPDF, sizeof(kExpectedPDF)))); FPDF_ClosePage(page); } + +// Regression test for https://crbug.com/667012 +TEST_F(FPDFEditEmbeddertest, RasterizePDF) { + const char kAllBlackMd5sum[] = "5708fc5c4a8bd0abde99c8e8f0390615"; + + // Get the bitmap for the original document/ + FPDF_BITMAP orig_bitmap; + { + EXPECT_TRUE(OpenDocument("black.pdf")); + FPDF_PAGE orig_page = LoadPage(0); + EXPECT_NE(nullptr, orig_page); + orig_bitmap = RenderPage(orig_page); + CompareBitmap(orig_bitmap, 612, 792, kAllBlackMd5sum); + UnloadPage(orig_page); + } + + // Create a new document from |orig_bitmap| and save it. + { + FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); + FPDF_PAGE temp_page = FPDFPage_New(temp_doc, 0, 612, 792); + + // Add the bitmap to an image object and add the image object to the output + // page. + FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); + EXPECT_TRUE(FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, orig_bitmap)); + EXPECT_TRUE(FPDFImageObj_SetMatrix(temp_img, 612, 0, 0, 792, 0, 0)); + FPDFPage_InsertObject(temp_page, temp_img); + EXPECT_TRUE(FPDFPage_GenerateContent(temp_page)); + EXPECT_TRUE(FPDF_SaveAsCopy(temp_doc, this, 0)); + FPDF_ClosePage(temp_page); + FPDF_CloseDocument(temp_doc); + } + FPDFBitmap_Destroy(orig_bitmap); + + // Get the generated content. Make sure it is at least as big as the original + // PDF. + std::string new_file = GetString(); + EXPECT_GT(new_file.size(), 923U); + + // Read |new_file| in, and verify its rendered bitmap. + { + FPDF_FILEACCESS file_access; + memset(&file_access, 0, sizeof(file_access)); + file_access.m_FileLen = new_file.size(); + file_access.m_GetBlock = GetBlockFromString; + file_access.m_Param = &new_file; + + FPDF_DOCUMENT new_doc = FPDF_LoadCustomDocument(&file_access, nullptr); + EXPECT_EQ(1, FPDF_GetPageCount(document_)); + FPDF_PAGE new_page = FPDF_LoadPage(new_doc, 0); + EXPECT_NE(nullptr, new_page); + int width = static_cast(FPDF_GetPageWidth(new_page)); + int height = static_cast(FPDF_GetPageHeight(new_page)); + int alpha = FPDFPage_HasTransparency(new_page) ? 1 : 0; + FPDF_BITMAP new_bitmap = FPDFBitmap_Create(width, height, alpha); + FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF; + FPDFBitmap_FillRect(new_bitmap, 0, 0, width, height, fill_color); + FPDF_RenderPageBitmap(new_bitmap, new_page, 0, 0, width, height, 0, 0); + CompareBitmap(new_bitmap, 612, 792, kAllBlackMd5sum); + FPDF_ClosePage(new_page); + FPDF_CloseDocument(new_doc); + FPDFBitmap_Destroy(new_bitmap); + } +} diff --git a/testing/resources/black.pdf b/testing/resources/black.pdf new file mode 100644 index 0000000000..8513d9f3fd Binary files /dev/null and b/testing/resources/black.pdf differ -- cgit v1.2.3