| 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> |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 namespace gfx { | 60 namespace gfx { |
| 61 | 61 |
| 62 void Rect::Inset(const Insets& insets) { | 62 void Rect::Inset(const Insets& insets) { |
| 63 Inset(insets.left(), insets.top(), insets.right(), insets.bottom()); | 63 Inset(insets.left(), insets.top(), insets.right(), insets.bottom()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 void Rect::Inset(int left, int top, int right, int bottom) { | 66 void Rect::Inset(int left, int top, int right, int bottom) { |
| 67 origin_ += Vector2d(left, top); | 67 origin_ += Vector2d(left, top); |
| 68 set_width(std::max(width() - left - right, static_cast<int>(0))); | 68 // left+right might overflow/underflow, but width() - (left+right) might |
| 69 set_height(std::max(height() - top - bottom, static_cast<int>(0))); | 69 // overflow as well. |
| 70 set_width(SafeSubtract(width(), SafeAdd(left, right))); |
| 71 set_height(SafeSubtract(height(), SafeAdd(top, bottom))); |
| 70 } | 72 } |
| 71 | 73 |
| 72 void Rect::Offset(int horizontal, int vertical) { | 74 void Rect::Offset(int horizontal, int vertical) { |
| 73 origin_ += Vector2d(horizontal, vertical); | 75 origin_ += Vector2d(horizontal, vertical); |
| 74 // Ensure that width and height remain valid. | 76 // Ensure that width and height remain valid. |
| 75 set_width(width()); | 77 set_width(width()); |
| 76 set_height(height()); | 78 set_height(height()); |
| 77 } | 79 } |
| 78 | 80 |
| 79 void Rect::operator+=(const Vector2d& offset) { | 81 void Rect::operator+=(const Vector2d& offset) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 return; | 146 return; |
| 145 } | 147 } |
| 146 if (rect.IsEmpty()) | 148 if (rect.IsEmpty()) |
| 147 return; | 149 return; |
| 148 | 150 |
| 149 int rx = std::min(x(), rect.x()); | 151 int rx = std::min(x(), rect.x()); |
| 150 int ry = std::min(y(), rect.y()); | 152 int ry = std::min(y(), rect.y()); |
| 151 int rr = std::max(right(), rect.right()); | 153 int rr = std::max(right(), rect.right()); |
| 152 int rb = std::max(bottom(), rect.bottom()); | 154 int rb = std::max(bottom(), rect.bottom()); |
| 153 | 155 |
| 154 SetRect(rx, ry, rr - rx, rb - ry); | 156 // Subtracting to get width/height might overflow integers, so clamp them. |
| 157 SetRect(rx, ry, GetClampedWidthFromExtents(rx, rr), |
| 158 GetClampedWidthFromExtents(ry, rb)); |
| 155 } | 159 } |
| 156 | 160 |
| 157 void Rect::Subtract(const Rect& rect) { | 161 void Rect::Subtract(const Rect& rect) { |
| 158 if (!Intersects(rect)) | 162 if (!Intersects(rect)) |
| 159 return; | 163 return; |
| 160 if (rect.Contains(*this)) { | 164 if (rect.Contains(*this)) { |
| 161 SetRect(0, 0, 0, 0); | 165 SetRect(0, 0, 0, 0); |
| 162 return; | 166 return; |
| 163 } | 167 } |
| 164 | 168 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 | 294 |
| 291 Rect BoundingRect(const Point& p1, const Point& p2) { | 295 Rect BoundingRect(const Point& p1, const Point& p2) { |
| 292 int rx = std::min(p1.x(), p2.x()); | 296 int rx = std::min(p1.x(), p2.x()); |
| 293 int ry = std::min(p1.y(), p2.y()); | 297 int ry = std::min(p1.y(), p2.y()); |
| 294 int rr = std::max(p1.x(), p2.x()); | 298 int rr = std::max(p1.x(), p2.x()); |
| 295 int rb = std::max(p1.y(), p2.y()); | 299 int rb = std::max(p1.y(), p2.y()); |
| 296 return Rect(rx, ry, rr - rx, rb - ry); | 300 return Rect(rx, ry, rr - rx, rb - ry); |
| 297 } | 301 } |
| 298 | 302 |
| 299 } // namespace gfx | 303 } // namespace gfx |
| OLD | NEW |