1a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck// Use of this source code is governed by a BSD-style license that can be
3a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck// found in the LICENSE file.
4a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
5a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#ifndef UI_GFX_POINT_H_
6a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#define UI_GFX_POINT_H_
7a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#pragma once
8a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
9a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#include <string>
10a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
11a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#include "build/build_config.h"
12a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#include "ui/base/ui_export.h"
13a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
14a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#if defined(OS_WIN)
15a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Recktypedef unsigned long DWORD;
16a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Recktypedef struct tagPOINT POINT;
17a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#elif defined(OS_MACOSX)
18a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#include <ApplicationServices/ApplicationServices.h>
19a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#endif
20a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
21a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Recknamespace gfx {
22a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
23a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck// A point has an x and y coordinate.
24a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reckclass UI_EXPORT Point {
25a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck public:
26a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point();
27a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point(int x, int y);
28a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#if defined(OS_WIN)
29a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // |point| is a DWORD value that contains a coordinate.  The x-coordinate is
30a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // the low-order short and the y-coordinate is the high-order short.  This
31a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // value is commonly acquired from GetMessagePos/GetCursorPos.
32a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  explicit Point(DWORD point);
33a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  explicit Point(const POINT& point);
34a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point& operator=(const POINT& point);
35a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#elif defined(OS_MACOSX)
36a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  explicit Point(const CGPoint& point);
37a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#endif
38a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
39a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  ~Point() {}
40a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
41a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  int x() const { return x_; }
42a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  int y() const { return y_; }
43a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
44a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  void SetPoint(int x, int y) {
45a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    x_ = x;
46a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    y_ = y;
47a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
48a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
49a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  void set_x(int x) { x_ = x; }
50a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  void set_y(int y) { y_ = y; }
51a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
52a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  void Offset(int delta_x, int delta_y) {
53a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    x_ += delta_x;
54a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    y_ += delta_y;
55a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
56a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
57a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point Add(const Point& other) const{
58a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    Point copy = *this;
59a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    copy.Offset(other.x_, other.y_);
60a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return copy;
61a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
62a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
63a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point Subtract(const Point& other) const {
64a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    Point copy = *this;
65a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    copy.Offset(-other.x_, -other.y_);
66a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return copy;
67a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
68a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
69a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  Point Middle(const Point& other) const {
70a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return Point((x_ + other.x_) / 2, (y_ + other.y_) / 2);
71a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
72a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
73a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  bool operator==(const Point& rhs) const {
74a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return x_ == rhs.x_ && y_ == rhs.y_;
75a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
76a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
77a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  bool operator!=(const Point& rhs) const {
78a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return !(*this == rhs);
79a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
80a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
81a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // A point is less than another point if its y-value is closer
82a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // to the origin. If the y-values are the same, then point with
83a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // the x-value closer to the origin is considered less than the
84a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // other.
85a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // This comparison is required to use Points in sets, or sorted
86a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // vectors.
87a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  bool operator<(const Point& rhs) const {
88a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck    return (y_ == rhs.y_) ? (x_ < rhs.x_) : (y_ < rhs.y_);
89a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  }
90a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
91a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#if defined(OS_WIN)
92a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  POINT ToPOINT() const;
93a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#elif defined(OS_MACOSX)
94a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  CGPoint ToCGPoint() const;
95a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#endif
96a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
97a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  // Returns a string representation of point.
98a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  std::string ToString() const;
99a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
100a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck private:
101a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  int x_;
102a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck  int y_;
103a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck};
104a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
105a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck}  // namespace gfx
106a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck
107a7dee89fba4aaa5f0be152cfc7c7b9b5cff98d51John Reck#endif  // UI_GFX_POINT_H_
108