OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/range/range_f.h" | 5 #include "ui/gfx/range/range_f.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cmath> | 10 #include <cmath> |
11 #include <limits> | |
12 | 11 |
13 #include "base/format_macros.h" | 12 #include "base/format_macros.h" |
14 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
15 | 14 |
16 namespace gfx { | 15 namespace gfx { |
17 | 16 |
18 RangeF::RangeF() | |
19 : start_(0.0f), | |
20 end_(0.0f) { | |
21 } | |
22 | |
23 RangeF::RangeF(float start, float end) | |
24 : start_(start), | |
25 end_(end) { | |
26 } | |
27 | |
28 RangeF::RangeF(float position) | |
29 : start_(position), | |
30 end_(position) { | |
31 } | |
32 | |
33 // static | |
34 const RangeF RangeF::InvalidRange() { | |
35 return RangeF(std::numeric_limits<float>::max()); | |
36 } | |
37 | |
38 bool RangeF::IsValid() const { | |
39 return *this != InvalidRange(); | |
40 } | |
41 | |
42 float RangeF::GetMin() const { | |
43 return std::min(start(), end()); | |
44 } | |
45 | |
46 float RangeF::GetMax() const { | |
47 return std::max(start(), end()); | |
48 } | |
49 | |
50 bool RangeF::operator==(const RangeF& other) const { | |
51 return start() == other.start() && end() == other.end(); | |
52 } | |
53 | |
54 bool RangeF::operator!=(const RangeF& other) const { | |
55 return !(*this == other); | |
56 } | |
57 | |
58 bool RangeF::EqualsIgnoringDirection(const RangeF& other) const { | |
59 return GetMin() == other.GetMin() && GetMax() == other.GetMax(); | |
60 } | |
61 | |
62 bool RangeF::Intersects(const RangeF& range) const { | |
63 return IsValid() && range.IsValid() && | |
64 !(range.GetMax() < GetMin() || range.GetMin() >= GetMax()); | |
65 } | |
66 | |
67 bool RangeF::Contains(const RangeF& range) const { | |
68 return IsValid() && range.IsValid() && | |
69 GetMin() <= range.GetMin() && range.GetMax() <= GetMax(); | |
70 } | |
71 | |
72 RangeF RangeF::Intersect(const RangeF& range) const { | 17 RangeF RangeF::Intersect(const RangeF& range) const { |
73 float min = std::max(GetMin(), range.GetMin()); | 18 float min = std::max(GetMin(), range.GetMin()); |
74 float max = std::min(GetMax(), range.GetMax()); | 19 float max = std::min(GetMax(), range.GetMax()); |
75 | 20 |
76 if (min >= max) // No intersection. | 21 if (min >= max) // No intersection. |
77 return InvalidRange(); | 22 return InvalidRange(); |
78 | 23 |
79 return RangeF(min, max); | 24 return RangeF(min, max); |
80 } | 25 } |
81 | 26 |
82 RangeF RangeF::Intersect(const Range& range) const { | 27 RangeF RangeF::Intersect(const Range& range) const { |
83 RangeF range_f(range.start(), range.end()); | 28 RangeF range_f(range.start(), range.end()); |
84 return Intersect(range_f); | 29 return Intersect(range_f); |
85 } | 30 } |
86 | 31 |
87 Range RangeF::Floor() const { | 32 Range RangeF::Floor() const { |
88 size_t start = start_ > 0.0f ? static_cast<size_t>(std::floor(start_)) : 0; | 33 size_t start = start_ > 0.0f ? static_cast<uint32_t>(std::floor(start_)) : 0; |
Robert Sesek
2017/03/06 21:27:58
Should the size_t's here move to uint32_t?
Peter Kasting
2017/03/07 00:08:01
Yes. Missed those. Thanks.
| |
89 size_t end = end_ > 0.0f ? static_cast<size_t>(std::floor(end_)) : 0; | 34 size_t end = end_ > 0.0f ? static_cast<uint32_t>(std::floor(end_)) : 0; |
90 return Range(start, end); | 35 return Range(start, end); |
91 } | 36 } |
92 | 37 |
93 Range RangeF::Ceil() const { | 38 Range RangeF::Ceil() const { |
94 size_t start = start_ > 0.0f ? static_cast<size_t>(std::ceil(start_)) : 0; | 39 size_t start = start_ > 0.0f ? static_cast<uint32_t>(std::ceil(start_)) : 0; |
95 size_t end = end_ > 0.0f ? static_cast<size_t>(std::ceil(end_)) : 0; | 40 size_t end = end_ > 0.0f ? static_cast<uint32_t>(std::ceil(end_)) : 0; |
96 return Range(start, end); | 41 return Range(start, end); |
97 } | 42 } |
98 | 43 |
99 Range RangeF::Round() const { | 44 Range RangeF::Round() const { |
100 size_t start = | 45 size_t start = start_ > 0.0f ? static_cast<uint32_t>(std::round(start_)) : 0; |
101 start_ > 0.0f ? static_cast<size_t>(std::floor(start_ + 0.5f)) : 0; | 46 size_t end = end_ > 0.0f ? static_cast<uint32_t>(std::round(end_)) : 0; |
102 size_t end = end_ > 0.0f ? static_cast<size_t>(std::floor(end_ + 0.5f)) : 0; | |
103 return Range(start, end); | 47 return Range(start, end); |
104 } | 48 } |
105 | 49 |
106 std::string RangeF::ToString() const { | 50 std::string RangeF::ToString() const { |
107 return base::StringPrintf("{%f,%f}", start(), end()); | 51 return base::StringPrintf("{%f,%f}", start(), end()); |
108 } | 52 } |
109 | 53 |
110 std::ostream& operator<<(std::ostream& os, const RangeF& range) { | 54 std::ostream& operator<<(std::ostream& os, const RangeF& range) { |
111 return os << range.ToString(); | 55 return os << range.ToString(); |
112 } | 56 } |
113 | 57 |
114 } // namespace gfx | 58 } // namespace gfx |
OLD | NEW |