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