diff options
author | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-31 18:33:24 +0000 |
---|---|---|
committer | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-31 18:33:24 +0000 |
commit | ceb36f7d5cec71407b265aba887cd64216d24731 (patch) | |
tree | ea977c72eb7882c1629a5c78f56b1a9e7e3e6b60 /ash/display | |
parent | 80211f670f34191d80b875086aaf7b5b06a743d4 (diff) | |
download | chromium_src-ceb36f7d5cec71407b265aba887cd64216d24731.zip chromium_src-ceb36f7d5cec71407b265aba887cd64216d24731.tar.gz chromium_src-ceb36f7d5cec71407b265aba887cd64216d24731.tar.bz2 |
Add Vector2d classes that represent offsets, instead of using Point.
Previously Point served two purposes, to be a position in 2d space, and also
an offset from the origin. This introduces a Vector2d class to represent an
offset, allowing typesafety checks for geometric operations.
The following are now the case:
Point +/- Vector = Point
- A point plus/minus an offset gives you a point at a position offset by the
vector.
Vector +/- Vector = Vector
- Two offsets can be added together to make a new offset.
Point - Point = Vector
- Subtracting one point from another gives you the offset between the two
points.
We add some new methods to perform these operations:
Rect::OffsetFromOrigin() gives the offset between the position of the rect
and the origin.
Point::OffsetFromOrigin() gives the offset between the point and the origin.
PointAtOffsetFromOrigin(Vector2d) converts a Vector2d to a Point at the given
offset away from the origin.
Rect::Offset(), Point::Add(), and Point::Subtract() now receive a Vector2d
instead of a point.
BUG=147395
R=sky
Review URL: https://codereview.chromium.org/11269022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165198 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/display')
-rw-r--r-- | ash/display/multi_display_manager.cc | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/ash/display/multi_display_manager.cc b/ash/display/multi_display_manager.cc index 5911ae9..d155aed 100644 --- a/ash/display/multi_display_manager.cc +++ b/ash/display/multi_display_manager.cc @@ -511,7 +511,7 @@ void MultiDisplayManager::EnsurePointerInDisplays() { return; gfx::Point location_in_screen = Shell::GetScreen()->GetCursorScreenPoint(); gfx::Point target_location; - int64 closest_distance = -1; + int64 closest_distance_squared = -1; for (DisplayList::const_iterator iter = displays_.begin(); iter != displays_.end(); ++iter) { @@ -522,14 +522,16 @@ void MultiDisplayManager::EnsurePointerInDisplays() { break; } gfx::Point center = display_bounds.CenterPoint(); - gfx::Point diff = center.Subtract(location_in_screen); - // Use the distance from the center of the dislay. This is not + // Use the distance squared from the center of the dislay. This is not // exactly "closest" display, but good enough to pick one // appropriate (and there are at most two displays). - int64 distance = diff.x() * diff.x() + diff.y() * diff.y(); - if (closest_distance < 0 || closest_distance > distance) { + // We don't care about actual distance, only relative to other displays, so + // using the LengthSquared() is cheaper than Length(). + int64 distance_squared = (center - location_in_screen).LengthSquared(); + if (closest_distance_squared < 0 || + closest_distance_squared > distance_squared) { target_location = center; - closest_distance = distance; + closest_distance_squared = distance_squared; } } |