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