summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpdfsdk/fpdfedit_embeddertest.cpp82
-rw-r--r--testing/resources/black.pdfbin0 -> 923 bytes
2 files changed, 82 insertions, 0 deletions
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<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);
+ }
+}
diff --git a/testing/resources/black.pdf b/testing/resources/black.pdf
new file mode 100644
index 0000000000..8513d9f3fd
--- /dev/null
+++ b/testing/resources/black.pdf
Binary files differ