3390f44cbcb48dd76c9d3493622fd3cfcbea3515
[WebKit-https.git] / Source / WebCore / platform / graphics / IntPoint.h
1 /*
2  * Copyright (C) 2004, 2005, 2006 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef IntPoint_h
27 #define IntPoint_h
28
29 #include "IntSize.h"
30 #include <cmath>
31
32 #if PLATFORM(MAC) && defined __OBJC__
33 #import <Foundation/NSGeometry.h>
34 #endif
35
36 #if USE(CG)
37 typedef struct CGPoint CGPoint;
38 #endif
39
40
41 #if !PLATFORM(IOS)
42 #if OS(DARWIN)
43 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
44 typedef struct CGPoint NSPoint;
45 #else
46 typedef struct _NSPoint NSPoint;
47 #endif
48 #endif
49 #endif // !PLATFORM(IOS)
50
51 #if PLATFORM(WIN)
52 typedef struct tagPOINT POINT;
53 typedef struct tagPOINTS POINTS;
54 #endif
55
56 namespace WebCore {
57
58 class FloatPoint;
59 class TextStream;
60
61 class IntPoint {
62 public:
63     IntPoint() : m_x(0), m_y(0) { }
64     IntPoint(int x, int y) : m_x(x), m_y(y) { }
65     explicit IntPoint(const IntSize& size) : m_x(size.width()), m_y(size.height()) { }
66     explicit IntPoint(const FloatPoint&); // don't do this implicitly since it's lossy
67
68     static IntPoint zero() { return IntPoint(); }
69     bool isZero() const { return !m_x && !m_y; }
70
71     int x() const { return m_x; }
72     int y() const { return m_y; }
73
74     void setX(int x) { m_x = x; }
75     void setY(int y) { m_y = y; }
76
77     void move(const IntSize& s) { move(s.width(), s.height()); } 
78     void moveBy(const IntPoint& offset) { move(offset.x(), offset.y()); }
79     void move(int dx, int dy) { m_x += dx; m_y += dy; }
80     void scale(float sx, float sy)
81     {
82         m_x = lroundf(static_cast<float>(m_x * sx));
83         m_y = lroundf(static_cast<float>(m_y * sy));
84     }
85     
86     IntPoint expandedTo(const IntPoint& other) const
87     {
88         return {
89             m_x > other.m_x ? m_x : other.m_x,
90             m_y > other.m_y ? m_y : other.m_y
91         };
92     }
93
94     IntPoint shrunkTo(const IntPoint& other) const
95     {
96         return {
97             m_x < other.m_x ? m_x : other.m_x,
98             m_y < other.m_y ? m_y : other.m_y
99         };
100     }
101
102     IntPoint constrainedBetween(const IntPoint& min, const IntPoint& max) const;
103
104     int distanceSquaredToPoint(const IntPoint&) const;
105
106     void clampNegativeToZero()
107     {
108         *this = expandedTo(zero());
109     }
110
111     IntPoint transposedPoint() const
112     {
113         return IntPoint(m_y, m_x);
114     }
115
116 #if USE(CG)
117     WEBCORE_EXPORT explicit IntPoint(const CGPoint&); // don't do this implicitly since it's lossy
118     WEBCORE_EXPORT operator CGPoint() const;
119 #endif
120
121 #if !PLATFORM(IOS)
122 #if OS(DARWIN) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)
123     WEBCORE_EXPORT explicit IntPoint(const NSPoint&); // don't do this implicitly since it's lossy
124     WEBCORE_EXPORT operator NSPoint() const;
125 #endif
126 #endif // !PLATFORM(IOS)
127
128 #if PLATFORM(WIN)
129     IntPoint(const POINT&);
130     operator POINT() const;
131     IntPoint(const POINTS&);
132     operator POINTS() const;
133 #elif PLATFORM(EFL)
134     explicit IntPoint(const Evas_Point&);
135     operator Evas_Point() const;
136 #endif
137
138 private:
139     int m_x, m_y;
140 };
141
142 inline IntPoint& operator+=(IntPoint& a, const IntSize& b)
143 {
144     a.move(b.width(), b.height());
145     return a;
146 }
147
148 inline IntPoint& operator-=(IntPoint& a, const IntSize& b)
149 {
150     a.move(-b.width(), -b.height());
151     return a;
152 }
153
154 inline IntPoint operator+(const IntPoint& a, const IntSize& b)
155 {
156     return IntPoint(a.x() + b.width(), a.y() + b.height());
157 }
158
159 inline IntPoint operator+(const IntPoint& a, const IntPoint& b)
160 {
161     return IntPoint(a.x() + b.x(), a.y() + b.y());
162 }
163
164 inline IntSize operator-(const IntPoint& a, const IntPoint& b)
165 {
166     return IntSize(a.x() - b.x(), a.y() - b.y());
167 }
168
169 inline IntPoint operator-(const IntPoint& a, const IntSize& b)
170 {
171     return IntPoint(a.x() - b.width(), a.y() - b.height());
172 }
173
174 inline IntPoint operator-(const IntPoint& point)
175 {
176     return IntPoint(-point.x(), -point.y());
177 }
178
179 inline bool operator==(const IntPoint& a, const IntPoint& b)
180 {
181     return a.x() == b.x() && a.y() == b.y();
182 }
183
184 inline bool operator!=(const IntPoint& a, const IntPoint& b)
185 {
186     return a.x() != b.x() || a.y() != b.y();
187 }
188
189 inline IntSize toIntSize(const IntPoint& a)
190 {
191     return IntSize(a.x(), a.y());
192 }
193
194 inline int IntPoint::distanceSquaredToPoint(const IntPoint& point) const
195 {
196     return ((*this) - point).diagonalLengthSquared();
197 }
198
199 WEBCORE_EXPORT TextStream& operator<<(TextStream&, const IntPoint&);
200
201 } // namespace WebCore
202
203 #endif // IntPoint_h