1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtCore module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QPOINT_H
43#define QPOINT_H
44
45#include <QtCore/qnamespace.h>
46
47QT_BEGIN_HEADER
48
49QT_BEGIN_NAMESPACE
50
51QT_MODULE(Core)
52
53class Q_CORE_EXPORT QPoint
54{
55public:
56 QPoint();
57 QPoint(int xpos, int ypos);
58
59 bool isNull() const;
60
61 int x() const;
62 int y() const;
63 void setX(int x);
64 void setY(int y);
65
66 int manhattanLength() const;
67
68 int &rx();
69 int &ry();
70
71 QPoint &operator+=(const QPoint &p);
72 QPoint &operator-=(const QPoint &p);
73
74 QPoint &operator*=(float c);
75 QPoint &operator*=(double c);
76 QPoint &operator*=(int c);
77
78 QPoint &operator/=(qreal c);
79
80 friend inline bool operator==(const QPoint &, const QPoint &);
81 friend inline bool operator!=(const QPoint &, const QPoint &);
82 friend inline const QPoint operator+(const QPoint &, const QPoint &);
83 friend inline const QPoint operator-(const QPoint &, const QPoint &);
84 friend inline const QPoint operator*(const QPoint &, float);
85 friend inline const QPoint operator*(float, const QPoint &);
86 friend inline const QPoint operator*(const QPoint &, double);
87 friend inline const QPoint operator*(double, const QPoint &);
88 friend inline const QPoint operator*(const QPoint &, int);
89 friend inline const QPoint operator*(int, const QPoint &);
90 friend inline const QPoint operator-(const QPoint &);
91 friend inline const QPoint operator/(const QPoint &, qreal);
92
93private:
94 friend class QTransform;
95 // ### Qt 5; remove the ifdef and just have the same order on all platforms.
96#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
97 int yp;
98 int xp;
99#else
100 int xp;
101 int yp;
102#endif
103};
104
105Q_DECLARE_TYPEINFO(QPoint, Q_MOVABLE_TYPE);
106
107/*****************************************************************************
108 QPoint stream functions
109 *****************************************************************************/
110#ifndef QT_NO_DATASTREAM
111Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QPoint &);
112Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QPoint &);
113#endif
114
115/*****************************************************************************
116 QPoint inline functions
117 *****************************************************************************/
118
119inline QPoint::QPoint()
120{ xp=0; yp=0; }
121
122inline QPoint::QPoint(int xpos, int ypos)
123{ xp = xpos; yp = ypos; }
124
125inline bool QPoint::isNull() const
126{ return xp == 0 && yp == 0; }
127
128inline int QPoint::x() const
129{ return xp; }
130
131inline int QPoint::y() const
132{ return yp; }
133
134inline void QPoint::setX(int xpos)
135{ xp = xpos; }
136
137inline void QPoint::setY(int ypos)
138{ yp = ypos; }
139
140inline int &QPoint::rx()
141{ return xp; }
142
143inline int &QPoint::ry()
144{ return yp; }
145
146inline QPoint &QPoint::operator+=(const QPoint &p)
147{ xp+=p.xp; yp+=p.yp; return *this; }
148
149inline QPoint &QPoint::operator-=(const QPoint &p)
150{ xp-=p.xp; yp-=p.yp; return *this; }
151
152inline QPoint &QPoint::operator*=(float c)
153{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
154
155inline QPoint &QPoint::operator*=(double c)
156{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
157
158inline QPoint &QPoint::operator*=(int c)
159{ xp = xp*c; yp = yp*c; return *this; }
160
161inline bool operator==(const QPoint &p1, const QPoint &p2)
162{ return p1.xp == p2.xp && p1.yp == p2.yp; }
163
164inline bool operator!=(const QPoint &p1, const QPoint &p2)
165{ return p1.xp != p2.xp || p1.yp != p2.yp; }
166
167inline const QPoint operator+(const QPoint &p1, const QPoint &p2)
168{ return QPoint(p1.xp+p2.xp, p1.yp+p2.yp); }
169
170inline const QPoint operator-(const QPoint &p1, const QPoint &p2)
171{ return QPoint(p1.xp-p2.xp, p1.yp-p2.yp); }
172
173inline const QPoint operator*(const QPoint &p, float c)
174{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
175
176inline const QPoint operator*(const QPoint &p, double c)
177{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
178
179inline const QPoint operator*(const QPoint &p, int c)
180{ return QPoint(p.xp*c, p.yp*c); }
181
182inline const QPoint operator*(float c, const QPoint &p)
183{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
184
185inline const QPoint operator*(double c, const QPoint &p)
186{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
187
188inline const QPoint operator*(int c, const QPoint &p)
189{ return QPoint(p.xp*c, p.yp*c); }
190
191inline const QPoint operator-(const QPoint &p)
192{ return QPoint(-p.xp, -p.yp); }
193
194inline QPoint &QPoint::operator/=(qreal c)
195{
196 xp = qRound(xp/c);
197 yp = qRound(yp/c);
198 return *this;
199}
200
201inline const QPoint operator/(const QPoint &p, qreal c)
202{
203 return QPoint(qRound(p.xp/c), qRound(p.yp/c));
204}
205
206#ifndef QT_NO_DEBUG_STREAM
207Q_CORE_EXPORT QDebug operator<<(QDebug, const QPoint &);
208#endif
209
210
211
212
213
214class Q_CORE_EXPORT QPointF
215{
216public:
217 QPointF();
218 QPointF(const QPoint &p);
219 QPointF(qreal xpos, qreal ypos);
220
221 qreal manhattanLength() const;
222
223 bool isNull() const;
224
225 qreal x() const;
226 qreal y() const;
227 void setX(qreal x);
228 void setY(qreal y);
229
230 qreal &rx();
231 qreal &ry();
232
233 QPointF &operator+=(const QPointF &p);
234 QPointF &operator-=(const QPointF &p);
235 QPointF &operator*=(qreal c);
236 QPointF &operator/=(qreal c);
237
238 friend inline bool operator==(const QPointF &, const QPointF &);
239 friend inline bool operator!=(const QPointF &, const QPointF &);
240 friend inline const QPointF operator+(const QPointF &, const QPointF &);
241 friend inline const QPointF operator-(const QPointF &, const QPointF &);
242 friend inline const QPointF operator*(qreal, const QPointF &);
243 friend inline const QPointF operator*(const QPointF &, qreal);
244 friend inline const QPointF operator-(const QPointF &);
245 friend inline const QPointF operator/(const QPointF &, qreal);
246
247 QPoint toPoint() const;
248
249private:
250 friend class QMatrix;
251 friend class QTransform;
252
253 qreal xp;
254 qreal yp;
255};
256
257Q_DECLARE_TYPEINFO(QPointF, Q_MOVABLE_TYPE);
258
259/*****************************************************************************
260 QPointF stream functions
261 *****************************************************************************/
262#ifndef QT_NO_DATASTREAM
263Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QPointF &);
264Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QPointF &);
265#endif
266
267/*****************************************************************************
268 QPointF inline functions
269 *****************************************************************************/
270
271inline QPointF::QPointF() : xp(0), yp(0) { }
272
273inline QPointF::QPointF(qreal xpos, qreal ypos) : xp(xpos), yp(ypos) { }
274
275inline QPointF::QPointF(const QPoint &p) : xp(p.x()), yp(p.y()) { }
276
277inline bool QPointF::isNull() const
278{
279 return qIsNull(xp) && qIsNull(yp);
280}
281
282inline qreal QPointF::x() const
283{
284 return xp;
285}
286
287inline qreal QPointF::y() const
288{
289 return yp;
290}
291
292inline void QPointF::setX(qreal xpos)
293{
294 xp = xpos;
295}
296
297inline void QPointF::setY(qreal ypos)
298{
299 yp = ypos;
300}
301
302inline qreal &QPointF::rx()
303{
304 return xp;
305}
306
307inline qreal &QPointF::ry()
308{
309 return yp;
310}
311
312inline QPointF &QPointF::operator+=(const QPointF &p)
313{
314 xp+=p.xp;
315 yp+=p.yp;
316 return *this;
317}
318
319inline QPointF &QPointF::operator-=(const QPointF &p)
320{
321 xp-=p.xp; yp-=p.yp; return *this;
322}
323
324inline QPointF &QPointF::operator*=(qreal c)
325{
326 xp*=c; yp*=c; return *this;
327}
328
329inline bool operator==(const QPointF &p1, const QPointF &p2)
330{
331 return qFuzzyIsNull(p1.xp - p2.xp) && qFuzzyIsNull(p1.yp - p2.yp);
332}
333
334inline bool operator!=(const QPointF &p1, const QPointF &p2)
335{
336 return !qFuzzyIsNull(p1.xp - p2.xp) || !qFuzzyIsNull(p1.yp - p2.yp);
337}
338
339inline const QPointF operator+(const QPointF &p1, const QPointF &p2)
340{
341 return QPointF(p1.xp+p2.xp, p1.yp+p2.yp);
342}
343
344inline const QPointF operator-(const QPointF &p1, const QPointF &p2)
345{
346 return QPointF(p1.xp-p2.xp, p1.yp-p2.yp);
347}
348
349inline const QPointF operator*(const QPointF &p, qreal c)
350{
351 return QPointF(p.xp*c, p.yp*c);
352}
353
354inline const QPointF operator*(qreal c, const QPointF &p)
355{
356 return QPointF(p.xp*c, p.yp*c);
357}
358
359inline const QPointF operator-(const QPointF &p)
360{
361 return QPointF(-p.xp, -p.yp);
362}
363
364inline QPointF &QPointF::operator/=(qreal c)
365{
366 xp/=c;
367 yp/=c;
368 return *this;
369}
370
371inline const QPointF operator/(const QPointF &p, qreal c)
372{
373 return QPointF(p.xp/c, p.yp/c);
374}
375
376inline QPoint QPointF::toPoint() const
377{
378 return QPoint(qRound(xp), qRound(yp));
379}
380
381#ifndef QT_NO_DEBUG_STREAM
382Q_CORE_EXPORT QDebug operator<<(QDebug d, const QPointF &p);
383#endif
384
385QT_END_NAMESPACE
386
387QT_END_HEADER
388
389#endif // QPOINT_H
390