Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
fpdf_editpath_embeddertest.cpp
Go to the documentation of this file.
1// Copyright 2017 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 "core/fxcrt/check.h"
6#include "core/fxcrt/fx_system.h"
7#include "core/fxge/cfx_defaultrenderdevice.h"
8#include "public/fpdf_edit.h"
9#include "testing/embedder_test.h"
10#include "testing/embedder_test_constants.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13using pdfium::RectanglesChecksum;
14
16
17namespace {
18
19constexpr int kExpectedRectangleWidth = 200;
20constexpr int kExpectedRectangleHeight = 300;
21
22const char* RectanglesAndTriangleChecksum() {
23 return CFX_DefaultRenderDevice::UseSkiaRenderer()
24 ? "89b85ca2749a98320518531cf365b010"
25 : "8bb78ca28f1e0ab9d36c0745ae0f58bb";
26}
27
28ScopedFPDFPageObject CreateBlackTriangle() {
29 ScopedFPDFPageObject path(FPDFPageObj_CreateNewPath(100, 50));
30 EXPECT_TRUE(FPDFPageObj_SetFillColor(path.get(), 0, 0, 0, 255));
31 EXPECT_TRUE(FPDFPath_SetDrawMode(path.get(), FPDF_FILLMODE_ALTERNATE, 0));
32 EXPECT_TRUE(FPDFPath_LineTo(path.get(), 100, 75));
33 EXPECT_TRUE(FPDFPath_LineTo(path.get(), 75, 75));
34 EXPECT_TRUE(FPDFPath_Close(path.get()));
35 return path;
36}
37
38} // namespace
39
41 constexpr int kObjectCount = 256;
42 CreateEmptyDocument();
43 FPDF_PAGE page = FPDFPage_New(document(), 0, 612, 792);
44
45 for (size_t i = 0; i < kObjectCount; ++i) {
46 FPDF_PAGEOBJECT path = FPDFPageObj_CreateNewPath(400, 100);
47 EXPECT_TRUE(FPDFPageObj_SetFillColor(path, i, i, i, i));
48 EXPECT_TRUE(FPDFPageObj_SetStrokeColor(path, i, i, i, i));
50 EXPECT_TRUE(FPDFPath_LineTo(path, 400, 200));
51 EXPECT_TRUE(FPDFPath_LineTo(path, 300, 100));
52 EXPECT_TRUE(FPDFPath_Close(path));
53
55 }
56
57 EXPECT_TRUE(FPDFPage_GenerateContent(page));
58 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
60 page = nullptr;
61
62 ASSERT_TRUE(OpenSavedDocument());
63 page = LoadSavedPage(0);
64 ASSERT_TRUE(page);
65
66 for (size_t i = 0; i < kObjectCount; ++i) {
67 FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, i);
68 ASSERT_TRUE(path);
69
71
72 unsigned int r;
73 unsigned int g;
74 unsigned int b;
75 unsigned int a;
76 ASSERT_TRUE(FPDFPageObj_GetFillColor(path, &r, &g, &b, &a));
77 EXPECT_EQ(i, r);
78 EXPECT_EQ(i, g);
79 EXPECT_EQ(i, b);
80 EXPECT_EQ(i, a);
81
82 ASSERT_TRUE(FPDFPageObj_GetStrokeColor(path, &r, &g, &b, &a));
83 EXPECT_EQ(i, r);
84 EXPECT_EQ(i, g);
85 EXPECT_EQ(i, b);
86 EXPECT_EQ(i, a);
87 }
88
89 CloseSavedPage(page);
90 CloseSavedDocument();
91}
92
94 OpenDocument("rectangles_double_flipped.pdf");
95 FPDF_PAGE page = LoadPage(0);
96 ASSERT_TRUE(page);
97
98 {
99 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
100 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
101 kExpectedRectangleHeight, RectanglesChecksum());
102 }
103
104 FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 0);
105 ASSERT_TRUE(path);
107
108 FS_MATRIX matrix;
109 ASSERT_TRUE(FPDFPageObj_GetMatrix(path, &matrix));
110 EXPECT_FLOAT_EQ(1.0f, matrix.a);
111 EXPECT_FLOAT_EQ(0.0f, matrix.b);
112 EXPECT_FLOAT_EQ(0.0f, matrix.c);
113 EXPECT_FLOAT_EQ(-1.0f, matrix.d);
114 EXPECT_FLOAT_EQ(0.0f, matrix.e);
115 EXPECT_FLOAT_EQ(300.0f, matrix.f);
116
117 ASSERT_TRUE(FPDFPageObj_SetMatrix(path, &matrix));
118 {
119 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
120 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
121 kExpectedRectangleHeight, RectanglesChecksum());
122 }
123
124 ASSERT_TRUE(FPDFPage_GenerateContent(page));
125 ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
126
127 {
128 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
129 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
130 kExpectedRectangleHeight, RectanglesChecksum());
131 }
132
133 UnloadPage(page);
134
135 VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
137}
138
140 OpenDocument("form_object_with_path.pdf");
141 FPDF_PAGE page = LoadPage(0);
142 ASSERT_TRUE(page);
143
144 {
145 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
146 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
147 kExpectedRectangleHeight, RectanglesChecksum());
148 }
149
150 FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
151 ASSERT_TRUE(form);
153
154 FS_MATRIX matrix;
155 ASSERT_TRUE(FPDFPageObj_GetMatrix(form, &matrix));
156 EXPECT_FLOAT_EQ(2.0f, matrix.a);
157 EXPECT_FLOAT_EQ(0.0f, matrix.b);
158 EXPECT_FLOAT_EQ(0.0f, matrix.c);
159 EXPECT_FLOAT_EQ(-1.0f, matrix.d);
160 EXPECT_FLOAT_EQ(0.0f, matrix.e);
161 EXPECT_FLOAT_EQ(300.0f, matrix.f);
162
163 ASSERT_TRUE(FPDFPageObj_SetMatrix(form, &matrix));
164 {
165 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
166 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
167 kExpectedRectangleHeight, RectanglesChecksum());
168 }
169
170 FPDF_PAGEOBJECT path = FPDFFormObj_GetObject(form, 0);
171 ASSERT_TRUE(path);
173
174 ASSERT_TRUE(FPDFPageObj_GetMatrix(path, &matrix));
175 EXPECT_FLOAT_EQ(0.5f, matrix.a);
176 EXPECT_FLOAT_EQ(0.0f, matrix.b);
177 EXPECT_FLOAT_EQ(0.0f, matrix.c);
178 EXPECT_FLOAT_EQ(-1.0f, matrix.d);
179 EXPECT_FLOAT_EQ(0.0f, matrix.e);
180 EXPECT_FLOAT_EQ(300.0f, matrix.f);
181
182 ASSERT_TRUE(FPDFPageObj_SetMatrix(path, &matrix));
183 {
184 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
185 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
186 kExpectedRectangleHeight, RectanglesChecksum());
187 }
188
189 ASSERT_TRUE(FPDFPage_GenerateContent(page));
190 ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
191
192 {
193 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
194 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
195 kExpectedRectangleHeight, RectanglesChecksum());
196 }
197
198 UnloadPage(page);
199
200 VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
202}
203
205 OpenDocument("rectangles.pdf");
206 FPDF_PAGE page = LoadPage(0);
207 ASSERT_TRUE(page);
208
209 {
210 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
211 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
212 kExpectedRectangleHeight, RectanglesChecksum());
213 }
214
215 ScopedFPDFPageObject path = CreateBlackTriangle();
216 ASSERT_TRUE(path);
217 FPDFPage_InsertObject(page, path.release());
218
219 {
220 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
221 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
222 kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
223 }
224
225 EXPECT_TRUE(FPDFPage_GenerateContent(page));
226 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
227
228 {
229 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
230 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
231 kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
232 }
233
234 UnloadPage(page);
235
236 VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
237 RectanglesAndTriangleChecksum());
238}
239
241 OpenDocument("rectangles_with_leaky_ctm.pdf");
242 FPDF_PAGE page = LoadPage(0);
243 ASSERT_TRUE(page);
244
245 {
246 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
247 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
248 kExpectedRectangleHeight, RectanglesChecksum());
249 }
250
251 ScopedFPDFPageObject path = CreateBlackTriangle();
252 ASSERT_TRUE(path);
253 FPDFPage_InsertObject(page, path.release());
254
255 {
256 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
257 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
258 kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
259 }
260
261 EXPECT_TRUE(FPDFPage_GenerateContent(page));
262 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
263
264 {
265 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
266 CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
267 kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
268 }
269
270 UnloadPage(page);
271
272 VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
273 RectanglesAndTriangleChecksum());
274}
#define FPDF_FILLMODE_ALTERNATE
Definition fpdf_edit.h:52
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPageObj_CreateNewPath(float x, float y)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path, int fillmode, FPDF_BOOL stroke)
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_Close(FPDF_PAGEOBJECT path)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetFillColor(FPDF_PAGEOBJECT page_object, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPage_GetObject(FPDF_PAGE page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_GetType(FPDF_PAGEOBJECT page_object)
#define FPDF_PAGEOBJ_PATH
Definition fpdf_edit.h:40
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT page_object, const FS_MATRIX *matrix)
#define FPDF_PAGEOBJ_FORM
Definition fpdf_edit.h:43
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_GenerateContent(FPDF_PAGE page)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object, unsigned long index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object, FS_MATRIX *matrix)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetStrokeColor(FPDF_PAGEOBJECT page_object, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A)
EmbedderTest FPDFEditPathEmbedderTest
TEST_F(FPDFParserDecodeEmbedderTest, Bug552046)
FPDF_EXPORT void FPDF_CALLCONV FPDF_ClosePage(FPDF_PAGE page)
const char * RectanglesChecksum()