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