diff options
Diffstat (limited to 'components/view_manager/view_coordinate_conversions.cc')
-rw-r--r-- | components/view_manager/view_coordinate_conversions.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/components/view_manager/view_coordinate_conversions.cc b/components/view_manager/view_coordinate_conversions.cc new file mode 100644 index 0000000..8237875 --- /dev/null +++ b/components/view_manager/view_coordinate_conversions.cc @@ -0,0 +1,69 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/view_manager/view_coordinate_conversions.h" + +#include "components/view_manager/server_view.h" +#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/point_conversions.h" +#include "ui/gfx/geometry/point_f.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/vector2d.h" +#include "ui/gfx/geometry/vector2d_f.h" + +namespace view_manager { + +namespace { + +gfx::Vector2dF CalculateOffsetToAncestor(const ServerView* view, + const ServerView* ancestor) { + DCHECK(ancestor->Contains(view)); + gfx::Vector2d result; + for (const ServerView* v = view; v != ancestor; v = v->parent()) + result += v->bounds().OffsetFromOrigin(); + return gfx::Vector2dF(result.x(), result.y()); +} + +} // namespace + +gfx::Point ConvertPointBetweenViews(const ServerView* from, + const ServerView* to, + const gfx::Point& point) { + return gfx::ToFlooredPoint( + ConvertPointFBetweenViews(from, to, gfx::PointF(point.x(), point.y()))); +} + +gfx::PointF ConvertPointFBetweenViews(const ServerView* from, + const ServerView* to, + const gfx::PointF& point) { + DCHECK(from); + DCHECK(to); + if (from == to) + return point; + + if (from->Contains(to)) { + const gfx::Vector2dF offset(CalculateOffsetToAncestor(to, from)); + return point - offset; + } + DCHECK(to->Contains(from)); + const gfx::Vector2dF offset(CalculateOffsetToAncestor(from, to)); + return point + offset; +} + +gfx::Rect ConvertRectBetweenViews(const ServerView* from, + const ServerView* to, + const gfx::Rect& rect) { + DCHECK(from); + DCHECK(to); + if (from == to) + return rect; + + const gfx::Point top_left(ConvertPointBetweenViews(from, to, rect.origin())); + const gfx::Point bottom_right(gfx::ToCeiledPoint(ConvertPointFBetweenViews( + from, to, gfx::PointF(rect.right(), rect.bottom())))); + return gfx::Rect(top_left.x(), top_left.y(), bottom_right.x() - top_left.x(), + bottom_right.y() - top_left.y()); +} + +} // namespace view_manager |