blob: 921e8b47d04ba9e0c4ba9740f641b271db700745 [file] [log] [blame]
thestig64c8e262015-10-28 19:04:261// Copyright 2015 The Chromium 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
Lei Zhangcc9acc12018-03-05 20:49:135#include "pdf/pdf_transform.h"
thestig64c8e262015-10-28 19:04:266
7#include "printing/units.h"
8#include "testing/gtest/include/gtest/gtest.h"
9#include "ui/gfx/geometry/rect.h"
10
Lei Zhangcc9acc12018-03-05 20:49:1311namespace chrome_pdf {
thestig64c8e262015-10-28 19:04:2612
13namespace {
14
Henrique Nakashima1c5da8e2018-10-05 21:56:4315constexpr float kDefaultWidth = 8.5 * printing::kPointsPerInch;
16constexpr float kDefaultHeight = 11.0 * printing::kPointsPerInch;
17constexpr float kDefaultRatio = kDefaultWidth / kDefaultHeight;
18constexpr double kTolerance = 0.0001;
thestig64c8e262015-10-28 19:04:2619
thestig09649fa2016-04-13 03:26:4920void ExpectDefaultPortraitBox(const PdfRectangle& box) {
thestig64c8e262015-10-28 19:04:2621 EXPECT_FLOAT_EQ(0, box.left);
thestig09649fa2016-04-13 03:26:4922 EXPECT_FLOAT_EQ(0, box.bottom);
thestig64c8e262015-10-28 19:04:2623 EXPECT_FLOAT_EQ(kDefaultWidth, box.right);
24 EXPECT_FLOAT_EQ(kDefaultHeight, box.top);
thestig64c8e262015-10-28 19:04:2625}
26
thestig09649fa2016-04-13 03:26:4927void ExpectDefaultLandscapeBox(const PdfRectangle& box) {
thestig64c8e262015-10-28 19:04:2628 EXPECT_FLOAT_EQ(0, box.left);
thestig09649fa2016-04-13 03:26:4929 EXPECT_FLOAT_EQ(0, box.bottom);
thestig64c8e262015-10-28 19:04:2630 EXPECT_FLOAT_EQ(kDefaultHeight, box.right);
31 EXPECT_FLOAT_EQ(kDefaultWidth, box.top);
thestig64c8e262015-10-28 19:04:2632}
33
thestig09649fa2016-04-13 03:26:4934void ExpectBoxesAreEqual(const PdfRectangle& expected,
35 const PdfRectangle& actual) {
thestig64c8e262015-10-28 19:04:2636 EXPECT_FLOAT_EQ(expected.left, actual.left);
thestig09649fa2016-04-13 03:26:4937 EXPECT_FLOAT_EQ(expected.bottom, actual.bottom);
thestig64c8e262015-10-28 19:04:2638 EXPECT_FLOAT_EQ(expected.right, actual.right);
39 EXPECT_FLOAT_EQ(expected.top, actual.top);
thestig64c8e262015-10-28 19:04:2640}
41
thestig09649fa2016-04-13 03:26:4942void InitializeBoxToInvalidValues(PdfRectangle* box) {
43 box->left = box->bottom = box->right = box->top = -1;
thestig64c8e262015-10-28 19:04:2644}
45
thestig09649fa2016-04-13 03:26:4946void InitializeBoxToDefaultPortraitValues(PdfRectangle* box) {
thestig64c8e262015-10-28 19:04:2647 box->left = 0;
thestig09649fa2016-04-13 03:26:4948 box->bottom = 0;
thestig64c8e262015-10-28 19:04:2649 box->right = kDefaultWidth;
50 box->top = kDefaultHeight;
thestig64c8e262015-10-28 19:04:2651}
52
thestig09649fa2016-04-13 03:26:4953void InitializeBoxToDefaultLandscapeValue(PdfRectangle* box) {
thestig64c8e262015-10-28 19:04:2654 box->left = 0;
thestig09649fa2016-04-13 03:26:4955 box->bottom = 0;
thestig64c8e262015-10-28 19:04:2656 box->right = kDefaultHeight;
57 box->top = kDefaultWidth;
thestig64c8e262015-10-28 19:04:2658}
59
60} // namespace
61
62TEST(PdfTransformTest, CalculateScaleFactor) {
63 gfx::Rect rect(kDefaultWidth, kDefaultHeight);
64 double scale;
65
66 // 1:1
67 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, false);
68 EXPECT_NEAR(1, scale, kTolerance);
69 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, true);
70 EXPECT_NEAR(kDefaultRatio, scale, kTolerance);
71
72 // 1:2
73 rect = gfx::Rect(kDefaultWidth / 2, kDefaultHeight / 2);
74 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, false);
75 EXPECT_NEAR(0.5, scale, kTolerance);
76 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, true);
77 EXPECT_NEAR(kDefaultRatio / 2, scale, kTolerance);
78
79 // 3:1
80 rect = gfx::Rect(kDefaultWidth * 3, kDefaultHeight * 3);
81 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, false);
82 EXPECT_NEAR(3, scale, kTolerance);
83 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, true);
84 EXPECT_NEAR(kDefaultRatio * 3, scale, kTolerance);
85
86 // 3:1, rotated.
87 rect = gfx::Rect(kDefaultHeight * 3, kDefaultWidth * 3);
88 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, false);
89 EXPECT_NEAR(kDefaultRatio * 3, scale, kTolerance);
90 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, true);
91 EXPECT_NEAR(3, scale, kTolerance);
92
93 // Odd size
94 rect = gfx::Rect(10, 1000);
95 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, false);
96 EXPECT_NEAR(0.01634, scale, kTolerance);
97 scale = CalculateScaleFactor(rect, kDefaultWidth, kDefaultHeight, true);
98 EXPECT_NEAR(0.01263, scale, kTolerance);
99}
100
101TEST(PdfTransformTest, SetDefaultClipBox) {
thestig09649fa2016-04-13 03:26:49102 PdfRectangle box;
thestig64c8e262015-10-28 19:04:26103
104 SetDefaultClipBox(false, &box);
105 ExpectDefaultPortraitBox(box);
106
107 SetDefaultClipBox(true, &box);
108 ExpectDefaultLandscapeBox(box);
109}
110
111TEST(PdfTransformTest, CalculateMediaBoxAndCropBox) {
thestig09649fa2016-04-13 03:26:49112 PdfRectangle media_box;
113 PdfRectangle crop_box;
thestig64c8e262015-10-28 19:04:26114
115 // Assume both boxes are there.
116 InitializeBoxToDefaultPortraitValues(&media_box);
117 InitializeBoxToDefaultLandscapeValue(&crop_box);
118 CalculateMediaBoxAndCropBox(true, true, true, &media_box, &crop_box);
119 ExpectDefaultPortraitBox(media_box);
120 ExpectDefaultLandscapeBox(crop_box);
121
122 // Assume both boxes are missing.
123 InitializeBoxToInvalidValues(&media_box);
124 InitializeBoxToInvalidValues(&crop_box);
125 CalculateMediaBoxAndCropBox(false, false, false, &media_box, &crop_box);
126 ExpectDefaultPortraitBox(media_box);
127 ExpectDefaultPortraitBox(crop_box);
128 CalculateMediaBoxAndCropBox(true, false, false, &media_box, &crop_box);
129 ExpectDefaultLandscapeBox(media_box);
130 ExpectDefaultLandscapeBox(crop_box);
131
132 // Assume crop box is missing.
Henrique Nakashima1c5da8e2018-10-05 21:56:43133 constexpr PdfRectangle expected_box = {0, 0, 42, 420};
thestig64c8e262015-10-28 19:04:26134 media_box = expected_box;
135 InitializeBoxToInvalidValues(&crop_box);
136 CalculateMediaBoxAndCropBox(false, true, false, &media_box, &crop_box);
137 ExpectBoxesAreEqual(expected_box, media_box);
138 ExpectBoxesAreEqual(expected_box, crop_box);
139
140 // Assume media box is missing.
141 InitializeBoxToInvalidValues(&media_box);
142 CalculateMediaBoxAndCropBox(false, false, true, &media_box, &crop_box);
143 ExpectBoxesAreEqual(expected_box, media_box);
144 ExpectBoxesAreEqual(expected_box, crop_box);
145}
146
147TEST(PdfTransformTest, CalculateClipBoxBoundary) {
thestig09649fa2016-04-13 03:26:49148 PdfRectangle media_box;
149 PdfRectangle crop_box;
150 PdfRectangle result;
thestig64c8e262015-10-28 19:04:26151
152 // media box and crop box are the same.
153 InitializeBoxToDefaultPortraitValues(&media_box);
154 InitializeBoxToDefaultPortraitValues(&crop_box);
155 result = CalculateClipBoxBoundary(media_box, crop_box);
156 ExpectDefaultPortraitBox(result);
157
158 // media box is portrait and crop box is landscape.
159 InitializeBoxToDefaultLandscapeValue(&crop_box);
160 result = CalculateClipBoxBoundary(media_box, crop_box);
161 EXPECT_FLOAT_EQ(0, result.left);
thestig09649fa2016-04-13 03:26:49162 EXPECT_FLOAT_EQ(0, result.bottom);
thestig64c8e262015-10-28 19:04:26163 EXPECT_FLOAT_EQ(kDefaultWidth, result.right);
164 EXPECT_FLOAT_EQ(kDefaultWidth, result.top);
thestig64c8e262015-10-28 19:04:26165
166 // crop box is smaller than media box.
167 crop_box.left = 0;
thestig64c8e262015-10-28 19:04:26168 crop_box.bottom = 0;
thestig09649fa2016-04-13 03:26:49169 crop_box.right = 100;
thestig64c8e262015-10-28 19:04:26170 crop_box.top = 200;
171 result = CalculateClipBoxBoundary(media_box, crop_box);
172 EXPECT_FLOAT_EQ(0, result.left);
thestig09649fa2016-04-13 03:26:49173 EXPECT_FLOAT_EQ(0, result.bottom);
thestig64c8e262015-10-28 19:04:26174 EXPECT_FLOAT_EQ(100, result.right);
175 EXPECT_FLOAT_EQ(200, result.top);
thestig64c8e262015-10-28 19:04:26176
177 // crop box is smaller than the media box in one dimension and longer in the
178 // other.
179 crop_box.left = 0;
thestig64c8e262015-10-28 19:04:26180 crop_box.bottom = 0;
thestig09649fa2016-04-13 03:26:49181 crop_box.right = 100;
thestig64c8e262015-10-28 19:04:26182 crop_box.top = 2000;
183 result = CalculateClipBoxBoundary(media_box, crop_box);
184 EXPECT_FLOAT_EQ(0, result.left);
thestig09649fa2016-04-13 03:26:49185 EXPECT_FLOAT_EQ(0, result.bottom);
thestig64c8e262015-10-28 19:04:26186 EXPECT_FLOAT_EQ(100, result.right);
187 EXPECT_FLOAT_EQ(kDefaultHeight, result.top);
thestig64c8e262015-10-28 19:04:26188}
189
190TEST(PdfTransformTest, CalculateScaledClipBoxOffset) {
Henrique Nakashima1c5da8e2018-10-05 21:56:43191 constexpr gfx::Rect rect(kDefaultWidth, kDefaultHeight);
thestig09649fa2016-04-13 03:26:49192 PdfRectangle clip_box;
thestig64c8e262015-10-28 19:04:26193 double offset_x;
194 double offset_y;
195
196 // |rect| and |clip_box| are the same size.
197 InitializeBoxToDefaultPortraitValues(&clip_box);
198 CalculateScaledClipBoxOffset(rect, clip_box, &offset_x, &offset_y);
199 EXPECT_DOUBLE_EQ(0, offset_x);
200 EXPECT_DOUBLE_EQ(0, offset_y);
201
202 // |rect| is larger than |clip_box|.
203 clip_box.top /= 2;
204 clip_box.right /= 4;
205 CalculateScaledClipBoxOffset(rect, clip_box, &offset_x, &offset_y);
206 EXPECT_DOUBLE_EQ(229.5, offset_x);
207 EXPECT_DOUBLE_EQ(198, offset_y);
208}
209
210TEST(PdfTransformTest, CalculateNonScaledClipBoxOffset) {
211 int page_width = kDefaultWidth;
212 int page_height = kDefaultHeight;
thestig09649fa2016-04-13 03:26:49213 PdfRectangle clip_box;
thestig64c8e262015-10-28 19:04:26214 double offset_x;
215 double offset_y;
216
217 // |rect|, page size and |clip_box| are the same.
218 InitializeBoxToDefaultPortraitValues(&clip_box);
Daniel Hosseinian038f0d72019-08-06 23:02:51219 CalculateNonScaledClipBoxOffset(0, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13220 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26221 EXPECT_DOUBLE_EQ(0, offset_x);
222 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51223 CalculateNonScaledClipBoxOffset(1, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13224 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26225 EXPECT_DOUBLE_EQ(0, offset_x);
226 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51227 CalculateNonScaledClipBoxOffset(2, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13228 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26229 EXPECT_DOUBLE_EQ(0, offset_x);
230 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51231 CalculateNonScaledClipBoxOffset(3, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13232 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26233 EXPECT_DOUBLE_EQ(180, offset_x);
234 EXPECT_DOUBLE_EQ(-180, offset_y);
235
236 // Smaller |clip_box|.
237 clip_box.top /= 4;
238 clip_box.right /= 2;
Daniel Hosseinian038f0d72019-08-06 23:02:51239 CalculateNonScaledClipBoxOffset(0, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13240 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26241 EXPECT_DOUBLE_EQ(0, offset_x);
242 EXPECT_DOUBLE_EQ(594, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51243 CalculateNonScaledClipBoxOffset(1, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13244 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26245 EXPECT_DOUBLE_EQ(0, offset_x);
246 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51247 CalculateNonScaledClipBoxOffset(2, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13248 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26249 EXPECT_DOUBLE_EQ(306, offset_x);
250 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51251 CalculateNonScaledClipBoxOffset(3, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13252 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26253 EXPECT_DOUBLE_EQ(486, offset_x);
254 EXPECT_DOUBLE_EQ(414, offset_y);
255
256 // Larger page size.
257 InitializeBoxToDefaultPortraitValues(&clip_box);
258 page_width += 10;
259 page_height += 20;
Daniel Hosseinian038f0d72019-08-06 23:02:51260 CalculateNonScaledClipBoxOffset(0, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13261 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26262 EXPECT_DOUBLE_EQ(0, offset_x);
263 EXPECT_DOUBLE_EQ(20, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51264 CalculateNonScaledClipBoxOffset(1, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13265 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26266 EXPECT_DOUBLE_EQ(0, offset_x);
267 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51268 CalculateNonScaledClipBoxOffset(2, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13269 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26270 EXPECT_DOUBLE_EQ(10, offset_x);
271 EXPECT_DOUBLE_EQ(0, offset_y);
Daniel Hosseinian038f0d72019-08-06 23:02:51272 CalculateNonScaledClipBoxOffset(3, page_width, page_height, clip_box,
Lei Zhangcc9acc12018-03-05 20:49:13273 &offset_x, &offset_y);
thestig64c8e262015-10-28 19:04:26274 EXPECT_DOUBLE_EQ(200, offset_x);
275 EXPECT_DOUBLE_EQ(-170, offset_y);
276}
277
thestigb923f182016-04-05 00:23:33278// https://crbug.com/491160 and https://crbug.com/588757
279TEST(PdfTransformTest, ReversedMediaBox) {
280 int page_width = kDefaultWidth;
281 int page_height = kDefaultHeight;
Henrique Nakashima1c5da8e2018-10-05 21:56:43282 constexpr gfx::Rect rect(kDefaultWidth, kDefaultHeight);
thestig09649fa2016-04-13 03:26:49283 PdfRectangle clip_box;
thestigb923f182016-04-05 00:23:33284 double offset_x;
285 double offset_y;
286
Henrique Nakashima1c5da8e2018-10-05 21:56:43287 constexpr PdfRectangle expected_media_box_b491160 = {0, -792, 612, 0};
thestig09649fa2016-04-13 03:26:49288 PdfRectangle media_box_b491160 = {0, 0, 612, -792};
thestigb923f182016-04-05 00:23:33289 CalculateMediaBoxAndCropBox(false, true, false, &media_box_b491160,
290 &clip_box);
291 ExpectBoxesAreEqual(expected_media_box_b491160, media_box_b491160);
292 ExpectBoxesAreEqual(expected_media_box_b491160, clip_box);
293
294 CalculateScaledClipBoxOffset(rect, media_box_b491160, &offset_x, &offset_y);
295 EXPECT_DOUBLE_EQ(0, offset_x);
296 EXPECT_DOUBLE_EQ(792, offset_y);
297
Daniel Hosseinian038f0d72019-08-06 23:02:51298 CalculateNonScaledClipBoxOffset(0, page_width, page_height, media_box_b491160,
299 &offset_x, &offset_y);
thestigb923f182016-04-05 00:23:33300 EXPECT_DOUBLE_EQ(0, offset_x);
301 EXPECT_DOUBLE_EQ(792, offset_y);
302
thestig09649fa2016-04-13 03:26:49303 PdfRectangle media_box_b588757 = {0, 792, 612, 0};
thestigb923f182016-04-05 00:23:33304 CalculateMediaBoxAndCropBox(false, true, false, &media_box_b588757,
305 &clip_box);
306 ExpectDefaultPortraitBox(media_box_b588757);
307 ExpectDefaultPortraitBox(clip_box);
308
309 CalculateScaledClipBoxOffset(rect, clip_box, &offset_x, &offset_y);
310 EXPECT_DOUBLE_EQ(0, offset_x);
311 EXPECT_DOUBLE_EQ(0, offset_y);
312
Daniel Hosseinian038f0d72019-08-06 23:02:51313 CalculateNonScaledClipBoxOffset(0, page_width, page_height, clip_box,
thestigb923f182016-04-05 00:23:33314 &offset_x, &offset_y);
315 EXPECT_DOUBLE_EQ(0, offset_x);
316 EXPECT_DOUBLE_EQ(0, offset_y);
317
thestig09649fa2016-04-13 03:26:49318 PdfRectangle media_box_left_right_flipped = {612, 792, 0, 0};
thestigb923f182016-04-05 00:23:33319 CalculateMediaBoxAndCropBox(false, true, false, &media_box_left_right_flipped,
320 &clip_box);
321 ExpectDefaultPortraitBox(media_box_left_right_flipped);
322 ExpectDefaultPortraitBox(clip_box);
323
324 CalculateScaledClipBoxOffset(rect, clip_box, &offset_x, &offset_y);
325 EXPECT_DOUBLE_EQ(0, offset_x);
326 EXPECT_DOUBLE_EQ(0, offset_y);
327
Daniel Hosseinian038f0d72019-08-06 23:02:51328 CalculateNonScaledClipBoxOffset(0, page_width, page_height, clip_box,
thestigb923f182016-04-05 00:23:33329 &offset_x, &offset_y);
330 EXPECT_DOUBLE_EQ(0, offset_x);
331 EXPECT_DOUBLE_EQ(0, offset_y);
332}
333
Lei Zhangcc9acc12018-03-05 20:49:13334} // namespace chrome_pdf