| Index: fpdfsdk/fpdfedit_embeddertest.cpp
|
| diff --git a/fpdfsdk/fpdfedit_embeddertest.cpp b/fpdfsdk/fpdfedit_embeddertest.cpp
|
| index 1f96b89677533958240749bb7910cec494c267b1..40bed3a565f5774c353cdda362410dff3cd4dcbc 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<std::string*>(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<int>(FPDF_GetPageWidth(new_page));
|
| + int height = static_cast<int>(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);
|
| + }
|
| +}
|
|
|