xref: /aosp_15_r20/external/pdfium/fpdfsdk/fpdf_editimg_embeddertest.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_edit.h"
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "public/cpp/fpdf_scopers.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "testing/embedder_test.h"
9*3ac0a46fSAndroid Build Coastguard Worker #include "testing/utils/file_util.h"
10*3ac0a46fSAndroid Build Coastguard Worker 
11*3ac0a46fSAndroid Build Coastguard Worker class PDFEditImgTest : public EmbedderTest {};
12*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,InsertObjectWithInvalidPage)13*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, InsertObjectWithInvalidPage) {
14*3ac0a46fSAndroid Build Coastguard Worker   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
15*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
16*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
17*3ac0a46fSAndroid Build Coastguard Worker 
18*3ac0a46fSAndroid Build Coastguard Worker   FPDFPage_InsertObject(nullptr, nullptr);
19*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
20*3ac0a46fSAndroid Build Coastguard Worker 
21*3ac0a46fSAndroid Build Coastguard Worker   FPDFPage_InsertObject(page, nullptr);
22*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
25*3ac0a46fSAndroid Build Coastguard Worker   FPDFPage_InsertObject(nullptr, page_image);
26*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
27*3ac0a46fSAndroid Build Coastguard Worker 
28*3ac0a46fSAndroid Build Coastguard Worker   FPDF_ClosePage(page);
29*3ac0a46fSAndroid Build Coastguard Worker   FPDF_CloseDocument(doc);
30*3ac0a46fSAndroid Build Coastguard Worker }
31*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,NewImageObj)32*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, NewImageObj) {
33*3ac0a46fSAndroid Build Coastguard Worker   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
34*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
35*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
38*3ac0a46fSAndroid Build Coastguard Worker   FPDFPage_InsertObject(page, page_image);
39*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, FPDFPage_CountObjects(page));
40*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFPage_GenerateContent(page));
41*3ac0a46fSAndroid Build Coastguard Worker 
42*3ac0a46fSAndroid Build Coastguard Worker   FPDF_ClosePage(page);
43*3ac0a46fSAndroid Build Coastguard Worker   FPDF_CloseDocument(doc);
44*3ac0a46fSAndroid Build Coastguard Worker }
45*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,NewImageObjGenerateContent)46*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, NewImageObjGenerateContent) {
47*3ac0a46fSAndroid Build Coastguard Worker   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
48*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
49*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(0, FPDFPage_CountObjects(page));
50*3ac0a46fSAndroid Build Coastguard Worker 
51*3ac0a46fSAndroid Build Coastguard Worker   constexpr int kBitmapSize = 50;
52*3ac0a46fSAndroid Build Coastguard Worker   FPDF_BITMAP bitmap = FPDFBitmap_Create(kBitmapSize, kBitmapSize, 0);
53*3ac0a46fSAndroid Build Coastguard Worker   FPDFBitmap_FillRect(bitmap, 0, 0, kBitmapSize, kBitmapSize, 0x00000000);
54*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(kBitmapSize, FPDFBitmap_GetWidth(bitmap));
55*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(bitmap));
56*3ac0a46fSAndroid Build Coastguard Worker 
57*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
58*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, page_image, bitmap));
59*3ac0a46fSAndroid Build Coastguard Worker   static constexpr FS_MATRIX kScaleBitmapMatrix{kBitmapSize, 0, 0,
60*3ac0a46fSAndroid Build Coastguard Worker                                                 kBitmapSize, 0, 0};
61*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(FPDFPageObj_SetMatrix(page_image, &kScaleBitmapMatrix));
62*3ac0a46fSAndroid Build Coastguard Worker   FPDFPage_InsertObject(page, page_image);
63*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, FPDFPage_CountObjects(page));
64*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFPage_GenerateContent(page));
65*3ac0a46fSAndroid Build Coastguard Worker 
66*3ac0a46fSAndroid Build Coastguard Worker   FPDFBitmap_Destroy(bitmap);
67*3ac0a46fSAndroid Build Coastguard Worker   FPDF_ClosePage(page);
68*3ac0a46fSAndroid Build Coastguard Worker   FPDF_CloseDocument(doc);
69*3ac0a46fSAndroid Build Coastguard Worker }
70*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,NewImageObjLoadJpeg)71*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, NewImageObjLoadJpeg) {
72*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
73*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200));
74*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(page);
75*3ac0a46fSAndroid Build Coastguard Worker 
76*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
77*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(image);
78*3ac0a46fSAndroid Build Coastguard Worker 
79*3ac0a46fSAndroid Build Coastguard Worker   FileAccessForTesting file_access("mona_lisa.jpg");
80*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE temp_page = page.get();
81*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(
82*3ac0a46fSAndroid Build Coastguard Worker       FPDFImageObj_LoadJpegFile(&temp_page, 1, image.get(), &file_access));
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(image.get()));
85*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(bitmap);
86*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(120, FPDFBitmap_GetWidth(bitmap.get()));
87*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(120, FPDFBitmap_GetHeight(bitmap.get()));
88*3ac0a46fSAndroid Build Coastguard Worker }
89*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,NewImageObjLoadJpegInline)90*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, NewImageObjLoadJpegInline) {
91*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
92*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200));
93*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(page);
94*3ac0a46fSAndroid Build Coastguard Worker 
95*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
96*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(image);
97*3ac0a46fSAndroid Build Coastguard Worker 
98*3ac0a46fSAndroid Build Coastguard Worker   FileAccessForTesting file_access("mona_lisa.jpg");
99*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE temp_page = page.get();
100*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFImageObj_LoadJpegFileInline(&temp_page, 1, image.get(),
101*3ac0a46fSAndroid Build Coastguard Worker                                               &file_access));
102*3ac0a46fSAndroid Build Coastguard Worker 
103*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(image.get()));
104*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(bitmap);
105*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(120, FPDFBitmap_GetWidth(bitmap.get()));
106*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(120, FPDFBitmap_GetHeight(bitmap.get()));
107*3ac0a46fSAndroid Build Coastguard Worker }
108*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,SetBitmap)109*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, SetBitmap) {
110*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFDocument doc(FPDF_CreateNewDocument());
111*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
112*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
113*3ac0a46fSAndroid Build Coastguard Worker   ScopedFPDFBitmap bitmap(FPDFBitmap_Create(100, 100, 0));
114*3ac0a46fSAndroid Build Coastguard Worker 
115*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE page_ptr = page.get();
116*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGE* pages = &page_ptr;
117*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFImageObj_SetBitmap(nullptr, 1, image.get(), bitmap.get()));
118*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFImageObj_SetBitmap(pages, 0, image.get(), bitmap.get()));
119*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, nullptr, bitmap.get()));
120*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(FPDFImageObj_SetBitmap(pages, 1, image.get(), nullptr));
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(PDFEditImgTest,GetSetImageMatrix)123*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFEditImgTest, GetSetImageMatrix) {
124*3ac0a46fSAndroid Build Coastguard Worker   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
125*3ac0a46fSAndroid Build Coastguard Worker   FPDF_PAGEOBJECT image = FPDFPageObj_NewImageObj(doc);
126*3ac0a46fSAndroid Build Coastguard Worker 
127*3ac0a46fSAndroid Build Coastguard Worker   FS_MATRIX matrix;
128*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, nullptr));
129*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, &matrix));
130*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(FPDFPageObj_GetMatrix(image, nullptr));
131*3ac0a46fSAndroid Build Coastguard Worker 
132*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
133*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(1.0f, matrix.a);
134*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(0.0f, matrix.b);
135*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(0.0f, matrix.c);
136*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(1.0f, matrix.d);
137*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(0.0f, matrix.e);
138*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(0.0f, matrix.f);
139*3ac0a46fSAndroid Build Coastguard Worker 
140*3ac0a46fSAndroid Build Coastguard Worker   static constexpr FS_MATRIX kMatrix{1, 2, 3, 4, 5, 6};
141*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFPageObj_SetMatrix(image, &kMatrix));
142*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
143*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(1.0f, matrix.a);
144*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(2.0f, matrix.b);
145*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(3.0f, matrix.c);
146*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(4.0f, matrix.d);
147*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(5.0f, matrix.e);
148*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(6.0f, matrix.f);
149*3ac0a46fSAndroid Build Coastguard Worker 
150*3ac0a46fSAndroid Build Coastguard Worker   FPDFPageObj_Destroy(image);
151*3ac0a46fSAndroid Build Coastguard Worker   FPDF_CloseDocument(doc);
152*3ac0a46fSAndroid Build Coastguard Worker }
153