1 // Copyright 2016 PDFium Authors. All rights reserved.
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 "core/fpdfapi/page/cpdf_pagemodule.h"
8 #include "public/cpp/fpdf_scopers.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "testing/utils/file_util.h"
11
12 class PDFEditImgTest : public testing::Test {
SetUp()13 void SetUp() override { CPDF_PageModule::Create(); }
TearDown()14 void TearDown() override { CPDF_PageModule::Destroy(); }
15 };
16
TEST_F(PDFEditImgTest,InsertObjectWithInvalidPage)17 TEST_F(PDFEditImgTest, InsertObjectWithInvalidPage) {
18 FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
19 FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
20 EXPECT_EQ(0, FPDFPage_CountObjects(page));
21
22 FPDFPage_InsertObject(nullptr, nullptr);
23 EXPECT_EQ(0, FPDFPage_CountObjects(page));
24
25 FPDFPage_InsertObject(page, nullptr);
26 EXPECT_EQ(0, FPDFPage_CountObjects(page));
27
28 FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
29 FPDFPage_InsertObject(nullptr, page_image);
30 EXPECT_EQ(0, FPDFPage_CountObjects(page));
31
32 FPDF_ClosePage(page);
33 FPDF_CloseDocument(doc);
34 }
35
TEST_F(PDFEditImgTest,NewImageObj)36 TEST_F(PDFEditImgTest, NewImageObj) {
37 FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
38 FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
39 EXPECT_EQ(0, FPDFPage_CountObjects(page));
40
41 FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
42 FPDFPage_InsertObject(page, page_image);
43 EXPECT_EQ(1, FPDFPage_CountObjects(page));
44 EXPECT_TRUE(FPDFPage_GenerateContent(page));
45
46 FPDF_ClosePage(page);
47 FPDF_CloseDocument(doc);
48 }
49
TEST_F(PDFEditImgTest,NewImageObjGenerateContent)50 TEST_F(PDFEditImgTest, NewImageObjGenerateContent) {
51 FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
52 FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
53 EXPECT_EQ(0, FPDFPage_CountObjects(page));
54
55 constexpr int kBitmapSize = 50;
56 FPDF_BITMAP bitmap = FPDFBitmap_Create(kBitmapSize, kBitmapSize, 0);
57 FPDFBitmap_FillRect(bitmap, 0, 0, kBitmapSize, kBitmapSize, 0x00000000);
58 EXPECT_EQ(kBitmapSize, FPDFBitmap_GetWidth(bitmap));
59 EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(bitmap));
60
61 FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
62 ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, page_image, bitmap));
63 ASSERT_TRUE(
64 FPDFImageObj_SetMatrix(page_image, kBitmapSize, 0, 0, kBitmapSize, 0, 0));
65 FPDFPage_InsertObject(page, page_image);
66 EXPECT_EQ(1, FPDFPage_CountObjects(page));
67 EXPECT_TRUE(FPDFPage_GenerateContent(page));
68
69 FPDFBitmap_Destroy(bitmap);
70 FPDF_ClosePage(page);
71 FPDF_CloseDocument(doc);
72 }
73
TEST_F(PDFEditImgTest,NewImageObjLoadJpeg)74 TEST_F(PDFEditImgTest, NewImageObjLoadJpeg) {
75 ScopedFPDFDocument doc(FPDF_CreateNewDocument());
76 ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200));
77 ASSERT_TRUE(page);
78
79 ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
80 ASSERT_TRUE(image);
81
82 FileAccessForTesting file_access("mona_lisa.jpg");
83 FPDF_PAGE temp_page = page.get();
84 EXPECT_TRUE(
85 FPDFImageObj_LoadJpegFile(&temp_page, 1, image.get(), &file_access));
86
87 ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(image.get()));
88 EXPECT_TRUE(bitmap);
89 EXPECT_EQ(120, FPDFBitmap_GetWidth(bitmap.get()));
90 EXPECT_EQ(120, FPDFBitmap_GetHeight(bitmap.get()));
91 }
92
TEST_F(PDFEditImgTest,NewImageObjLoadJpegInline)93 TEST_F(PDFEditImgTest, NewImageObjLoadJpegInline) {
94 ScopedFPDFDocument doc(FPDF_CreateNewDocument());
95 ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200));
96 ASSERT_TRUE(page);
97
98 ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
99 ASSERT_TRUE(image);
100
101 FileAccessForTesting file_access("mona_lisa.jpg");
102 FPDF_PAGE temp_page = page.get();
103 EXPECT_TRUE(FPDFImageObj_LoadJpegFileInline(&temp_page, 1, image.get(),
104 &file_access));
105
106 ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(image.get()));
107 EXPECT_TRUE(bitmap);
108 EXPECT_EQ(120, FPDFBitmap_GetWidth(bitmap.get()));
109 EXPECT_EQ(120, FPDFBitmap_GetHeight(bitmap.get()));
110 }
111
TEST_F(PDFEditImgTest,SetBitmap)112 TEST_F(PDFEditImgTest, SetBitmap) {
113 ScopedFPDFDocument doc(FPDF_CreateNewDocument());
114 ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
115 ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
116 ScopedFPDFBitmap bitmap(FPDFBitmap_Create(100, 100, 0));
117
118 FPDF_PAGE page_ptr = page.get();
119 FPDF_PAGE* pages = &page_ptr;
120 EXPECT_TRUE(FPDFImageObj_SetBitmap(nullptr, 1, image.get(), bitmap.get()));
121 EXPECT_TRUE(FPDFImageObj_SetBitmap(pages, 0, image.get(), bitmap.get()));
122 EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, nullptr, bitmap.get()));
123 EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, image.get(), nullptr));
124 }
125
TEST_F(PDFEditImgTest,GetSetImageMatrix)126 TEST_F(PDFEditImgTest, GetSetImageMatrix) {
127 FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
128 FPDF_PAGEOBJECT image = FPDFPageObj_NewImageObj(doc);
129
130 double a;
131 double b;
132 double c;
133 double d;
134 double e;
135 double f;
136 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, nullptr, nullptr, nullptr,
137 nullptr, nullptr, nullptr));
138 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, nullptr, nullptr, nullptr,
139 nullptr, nullptr));
140 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, nullptr, nullptr,
141 nullptr, nullptr));
142 EXPECT_FALSE(
143 FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, nullptr, nullptr, nullptr));
144 EXPECT_FALSE(
145 FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, nullptr, nullptr, nullptr));
146 EXPECT_FALSE(
147 FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, nullptr, nullptr));
148 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, &e, nullptr));
149 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, &e, &f));
150 EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, nullptr, &c, &d, &e, &f));
151
152 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, nullptr, nullptr, nullptr, nullptr,
153 nullptr, nullptr));
154 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, nullptr, nullptr, nullptr,
155 nullptr, nullptr));
156 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, nullptr, nullptr, nullptr,
157 nullptr));
158 EXPECT_FALSE(
159 FPDFImageObj_GetMatrix(image, &a, &b, &c, nullptr, nullptr, nullptr));
160 EXPECT_FALSE(
161 FPDFImageObj_GetMatrix(image, &a, &b, &c, nullptr, nullptr, nullptr));
162 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, nullptr, nullptr));
163 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, nullptr));
164 EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, nullptr, &c, &d, &e, &f));
165
166 EXPECT_TRUE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, &f));
167 EXPECT_DOUBLE_EQ(1.0, a);
168 EXPECT_DOUBLE_EQ(0.0, b);
169 EXPECT_DOUBLE_EQ(0.0, c);
170 EXPECT_DOUBLE_EQ(1.0, d);
171 EXPECT_DOUBLE_EQ(0.0, e);
172 EXPECT_DOUBLE_EQ(0.0, f);
173
174 EXPECT_TRUE(FPDFImageObj_SetMatrix(image, 1, 2, 3, 4, 5, 6));
175 EXPECT_TRUE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, &f));
176 EXPECT_DOUBLE_EQ(1.0, a);
177 EXPECT_DOUBLE_EQ(2.0, b);
178 EXPECT_DOUBLE_EQ(3.0, c);
179 EXPECT_DOUBLE_EQ(4.0, d);
180 EXPECT_DOUBLE_EQ(5.0, e);
181 EXPECT_DOUBLE_EQ(6.0, f);
182
183 FPDFPageObj_Destroy(image);
184 FPDF_CloseDocument(doc);
185 }
186