5#include "gtest/gtest.h"
12#define CHECK_POINT_WITH_OFFSET(rr, p, outward_offset) \
13 EXPECT_TRUE(rr.Contains(p)); \
14 EXPECT_FALSE(rr.Contains(p + outward_offset));
22class SpyPathReceiver :
public PathReceiver {
25 using LineSegment = std::function<void(
const Point&)>;
29 using ConicSegment = std::function<void(
const Point&,
const Point&,
Scalar)>;
31 void SpyLineTo(LineSegment line_to) { line_to_ = std::move(line_to); }
33 void SpyCubicTo(CubicSegment cubic_to) { cubic_to_ = std::move(cubic_to); }
35 void SpyConicTo(ConicSegment conic_to) { conic_to_ = std::move(conic_to); }
46 void QuadTo(
const Point& cp,
const Point&
p2)
override {}
50 cubic_to_(cp1, cp2,
p2);
61 void Close()
override {}
65 CubicSegment cubic_to_;
66 ConicSegment conic_to_;
73TEST(RoundSuperellipseTest, EmptyDeclaration) {
74 RoundSuperellipse rse;
76 EXPECT_TRUE(rse.IsEmpty());
77 EXPECT_FALSE(rse.IsRect());
78 EXPECT_FALSE(rse.IsOval());
79 EXPECT_TRUE(rse.IsFinite());
80 EXPECT_TRUE(rse.GetBounds().IsEmpty());
81 EXPECT_EQ(rse.GetBounds(), Rect());
82 EXPECT_EQ(rse.GetBounds().GetLeft(), 0.0f);
83 EXPECT_EQ(rse.GetBounds().GetTop(), 0.0f);
84 EXPECT_EQ(rse.GetBounds().GetRight(), 0.0f);
85 EXPECT_EQ(rse.GetBounds().GetBottom(), 0.0f);
86 EXPECT_EQ(rse.GetRadii().top_left, Size());
87 EXPECT_EQ(rse.GetRadii().top_right, Size());
88 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
89 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
90 EXPECT_EQ(rse.GetRadii().top_left.width, 0.0f);
91 EXPECT_EQ(rse.GetRadii().top_left.height, 0.0f);
92 EXPECT_EQ(rse.GetRadii().top_right.width, 0.0f);
93 EXPECT_EQ(rse.GetRadii().top_right.height, 0.0f);
94 EXPECT_EQ(rse.GetRadii().bottom_left.width, 0.0f);
95 EXPECT_EQ(rse.GetRadii().bottom_left.height, 0.0f);
96 EXPECT_EQ(rse.GetRadii().bottom_right.width, 0.0f);
97 EXPECT_EQ(rse.GetRadii().bottom_right.height, 0.0f);
100TEST(RoundSuperellipseTest, DefaultConstructor) {
101 RoundSuperellipse rse = RoundSuperellipse();
103 EXPECT_TRUE(rse.IsEmpty());
104 EXPECT_FALSE(rse.IsRect());
105 EXPECT_FALSE(rse.IsOval());
106 EXPECT_TRUE(rse.IsFinite());
107 EXPECT_TRUE(rse.GetBounds().IsEmpty());
108 EXPECT_EQ(rse.GetBounds(), Rect());
109 EXPECT_EQ(rse.GetRadii().top_left, Size());
110 EXPECT_EQ(rse.GetRadii().top_right, Size());
111 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
112 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
115TEST(RoundSuperellipseTest, EmptyRectConstruction) {
116 RoundSuperellipse rse =
119 EXPECT_TRUE(rse.IsEmpty());
120 EXPECT_FALSE(rse.IsRect());
121 EXPECT_FALSE(rse.IsOval());
122 EXPECT_TRUE(rse.IsFinite());
123 EXPECT_TRUE(rse.GetBounds().IsEmpty());
124 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(20.0f, 20.0f, 20.0f, 20.0f));
125 EXPECT_EQ(rse.GetRadii().top_left, Size());
126 EXPECT_EQ(rse.GetRadii().top_right, Size());
127 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
128 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
131TEST(RoundSuperellipseTest, RectConstructor) {
132 RoundSuperellipse rse =
135 EXPECT_FALSE(rse.IsEmpty());
136 EXPECT_TRUE(rse.IsRect());
137 EXPECT_FALSE(rse.IsOval());
138 EXPECT_TRUE(rse.IsFinite());
139 EXPECT_FALSE(rse.GetBounds().IsEmpty());
140 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
141 EXPECT_EQ(rse.GetRadii().top_left, Size());
142 EXPECT_EQ(rse.GetRadii().top_right, Size());
143 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
144 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
147TEST(RoundSuperellipseTest, InvertedRectConstruction) {
148 RoundSuperellipse rse =
151 EXPECT_FALSE(rse.IsEmpty());
152 EXPECT_TRUE(rse.IsRect());
153 EXPECT_FALSE(rse.IsOval());
154 EXPECT_TRUE(rse.IsFinite());
155 EXPECT_FALSE(rse.GetBounds().IsEmpty());
156 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
157 EXPECT_EQ(rse.GetRadii().top_left, Size());
158 EXPECT_EQ(rse.GetRadii().top_right, Size());
159 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
160 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
163TEST(RoundSuperellipseTest, EmptyOvalConstruction) {
167 EXPECT_TRUE(rse.IsEmpty());
168 EXPECT_FALSE(rse.IsRect());
169 EXPECT_FALSE(rse.IsOval());
170 EXPECT_TRUE(rse.IsFinite());
171 EXPECT_TRUE(rse.GetBounds().IsEmpty());
172 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(20.0f, 20.0f, 20.0f, 20.0f));
173 EXPECT_EQ(rse.GetRadii().top_left, Size());
174 EXPECT_EQ(rse.GetRadii().top_right, Size());
175 EXPECT_EQ(rse.GetRadii().bottom_left, Size());
176 EXPECT_EQ(rse.GetRadii().bottom_right, Size());
179TEST(RoundSuperellipseTest, OvalConstructor) {
180 RoundSuperellipse rse =
183 EXPECT_FALSE(rse.IsEmpty());
184 EXPECT_FALSE(rse.IsRect());
185 EXPECT_TRUE(rse.IsOval());
186 EXPECT_TRUE(rse.IsFinite());
187 EXPECT_FALSE(rse.GetBounds().IsEmpty());
188 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
189 EXPECT_EQ(rse.GetRadii().top_left, Size(5.0f, 5.0f));
190 EXPECT_EQ(rse.GetRadii().top_right, Size(5.0f, 5.0f));
191 EXPECT_EQ(rse.GetRadii().bottom_left, Size(5.0f, 5.0f));
192 EXPECT_EQ(rse.GetRadii().bottom_right, Size(5.0f, 5.0f));
195TEST(RoundSuperellipseTest, InvertedOvalConstruction) {
199 EXPECT_FALSE(rse.IsEmpty());
200 EXPECT_FALSE(rse.IsRect());
201 EXPECT_TRUE(rse.IsOval());
202 EXPECT_TRUE(rse.IsFinite());
203 EXPECT_FALSE(rse.GetBounds().IsEmpty());
204 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
205 EXPECT_EQ(rse.GetRadii().top_left, Size(5.0f, 5.0f));
206 EXPECT_EQ(rse.GetRadii().top_right, Size(5.0f, 5.0f));
207 EXPECT_EQ(rse.GetRadii().bottom_left, Size(5.0f, 5.0f));
208 EXPECT_EQ(rse.GetRadii().bottom_right, Size(5.0f, 5.0f));
211TEST(RoundSuperellipseTest, RectRadiusConstructor) {
215 EXPECT_FALSE(rse.IsEmpty());
216 EXPECT_FALSE(rse.IsRect());
217 EXPECT_FALSE(rse.IsOval());
218 EXPECT_TRUE(rse.IsFinite());
219 EXPECT_FALSE(rse.GetBounds().IsEmpty());
220 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
221 EXPECT_EQ(rse.GetRadii().top_left, Size(2.0f, 2.0f));
222 EXPECT_EQ(rse.GetRadii().top_right, Size(2.0f, 2.0f));
223 EXPECT_EQ(rse.GetRadii().bottom_left, Size(2.0f, 2.0f));
224 EXPECT_EQ(rse.GetRadii().bottom_right, Size(2.0f, 2.0f));
227TEST(RoundSuperellipseTest, RectXYConstructor) {
231 EXPECT_FALSE(rse.IsEmpty());
232 EXPECT_FALSE(rse.IsRect());
233 EXPECT_FALSE(rse.IsOval());
234 EXPECT_TRUE(rse.IsFinite());
235 EXPECT_FALSE(rse.GetBounds().IsEmpty());
236 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
237 EXPECT_EQ(rse.GetRadii().top_left, Size(2.0f, 3.0f));
238 EXPECT_EQ(rse.GetRadii().top_right, Size(2.0f, 3.0f));
239 EXPECT_EQ(rse.GetRadii().bottom_left, Size(2.0f, 3.0f));
240 EXPECT_EQ(rse.GetRadii().bottom_right, Size(2.0f, 3.0f));
243TEST(RoundSuperellipseTest, RectSizeConstructor) {
247 EXPECT_FALSE(rse.IsEmpty());
248 EXPECT_FALSE(rse.IsRect());
249 EXPECT_FALSE(rse.IsOval());
250 EXPECT_TRUE(rse.IsFinite());
251 EXPECT_FALSE(rse.GetBounds().IsEmpty());
252 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
253 EXPECT_EQ(rse.GetRadii().top_left, Size(2.0f, 3.0f));
254 EXPECT_EQ(rse.GetRadii().top_right, Size(2.0f, 3.0f));
255 EXPECT_EQ(rse.GetRadii().bottom_left, Size(2.0f, 3.0f));
256 EXPECT_EQ(rse.GetRadii().bottom_right, Size(2.0f, 3.0f));
259TEST(RoundSuperellipseTest, RectRadiiConstructor) {
263 .top_left = Size(1.0, 1.5),
264 .top_right = Size(2.0, 2.5f),
265 .bottom_left = Size(3.0, 3.5f),
266 .bottom_right = Size(4.0, 4.5f),
269 EXPECT_FALSE(rse.IsEmpty());
270 EXPECT_FALSE(rse.IsRect());
271 EXPECT_FALSE(rse.IsOval());
272 EXPECT_TRUE(rse.IsFinite());
273 EXPECT_FALSE(rse.GetBounds().IsEmpty());
274 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 20.0f, 20.0f));
275 EXPECT_EQ(rse.GetRadii().top_left, Size(1.0f, 1.5f));
276 EXPECT_EQ(rse.GetRadii().top_right, Size(2.0f, 2.5f));
277 EXPECT_EQ(rse.GetRadii().bottom_left, Size(3.0f, 3.5f));
278 EXPECT_EQ(rse.GetRadii().bottom_right, Size(4.0f, 4.5f));
281TEST(RoundSuperellipseTest, RectRadiiOverflowWidthConstructor) {
285 .top_left = Size(1.0f, 2.0f),
286 .top_right = Size(3.0f, 4.0f),
287 .bottom_left = Size(5.0f, 6.0f),
288 .bottom_right = Size(7.0f, 8.0f),
294 EXPECT_FALSE(rse.IsEmpty());
295 EXPECT_FALSE(rse.IsRect());
296 EXPECT_FALSE(rse.IsOval());
297 EXPECT_TRUE(rse.IsFinite());
298 EXPECT_FALSE(rse.GetBounds().IsEmpty());
299 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 16.0f, 40.0f));
300 EXPECT_EQ(rse.GetRadii().top_left, Size(0.5f, 1.0f));
301 EXPECT_EQ(rse.GetRadii().top_right, Size(1.5f, 2.0f));
302 EXPECT_EQ(rse.GetRadii().bottom_left, Size(2.5f, 3.0f));
303 EXPECT_EQ(rse.GetRadii().bottom_right, Size(3.5f, 4.0f));
306TEST(RoundSuperellipseTest, RectRadiiOverflowHeightConstructor) {
310 .top_left = Size(1.0f, 2.0f),
311 .top_right = Size(3.0f, 4.0f),
312 .bottom_left = Size(5.0f, 6.0f),
313 .bottom_right = Size(7.0f, 8.0f),
319 EXPECT_FALSE(rse.IsEmpty());
320 EXPECT_FALSE(rse.IsRect());
321 EXPECT_FALSE(rse.IsOval());
322 EXPECT_TRUE(rse.IsFinite());
323 EXPECT_FALSE(rse.GetBounds().IsEmpty());
324 EXPECT_EQ(rse.GetBounds(),
Rect::MakeLTRB(10.0f, 10.0f, 40.0f, 16.0f));
325 EXPECT_EQ(rse.GetRadii().top_left, Size(0.5f, 1.0f));
326 EXPECT_EQ(rse.GetRadii().top_right, Size(1.5f, 2.0f));
327 EXPECT_EQ(rse.GetRadii().bottom_left, Size(2.5f, 3.0f));
328 EXPECT_EQ(rse.GetRadii().bottom_right, Size(3.5f, 4.0f));
331TEST(RoundSuperellipseTest, Shift) {
335 .top_left = Size(1.0f, 2.0f),
336 .top_right = Size(3.0f, 4.0f),
337 .bottom_left = Size(5.0f, 6.0f),
338 .bottom_right = Size(7.0f, 8.0f),
340 RoundSuperellipse shifted = rse.
Shift(5.0, 6.0);
342 EXPECT_FALSE(shifted.IsEmpty());
343 EXPECT_FALSE(shifted.IsRect());
344 EXPECT_FALSE(shifted.IsOval());
345 EXPECT_TRUE(shifted.IsFinite());
346 EXPECT_FALSE(shifted.GetBounds().IsEmpty());
347 EXPECT_EQ(shifted.GetBounds(),
Rect::MakeLTRB(15.0f, 16.0f, 45.0f, 46.0f));
348 EXPECT_EQ(shifted.GetRadii().top_left, Size(1.0f, 2.0f));
349 EXPECT_EQ(shifted.GetRadii().top_right, Size(3.0f, 4.0f));
350 EXPECT_EQ(shifted.GetRadii().bottom_left, Size(5.0f, 6.0f));
351 EXPECT_EQ(shifted.GetRadii().bottom_right, Size(7.0f, 8.0f));
356 .top_left = Size(1.0f, 2.0f),
357 .top_right = Size(3.0f, 4.0f),
358 .bottom_left = Size(5.0f, 6.0f),
359 .bottom_right = Size(7.0f, 8.0f),
363TEST(RoundSuperellipseTest, ExpandScalar) {
367 .top_left = Size(1.0f, 2.0f),
368 .top_right = Size(3.0f, 4.0f),
369 .bottom_left = Size(5.0f, 6.0f),
370 .bottom_right = Size(7.0f, 8.0f),
372 RoundSuperellipse expanded = rse.
Expand(5.0);
374 EXPECT_FALSE(expanded.IsEmpty());
375 EXPECT_FALSE(expanded.IsRect());
376 EXPECT_FALSE(expanded.IsOval());
377 EXPECT_TRUE(expanded.IsFinite());
378 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
379 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 5.0f, 45.0f, 45.0f));
380 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
381 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
382 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
383 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
388 .top_left = Size(1.0f, 2.0f),
389 .top_right = Size(3.0f, 4.0f),
390 .bottom_left = Size(5.0f, 6.0f),
391 .bottom_right = Size(7.0f, 8.0f),
395TEST(RoundSuperellipseTest, ExpandTwoScalars) {
399 .top_left = Size(1.0f, 2.0f),
400 .top_right = Size(3.0f, 4.0f),
401 .bottom_left = Size(5.0f, 6.0f),
402 .bottom_right = Size(7.0f, 8.0f),
404 RoundSuperellipse expanded = rse.
Expand(5.0, 6.0);
406 EXPECT_FALSE(expanded.IsEmpty());
407 EXPECT_FALSE(expanded.IsRect());
408 EXPECT_FALSE(expanded.IsOval());
409 EXPECT_TRUE(expanded.IsFinite());
410 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
411 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 45.0f, 46.0f));
412 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
413 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
414 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
415 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
420 .top_left = Size(1.0f, 2.0f),
421 .top_right = Size(3.0f, 4.0f),
422 .bottom_left = Size(5.0f, 6.0f),
423 .bottom_right = Size(7.0f, 8.0f),
427TEST(RoundSuperellipseTest, ExpandFourScalars) {
431 .top_left = Size(1.0f, 2.0f),
432 .top_right = Size(3.0f, 4.0f),
433 .bottom_left = Size(5.0f, 6.0f),
434 .bottom_right = Size(7.0f, 8.0f),
436 RoundSuperellipse expanded = rse.
Expand(5.0, 6.0, 7.0, 8.0);
438 EXPECT_FALSE(expanded.IsEmpty());
439 EXPECT_FALSE(expanded.IsRect());
440 EXPECT_FALSE(expanded.IsOval());
441 EXPECT_TRUE(expanded.IsFinite());
442 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
443 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 47.0f, 48.0f));
444 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
445 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
446 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
447 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
452 .top_left = Size(1.0f, 2.0f),
453 .top_right = Size(3.0f, 4.0f),
454 .bottom_left = Size(5.0f, 6.0f),
455 .bottom_right = Size(7.0f, 8.0f),
459TEST(RoundSuperellipseTest, ContractScalar) {
463 .top_left = Size(1.0f, 2.0f),
464 .top_right = Size(3.0f, 4.0f),
465 .bottom_left = Size(5.0f, 6.0f),
466 .bottom_right = Size(7.0f, 8.0f),
468 RoundSuperellipse expanded = rse.
Expand(-2.0);
470 EXPECT_FALSE(expanded.IsEmpty());
471 EXPECT_FALSE(expanded.IsRect());
472 EXPECT_FALSE(expanded.IsOval());
473 EXPECT_TRUE(expanded.IsFinite());
474 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
475 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(12.0f, 12.0f, 38.0f, 38.0f));
476 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
477 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
478 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
479 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
484 .top_left = Size(1.0f, 2.0f),
485 .top_right = Size(3.0f, 4.0f),
486 .bottom_left = Size(5.0f, 6.0f),
487 .bottom_right = Size(7.0f, 8.0f),
491TEST(RoundSuperellipseTest, ContractTwoScalars) {
495 .top_left = Size(1.0f, 2.0f),
496 .top_right = Size(3.0f, 4.0f),
497 .bottom_left = Size(5.0f, 6.0f),
498 .bottom_right = Size(7.0f, 8.0f),
500 RoundSuperellipse expanded = rse.
Expand(-1.0, -2.0);
502 EXPECT_FALSE(expanded.IsEmpty());
503 EXPECT_FALSE(expanded.IsRect());
504 EXPECT_FALSE(expanded.IsOval());
505 EXPECT_TRUE(expanded.IsFinite());
506 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
507 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 12.0f, 39.0f, 38.0f));
508 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
509 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
510 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
511 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
516 .top_left = Size(1.0f, 2.0f),
517 .top_right = Size(3.0f, 4.0f),
518 .bottom_left = Size(5.0f, 6.0f),
519 .bottom_right = Size(7.0f, 8.0f),
523TEST(RoundSuperellipseTest, ContractFourScalars) {
527 .top_left = Size(1.0f, 2.0f),
528 .top_right = Size(3.0f, 4.0f),
529 .bottom_left = Size(5.0f, 6.0f),
530 .bottom_right = Size(7.0f, 8.0f),
532 RoundSuperellipse expanded = rse.
Expand(-1.0, -1.5, -2.0, -2.5);
534 EXPECT_FALSE(expanded.IsEmpty());
535 EXPECT_FALSE(expanded.IsRect());
536 EXPECT_FALSE(expanded.IsOval());
537 EXPECT_TRUE(expanded.IsFinite());
538 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
539 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 11.5f, 38.0f, 37.5f));
540 EXPECT_EQ(expanded.GetRadii().top_left, Size(1.0f, 2.0f));
541 EXPECT_EQ(expanded.GetRadii().top_right, Size(3.0f, 4.0f));
542 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(5.0f, 6.0f));
543 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(7.0f, 8.0f));
548 .top_left = Size(1.0f, 2.0f),
549 .top_right = Size(3.0f, 4.0f),
550 .bottom_left = Size(5.0f, 6.0f),
551 .bottom_right = Size(7.0f, 8.0f),
555TEST(RoundSuperellipseTest, ContractAndRequireRadiiAdjustment) {
559 .top_left = Size(1.0f, 2.0f),
560 .top_right = Size(3.0f, 4.0f),
561 .bottom_left = Size(5.0f, 6.0f),
562 .bottom_right = Size(7.0f, 8.0f),
564 RoundSuperellipse expanded = rse.
Expand(-12.0);
570 EXPECT_FALSE(expanded.IsEmpty());
571 EXPECT_FALSE(expanded.IsRect());
572 EXPECT_FALSE(expanded.IsOval());
573 EXPECT_TRUE(expanded.IsFinite());
574 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
575 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(22.0f, 22.0f, 28.0f, 28.0f));
576 EXPECT_EQ(expanded.GetRadii().top_left, Size(0.5f, 1.0f));
577 EXPECT_EQ(expanded.GetRadii().top_right, Size(1.5f, 2.0f));
578 EXPECT_EQ(expanded.GetRadii().bottom_left, Size(2.5f, 3.0f));
579 EXPECT_EQ(expanded.GetRadii().bottom_right, Size(3.5f, 4.0f));
586 .top_left = Size(1.0f, 2.0f),
587 .top_right = Size(3.0f, 4.0f),
588 .bottom_left = Size(5.0f, 6.0f),
589 .bottom_right = Size(7.0f, 8.0f),
598 .top_left = Size(0.5f, 1.0f),
599 .top_right = Size(1.5f, 2.0f),
600 .bottom_left = Size(2.5f, 3.0f),
601 .bottom_right = Size(3.5f, 4.0f),
605TEST(RoundSuperellipseTest, NoCornerRoundSuperellipseContains) {
612 EXPECT_TRUE(no_corners.Contains({-50, -50}));
615 EXPECT_TRUE(no_corners.Contains({-50, 49.99}));
616 EXPECT_TRUE(no_corners.Contains({49.99, -50}));
617 EXPECT_TRUE(no_corners.Contains({49.99, 49.99}));
618 EXPECT_FALSE(no_corners.Contains({-50.01, -50}));
619 EXPECT_FALSE(no_corners.Contains({-50, -50.01}));
620 EXPECT_FALSE(no_corners.Contains({-50.01, 50}));
621 EXPECT_FALSE(no_corners.Contains({-50, 50.01}));
622 EXPECT_FALSE(no_corners.Contains({50.01, -50}));
623 EXPECT_FALSE(no_corners.Contains({50, -50.01}));
624 EXPECT_FALSE(no_corners.Contains({50.01, 50}));
625 EXPECT_FALSE(no_corners.Contains({50, 50.01}));
628TEST(RoundSuperellipseTest, TinyCornerContains) {
635 EXPECT_FALSE(tiny_corners.Contains({-50, -50}));
636 EXPECT_FALSE(tiny_corners.Contains({-50, 50}));
637 EXPECT_FALSE(tiny_corners.Contains({50, -50}));
638 EXPECT_FALSE(tiny_corners.Contains({50, 50}));
641TEST(RoundSuperellipseTest, UniformSquareContains) {
646#define CHECK_POINT_AND_MIRRORS(p) \
647 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, 0.02)); \
648 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(1, -1), Point(0.02, -0.02)); \
649 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, 1), Point(-0.02, 0.02)); \
650 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, -0.02));
659#undef CHECK_POINT_AND_MIRRORS
662TEST(RoundSuperellipseTest, UniformEllipticalContains) {
667#define CHECK_POINT_AND_MIRRORS(p) \
668 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, 0.02)); \
669 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(1, -1), Point(0.02, -0.02)); \
670 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, 1), Point(-0.02, 0.02)); \
671 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, -0.02));
680#undef CHECK_POINT_AND_MIRRORS
683TEST(RoundSuperellipseTest, UniformRectangularContains) {
689 Point center = bounds.GetCenter();
690#define CHECK_POINT_AND_MIRRORS(p) \
691 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(1, 1) + center, \
692 Point(0.02, 0.02)); \
693 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(1, -1) + center, \
694 Point(0.02, -0.02)); \
695 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(-1, 1) + center, \
696 Point(-0.02, 0.02)); \
697 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(-1, -1) + center, \
698 Point(-0.02, -0.02));
710#undef CHECK_POINT_AND_MIRRORS
713TEST(RoundSuperellipseTest, SlimDiagonalContains) {
719 .top_left = Size(1.0, 1.0),
720 .top_right = Size(99.0, 99.0),
721 .bottom_left = Size(99.0, 99.0),
722 .bottom_right = Size(1.0, 1.0),
725 EXPECT_TRUE(rr.Contains(Point{0, 0}));
726 EXPECT_FALSE(rr.Contains(Point{-49.999, -49.999}));
727 EXPECT_FALSE(rr.Contains(Point{-49.999, 49.999}));
728 EXPECT_FALSE(rr.Contains(Point{49.999, 49.999}));
729 EXPECT_FALSE(rr.Contains(Point{49.999, -49.999}));
736#define CHECK_DIAGONAL_POINTS(p) \
737 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, -0.02)); \
738 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, 0.02));
747#undef CHECK_POINT_AND_MIRRORS
750TEST(RoundSuperellipseTest, PointsOutsideOfSharpCorner) {
758 .top_left = Size(0.0, 0.0),
759 .top_right = Size(3.0, 3.0),
760 .bottom_left = Size(0.0, 0.0),
761 .bottom_right = Size(3.0, 3.0),
764 EXPECT_FALSE(rr.Contains(Point{147.0, 14.0}));
767TEST(RoundSuperellipseTest,
768 PathForRectangularRseWithShapeCornersShouldBeWithinBounds) {
779 .top_left = Size(14.0, 14.0),
780 .top_right = Size(14.0, 14.0),
781 .bottom_left = Size(0.0, 0.0),
782 .bottom_right = Size(0.0, 0.0),
784 SpyPathReceiver receiver;
786 [&](
const Point&
p2) { EXPECT_TRUE(bounds.ContainsInclusive(
p2)); });
787 receiver.SpyCubicTo([&](
const Point& cp1,
const Point& cp2,
const Point&
p2) {
788 EXPECT_TRUE(bounds.ContainsInclusive(
p2));
794TEST(RoundSuperellipseTest, PathForLongRseShouldBeCorrect) {
799 SpyPathReceiver receiver;
801 [&](
const Point&
p2) { EXPECT_TRUE(bounds.ContainsInclusive(
p2)); });
802 receiver.SpyCubicTo([&](
const Point& cp1,
const Point& cp2,
const Point&
p2) {
803 EXPECT_TRUE(bounds.ContainsInclusive(cp1));
804 EXPECT_TRUE(bounds.ContainsInclusive(cp2));
805 EXPECT_TRUE(bounds.ContainsInclusive(
p2));
807 receiver.SpyConicTo([&](
const Point& cp,
const Point&
p2,
Scalar weight) {
808 EXPECT_TRUE(bounds.ContainsInclusive(cp));
809 EXPECT_TRUE(bounds.ContainsInclusive(
p2));
812 rr.Dispatch(receiver);
TEST(FrameTimingsRecorderTest, RecordVsync)
void MoveTo(PathBuilder *builder, Scalar x, Scalar y)
void LineTo(PathBuilder *builder, Scalar x, Scalar y)
void CubicTo(PathBuilder *builder, Scalar x1, Scalar y1, Scalar x2, Scalar y2, Scalar x3, Scalar y3)
void Close(PathBuilder *builder)
#define CHECK_DIAGONAL_POINTS(p)
#define CHECK_POINT_WITH_OFFSET(rr, p, outward_offset)
#define CHECK_POINT_AND_MIRRORS(p)
static RoundSuperellipse MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
RoundSuperellipse Expand(Scalar left, Scalar top, Scalar right, Scalar bottom) const
Returns a round rectangle with expanded edges. Negative expansion results in shrinking.
static RoundSuperellipse MakeOval(const Rect &rect)
RoundSuperellipse Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
static RoundSuperellipse MakeRect(const Rect &rect)
static RoundSuperellipse MakeRectRadius(const Rect &rect, Scalar radius)
static RoundSuperellipse MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
static RoundSuperellipseParam MakeBoundsRadii(const Rect &bounds, const RoundingRadii &radii)
void Dispatch(PathReceiver &receiver) const
static RoundSuperellipseParam MakeBoundsRadius(const Rect &bounds, Scalar radius)
static constexpr RoundingRadii MakeRadii(Size radii)
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)