1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2018 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 "core/fxcrt/fx_system.h"
6*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_defaultrenderdevice.h"
7*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_edit.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "testing/embedder_test.h"
9*3ac0a46fSAndroid Build Coastguard Worker #include "testing/embedder_test_constants.h"
10*3ac0a46fSAndroid Build Coastguard Worker
11*3ac0a46fSAndroid Build Coastguard Worker class FPDFEditPageEmbedderTest : public EmbedderTest {};
12*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,Rotation)13*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, Rotation) {
14*3ac0a46fSAndroid Build Coastguard Worker const char* rotated_checksum = []() {
15*3ac0a46fSAndroid Build Coastguard Worker if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
16*3ac0a46fSAndroid Build Coastguard Worker return "eded83f75f3d0332c584c416c571c0df";
17*3ac0a46fSAndroid Build Coastguard Worker return "d599429574ff0dcad3bc898ea8b874ca";
18*3ac0a46fSAndroid Build Coastguard Worker }();
19*3ac0a46fSAndroid Build Coastguard Worker
20*3ac0a46fSAndroid Build Coastguard Worker {
21*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("rectangles.pdf"));
22*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
23*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
24*3ac0a46fSAndroid Build Coastguard Worker
25*3ac0a46fSAndroid Build Coastguard Worker {
26*3ac0a46fSAndroid Build Coastguard Worker // Render the page as is.
27*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPage_GetRotation(page));
28*3ac0a46fSAndroid Build Coastguard Worker const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
29*3ac0a46fSAndroid Build Coastguard Worker const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
30*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(200, page_width);
31*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(300, page_height);
32*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
33*3ac0a46fSAndroid Build Coastguard Worker CompareBitmap(bitmap.get(), page_width, page_height,
34*3ac0a46fSAndroid Build Coastguard Worker pdfium::RectanglesChecksum());
35*3ac0a46fSAndroid Build Coastguard Worker }
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_SetRotation(page, 1);
38*3ac0a46fSAndroid Build Coastguard Worker
39*3ac0a46fSAndroid Build Coastguard Worker {
40*3ac0a46fSAndroid Build Coastguard Worker // Render the page after rotation.
41*3ac0a46fSAndroid Build Coastguard Worker // Note that the change affects the rendering, as expected.
42*3ac0a46fSAndroid Build Coastguard Worker // It behaves just like the case below, rather than the case above.
43*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFPage_GetRotation(page));
44*3ac0a46fSAndroid Build Coastguard Worker const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
45*3ac0a46fSAndroid Build Coastguard Worker const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
46*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(300, page_width);
47*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(200, page_height);
48*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
49*3ac0a46fSAndroid Build Coastguard Worker CompareBitmap(bitmap.get(), page_width, page_height, rotated_checksum);
50*3ac0a46fSAndroid Build Coastguard Worker }
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
53*3ac0a46fSAndroid Build Coastguard Worker }
54*3ac0a46fSAndroid Build Coastguard Worker
55*3ac0a46fSAndroid Build Coastguard Worker {
56*3ac0a46fSAndroid Build Coastguard Worker // Save a copy, open the copy, and render it.
57*3ac0a46fSAndroid Build Coastguard Worker // Note that it renders the rotation.
58*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
59*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenSavedDocument());
60*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE saved_page = LoadSavedPage(0);
61*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(saved_page);
62*3ac0a46fSAndroid Build Coastguard Worker
63*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFPage_GetRotation(saved_page));
64*3ac0a46fSAndroid Build Coastguard Worker const int page_width = static_cast<int>(FPDF_GetPageWidth(saved_page));
65*3ac0a46fSAndroid Build Coastguard Worker const int page_height = static_cast<int>(FPDF_GetPageHeight(saved_page));
66*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(300, page_width);
67*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(200, page_height);
68*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap bitmap = RenderSavedPage(saved_page);
69*3ac0a46fSAndroid Build Coastguard Worker CompareBitmap(bitmap.get(), page_width, page_height, rotated_checksum);
70*3ac0a46fSAndroid Build Coastguard Worker
71*3ac0a46fSAndroid Build Coastguard Worker CloseSavedPage(saved_page);
72*3ac0a46fSAndroid Build Coastguard Worker CloseSavedDocument();
73*3ac0a46fSAndroid Build Coastguard Worker }
74*3ac0a46fSAndroid Build Coastguard Worker }
75*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,HasTransparencyImage)76*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, HasTransparencyImage) {
77*3ac0a46fSAndroid Build Coastguard Worker constexpr int kExpectedObjectCount = 39;
78*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
79*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
80*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
81*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
82*3ac0a46fSAndroid Build Coastguard Worker
83*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < kExpectedObjectCount; ++i) {
84*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
85*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetFillColor(obj, 255, 0, 0, 127);
88*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
89*3ac0a46fSAndroid Build Coastguard Worker }
90*3ac0a46fSAndroid Build Coastguard Worker
91*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
92*3ac0a46fSAndroid Build Coastguard Worker }
93*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,HasTransparencyInvalid)94*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, HasTransparencyInvalid) {
95*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_HasTransparency(nullptr));
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,HasTransparencyPath)98*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, HasTransparencyPath) {
99*3ac0a46fSAndroid Build Coastguard Worker constexpr int kExpectedObjectCount = 8;
100*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("rectangles.pdf"));
101*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
102*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
103*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < kExpectedObjectCount; ++i) {
106*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
107*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
108*3ac0a46fSAndroid Build Coastguard Worker
109*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetStrokeColor(obj, 63, 63, 0, 127);
110*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,HasTransparencyText)116*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, HasTransparencyText) {
117*3ac0a46fSAndroid Build Coastguard Worker constexpr int kExpectedObjectCount = 2;
118*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("text_render_mode.pdf"));
119*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
120*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
121*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
122*3ac0a46fSAndroid Build Coastguard Worker
123*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < kExpectedObjectCount; ++i) {
124*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
125*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
126*3ac0a46fSAndroid Build Coastguard Worker
127*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetBlendMode(obj, "Lighten");
128*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
129*3ac0a46fSAndroid Build Coastguard Worker }
130*3ac0a46fSAndroid Build Coastguard Worker
131*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetFillAndStrokeForImage)134*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetFillAndStrokeForImage) {
135*3ac0a46fSAndroid Build Coastguard Worker constexpr int kExpectedObjectCount = 39;
136*3ac0a46fSAndroid Build Coastguard Worker constexpr int kImageObjectsStartIndex = 33;
137*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
138*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
139*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
140*3ac0a46fSAndroid Build Coastguard Worker
141*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
142*3ac0a46fSAndroid Build Coastguard Worker
143*3ac0a46fSAndroid Build Coastguard Worker for (int i = kImageObjectsStartIndex; i < kExpectedObjectCount; ++i) {
144*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, i);
145*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(image);
146*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
147*3ac0a46fSAndroid Build Coastguard Worker
148*3ac0a46fSAndroid Build Coastguard Worker unsigned int r;
149*3ac0a46fSAndroid Build Coastguard Worker unsigned int g;
150*3ac0a46fSAndroid Build Coastguard Worker unsigned int b;
151*3ac0a46fSAndroid Build Coastguard Worker unsigned int a;
152*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetFillColor(image, &r, &g, &b, &a));
153*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetStrokeColor(image, &r, &g, &b, &a));
154*3ac0a46fSAndroid Build Coastguard Worker }
155*3ac0a46fSAndroid Build Coastguard Worker
156*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
157*3ac0a46fSAndroid Build Coastguard Worker }
158*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,DashingArrayAndPhase)159*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, DashingArrayAndPhase) {
160*3ac0a46fSAndroid Build Coastguard Worker {
161*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashPhase(nullptr, nullptr));
162*3ac0a46fSAndroid Build Coastguard Worker
163*3ac0a46fSAndroid Build Coastguard Worker float phase = -1123.5f;
164*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashPhase(nullptr, &phase));
165*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1123.5f, phase);
166*3ac0a46fSAndroid Build Coastguard Worker
167*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFPageObj_GetDashCount(nullptr));
168*3ac0a46fSAndroid Build Coastguard Worker
169*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashArray(nullptr, nullptr, 3));
170*3ac0a46fSAndroid Build Coastguard Worker
171*3ac0a46fSAndroid Build Coastguard Worker float get_array[] = {-1.0f, -1.0f, -1.0f};
172*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashArray(nullptr, get_array, 3));
173*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 3; i++)
174*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1.0f, get_array[i]);
175*3ac0a46fSAndroid Build Coastguard Worker
176*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_SetDashPhase(nullptr, 5.0f));
177*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_SetDashArray(nullptr, nullptr, 3, 5.0f));
178*3ac0a46fSAndroid Build Coastguard Worker
179*3ac0a46fSAndroid Build Coastguard Worker float set_array[] = {1.0f, 2.0f, 3.0f};
180*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_SetDashArray(nullptr, set_array, 3, 5.0f));
181*3ac0a46fSAndroid Build Coastguard Worker }
182*3ac0a46fSAndroid Build Coastguard Worker
183*3ac0a46fSAndroid Build Coastguard Worker constexpr int kExpectedObjectCount = 3;
184*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("dashed_lines.pdf"));
185*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
186*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
187*3ac0a46fSAndroid Build Coastguard Worker
188*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
189*3ac0a46fSAndroid Build Coastguard Worker
190*3ac0a46fSAndroid Build Coastguard Worker {
191*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 0);
192*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(path);
193*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
194*3ac0a46fSAndroid Build Coastguard Worker
195*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashPhase(path, nullptr));
196*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashArray(path, nullptr, 3));
197*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_SetDashArray(path, nullptr, 3, 5.0f));
198*3ac0a46fSAndroid Build Coastguard Worker
199*3ac0a46fSAndroid Build Coastguard Worker float phase = -1123.5f;
200*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
201*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0f, phase);
202*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPageObj_GetDashCount(path));
203*3ac0a46fSAndroid Build Coastguard Worker
204*3ac0a46fSAndroid Build Coastguard Worker float get_array[] = {-1.0f, -1.0f, -1.0f};
205*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashArray(path, get_array, 3));
206*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 3; i++)
207*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1.0f, get_array[i]);
208*3ac0a46fSAndroid Build Coastguard Worker }
209*3ac0a46fSAndroid Build Coastguard Worker
210*3ac0a46fSAndroid Build Coastguard Worker {
211*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 1);
212*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(path);
213*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
214*3ac0a46fSAndroid Build Coastguard Worker
215*3ac0a46fSAndroid Build Coastguard Worker float phase = -1123.5f;
216*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
217*3ac0a46fSAndroid Build Coastguard Worker EXPECT_LT(0.0f, phase);
218*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(6, FPDFPageObj_GetDashCount(path));
219*3ac0a46fSAndroid Build Coastguard Worker
220*3ac0a46fSAndroid Build Coastguard Worker float dash_array[] = {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f};
221*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetDashArray(path, dash_array, 6));
222*3ac0a46fSAndroid Build Coastguard Worker
223*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
224*3ac0a46fSAndroid Build Coastguard Worker EXPECT_LT(0.0f, dash_array[i]);
225*3ac0a46fSAndroid Build Coastguard Worker
226*3ac0a46fSAndroid Build Coastguard Worker // the array is decreasing in value.
227*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 5; i++)
228*3ac0a46fSAndroid Build Coastguard Worker EXPECT_GT(dash_array[i], dash_array[i + 1]);
229*3ac0a46fSAndroid Build Coastguard Worker
230*3ac0a46fSAndroid Build Coastguard Worker // modify phase
231*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetDashPhase(path, 1.0f));
232*3ac0a46fSAndroid Build Coastguard Worker
233*3ac0a46fSAndroid Build Coastguard Worker phase = -1123.5f;
234*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
235*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(1.0f, phase);
236*3ac0a46fSAndroid Build Coastguard Worker
237*3ac0a46fSAndroid Build Coastguard Worker // clear array
238*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetDashArray(path, nullptr, 0, 0.0f));
239*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPageObj_GetDashCount(path));
240*3ac0a46fSAndroid Build Coastguard Worker
241*3ac0a46fSAndroid Build Coastguard Worker phase = -1123.5f;
242*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
243*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0f, phase);
244*3ac0a46fSAndroid Build Coastguard Worker }
245*3ac0a46fSAndroid Build Coastguard Worker
246*3ac0a46fSAndroid Build Coastguard Worker {
247*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 2);
248*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(path);
249*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
250*3ac0a46fSAndroid Build Coastguard Worker
251*3ac0a46fSAndroid Build Coastguard Worker float phase = -1123.5f;
252*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
253*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0f, phase);
254*3ac0a46fSAndroid Build Coastguard Worker
255*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPageObj_GetDashCount(path));
256*3ac0a46fSAndroid Build Coastguard Worker
257*3ac0a46fSAndroid Build Coastguard Worker // `get_array` should be unmodified
258*3ac0a46fSAndroid Build Coastguard Worker float get_array[] = {-1.0f, -1.0f, -1.0f, -1.0f};
259*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashArray(path, get_array, 4));
260*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
261*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1.0f, get_array[i]);
262*3ac0a46fSAndroid Build Coastguard Worker
263*3ac0a46fSAndroid Build Coastguard Worker // modify dash_array and phase
264*3ac0a46fSAndroid Build Coastguard Worker const float set_array[] = {1.0f, 2.0f, 3.0f};
265*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetDashArray(path, set_array, 3, 5.0f));
266*3ac0a46fSAndroid Build Coastguard Worker
267*3ac0a46fSAndroid Build Coastguard Worker phase = -1123.5f;
268*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
269*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(5.0f, phase);
270*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(3, FPDFPageObj_GetDashCount(path));
271*3ac0a46fSAndroid Build Coastguard Worker
272*3ac0a46fSAndroid Build Coastguard Worker // Pretend `get_array` has too few members.
273*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFPageObj_GetDashArray(path, get_array, 2));
274*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
275*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1.0f, get_array[i]);
276*3ac0a46fSAndroid Build Coastguard Worker
277*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetDashArray(path, get_array, 4));
278*3ac0a46fSAndroid Build Coastguard Worker
279*3ac0a46fSAndroid Build Coastguard Worker // `get_array` should be modified only up to dash_count
280*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < 3; i++)
281*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(static_cast<float>(i + 1), get_array[i]);
282*3ac0a46fSAndroid Build Coastguard Worker
283*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-1.0f, get_array[3]);
284*3ac0a46fSAndroid Build Coastguard Worker
285*3ac0a46fSAndroid Build Coastguard Worker // clear array
286*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetDashArray(path, set_array, 0, 4.0f));
287*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPageObj_GetDashCount(path));
288*3ac0a46fSAndroid Build Coastguard Worker
289*3ac0a46fSAndroid Build Coastguard Worker phase = -1123.5f;
290*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
291*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(4.0f, phase);
292*3ac0a46fSAndroid Build Coastguard Worker }
293*3ac0a46fSAndroid Build Coastguard Worker
294*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
295*3ac0a46fSAndroid Build Coastguard Worker }
296*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetRotatedBoundsBadParameters)297*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetRotatedBoundsBadParameters) {
298*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
299*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
300*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
301*3ac0a46fSAndroid Build Coastguard Worker
302*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
303*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
304*3ac0a46fSAndroid Build Coastguard Worker
305*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF quad;
306*3ac0a46fSAndroid Build Coastguard Worker ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(nullptr, nullptr));
307*3ac0a46fSAndroid Build Coastguard Worker ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(obj, nullptr));
308*3ac0a46fSAndroid Build Coastguard Worker ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(nullptr, &quad));
309*3ac0a46fSAndroid Build Coastguard Worker
310*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
311*3ac0a46fSAndroid Build Coastguard Worker }
312*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetBoundsForNormalText)313*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetBoundsForNormalText) {
314*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
315*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
316*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
317*3ac0a46fSAndroid Build Coastguard Worker
318*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
319*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
320*3ac0a46fSAndroid Build Coastguard Worker
321*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedLeft = 20.348f;
322*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedBottom = 48.164f;
323*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedRight = 83.36f;
324*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedTop = 58.328f;
325*3ac0a46fSAndroid Build Coastguard Worker
326*3ac0a46fSAndroid Build Coastguard Worker float left;
327*3ac0a46fSAndroid Build Coastguard Worker float bottom;
328*3ac0a46fSAndroid Build Coastguard Worker float right;
329*3ac0a46fSAndroid Build Coastguard Worker float top;
330*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetBounds(obj, &left, &bottom, &right, &top));
331*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, left);
332*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, bottom);
333*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, right);
334*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, top);
335*3ac0a46fSAndroid Build Coastguard Worker
336*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF quad;
337*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetRotatedBounds(obj, &quad));
338*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x1);
339*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y1);
340*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x2);
341*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y2);
342*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x3);
343*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y3);
344*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x4);
345*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
346*3ac0a46fSAndroid Build Coastguard Worker
347*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
348*3ac0a46fSAndroid Build Coastguard Worker }
349*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetBoundsForRotatedText)350*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetBoundsForRotatedText) {
351*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("rotated_text.pdf"));
352*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
353*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
354*3ac0a46fSAndroid Build Coastguard Worker
355*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
356*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
357*3ac0a46fSAndroid Build Coastguard Worker
358*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedLeft = 98.9478f;
359*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedBottom = 78.2607f;
360*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedRight = 126.32983f;
361*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedTop = 105.64272f;
362*3ac0a46fSAndroid Build Coastguard Worker
363*3ac0a46fSAndroid Build Coastguard Worker float left;
364*3ac0a46fSAndroid Build Coastguard Worker float bottom;
365*3ac0a46fSAndroid Build Coastguard Worker float right;
366*3ac0a46fSAndroid Build Coastguard Worker float top;
367*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetBounds(obj, &left, &bottom, &right, &top));
368*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, left);
369*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, bottom);
370*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, right);
371*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, top);
372*3ac0a46fSAndroid Build Coastguard Worker
373*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF quad;
374*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetRotatedBounds(obj, &quad));
375*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x1);
376*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(98.4557f, quad.y1);
377*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(119.14279f, quad.x2);
378*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y2);
379*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x3);
380*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(85.447739f, quad.y3);
381*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(106.13486f, quad.x4);
382*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
383*3ac0a46fSAndroid Build Coastguard Worker
384*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
385*3ac0a46fSAndroid Build Coastguard Worker }
386*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetBoundsForNormalImage)387*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetBoundsForNormalImage) {
388*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("matte.pdf"));
389*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
390*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
391*3ac0a46fSAndroid Build Coastguard Worker
392*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 2);
393*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
394*3ac0a46fSAndroid Build Coastguard Worker
395*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedLeft = 0.0f;
396*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedBottom = 90.0f;
397*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedRight = 40.0f;
398*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedTop = 150.0f;
399*3ac0a46fSAndroid Build Coastguard Worker
400*3ac0a46fSAndroid Build Coastguard Worker float left;
401*3ac0a46fSAndroid Build Coastguard Worker float bottom;
402*3ac0a46fSAndroid Build Coastguard Worker float right;
403*3ac0a46fSAndroid Build Coastguard Worker float top;
404*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetBounds(obj, &left, &bottom, &right, &top));
405*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, left);
406*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, bottom);
407*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, right);
408*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, top);
409*3ac0a46fSAndroid Build Coastguard Worker
410*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF quad;
411*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetRotatedBounds(obj, &quad));
412*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x1);
413*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y1);
414*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x2);
415*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y2);
416*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x3);
417*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y3);
418*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x4);
419*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
420*3ac0a46fSAndroid Build Coastguard Worker
421*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
422*3ac0a46fSAndroid Build Coastguard Worker }
423*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,GetBoundsForRotatedImage)424*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, GetBoundsForRotatedImage) {
425*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("rotated_image.pdf"));
426*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
427*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
428*3ac0a46fSAndroid Build Coastguard Worker
429*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
430*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
431*3ac0a46fSAndroid Build Coastguard Worker
432*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedLeft = 100.0f;
433*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedBottom = 70.0f;
434*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedRight = 170.0f;
435*3ac0a46fSAndroid Build Coastguard Worker constexpr float kExpectedTop = 140.0f;
436*3ac0a46fSAndroid Build Coastguard Worker
437*3ac0a46fSAndroid Build Coastguard Worker float left;
438*3ac0a46fSAndroid Build Coastguard Worker float bottom;
439*3ac0a46fSAndroid Build Coastguard Worker float right;
440*3ac0a46fSAndroid Build Coastguard Worker float top;
441*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetBounds(obj, &left, &bottom, &right, &top));
442*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, left);
443*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, bottom);
444*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, right);
445*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, top);
446*3ac0a46fSAndroid Build Coastguard Worker
447*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF quad;
448*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetRotatedBounds(obj, &quad));
449*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedLeft, quad.x1);
450*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(100.0f, quad.y1);
451*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(130.0f, quad.x2);
452*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedBottom, quad.y2);
453*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedRight, quad.x3);
454*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(110.0f, quad.y3);
455*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(140.0f, quad.x4);
456*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
457*3ac0a46fSAndroid Build Coastguard Worker
458*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
459*3ac0a46fSAndroid Build Coastguard Worker }
460*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFEditPageEmbedderTest,VerifyDashArraySaved)461*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFEditPageEmbedderTest, VerifyDashArraySaved) {
462*3ac0a46fSAndroid Build Coastguard Worker constexpr float kDashArray[] = {2.5, 3.6};
463*3ac0a46fSAndroid Build Coastguard Worker constexpr float kDashPhase = 1.2;
464*3ac0a46fSAndroid Build Coastguard Worker
465*3ac0a46fSAndroid Build Coastguard Worker CreateEmptyDocument();
466*3ac0a46fSAndroid Build Coastguard Worker {
467*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFPage page(FPDFPage_New(document(), 0, 612, 792));
468*3ac0a46fSAndroid Build Coastguard Worker
469*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT path = FPDFPageObj_CreateNewPath(400, 100);
470*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetStrokeWidth(path, 2));
471*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetStrokeColor(path, 255, 0, 0, 255));
472*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPath_SetDrawMode(path, FPDF_FILLMODE_NONE, 1));
473*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPath_LineTo(path, 200, 200));
474*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPageObj_SetDashArray(path, kDashArray,
475*3ac0a46fSAndroid Build Coastguard Worker std::size(kDashArray), kDashPhase));
476*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_InsertObject(page.get(), path);
477*3ac0a46fSAndroid Build Coastguard Worker
478*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
479*3ac0a46fSAndroid Build Coastguard Worker path = FPDFPage_GetObject(page.get(), 0);
480*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(path);
481*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2, FPDFPageObj_GetDashCount(path));
482*3ac0a46fSAndroid Build Coastguard Worker
483*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
484*3ac0a46fSAndroid Build Coastguard Worker }
485*3ac0a46fSAndroid Build Coastguard Worker
486*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenSavedDocument());
487*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadSavedPage(0);
488*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
489*3ac0a46fSAndroid Build Coastguard Worker
490*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 0);
491*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(path);
492*3ac0a46fSAndroid Build Coastguard Worker
493*3ac0a46fSAndroid Build Coastguard Worker float dash_array[] = {0, 0};
494*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int>(std::size(dash_array)),
495*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetDashCount(path));
496*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(
497*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetDashArray(path, dash_array, std::size(dash_array)));
498*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kDashArray[0], dash_array[0]);
499*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kDashArray[1], dash_array[1]);
500*3ac0a46fSAndroid Build Coastguard Worker float dash_phase = 0;
501*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(FPDFPageObj_GetDashPhase(path, &dash_phase));
502*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kDashPhase, dash_phase);
503*3ac0a46fSAndroid Build Coastguard Worker
504*3ac0a46fSAndroid Build Coastguard Worker CloseSavedPage(page);
505*3ac0a46fSAndroid Build Coastguard Worker CloseSavedDocument();
506*3ac0a46fSAndroid Build Coastguard Worker }
507