1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/view_manager/view_coordinate_conversions.h"
7 #include "components/view_manager/server_view.h"
8 #include "ui/gfx/geometry/point.h"
9 #include "ui/gfx/geometry/point_conversions.h"
10 #include "ui/gfx/geometry/point_f.h"
11 #include "ui/gfx/geometry/rect.h"
12 #include "ui/gfx/geometry/vector2d.h"
13 #include "ui/gfx/geometry/vector2d_f.h"
15 namespace view_manager
{
19 gfx::Vector2dF
CalculateOffsetToAncestor(const ServerView
* view
,
20 const ServerView
* ancestor
) {
21 DCHECK(ancestor
->Contains(view
));
23 for (const ServerView
* v
= view
; v
!= ancestor
; v
= v
->parent())
24 result
+= v
->bounds().OffsetFromOrigin();
25 return gfx::Vector2dF(result
.x(), result
.y());
30 gfx::Point
ConvertPointBetweenViews(const ServerView
* from
,
32 const gfx::Point
& point
) {
33 return gfx::ToFlooredPoint(
34 ConvertPointFBetweenViews(from
, to
, gfx::PointF(point
.x(), point
.y())));
37 gfx::PointF
ConvertPointFBetweenViews(const ServerView
* from
,
39 const gfx::PointF
& point
) {
45 if (from
->Contains(to
)) {
46 const gfx::Vector2dF
offset(CalculateOffsetToAncestor(to
, from
));
47 return point
- offset
;
49 DCHECK(to
->Contains(from
));
50 const gfx::Vector2dF
offset(CalculateOffsetToAncestor(from
, to
));
51 return point
+ offset
;
54 gfx::Rect
ConvertRectBetweenViews(const ServerView
* from
,
56 const gfx::Rect
& rect
) {
62 const gfx::Point
top_left(ConvertPointBetweenViews(from
, to
, rect
.origin()));
63 const gfx::Point
bottom_right(gfx::ToCeiledPoint(ConvertPointFBetweenViews(
64 from
, to
, gfx::PointF(rect
.right(), rect
.bottom()))));
65 return gfx::Rect(top_left
.x(), top_left
.y(), bottom_right
.x() - top_left
.x(),
66 bottom_right
.y() - top_left
.y());
69 } // namespace view_manager