1 /*
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2005 Nokia. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #ifndef FloatPoint_h
28 #define FloatPoint_h
29
30 #include "FloatSize.h"
31 #include "IntPoint.h"
32 #include <wtf/MathExtras.h>
33
34 #if USE(CG) || USE(SKIA_ON_MAC_CHROME)
35 typedef struct CGPoint CGPoint;
36 #endif
37
38 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
39 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
40 typedef struct CGPoint NSPoint;
41 #else
42 typedef struct _NSPoint NSPoint;
43 #endif
44 #endif
45
46 #if PLATFORM(QT)
47 #include "qglobal.h"
48 QT_BEGIN_NAMESPACE
49 class QPointF;
50 QT_END_NAMESPACE
51 #endif
52
53 #if PLATFORM(HAIKU)
54 class BPoint;
55 #endif
56
57 #if USE(SKIA)
58 struct SkPoint;
59 #endif
60
61 namespace WebCore {
62
63 class AffineTransform;
64 class TransformationMatrix;
65 class IntPoint;
66
67 class FloatPoint {
68 public:
FloatPoint()69 FloatPoint() : m_x(0), m_y(0) { }
FloatPoint(float x,float y)70 FloatPoint(float x, float y) : m_x(x), m_y(y) { }
71 FloatPoint(const IntPoint&);
72
73
zero()74 static FloatPoint zero() { return FloatPoint(); }
75
76 static FloatPoint narrowPrecision(double x, double y);
77
x()78 float x() const { return m_x; }
y()79 float y() const { return m_y; }
80
setX(float x)81 void setX(float x) { m_x = x; }
setY(float y)82 void setY(float y) { m_y = y; }
set(float x,float y)83 void set(float x, float y)
84 {
85 m_x = x;
86 m_y = y;
87 }
move(float dx,float dy)88 void move(float dx, float dy)
89 {
90 m_x += dx;
91 m_y += dy;
92 }
scale(float sx,float sy)93 void scale(float sx, float sy)
94 {
95 m_x *= sx;
96 m_y *= sy;
97 }
98
99 void normalize();
100
dot(const FloatPoint & a)101 float dot(const FloatPoint& a) const
102 {
103 return m_x * a.x() + m_y * a.y();
104 }
105
106 float length() const;
lengthSquared()107 float lengthSquared() const
108 {
109 return m_x * m_x + m_y * m_y;
110 }
111
112 #if USE(CG) || USE(SKIA_ON_MAC_CHROME)
113 FloatPoint(const CGPoint&);
114 operator CGPoint() const;
115 #endif
116
117 #if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \
118 || (PLATFORM(CHROMIUM) && OS(DARWIN))
119 FloatPoint(const NSPoint&);
120 operator NSPoint() const;
121 #endif
122
123 #if PLATFORM(QT)
124 FloatPoint(const QPointF&);
125 operator QPointF() const;
126 #endif
127
128 #if PLATFORM(HAIKU)
129 FloatPoint(const BPoint&);
130 operator BPoint() const;
131 #endif
132
133 #if USE(SKIA)
134 operator SkPoint() const;
135 FloatPoint(const SkPoint&);
136 #endif
137
138 FloatPoint matrixTransform(const TransformationMatrix&) const;
139 FloatPoint matrixTransform(const AffineTransform&) const;
140
141 private:
142 float m_x, m_y;
143 };
144
145
146 inline FloatPoint& operator+=(FloatPoint& a, const FloatSize& b)
147 {
148 a.move(b.width(), b.height());
149 return a;
150 }
151
152 inline FloatPoint& operator+=(FloatPoint& a, const FloatPoint& b)
153 {
154 a.move(b.x(), b.y());
155 return a;
156 }
157
158 inline FloatPoint& operator-=(FloatPoint& a, const FloatSize& b)
159 {
160 a.move(-b.width(), -b.height());
161 return a;
162 }
163
164 inline FloatPoint operator+(const FloatPoint& a, const FloatSize& b)
165 {
166 return FloatPoint(a.x() + b.width(), a.y() + b.height());
167 }
168
169 inline FloatPoint operator+(const FloatPoint& a, const FloatPoint& b)
170 {
171 return FloatPoint(a.x() + b.x(), a.y() + b.y());
172 }
173
174 inline FloatSize operator-(const FloatPoint& a, const FloatPoint& b)
175 {
176 return FloatSize(a.x() - b.x(), a.y() - b.y());
177 }
178
179 inline FloatPoint operator-(const FloatPoint& a, const FloatSize& b)
180 {
181 return FloatPoint(a.x() - b.width(), a.y() - b.height());
182 }
183
184 inline bool operator==(const FloatPoint& a, const FloatPoint& b)
185 {
186 return a.x() == b.x() && a.y() == b.y();
187 }
188
189 inline bool operator!=(const FloatPoint& a, const FloatPoint& b)
190 {
191 return a.x() != b.x() || a.y() != b.y();
192 }
193
194 inline float operator*(const FloatPoint& a, const FloatPoint& b)
195 {
196 // dot product
197 return a.dot(b);
198 }
199
roundedIntPoint(const FloatPoint & p)200 inline IntPoint roundedIntPoint(const FloatPoint& p)
201 {
202 return IntPoint(static_cast<int>(roundf(p.x())), static_cast<int>(roundf(p.y())));
203 }
204
205 float findSlope(const FloatPoint& p1, const FloatPoint& p2, float& c);
206
207 // Find point where lines through the two pairs of points intersect. Returns false if the lines don't intersect.
208 bool findIntersection(const FloatPoint& p1, const FloatPoint& p2, const FloatPoint& d1, const FloatPoint& d2, FloatPoint& intersection);
209
210 }
211
212 #endif
213