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