OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/geometry/rect.h" | 5 #include "ui/gfx/geometry/rect.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <windows.h> | 10 #include <windows.h> |
11 #elif defined(OS_IOS) | 11 #elif defined(OS_IOS) |
12 #include <CoreGraphics/CoreGraphics.h> | 12 #include <CoreGraphics/CoreGraphics.h> |
13 #elif defined(OS_MACOSX) | 13 #elif defined(OS_MACOSX) |
14 #include <ApplicationServices/ApplicationServices.h> | 14 #include <ApplicationServices/ApplicationServices.h> |
15 #endif | 15 #endif |
16 | 16 |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/numerics/saturated_arithmetic.h" |
18 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
19 #include "build/build_config.h" | 20 #include "build/build_config.h" |
20 #include "ui/gfx/geometry/insets.h" | 21 #include "ui/gfx/geometry/insets.h" |
21 | 22 |
22 namespace gfx { | 23 namespace gfx { |
23 | 24 |
24 #if defined(OS_WIN) | 25 #if defined(OS_WIN) |
25 Rect::Rect(const RECT& r) | 26 Rect::Rect(const RECT& r) |
26 : origin_(r.left, r.top), | 27 : origin_(r.left, r.top), |
27 size_(std::abs(r.right - r.left), std::abs(r.bottom - r.top)) { | 28 size_(std::abs(r.right - r.left), std::abs(r.bottom - r.top)) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 namespace gfx { | 61 namespace gfx { |
61 | 62 |
62 void Rect::Inset(const Insets& insets) { | 63 void Rect::Inset(const Insets& insets) { |
63 Inset(insets.left(), insets.top(), insets.right(), insets.bottom()); | 64 Inset(insets.left(), insets.top(), insets.right(), insets.bottom()); |
64 } | 65 } |
65 | 66 |
66 void Rect::Inset(int left, int top, int right, int bottom) { | 67 void Rect::Inset(int left, int top, int right, int bottom) { |
67 origin_ += Vector2d(left, top); | 68 origin_ += Vector2d(left, top); |
68 // left+right might overflow/underflow, but width() - (left+right) might | 69 // left+right might overflow/underflow, but width() - (left+right) might |
69 // overflow as well. | 70 // overflow as well. |
70 set_width(SafeSubtract(width(), SafeAdd(left, right))); | 71 set_width(base::SaturatedSubtraction(width(), |
71 set_height(SafeSubtract(height(), SafeAdd(top, bottom))); | 72 base::SaturatedAddition(left, right))); |
| 73 set_height(base::SaturatedSubtraction(height(), |
| 74 base::SaturatedAddition(top, bottom))); |
72 } | 75 } |
73 | 76 |
74 void Rect::Offset(int horizontal, int vertical) { | 77 void Rect::Offset(int horizontal, int vertical) { |
75 origin_ += Vector2d(horizontal, vertical); | 78 origin_ += Vector2d(horizontal, vertical); |
76 // Ensure that width and height remain valid. | 79 // Ensure that width and height remain valid. |
77 set_width(width()); | 80 set_width(width()); |
78 set_height(height()); | 81 set_height(height()); |
79 } | 82 } |
80 | 83 |
81 void Rect::operator+=(const Vector2d& offset) { | 84 void Rect::operator+=(const Vector2d& offset) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 } | 150 } |
148 if (rect.IsEmpty()) | 151 if (rect.IsEmpty()) |
149 return; | 152 return; |
150 | 153 |
151 int rx = std::min(x(), rect.x()); | 154 int rx = std::min(x(), rect.x()); |
152 int ry = std::min(y(), rect.y()); | 155 int ry = std::min(y(), rect.y()); |
153 int rr = std::max(right(), rect.right()); | 156 int rr = std::max(right(), rect.right()); |
154 int rb = std::max(bottom(), rect.bottom()); | 157 int rb = std::max(bottom(), rect.bottom()); |
155 | 158 |
156 // Subtracting to get width/height might overflow integers, so clamp them. | 159 // Subtracting to get width/height might overflow integers, so clamp them. |
157 SetRect(rx, ry, GetClampedWidthFromExtents(rx, rr), | 160 SetRect(rx, ry, base::SaturatedSubtraction(rr, rx), |
158 GetClampedWidthFromExtents(ry, rb)); | 161 base::SaturatedSubtraction(rb, ry)); |
159 } | 162 } |
160 | 163 |
161 void Rect::Subtract(const Rect& rect) { | 164 void Rect::Subtract(const Rect& rect) { |
162 if (!Intersects(rect)) | 165 if (!Intersects(rect)) |
163 return; | 166 return; |
164 if (rect.Contains(*this)) { | 167 if (rect.Contains(*this)) { |
165 SetRect(0, 0, 0, 0); | 168 SetRect(0, 0, 0, 0); |
166 return; | 169 return; |
167 } | 170 } |
168 | 171 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 | 293 |
291 Rect BoundingRect(const Point& p1, const Point& p2) { | 294 Rect BoundingRect(const Point& p1, const Point& p2) { |
292 int rx = std::min(p1.x(), p2.x()); | 295 int rx = std::min(p1.x(), p2.x()); |
293 int ry = std::min(p1.y(), p2.y()); | 296 int ry = std::min(p1.y(), p2.y()); |
294 int rr = std::max(p1.x(), p2.x()); | 297 int rr = std::max(p1.x(), p2.x()); |
295 int rb = std::max(p1.y(), p2.y()); | 298 int rb = std::max(p1.y(), p2.y()); |
296 return Rect(rx, ry, rr - rx, rb - ry); | 299 return Rect(rx, ry, rr - rx, rb - ry); |
297 } | 300 } |
298 | 301 |
299 } // namespace gfx | 302 } // namespace gfx |
OLD | NEW |