[GTK][EFL] ImageBufferCairo should accept resolution factor
[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     void scale(float scale)
87     {
88         this->scale(scale, scale);
89     }
90     
91     IntPoint expandedTo(const IntPoint& other) const
92     {
93         return {
94             m_x > other.m_x ? m_x : other.m_x,
95             m_y > other.m_y ? m_y : other.m_y
96         };
97     }
98
99     IntPoint shrunkTo(const IntPoint& other) const
100     {
101         return {
102             m_x < other.m_x ? m_x : other.m_x,
103             m_y < other.m_y ? m_y : other.m_y
104         };
105     }
106
107     IntPoint constrainedBetween(const IntPoint& min, const IntPoint& max) const;
108
109     int distanceSquaredToPoint(const IntPoint&) const;
110
111     void clampNegativeToZero()
112     {
113         *this = expandedTo(zero());
114     }
115
116     IntPoint transposedPoint() const
117     {
118         return IntPoint(m_y, m_x);
119     }
120
121 #if USE(CG)
122     WEBCORE_EXPORT explicit IntPoint(const CGPoint&); // don't do this implicitly since it's lossy
123     WEBCORE_EXPORT operator CGPoint() const;
124 #endif
125
126 #if !PLATFORM(IOS)
127 #if OS(DARWIN) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)
128     WEBCORE_EXPORT explicit IntPoint(const NSPoint&); // don't do this implicitly since it's lossy
129     WEBCORE_EXPORT operator NSPoint() const;
130 #endif
131 #endif // !PLATFORM(IOS)
132
133 #if PLATFORM(WIN)
134     IntPoint(const POINT&);
135     operator POINT() const;
136     IntPoint(const POINTS&);
137     operator POINTS() const;
138 #elif PLATFORM(EFL)
139     explicit IntPoint(const Evas_Point&);
140     operator Evas_Point() const;
141 #endif
142
143 private:
144     int m_x, m_y;
145 };
146
147 inline IntPoint& operator+=(IntPoint& a, const IntSize& b)
148 {
149     a.move(b.width(), b.height());
150     return a;
151 }
152
153 inline IntPoint& operator-=(IntPoint& a, const IntSize& b)
154 {
155     a.move(-b.width(), -b.height());
156     return a;
157 }
158
159 inline IntPoint operator+(const IntPoint& a, const IntSize& b)
160 {
161     return IntPoint(a.x() + b.width(), a.y() + b.height());
162 }
163
164 inline IntPoint operator+(const IntPoint& a, const IntPoint& b)
165 {
166     return IntPoint(a.x() + b.x(), a.y() + b.y());
167 }
168
169 inline IntSize operator-(const IntPoint& a, const IntPoint& b)
170 {
171     return IntSize(a.x() - b.x(), a.y() - b.y());
172 }
173
174 inline IntPoint operator-(const IntPoint& a, const IntSize& b)
175 {
176     return IntPoint(a.x() - b.width(), a.y() - b.height());
177 }
178
179 inline IntPoint operator-(const IntPoint& point)
180 {
181     return IntPoint(-point.x(), -point.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 bool operator!=(const IntPoint& a, const IntPoint& b)
190 {
191     return a.x() != b.x() || a.y() != b.y();
192 }
193
194 inline IntSize toIntSize(const IntPoint& a)
195 {
196     return IntSize(a.x(), a.y());
197 }
198
199 inline int IntPoint::distanceSquaredToPoint(const IntPoint& point) const
200 {
201     return ((*this) - point).diagonalLengthSquared();
202 }
203
204 WEBCORE_EXPORT TextStream& operator<<(TextStream&, const IntPoint&);
205
206 } // namespace WebCore
207
208 #endif // IntPoint_h