• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "public/fpdf_edit.h"
6 
7 #include "public/cpp/fpdf_scopers.h"
8 #include "testing/embedder_test.h"
9 #include "testing/utils/file_util.h"
10 
11 class PDFEditImgTest : public EmbedderTest {};
12 
TEST_F(PDFEditImgTest,InsertObjectWithInvalidPage)13 TEST_F(PDFEditImgTest, InsertObjectWithInvalidPage) {
14   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
15   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
16   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
17 
18   FPDFPage_InsertObject(nullptr, nullptr);
19   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
20 
21   FPDFPage_InsertObject(page.get(), nullptr);
22   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
23 
24   FPDFPage_InsertObject(nullptr, FPDFPageObj_NewImageObj(doc.get()));
25   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
26 }
27 
TEST_F(PDFEditImgTest,NewImageObj)28 TEST_F(PDFEditImgTest, NewImageObj) {
29   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
30   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
31   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
32 
33   FPDFPage_InsertObject(page.get(), FPDFPageObj_NewImageObj(doc.get()));
34   EXPECT_EQ(1, FPDFPage_CountObjects(page.get()));
35   EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
36 }
37 
TEST_F(PDFEditImgTest,NewImageObjGenerateContent)38 TEST_F(PDFEditImgTest, NewImageObjGenerateContent) {
39   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
40   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
41   EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
42 
43   constexpr int kBitmapSize = 50;
44   ScopedFPDFBitmap bitmap(FPDFBitmap_Create(kBitmapSize, kBitmapSize, 0));
45   ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0, kBitmapSize, kBitmapSize,
46                                   0x00000000));
47   EXPECT_EQ(kBitmapSize, FPDFBitmap_GetWidth(bitmap.get()));
48   EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(bitmap.get()));
49 
50   ScopedFPDFPageObject page_image(FPDFPageObj_NewImageObj(doc.get()));
51   FPDF_PAGE pages_array[] = {page.get()};
52   ASSERT_TRUE(
53       FPDFImageObj_SetBitmap(pages_array, 0, page_image.get(), bitmap.get()));
54   static constexpr FS_MATRIX kScaleBitmapMatrix{kBitmapSize, 0, 0,
55                                                 kBitmapSize, 0, 0};
56   ASSERT_TRUE(FPDFPageObj_SetMatrix(page_image.get(), &kScaleBitmapMatrix));
57   FPDFPage_InsertObject(page.get(), page_image.release());
58   EXPECT_EQ(1, FPDFPage_CountObjects(page.get()));
59   EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
60 }
61 
TEST_F(PDFEditImgTest,NewImageObjLoadJpeg)62 TEST_F(PDFEditImgTest, NewImageObjLoadJpeg) {
63   CreateEmptyDocumentWithoutFormFillEnvironment();
64   constexpr int kPageWidth = 200;
65   constexpr int kPageHeight = 200;
66   ScopedFPDFPage page(FPDFPage_New(document(), 0, kPageWidth, kPageHeight));
67   ASSERT_TRUE(page);
68 
69   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(document()));
70   ASSERT_TRUE(image);
71 
72   FileAccessForTesting file_access("mona_lisa.jpg");
73   FPDF_PAGE temp_page = page.get();
74   EXPECT_TRUE(
75       FPDFImageObj_LoadJpegFile(&temp_page, 1, image.get(), &file_access));
76 
77   constexpr int kImageWidth = 120;
78   constexpr int kImageHeight = 120;
79   const char kImageChecksum[] = "58589c36b3b27a0058f5ca1fbed4d5e5";
80   const char kPageChecksum[] = "52b3a852f39c5fa9143e59d805dcb343";
81   {
82     ScopedFPDFBitmap image_bitmap(FPDFImageObj_GetBitmap(image.get()));
83     CompareBitmap(image_bitmap.get(), kImageWidth, kImageHeight,
84                   kImageChecksum);
85   }
86 
87   FPDFImageObj_SetMatrix(image.get(), kImageWidth, 0, 0, kImageHeight, 0, 0);
88   FPDFPage_InsertObject(page.get(), image.release());
89   FPDFPage_GenerateContent(page.get());
90   {
91     ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
92     CompareBitmap(page_bitmap.get(), kPageWidth, kPageHeight, kPageChecksum);
93   }
94 
95   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
96   VerifySavedDocument(kPageWidth, kPageHeight, kPageChecksum);
97 }
98 
TEST_F(PDFEditImgTest,NewImageObjLoadJpegInline)99 TEST_F(PDFEditImgTest, NewImageObjLoadJpegInline) {
100   CreateEmptyDocumentWithoutFormFillEnvironment();
101   constexpr int kPageWidth = 200;
102   constexpr int kPageHeight = 200;
103   ScopedFPDFPage page(FPDFPage_New(document(), 0, kPageWidth, kPageHeight));
104   ASSERT_TRUE(page);
105 
106   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(document()));
107   ASSERT_TRUE(image);
108 
109   FileAccessForTesting file_access("mona_lisa.jpg");
110   FPDF_PAGE temp_page = page.get();
111   EXPECT_TRUE(FPDFImageObj_LoadJpegFileInline(&temp_page, 1, image.get(),
112                                               &file_access));
113 
114   constexpr int kImageWidth = 120;
115   constexpr int kImageHeight = 120;
116   const char kImageChecksum[] = "58589c36b3b27a0058f5ca1fbed4d5e5";
117   const char kPageChecksum[] = "52b3a852f39c5fa9143e59d805dcb343";
118   {
119     ScopedFPDFBitmap image_bitmap(FPDFImageObj_GetBitmap(image.get()));
120     CompareBitmap(image_bitmap.get(), kImageWidth, kImageHeight,
121                   kImageChecksum);
122   }
123 
124   FPDFImageObj_SetMatrix(image.get(), kImageWidth, 0, 0, kImageHeight, 0, 0);
125   FPDFPage_InsertObject(page.get(), image.release());
126   FPDFPage_GenerateContent(page.get());
127   {
128     ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
129     CompareBitmap(page_bitmap.get(), kPageWidth, kPageHeight, kPageChecksum);
130   }
131 
132   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
133   VerifySavedDocument(kPageWidth, kPageHeight, kPageChecksum);
134 }
135 
TEST_F(PDFEditImgTest,SetBitmap)136 TEST_F(PDFEditImgTest, SetBitmap) {
137   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
138   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
139   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
140   ScopedFPDFBitmap bitmap(FPDFBitmap_Create(100, 100, 0));
141 
142   FPDF_PAGE page_ptr = page.get();
143   FPDF_PAGE* pages = &page_ptr;
144   EXPECT_TRUE(FPDFImageObj_SetBitmap(nullptr, 1, image.get(), bitmap.get()));
145   EXPECT_TRUE(FPDFImageObj_SetBitmap(pages, 0, image.get(), bitmap.get()));
146   EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, nullptr, bitmap.get()));
147   EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, image.get(), nullptr));
148 }
149 
TEST_F(PDFEditImgTest,GetSetImageMatrix)150 TEST_F(PDFEditImgTest, GetSetImageMatrix) {
151   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
152   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
153 
154   FS_MATRIX matrix;
155   EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, nullptr));
156   EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, &matrix));
157   EXPECT_FALSE(FPDFPageObj_GetMatrix(image.get(), nullptr));
158 
159   EXPECT_TRUE(FPDFPageObj_GetMatrix(image.get(), &matrix));
160   EXPECT_FLOAT_EQ(1.0f, matrix.a);
161   EXPECT_FLOAT_EQ(0.0f, matrix.b);
162   EXPECT_FLOAT_EQ(0.0f, matrix.c);
163   EXPECT_FLOAT_EQ(1.0f, matrix.d);
164   EXPECT_FLOAT_EQ(0.0f, matrix.e);
165   EXPECT_FLOAT_EQ(0.0f, matrix.f);
166 
167   static constexpr FS_MATRIX kMatrix{1, 2, 3, 4, 5, 6};
168   EXPECT_TRUE(FPDFPageObj_SetMatrix(image.get(), &kMatrix));
169   EXPECT_TRUE(FPDFPageObj_GetMatrix(image.get(), &matrix));
170   EXPECT_FLOAT_EQ(1.0f, matrix.a);
171   EXPECT_FLOAT_EQ(2.0f, matrix.b);
172   EXPECT_FLOAT_EQ(3.0f, matrix.c);
173   EXPECT_FLOAT_EQ(4.0f, matrix.d);
174   EXPECT_FLOAT_EQ(5.0f, matrix.e);
175   EXPECT_FLOAT_EQ(6.0f, matrix.f);
176 }
177 
TEST_F(PDFEditImgTest,Bug2132)178 TEST_F(PDFEditImgTest, Bug2132) {
179   constexpr int kExpectedWidth = 200;
180   constexpr int kExpectedHeight = 300;
181   constexpr char kExpectedChecksum[] = "617b1d57c30c516beee86e0781ff7810";
182 
183   OpenDocument("bug_2132.pdf");
184   ScopedEmbedderTestPage page = LoadScopedPage(0);
185   ASSERT_TRUE(page);
186 
187   {
188     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
189     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
190                   kExpectedChecksum);
191   }
192 
193   FPDF_PAGEOBJECT image = FPDFPage_GetObject(page.get(), 0);
194   ASSERT_TRUE(image);
195   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
196 
197   FS_MATRIX matrix;
198   ASSERT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
199   EXPECT_FLOAT_EQ(60.0f, matrix.a);
200   EXPECT_FLOAT_EQ(0.0f, matrix.b);
201   EXPECT_FLOAT_EQ(0.0f, matrix.c);
202   EXPECT_FLOAT_EQ(30.0f, matrix.d);
203   EXPECT_FLOAT_EQ(0.0f, matrix.e);
204   EXPECT_FLOAT_EQ(270.0f, matrix.f);
205 
206   ASSERT_TRUE(FPDFPageObj_SetMatrix(image, &matrix));
207   {
208     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
209     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
210                   kExpectedChecksum);
211   }
212 
213   ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
214   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
215 
216   {
217     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
218     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
219                   kExpectedChecksum);
220   }
221 
222 
223   VerifySavedDocument(kExpectedWidth, kExpectedHeight, kExpectedChecksum);
224 }
225 
TEST_F(PDFEditImgTest,GetAndSetMatrixForFormWithImage)226 TEST_F(PDFEditImgTest, GetAndSetMatrixForFormWithImage) {
227   constexpr int kExpectedWidth = 200;
228   constexpr int kExpectedHeight = 300;
229   constexpr char kExpectedChecksum[] = "fcb9007fd901d2052e2bd1c147b82800";
230 
231   OpenDocument("form_object_with_image.pdf");
232   ScopedEmbedderTestPage page = LoadScopedPage(0);
233   ASSERT_TRUE(page);
234 
235   {
236     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
237     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
238                   kExpectedChecksum);
239   }
240 
241   FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
242   ASSERT_TRUE(form);
243   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
244 
245   FS_MATRIX matrix;
246   ASSERT_TRUE(FPDFPageObj_GetMatrix(form, &matrix));
247   EXPECT_FLOAT_EQ(60.0f, matrix.a);
248   EXPECT_FLOAT_EQ(0.0f, matrix.b);
249   EXPECT_FLOAT_EQ(0.0f, matrix.c);
250   EXPECT_FLOAT_EQ(30.0f, matrix.d);
251   EXPECT_FLOAT_EQ(0.0f, matrix.e);
252   EXPECT_FLOAT_EQ(270.0f, matrix.f);
253 
254   ASSERT_TRUE(FPDFPageObj_SetMatrix(form, &matrix));
255   {
256     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
257     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
258                   kExpectedChecksum);
259   }
260 
261   FPDF_PAGEOBJECT image = FPDFFormObj_GetObject(form, 0);
262   ASSERT_TRUE(image);
263   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
264 
265   ASSERT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
266   EXPECT_FLOAT_EQ(1.0f, matrix.a);
267   EXPECT_FLOAT_EQ(0.0f, matrix.b);
268   EXPECT_FLOAT_EQ(0.0f, matrix.c);
269   EXPECT_FLOAT_EQ(1.0f, matrix.d);
270   EXPECT_FLOAT_EQ(1.0f, matrix.e);
271   EXPECT_FLOAT_EQ(0.0f, matrix.f);
272 
273   ASSERT_TRUE(FPDFPageObj_SetMatrix(image, &matrix));
274   {
275     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
276     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
277                   kExpectedChecksum);
278   }
279 
280   ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
281   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
282 
283   {
284     ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
285     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
286                   kExpectedChecksum);
287   }
288 
289 
290   VerifySavedDocument(kExpectedWidth, kExpectedHeight, kExpectedChecksum);
291 }
292