123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 |
- // Copyright 2021 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "ui/gfx/geometry/rect_f.h"
- #include <cmath>
- #include "ui/gfx/geometry/insets_f.h"
- #include "ui/gfx/geometry/rect_f.h"
- #include "ui/gfx/geometry/test/geometry_util.h"
- namespace gfx {
- TEST(RectFTest, FromRect) {
- // Check that explicit conversion from integer to float compiles.
- Rect a(10, 20, 30, 40);
- RectF b(10, 20, 30, 40);
- RectF c = RectF(a);
- EXPECT_EQ(b, c);
- }
- TEST(RectFTest, ContainsPointF) {
- EXPECT_FALSE(RectF().Contains(PointF()));
- RectF r(10, 20, 30, 40);
- EXPECT_FALSE(r.Contains(PointF(0, 0)));
- EXPECT_FALSE(r.Contains(PointF(9.9999f, 20)));
- EXPECT_FALSE(r.Contains(PointF(10, 19.9999f)));
- EXPECT_TRUE(r.Contains(PointF(10, 20)));
- EXPECT_TRUE(r.Contains(PointF(39.9999f, 20)));
- EXPECT_FALSE(r.Contains(PointF(40, 20)));
- EXPECT_TRUE(r.Contains(PointF(10, 59.9999f)));
- EXPECT_FALSE(r.Contains(PointF(10, 60)));
- EXPECT_TRUE(r.Contains(PointF(39.9999f, 59.9999f)));
- EXPECT_FALSE(r.Contains(PointF(40, 60)));
- EXPECT_FALSE(r.Contains(PointF(100, 100)));
- }
- TEST(RectFTest, ContainsXY) {
- EXPECT_FALSE(RectF().Contains(0, 0));
- RectF r(10, 20, 30, 40);
- EXPECT_FALSE(r.Contains(0, 0));
- EXPECT_FALSE(r.Contains(9.9999f, 20));
- EXPECT_FALSE(r.Contains(10, 19.9999f));
- EXPECT_TRUE(r.Contains(10, 20));
- EXPECT_TRUE(r.Contains(39.9999f, 20));
- EXPECT_FALSE(r.Contains(40, 20));
- EXPECT_TRUE(r.Contains(10, 59.9999f));
- EXPECT_FALSE(r.Contains(10, 60));
- EXPECT_TRUE(r.Contains(39.9999f, 59.9999f));
- EXPECT_FALSE(r.Contains(40, 60));
- EXPECT_FALSE(r.Contains(100, 100));
- }
- TEST(RectFTest, InclusiveContainsPointF) {
- EXPECT_TRUE(RectF().InclusiveContains(PointF()));
- EXPECT_FALSE(RectF().InclusiveContains(PointF(0.0001f, 0)));
- RectF r(10, 20, 30, 40);
- EXPECT_FALSE(r.InclusiveContains(PointF(0, 0)));
- EXPECT_FALSE(r.InclusiveContains(PointF(9.9999f, 20)));
- EXPECT_FALSE(r.InclusiveContains(PointF(10, 19.9999f)));
- EXPECT_TRUE(r.InclusiveContains(PointF(10, 20)));
- EXPECT_TRUE(r.InclusiveContains(PointF(40, 20)));
- EXPECT_FALSE(r.InclusiveContains(PointF(40.0001f, 20)));
- EXPECT_TRUE(r.InclusiveContains(PointF(10, 60)));
- EXPECT_FALSE(r.InclusiveContains(PointF(10, 60.0001f)));
- EXPECT_TRUE(r.InclusiveContains(PointF(40, 60)));
- EXPECT_FALSE(r.InclusiveContains(PointF(100, 100)));
- }
- TEST(RectFTest, InclusiveContainsXY) {
- EXPECT_TRUE(RectF().InclusiveContains(0, 0));
- EXPECT_FALSE(RectF().InclusiveContains(0.0001f, 0));
- RectF r(10, 20, 30, 40);
- EXPECT_FALSE(r.InclusiveContains(0, 0));
- EXPECT_FALSE(r.InclusiveContains(9.9999f, 20));
- EXPECT_FALSE(r.InclusiveContains(10, 19.9999f));
- EXPECT_TRUE(r.InclusiveContains(10, 20));
- EXPECT_TRUE(r.InclusiveContains(40, 20));
- EXPECT_FALSE(r.InclusiveContains(40.0001f, 20));
- EXPECT_TRUE(r.InclusiveContains(10, 60));
- EXPECT_FALSE(r.InclusiveContains(10, 60.0001f));
- EXPECT_TRUE(r.InclusiveContains(40, 60));
- EXPECT_FALSE(r.InclusiveContains(100, 100));
- }
- TEST(RectFTest, BoundingRect) {
- // If point B dominates A, then A should be the origin.
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 0, 0),
- BoundingRect(PointF(4.2f, 6.8f), PointF(4.2f, 6.8f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 4.3f, 0),
- BoundingRect(PointF(4.2f, 6.8f), PointF(8.5f, 6.8f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 0, 2.5f),
- BoundingRect(PointF(4.2f, 6.8f), PointF(4.2f, 9.3f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 4.3f, 2.5f),
- BoundingRect(PointF(4.2f, 6.8f), PointF(8.5f, 9.3f)));
- // If point A dominates B, then B should be the origin.
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 0, 0),
- BoundingRect(PointF(4.2f, 6.8f), PointF(4.2f, 6.8f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 4.3f, 0),
- BoundingRect(PointF(8.5f, 6.8f), PointF(4.2f, 6.8f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 0, 2.5f),
- BoundingRect(PointF(4.2f, 9.3f), PointF(4.2f, 6.8f)));
- EXPECT_RECTF_EQ(RectF(4.2f, 6.8f, 4.3f, 2.5f),
- BoundingRect(PointF(8.5f, 9.3f), PointF(4.2f, 6.8f)));
- // If neither point dominates, then the origin is a combination of the two.
- EXPECT_RECTF_EQ(RectF(4.2f, 4.2f, 2.6f, 2.6f),
- BoundingRect(PointF(4.2f, 6.8f), PointF(6.8f, 4.2f)));
- EXPECT_RECTF_EQ(RectF(-6.8f, -6.8f, 2.6f, 2.6f),
- BoundingRect(PointF(-4.2f, -6.8f), PointF(-6.8f, -4.2f)));
- EXPECT_RECTF_EQ(RectF(-4.2f, -4.2f, 11.0f, 11.0f),
- BoundingRect(PointF(-4.2f, 6.8f), PointF(6.8f, -4.2f)));
- }
- TEST(RectFTest, Union) {
- EXPECT_RECTF_EQ(RectF(), UnionRects(RectF(), RectF()));
- EXPECT_RECTF_EQ(
- RectF(1.1f, 2.2f, 3.3f, 4.4f),
- UnionRects(RectF(1.1f, 2.2f, 3.3f, 4.4f), RectF(1.1f, 2.2f, 3.3f, 4.4f)));
- EXPECT_RECTF_EQ(
- RectF(0, 0, 8.8f, 11.0f),
- UnionRects(RectF(0, 0, 3.3f, 4.4f), RectF(3.3f, 4.4f, 5.5f, 6.6f)));
- EXPECT_RECTF_EQ(
- RectF(0, 0, 8.8f, 11.0f),
- UnionRects(RectF(3.3f, 4.4f, 5.5f, 6.6f), RectF(0, 0, 3.3f, 4.4f)));
- EXPECT_RECTF_EQ(
- RectF(0, 1.1f, 3.3f, 8.8f),
- UnionRects(RectF(0, 1.1f, 3.3f, 4.4f), RectF(0, 5.5f, 3.3f, 4.4f)));
- EXPECT_RECTF_EQ(
- RectF(0, 1.1f, 11.0f, 12.1f),
- UnionRects(RectF(0, 1.1f, 3.3f, 4.4f), RectF(4.4f, 5.5f, 6.6f, 7.7f)));
- EXPECT_RECTF_EQ(
- RectF(0, 1.1f, 11.0f, 12.1f),
- UnionRects(RectF(4.4f, 5.5f, 6.6f, 7.7f), RectF(0, 1.1f, 3.3f, 4.4f)));
- EXPECT_RECTF_EQ(
- RectF(2.2f, 3.3f, 4.4f, 5.5f),
- UnionRects(RectF(8.8f, 9.9f, 0, 2.2f), RectF(2.2f, 3.3f, 4.4f, 5.5f)));
- EXPECT_RECTF_EQ(
- RectF(2.2f, 3.3f, 4.4f, 5.5f),
- UnionRects(RectF(2.2f, 3.3f, 4.4f, 5.5f), RectF(8.8f, 9.9f, 2.2f, 0)));
- }
- TEST(RectFTest, UnionEvenIfEmpty) {
- EXPECT_RECTF_EQ(RectF(), UnionRectsEvenIfEmpty(RectF(), RectF()));
- EXPECT_RECTF_EQ(RectF(0, 0, 3.3f, 4.4f),
- UnionRectsEvenIfEmpty(RectF(), RectF(3.3f, 4.4f, 0, 0)));
- EXPECT_RECTF_EQ(RectF(0, 0, 8.8f, 11.0f),
- UnionRectsEvenIfEmpty(RectF(0, 0, 3.3f, 4.4f),
- RectF(3.3f, 4.4f, 5.5f, 6.6f)));
- EXPECT_RECTF_EQ(RectF(0, 0, 8.8f, 11.0f),
- UnionRectsEvenIfEmpty(RectF(3.3f, 4.4f, 5.5f, 6.6f),
- RectF(0, 0, 3.3f, 4.4f)));
- EXPECT_RECTF_EQ(RectF(2.2f, 3.3f, 6.6f, 8.8f),
- UnionRectsEvenIfEmpty(RectF(8.8f, 9.9f, 0, 2.2f),
- RectF(2.2f, 3.3f, 4.4f, 5.5f)));
- EXPECT_RECTF_EQ(RectF(2.2f, 3.3f, 8.8f, 6.6f),
- UnionRectsEvenIfEmpty(RectF(2.2f, 3.3f, 4.4f, 5.5f),
- RectF(8.8f, 9.9f, 2.2f, 0)));
- }
- TEST(RectFTest, UnionEnsuresContainWithFloatingError) {
- for (float f = 0.1f; f < 5; f += 0.1f) {
- RectF r1(1, 2, 3, 4);
- r1.Scale(f, f + 0.05f);
- RectF r2 = r1 + Vector2dF(10.f + f, f - 10.f);
- RectF r3 = UnionRects(r1, r2);
- EXPECT_TRUE(r3.Contains(r1));
- EXPECT_TRUE(r3.Contains(r2));
- }
- }
- TEST(RectFTest, UnionIfEmptyResultTinySize) {
- RectF r1(1e-15f, 0, 0, 0);
- RectF r2(0, 1e-15f, 0, 0);
- RectF r3 = UnionRectsEvenIfEmpty(r1, r2);
- EXPECT_FALSE(r3.IsEmpty());
- EXPECT_TRUE(r3.Contains(r1));
- EXPECT_TRUE(r3.Contains(r2));
- }
- TEST(RectFTest, UnionMaxRects) {
- constexpr float kMaxFloat = std::numeric_limits<float>::max();
- constexpr float kMinFloat = std::numeric_limits<float>::min();
- gfx::RectF r1(kMinFloat, 0, kMaxFloat, kMaxFloat);
- gfx::RectF r2(0, kMinFloat, kMaxFloat, kMaxFloat);
- // This should not trigger DCHECK failure.
- r1.Union(r2);
- }
- TEST(RectFTest, CenterPoint) {
- PointF center;
- // When origin is (0, 0).
- center = RectF(0, 0, 20, 20).CenterPoint();
- EXPECT_TRUE(center == PointF(10, 10));
- // When origin is even.
- center = RectF(10, 10, 20, 20).CenterPoint();
- EXPECT_TRUE(center == PointF(20, 20));
- // When origin is odd.
- center = RectF(11, 11, 20, 20).CenterPoint();
- EXPECT_TRUE(center == PointF(21, 21));
- // When 0 width or height.
- center = RectF(10, 10, 0, 20).CenterPoint();
- EXPECT_TRUE(center == PointF(10, 20));
- center = RectF(10, 10, 20, 0).CenterPoint();
- EXPECT_TRUE(center == PointF(20, 10));
- // When an odd size.
- center = RectF(10, 10, 21, 21).CenterPoint();
- EXPECT_TRUE(center == PointF(20.5f, 20.5f));
- // When an odd size and position.
- center = RectF(11, 11, 21, 21).CenterPoint();
- EXPECT_TRUE(center == PointF(21.5f, 21.5f));
- }
- TEST(RectFTest, ScaleRect) {
- constexpr RectF input(3, 3, 3, 3);
- EXPECT_RECTF_EQ(RectF(4.5f, 4.5f, 4.5f, 4.5f), ScaleRect(input, 1.5f));
- EXPECT_RECTF_EQ(RectF(0, 0, 0, 0), ScaleRect(input, 0));
- constexpr float kMaxFloat = std::numeric_limits<float>::max();
- EXPECT_RECTF_EQ(RectF(kMaxFloat, kMaxFloat, kMaxFloat, kMaxFloat),
- ScaleRect(input, kMaxFloat));
- RectF nan_rect = ScaleRect(input, std::numeric_limits<float>::quiet_NaN());
- EXPECT_TRUE(std::isnan(nan_rect.x()));
- EXPECT_TRUE(std::isnan(nan_rect.y()));
- // NaN is clamped to 0 in SizeF constructor.
- EXPECT_EQ(0, nan_rect.width());
- EXPECT_EQ(0, nan_rect.height());
- }
- TEST(RectFTest, IsExpressibleAsRect) {
- EXPECT_TRUE(RectF().IsExpressibleAsRect());
- constexpr float kMinIntF =
- static_cast<float>(std::numeric_limits<int>::min());
- constexpr float kMaxIntF =
- static_cast<float>(std::numeric_limits<int>::max());
- constexpr float kInfinity = std::numeric_limits<float>::infinity();
- EXPECT_TRUE(
- RectF(kMinIntF + 200, kMinIntF + 200, kMaxIntF - 200, kMaxIntF - 200)
- .IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(kMinIntF - 200, kMinIntF + 200, kMaxIntF + 200, kMaxIntF + 200)
- .IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(kMinIntF + 200, kMinIntF - 200, kMaxIntF + 200, kMaxIntF + 200)
- .IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(kMinIntF + 200, kMinIntF + 200, kMaxIntF + 200, kMaxIntF - 200)
- .IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(kMinIntF + 200, kMinIntF + 200, kMaxIntF - 200, kMaxIntF + 200)
- .IsExpressibleAsRect());
- EXPECT_TRUE(
- RectF(0, 0, kMaxIntF - 200, kMaxIntF - 200).IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(200, 0, kMaxIntF + 200, kMaxIntF - 200).IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(0, 200, kMaxIntF - 200, kMaxIntF + 200).IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(0, 0, kMaxIntF + 200, kMaxIntF - 200).IsExpressibleAsRect());
- EXPECT_FALSE(
- RectF(0, 0, kMaxIntF - 200, kMaxIntF + 200).IsExpressibleAsRect());
- EXPECT_FALSE(RectF(kInfinity, 0, 1, 1).IsExpressibleAsRect());
- EXPECT_FALSE(RectF(0, kInfinity, 1, 1).IsExpressibleAsRect());
- EXPECT_FALSE(RectF(0, 0, kInfinity, 1).IsExpressibleAsRect());
- EXPECT_FALSE(RectF(0, 0, 1, kInfinity).IsExpressibleAsRect());
- }
- TEST(RectFTest, Offset) {
- RectF f(1.1f, 2.2f, 3.3f, 4.4f);
- EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), (f + Vector2dF(1.1f, -1.1f)));
- EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), (Vector2dF(1.1f, -1.1f) + f));
- f += Vector2dF(1.1f, -1.1f);
- EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), f);
- EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f), (f - Vector2dF(1.1f, -1.1f)));
- f -= Vector2dF(1.1f, -1.1f);
- EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f), f);
- }
- TEST(RectFTest, Corners) {
- RectF f(1.1f, 2.1f, 3.1f, 4.1f);
- EXPECT_EQ(PointF(1.1f, 2.1f), f.origin());
- EXPECT_EQ(PointF(4.2f, 2.1f), f.top_right());
- EXPECT_EQ(PointF(1.1f, 6.2f), f.bottom_left());
- EXPECT_EQ(PointF(4.2f, 6.2f), f.bottom_right());
- }
- TEST(RectFTest, Centers) {
- RectF f(10.1f, 20.2f, 30.3f, 40.4f);
- EXPECT_EQ(PointF(10.1f, 40.4f), f.left_center());
- EXPECT_EQ(PointF(25.25f, 20.2f), f.top_center());
- EXPECT_EQ(PointF(40.4f, 40.4f), f.right_center());
- EXPECT_EQ(25.25f, f.bottom_center().x());
- EXPECT_NEAR(60.6f, f.bottom_center().y(), 0.001f);
- }
- TEST(RectFTest, Transpose) {
- RectF f(10.1f, 20.2f, 30.3f, 40.4f);
- f.Transpose();
- EXPECT_EQ(RectF(20.2f, 10.1f, 40.4f, 30.3f), f);
- }
- TEST(RectFTest, ManhattanDistanceToPoint) {
- RectF f(1.1f, 2.1f, 3.1f, 4.1f);
- EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(1.1f, 2.1f)));
- EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(4.2f, 6.f)));
- EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(2.f, 4.f)));
- EXPECT_FLOAT_EQ(3.2f, f.ManhattanDistanceToPoint(PointF(0.f, 0.f)));
- EXPECT_FLOAT_EQ(2.1f, f.ManhattanDistanceToPoint(PointF(2.f, 0.f)));
- EXPECT_FLOAT_EQ(2.9f, f.ManhattanDistanceToPoint(PointF(5.f, 0.f)));
- EXPECT_FLOAT_EQ(.8f, f.ManhattanDistanceToPoint(PointF(5.f, 4.f)));
- EXPECT_FLOAT_EQ(2.6f, f.ManhattanDistanceToPoint(PointF(5.f, 8.f)));
- EXPECT_FLOAT_EQ(1.8f, f.ManhattanDistanceToPoint(PointF(3.f, 8.f)));
- EXPECT_FLOAT_EQ(1.9f, f.ManhattanDistanceToPoint(PointF(0.f, 7.f)));
- EXPECT_FLOAT_EQ(1.1f, f.ManhattanDistanceToPoint(PointF(0.f, 3.f)));
- }
- TEST(RectFTest, ManhattanInternalDistance) {
- RectF f(0.0f, 0.0f, 400.0f, 400.0f);
- static const float kEpsilon = std::numeric_limits<float>::epsilon();
- EXPECT_FLOAT_EQ(0.0f,
- f.ManhattanInternalDistance(RectF(-1.0f, 0.0f, 2.0f, 1.0f)));
- EXPECT_FLOAT_EQ(
- kEpsilon, f.ManhattanInternalDistance(RectF(400.0f, 0.0f, 1.0f, 400.0f)));
- EXPECT_FLOAT_EQ(2.0f * kEpsilon, f.ManhattanInternalDistance(RectF(
- -100.0f, -100.0f, 100.0f, 100.0f)));
- EXPECT_FLOAT_EQ(1.0f + kEpsilon, f.ManhattanInternalDistance(
- RectF(-101.0f, 100.0f, 100.0f, 100.0f)));
- EXPECT_FLOAT_EQ(
- 2.0f + 2.0f * kEpsilon,
- f.ManhattanInternalDistance(RectF(-101.0f, -101.0f, 100.0f, 100.0f)));
- EXPECT_FLOAT_EQ(
- 433.0f + 2.0f * kEpsilon,
- f.ManhattanInternalDistance(RectF(630.0f, 603.0f, 100.0f, 100.0f)));
- EXPECT_FLOAT_EQ(0.0f,
- f.ManhattanInternalDistance(RectF(-1.0f, 0.0f, 1.1f, 1.0f)));
- EXPECT_FLOAT_EQ(0.1f + kEpsilon,
- f.ManhattanInternalDistance(RectF(-1.5f, 0.0f, 1.4f, 1.0f)));
- EXPECT_FLOAT_EQ(kEpsilon,
- f.ManhattanInternalDistance(RectF(-1.5f, 0.0f, 1.5f, 1.0f)));
- }
- TEST(RectFTest, Inset) {
- RectF r(10, 20, 30, 40);
- r.Inset(0);
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- r.Inset(1.5);
- EXPECT_RECTF_EQ(RectF(11.5, 21.5, 27, 37), r);
- r.Inset(-1.5);
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- r.Inset(InsetsF::VH(2.25, 1.5));
- EXPECT_RECTF_EQ(RectF(11.5, 22.25, 27, 35.5), r);
- r.Inset(InsetsF::VH(-2.25, -1.5));
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- // The parameters are left, top, right, bottom.
- r.Inset(InsetsF::TLBR(2.25, 1.5, 4, 3.75));
- EXPECT_RECTF_EQ(RectF(11.5, 22.25, 24.75, 33.75), r);
- r.Inset(InsetsF::TLBR(-2.25, -1.5, -4, -3.75));
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- // InsetsF parameters are top, right, bottom, left.
- r.Inset(InsetsF::TLBR(1.5, 2.25, 3.75, 4));
- EXPECT_RECTF_EQ(RectF(12.25, 21.5, 23.75, 34.75), r);
- r.Inset(InsetsF::TLBR(-1.5, -2.25, -3.75, -4));
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- }
- TEST(RectFTest, Outset) {
- RectF r(10, 20, 30, 40);
- r.Outset(0);
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- r.Outset(1.5);
- EXPECT_RECTF_EQ(RectF(8.5, 18.5, 33, 43), r);
- r.Outset(-1.5);
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- r.Outset(OutsetsF::VH(2.25, 1.5));
- EXPECT_RECTF_EQ(RectF(8.5, 17.75, 33, 44.5), r);
- r.Outset(OutsetsF::VH(-2.25, -1.5));
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- r.Outset(OutsetsF::TLBR(2.25, 1.5, 4, 3.75));
- EXPECT_RECTF_EQ(RectF(8.5, 17.75, 35.25, 46.25), r);
- r.Outset(OutsetsF::TLBR(-2.25, -1.5, -4, -3.75));
- EXPECT_RECTF_EQ(RectF(10, 20, 30, 40), r);
- }
- TEST(RectFTest, InsetClamped) {
- RectF r(10, 20, 30, 40);
- r.Inset(18);
- EXPECT_RECTF_EQ(RectF(28, 38, 0, 4), r);
- r.Inset(-18);
- EXPECT_RECTF_EQ(RectF(10, 20, 36, 40), r);
- r.Inset(InsetsF::VH(30, 15));
- EXPECT_RECTF_EQ(RectF(25, 50, 6, 0), r);
- r.Inset(InsetsF::VH(-30, -15));
- EXPECT_RECTF_EQ(RectF(10, 20, 36, 60), r);
- r.Inset(InsetsF::TLBR(30, 20, 50, 40));
- EXPECT_RECTF_EQ(RectF(30, 50, 0, 0), r);
- r.Inset(InsetsF::TLBR(-30, -20, -50, -40));
- EXPECT_RECTF_EQ(RectF(10, 20, 60, 80), r);
- }
- TEST(RectFTest, InclusiveIntersect) {
- RectF rect(11, 12, 0, 0);
- EXPECT_TRUE(rect.InclusiveIntersect(RectF(11, 12, 13, 14)));
- EXPECT_RECTF_EQ(RectF(11, 12, 0, 0), rect);
- rect = RectF(11, 12, 13, 14);
- EXPECT_TRUE(rect.InclusiveIntersect(RectF(24, 8, 0, 7)));
- EXPECT_RECTF_EQ(RectF(24, 12, 0, 3), rect);
- rect = RectF(11, 12, 13, 14);
- EXPECT_TRUE(rect.InclusiveIntersect(RectF(9, 15, 4, 0)));
- EXPECT_RECTF_EQ(RectF(11, 15, 2, 0), rect);
- rect = RectF(11, 12, 0, 14);
- EXPECT_FALSE(rect.InclusiveIntersect(RectF(12, 13, 15, 16)));
- EXPECT_RECTF_EQ(RectF(), rect);
- }
- TEST(RectFTest, MaximumCoveredRect) {
- // X aligned and intersect: unite.
- EXPECT_EQ(RectF(10, 20, 30, 60),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(10, 30, 30, 50)));
- // X aligned and adjacent: unite.
- EXPECT_EQ(RectF(10, 20, 30, 90),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(10, 60, 30, 50)));
- // X aligned and separate: choose the bigger one.
- EXPECT_EQ(RectF(10, 61, 30, 50),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(10, 61, 30, 50)));
- // Y aligned and intersect: unite.
- EXPECT_EQ(RectF(10, 20, 60, 40),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(30, 20, 40, 40)));
- // Y aligned and adjacent: unite.
- EXPECT_EQ(RectF(10, 20, 70, 40),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(40, 20, 40, 40)));
- // Y aligned and separate: choose the bigger one.
- EXPECT_EQ(RectF(41, 20, 40, 40),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(41, 20, 40, 40)));
- // Get the biggest expanded intersection.
- EXPECT_EQ(RectF(0, 0, 9, 19),
- MaximumCoveredRect(RectF(0, 0, 10, 10), RectF(0, 9, 9, 10)));
- EXPECT_EQ(RectF(0, 0, 19, 9),
- MaximumCoveredRect(RectF(0, 0, 10, 10), RectF(9, 0, 10, 9)));
- // Otherwise choose the bigger one.
- EXPECT_EQ(RectF(20, 30, 40, 50),
- MaximumCoveredRect(RectF(10, 20, 30, 40), RectF(20, 30, 40, 50)));
- EXPECT_EQ(RectF(10, 20, 40, 50),
- MaximumCoveredRect(RectF(10, 20, 40, 50), RectF(20, 30, 30, 40)));
- EXPECT_EQ(RectF(10, 20, 40, 50),
- MaximumCoveredRect(RectF(10, 20, 40, 50), RectF(20, 30, 40, 50)));
- }
- TEST(RectFTest, ClosestPoint) {
- // r.x()=50 r.right()=350
- // | |
- // 1 | 2 | 3
- // ------+----------+--------r.y()=100
- // 4 | 5(in) | 6
- // ------+----------+--------r.bottom()=250
- // 7 | 8 | 9
- RectF r(50, 100, 300, 150);
- // 1
- EXPECT_EQ(PointF(50, 100), r.ClosestPoint(PointF(10, 20)));
- // 2
- EXPECT_EQ(PointF(110, 100), r.ClosestPoint(PointF(110, 80)));
- // 3
- EXPECT_EQ(PointF(350, 100), r.ClosestPoint(PointF(400, 80)));
- // 4
- EXPECT_EQ(PointF(50, 110), r.ClosestPoint(PointF(10, 110)));
- // 5
- EXPECT_EQ(PointF(50, 100), r.ClosestPoint(PointF(50, 100)));
- EXPECT_EQ(PointF(150, 100), r.ClosestPoint(PointF(150, 100)));
- EXPECT_EQ(PointF(350, 100), r.ClosestPoint(PointF(350, 100)));
- EXPECT_EQ(PointF(350, 150), r.ClosestPoint(PointF(350, 150)));
- EXPECT_EQ(PointF(350, 250), r.ClosestPoint(PointF(350, 250)));
- EXPECT_EQ(PointF(150, 250), r.ClosestPoint(PointF(150, 250)));
- EXPECT_EQ(PointF(50, 250), r.ClosestPoint(PointF(50, 250)));
- EXPECT_EQ(PointF(50, 150), r.ClosestPoint(PointF(50, 150)));
- EXPECT_EQ(PointF(150, 150), r.ClosestPoint(PointF(150, 150)));
- // 6
- EXPECT_EQ(PointF(350, 150), r.ClosestPoint(PointF(380, 150)));
- // 7
- EXPECT_EQ(PointF(50, 250), r.ClosestPoint(PointF(10, 280)));
- // 8
- EXPECT_EQ(PointF(180, 250), r.ClosestPoint(PointF(180, 300)));
- // 9
- EXPECT_EQ(PointF(350, 250), r.ClosestPoint(PointF(450, 450)));
- }
- TEST(RectFTest, MapRect) {
- EXPECT_RECTF_EQ(RectF(), MapRect(RectF(), RectF(), RectF()));
- EXPECT_RECTF_EQ(RectF(),
- MapRect(RectF(1, 2, 3, 4), RectF(), RectF(5, 6, 7, 8)));
- EXPECT_RECTF_EQ(
- RectF(1, 2, 3, 4),
- MapRect(RectF(1, 2, 3, 4), RectF(5, 6, 7, 8), RectF(5, 6, 7, 8)));
- EXPECT_RECTF_EQ(
- RectF(5, 6, 7, 8),
- MapRect(RectF(1, 2, 3, 4), RectF(1, 2, 3, 4), RectF(5, 6, 7, 8)));
- EXPECT_RECTF_EQ(
- RectF(200, 300, 300, 400),
- MapRect(RectF(1, 2, 3, 4), RectF(0, 1, 6, 8), RectF(100, 200, 600, 800)));
- EXPECT_RECTF_EQ(RectF(1, 2, 3, 4),
- MapRect(RectF(200, 300, 300, 400), RectF(100, 200, 600, 800),
- RectF(0, 1, 6, 8)));
- }
- } // namespace gfx
|