Index: ui/gfx/geometry/rect.cc |
diff --git a/ui/gfx/geometry/rect.cc b/ui/gfx/geometry/rect.cc |
index f3c47b2b378e9b0bd8087330560a4b7541e6384d..1ebe16991f691ecc7f736bfff5f6c31f458f981e 100644 |
--- a/ui/gfx/geometry/rect.cc |
+++ b/ui/gfx/geometry/rect.cc |
@@ -157,8 +157,29 @@ void Rect::Union(const Rect& rect) { |
int rb = std::max(bottom(), rect.bottom()); |
// Subtracting to get width/height might overflow integers, so clamp them. |
- SetRect(rx, ry, base::SaturatedSubtraction(rr, rx), |
- base::SaturatedSubtraction(rb, ry)); |
+ int rdx = base::SaturatedSubtraction(rr, rx); |
+ int rdy = base::SaturatedSubtraction(rb, ry); |
+ |
+ // clamping may move one side, choose to move the bigger by recomputing it. |
+ // The computation of right is implicit, so this happens vacuosly. |
+ // If Right is small, move left to width away. |
+ // If Left is big(negative), move them both to keep the center. |
+ if (rdx >= std::numeric_limits<int>::max() / 2) { |
Peter Mayo
2017/03/14 18:35:59
Maybe just on equality.
|
+ if (base::SaturatedAbsolute(rr) < rdx / 2) |
+ rx = rr - rdx; |
+ else if (base::SaturatedAbsolute(rx) > rdx / 2) |
+ rx = rx + rdx / 4; |
+ } |
+ |
+ // Same computation, other axis. |
+ if (rdy >= std::numeric_limits<int>::max() / 2) { |
+ if (base::SaturatedAbsolute(rb) < rdy / 2) |
+ ry = rb - rdy; |
+ else if (base::SaturatedAbsolute(ry) > rdy / 2) |
+ ry = ry + rdy / 4; |
+ } |
+ |
+ SetRect(rx, ry, rdx, rdy); |
} |
void Rect::Subtract(const Rect& rect) { |