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)
35typedef struct CGPoint CGPoint;
36#endif
37
38#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
39#ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
40typedef struct CGPoint NSPoint;
41#else
42typedef struct _NSPoint NSPoint;
43#endif
44#endif
45
46#if PLATFORM(QT)
47#include "qglobal.h"
48QT_BEGIN_NAMESPACE
49class QPointF;
50QT_END_NAMESPACE
51#endif
52
53#if PLATFORM(HAIKU)
54class BPoint;
55#endif
56
57#if USE(SKIA)
58struct SkPoint;
59#endif
60
61namespace WebCore {
62
63class AffineTransform;
64class TransformationMatrix;
65class IntPoint;
66
67class FloatPoint {
68public:
69    FloatPoint() : m_x(0), m_y(0) { }
70    FloatPoint(float x, float y) : m_x(x), m_y(y) { }
71    FloatPoint(const IntPoint&);
72
73
74    static FloatPoint zero() { return FloatPoint(); }
75
76    static FloatPoint narrowPrecision(double x, double y);
77
78    float x() const { return m_x; }
79    float y() const { return m_y; }
80
81    void setX(float x) { m_x = x; }
82    void setY(float y) { m_y = y; }
83    void set(float x, float y)
84    {
85        m_x = x;
86        m_y = y;
87    }
88    void move(float dx, float dy)
89    {
90        m_x += dx;
91        m_y += dy;
92    }
93    void scale(float sx, float sy)
94    {
95        m_x *= sx;
96        m_y *= sy;
97    }
98
99    void normalize();
100
101    float dot(const FloatPoint& a) const
102    {
103        return m_x * a.x() + m_y * a.y();
104    }
105
106    float length() const;
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
141private:
142    float m_x, m_y;
143};
144
145
146inline FloatPoint& operator+=(FloatPoint& a, const FloatSize& b)
147{
148    a.move(b.width(), b.height());
149    return a;
150}
151
152inline FloatPoint& operator+=(FloatPoint& a, const FloatPoint& b)
153{
154    a.move(b.x(), b.y());
155    return a;
156}
157
158inline FloatPoint& operator-=(FloatPoint& a, const FloatSize& b)
159{
160    a.move(-b.width(), -b.height());
161    return a;
162}
163
164inline FloatPoint operator+(const FloatPoint& a, const FloatSize& b)
165{
166    return FloatPoint(a.x() + b.width(), a.y() + b.height());
167}
168
169inline FloatPoint operator+(const FloatPoint& a, const FloatPoint& b)
170{
171    return FloatPoint(a.x() + b.x(), a.y() + b.y());
172}
173
174inline FloatSize operator-(const FloatPoint& a, const FloatPoint& b)
175{
176    return FloatSize(a.x() - b.x(), a.y() - b.y());
177}
178
179inline FloatPoint operator-(const FloatPoint& a, const FloatSize& b)
180{
181    return FloatPoint(a.x() - b.width(), a.y() - b.height());
182}
183
184inline bool operator==(const FloatPoint& a, const FloatPoint& b)
185{
186    return a.x() == b.x() && a.y() == b.y();
187}
188
189inline bool operator!=(const FloatPoint& a, const FloatPoint& b)
190{
191    return a.x() != b.x() || a.y() != b.y();
192}
193
194inline float operator*(const FloatPoint& a, const FloatPoint& b)
195{
196    // dot product
197    return a.dot(b);
198}
199
200inline IntPoint roundedIntPoint(const FloatPoint& p)
201{
202    return IntPoint(static_cast<int>(roundf(p.x())), static_cast<int>(roundf(p.y())));
203}
204
205float 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.
208bool findIntersection(const FloatPoint& p1, const FloatPoint& p2, const FloatPoint& d1, const FloatPoint& d2, FloatPoint& intersection);
209
210}
211
212#endif
213