Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Unified Diff: ui/gfx/geometry/rect_conversions.cc

Issue 2744423002: Handle large rects better. (Closed)
Patch Set: Handle large rects better. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/gfx/geometry/rect.cc ('K') | « ui/gfx/geometry/rect.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/geometry/rect_conversions.cc
diff --git a/ui/gfx/geometry/rect_conversions.cc b/ui/gfx/geometry/rect_conversions.cc
index b4ef3d44ec9c4e434b93ae64531cde2f6197014e..5bba79ea4f139e6507d0c44f7e197c210a0beb4f 100644
--- a/ui/gfx/geometry/rect_conversions.cc
+++ b/ui/gfx/geometry/rect_conversions.cc
@@ -15,32 +15,60 @@ namespace gfx {
Rect ToEnclosingRect(const RectF& rect) {
int min_x = ToFlooredInt(rect.x());
int min_y = ToFlooredInt(rect.y());
- float max_x = rect.right();
- float max_y = rect.bottom();
- int width =
- rect.width() == 0
- ? 0
- : std::max(
- ToCeiledInt(static_cast<double>(ToCeiledInt(max_x)) - min_x),
- 0);
- int height =
- rect.height() == 0
- ? 0
- : std::max(
- ToCeiledInt(static_cast<double>(ToCeiledInt(max_y)) - min_y),
- 0);
+ int max_x = ToCeiledInt(rect.right());
+ int max_y = ToCeiledInt(rect.bottom());
+ int width = base::SaturatedSubtraction(max_x, min_x);
+ int height = base::SaturatedSubtraction(max_y, min_y);
Peter Mayo 2017/03/14 18:35:59 move into set from range in header
+
+ // 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 (width >= std::numeric_limits<int>::max() / 2) {
+ if (base::SaturatedAbsolute(max_x) < width / 2)
+ min_x = max_x - width;
+ else if (base::SaturatedAbsolute(min_x) > width / 2)
+ min_x = min_x + width / 4;
+ }
+
+ // Same computation, other axis.
+ if (height >= std::numeric_limits<int>::max() / 2) {
+ if (base::SaturatedAbsolute(max_y) < height / 2)
+ min_y = max_y - height;
+ else if (base::SaturatedAbsolute(min_y) > height / 2)
+ min_y = min_y + height / 4;
+ }
+
return Rect(min_x, min_y, width, height);
}
Rect ToEnclosedRect(const RectF& rect) {
int min_x = ToCeiledInt(rect.x());
int min_y = ToCeiledInt(rect.y());
- float max_x = rect.right();
- float max_y = rect.bottom();
- int width = std::max(
- ToFlooredInt(static_cast<float>(ToFlooredInt(max_x)) - min_x), 0);
- int height = std::max(
- ToFlooredInt(static_cast<float>(ToFlooredInt(max_y)) - min_y), 0);
+ int max_x = ToFlooredInt(rect.right());
+ int max_y = ToFlooredInt(rect.bottom());
+ int width = base::SaturatedSubtraction(max_x, min_x);
+ int height = base::SaturatedSubtraction(max_y, min_y);
+
+ // 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 (width >= std::numeric_limits<int>::max() / 2) {
+ if (base::SaturatedAbsolute(max_x) < width / 2)
+ min_x = max_x - width;
+ else if (base::SaturatedAbsolute(min_x) > width / 2)
+ min_x = min_x + width / 4;
+ }
+
+ // Same computation, other axis.
+ if (height >= std::numeric_limits<int>::max() / 2) {
+ if (base::SaturatedAbsolute(max_y) < height / 2)
+ min_y = max_y - height;
+ else if (base::SaturatedAbsolute(min_y) > height / 2)
+ min_y = min_y + height / 4;
+ }
+
return Rect(min_x, min_y, width, height);
}
« ui/gfx/geometry/rect.cc ('K') | « ui/gfx/geometry/rect.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698