Qt 4.8
qfixed_p.h
Go to the documentation of this file.
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 QtGui 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 QFIXED_P_H
43 #define QFIXED_P_H
44 
45 //
46 // W A R N I N G
47 // -------------
48 //
49 // This file is not part of the Qt API. It exists for the convenience
50 // of other Qt classes. This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55 
56 #include "QtCore/qdebug.h"
57 #include "QtCore/qpoint.h"
58 #include "QtCore/qsize.h"
59 
61 
62 struct QFixed {
63 public:
64  QFixed() : val(0) {}
65  QFixed(int i) : val(i<<6) {}
66  QFixed(long i) : val(i<<6) {}
67  QFixed &operator=(int i) { val = (i<<6); return *this; }
68  QFixed &operator=(long i) { val = (i<<6); return *this; }
69 
70  static QFixed fromReal(qreal r) { QFixed f; f.val = (int)(r*qreal(64)); return f; }
71  static QFixed fromFixed(int fixed) { QFixed f; f.val = fixed; return f; }
72 
73  inline int value() const { return val; }
74  inline void setValue(int value) { val = value; }
75 
76  inline int toInt() const { return (((val)+32) & -64)>>6; }
77  inline qreal toReal() const { return ((qreal)val)/(qreal)64; }
78 
79  inline int truncate() const { return val>>6; }
80  inline QFixed round() const { QFixed f; f.val = ((val)+32) & -64; return f; }
81  inline QFixed floor() const { QFixed f; f.val = (val) & -64; return f; }
82  inline QFixed ceil() const { QFixed f; f.val = (val+63) & -64; return f; }
83 
84  inline QFixed operator+(int i) const { QFixed f; f.val = (val + (i<<6)); return f; }
85  inline QFixed operator+(uint i) const { QFixed f; f.val = (val + (i<<6)); return f; }
86  inline QFixed operator+(const QFixed &other) const { QFixed f; f.val = (val + other.val); return f; }
87  inline QFixed &operator+=(int i) { val += (i<<6); return *this; }
88  inline QFixed &operator+=(uint i) { val += (i<<6); return *this; }
89  inline QFixed &operator+=(const QFixed &other) { val += other.val; return *this; }
90  inline QFixed operator-(int i) const { QFixed f; f.val = (val - (i<<6)); return f; }
91  inline QFixed operator-(uint i) const { QFixed f; f.val = (val - (i<<6)); return f; }
92  inline QFixed operator-(const QFixed &other) const { QFixed f; f.val = (val - other.val); return f; }
93  inline QFixed &operator-=(int i) { val -= (i<<6); return *this; }
94  inline QFixed &operator-=(uint i) { val -= (i<<6); return *this; }
95  inline QFixed &operator-=(const QFixed &other) { val -= other.val; return *this; }
96  inline QFixed operator-() const { QFixed f; f.val = -val; return f; }
97 
98  inline bool operator==(const QFixed &other) const { return val == other.val; }
99  inline bool operator!=(const QFixed &other) const { return val != other.val; }
100  inline bool operator<(const QFixed &other) const { return val < other.val; }
101  inline bool operator>(const QFixed &other) const { return val > other.val; }
102  inline bool operator<=(const QFixed &other) const { return val <= other.val; }
103  inline bool operator>=(const QFixed &other) const { return val >= other.val; }
104  inline bool operator!() const { return !val; }
105 
106  inline QFixed &operator/=(int x) { val /= x; return *this; }
107  inline QFixed &operator/=(const QFixed &o) {
108  if (o.val == 0) {
109  val = 0x7FFFFFFFL;
110  } else {
111  bool neg = false;
112  qint64 a = val;
113  qint64 b = o.val;
114  if (a < 0) { a = -a; neg = true; }
115  if (b < 0) { b = -b; neg = !neg; }
116 
117  int res = (int)(((a << 6) + (b >> 1)) / b);
118 
119  val = (neg ? -res : res);
120  }
121  return *this;
122  }
123  inline QFixed operator/(int d) const { QFixed f; f.val = val/d; return f; }
124  inline QFixed operator/(QFixed b) const { QFixed f = *this; return (f /= b); }
125  inline QFixed operator>>(int d) const { QFixed f = *this; f.val >>= d; return f; }
126  inline QFixed &operator*=(int i) { val *= i; return *this; }
127  inline QFixed &operator*=(uint i) { val *= i; return *this; }
128  inline QFixed &operator*=(const QFixed &o) {
129  bool neg = false;
130  qint64 a = val;
131  qint64 b = o.val;
132  if (a < 0) { a = -a; neg = true; }
133  if (b < 0) { b = -b; neg = !neg; }
134 
135  int res = (int)((a * b + 0x20L) >> 6);
136  val = neg ? -res : res;
137  return *this;
138  }
139  inline QFixed operator*(int i) const { QFixed f = *this; return (f *= i); }
140  inline QFixed operator*(uint i) const { QFixed f = *this; return (f *= i); }
141  inline QFixed operator*(const QFixed &o) const { QFixed f = *this; return (f *= o); }
142 
143 private:
144  QFixed(qreal i) : val((int)(i*qreal(64))) {}
145  QFixed &operator=(qreal i) { val = (int)(i*qreal(64)); return *this; }
146  inline QFixed operator+(qreal i) const { QFixed f; f.val = (val + (int)(i*qreal(64))); return f; }
147  inline QFixed &operator+=(qreal i) { val += (int)(i*64); return *this; }
148  inline QFixed operator-(qreal i) const { QFixed f; f.val = (val - (int)(i*qreal(64))); return f; }
149  inline QFixed &operator-=(qreal i) { val -= (int)(i*64); return *this; }
150  inline QFixed &operator/=(qreal r) { val = (int)(val/r); return *this; }
151  inline QFixed operator/(qreal d) const { QFixed f; f.val = (int)(val/d); return f; }
152  inline QFixed &operator*=(qreal d) { val = (int) (val*d); return *this; }
153  inline QFixed operator*(qreal d) const { QFixed f = *this; return (f *= d); }
154  int val;
155 };
157 
158 #define QFIXED_MAX (INT_MAX/256)
159 
160 inline int qRound(const QFixed &f) { return f.toInt(); }
161 inline int qFloor(const QFixed &f) { return f.floor().truncate(); }
162 
163 inline QFixed operator*(int i, const QFixed &d) { return d*i; }
164 inline QFixed operator+(int i, const QFixed &d) { return d+i; }
165 inline QFixed operator-(int i, const QFixed &d) { return -(d-i); }
166 inline QFixed operator*(uint i, const QFixed &d) { return d*i; }
167 inline QFixed operator+(uint i, const QFixed &d) { return d+i; }
168 inline QFixed operator-(uint i, const QFixed &d) { return -(d-i); }
169 // inline QFixed operator*(qreal d, const QFixed &d2) { return d2*d; }
170 
171 inline bool operator==(const QFixed &f, int i) { return f.value() == (i<<6); }
172 inline bool operator==(int i, const QFixed &f) { return f.value() == (i<<6); }
173 inline bool operator!=(const QFixed &f, int i) { return f.value() != (i<<6); }
174 inline bool operator!=(int i, const QFixed &f) { return f.value() != (i<<6); }
175 inline bool operator<=(const QFixed &f, int i) { return f.value() <= (i<<6); }
176 inline bool operator<=(int i, const QFixed &f) { return (i<<6) <= f.value(); }
177 inline bool operator>=(const QFixed &f, int i) { return f.value() >= (i<<6); }
178 inline bool operator>=(int i, const QFixed &f) { return (i<<6) >= f.value(); }
179 inline bool operator<(const QFixed &f, int i) { return f.value() < (i<<6); }
180 inline bool operator<(int i, const QFixed &f) { return (i<<6) < f.value(); }
181 inline bool operator>(const QFixed &f, int i) { return f.value() > (i<<6); }
182 inline bool operator>(int i, const QFixed &f) { return (i<<6) > f.value(); }
183 
184 #ifndef QT_NO_DEBUG_STREAM
185 inline QDebug &operator<<(QDebug &dbg, const QFixed &f)
186 { return dbg << f.toReal(); }
187 #endif
188 
189 struct QFixedPoint {
192  inline QFixedPoint() {}
193  inline QFixedPoint(const QFixed &_x, const QFixed &_y) : x(_x), y(_y) {}
194  QPointF toPointF() const { return QPointF(x.toReal(), y.toReal()); }
195  static QFixedPoint fromPointF(const QPointF &p) {
196  return QFixedPoint(QFixed::fromReal(p.x()), QFixed::fromReal(p.y()));
197  }
198 };
200 
201 inline QFixedPoint operator-(const QFixedPoint &p1, const QFixedPoint &p2)
202 { return QFixedPoint(p1.x - p2.x, p1.y - p2.y); }
203 inline QFixedPoint operator+(const QFixedPoint &p1, const QFixedPoint &p2)
204 { return QFixedPoint(p1.x + p2.x, p1.y + p2.y); }
205 
206 struct QFixedSize {
209  QSizeF toSizeF() const { return QSizeF(width.toReal(), height.toReal()); }
210  static QFixedSize fromSizeF(const QSizeF &s) {
211  QFixedSize size;
212  size.width = QFixed::fromReal(s.width());
213  size.height = QFixed::fromReal(s.height());
214  return size;
215  }
216 };
218 
220 
221 #endif // QTEXTENGINE_P_H
int qFloor(const QFixed &f)
Definition: qfixed_p.h:161
The QDebug class provides an output stream for debugging information.
Definition: qdebug.h:62
double d
Definition: qnumeric_p.h:62
QFixed & operator*=(qreal d)
Definition: qfixed_p.h:152
QFixed operator-(uint i) const
Definition: qfixed_p.h:91
static QFixed fromFixed(int fixed)
Definition: qfixed_p.h:71
QFixed operator+(qreal i) const
Definition: qfixed_p.h:146
double qreal
Definition: qglobal.h:1193
QFixed operator+(const QFixed &other) const
Definition: qfixed_p.h:86
#define QT_END_NAMESPACE
This macro expands to.
Definition: qglobal.h:90
int value() const
Definition: qfixed_p.h:73
int val
Definition: qfixed_p.h:154
QFixed(int i)
Definition: qfixed_p.h:65
bool operator!=(const QFixed &other) const
Definition: qfixed_p.h:99
int qRound(const QFixed &f)
Definition: qfixed_p.h:160
QFixed operator-(int i) const
Definition: qfixed_p.h:90
QFixed operator/(qreal d) const
Definition: qfixed_p.h:151
qreal width() const
Returns the width.
Definition: qsize.h:284
QFixed operator-(qreal i) const
Definition: qfixed_p.h:148
QFixed & operator/=(qreal r)
Definition: qfixed_p.h:150
QFixed operator-(const QFixed &other) const
Definition: qfixed_p.h:92
The QPointF class defines a point in the plane using floating point precision.
Definition: qpoint.h:214
qreal height() const
Returns the height.
Definition: qsize.h:287
QFixed & operator+=(qreal i)
Definition: qfixed_p.h:147
QFixed & operator-=(qreal i)
Definition: qfixed_p.h:149
QFixed operator-() const
Definition: qfixed_p.h:96
bool operator<(const QFixed &other) const
Definition: qfixed_p.h:100
QFixed & operator-=(uint i)
Definition: qfixed_p.h:94
long ASN1_INTEGER_get ASN1_INTEGER * a
static QFixed fromReal(qreal r)
Definition: qfixed_p.h:70
QFixed operator*(int i) const
Definition: qfixed_p.h:139
QFixed & operator-=(const QFixed &other)
Definition: qfixed_p.h:95
static QFixedPoint fromPointF(const QPointF &p)
Definition: qfixed_p.h:195
The QSizeF class defines the size of a two-dimensional object using floating point precision...
Definition: qsize.h:202
QFixed operator+(uint i) const
Definition: qfixed_p.h:85
qreal x() const
Returns the x-coordinate of this point.
Definition: qpoint.h:282
bool operator>=(const QFixed &other) const
Definition: qfixed_p.h:103
bool operator!() const
Definition: qfixed_p.h:104
Q_CORE_EXPORT QTextStream & fixed(QTextStream &s)
QFixed floor() const
Definition: qfixed_p.h:81
#define QT_BEGIN_NAMESPACE
This macro expands to.
Definition: qglobal.h:89
void setValue(int value)
Definition: qfixed_p.h:74
QFixed y
Definition: qfixed_p.h:191
QFixed & operator/=(const QFixed &o)
Definition: qfixed_p.h:107
QFixed round() const
Definition: qfixed_p.h:80
Q_DECLARE_TYPEINFO(QFixed, Q_PRIMITIVE_TYPE)
QFixedPoint(const QFixed &_x, const QFixed &_y)
Definition: qfixed_p.h:193
QFixed operator/(QFixed b) const
Definition: qfixed_p.h:124
int toInt() const
Definition: qfixed_p.h:76
QFixed & operator+=(const QFixed &other)
Definition: qfixed_p.h:89
unsigned int uint
Definition: qglobal.h:996
QFixed(long i)
Definition: qfixed_p.h:66
QSizeF toSizeF() const
Definition: qfixed_p.h:209
QFixed operator/(int d) const
Definition: qfixed_p.h:123
__int64 qint64
Definition: qglobal.h:942
QDebug & operator<<(QDebug &dbg, const QFixed &f)
Definition: qfixed_p.h:185
QFixed & operator*=(int i)
Definition: qfixed_p.h:126
QFixed & operator-=(int i)
Definition: qfixed_p.h:93
QFixed & operator+=(int i)
Definition: qfixed_p.h:87
bool operator>(const QFixed &other) const
Definition: qfixed_p.h:101
QFixed x
Definition: qfixed_p.h:190
QFixed & operator=(int i)
Definition: qfixed_p.h:67
QFixed & operator+=(uint i)
Definition: qfixed_p.h:88
int truncate() const
Definition: qfixed_p.h:79
QPointF toPointF() const
Definition: qfixed_p.h:194
QFixed width
Definition: qfixed_p.h:207
QFixed operator*(uint i) const
Definition: qfixed_p.h:140
QFixed operator+(int i) const
Definition: qfixed_p.h:84
bool operator==(const QFixed &other) const
Definition: qfixed_p.h:98
static QFixedSize fromSizeF(const QSizeF &s)
Definition: qfixed_p.h:210
qreal toReal() const
Definition: qfixed_p.h:77
QFixed & operator*=(const QFixed &o)
Definition: qfixed_p.h:128
qreal y() const
Returns the y-coordinate of this point.
Definition: qpoint.h:287
QFixed(qreal i)
Definition: qfixed_p.h:144
QFixed operator*(const QFixed &o) const
Definition: qfixed_p.h:141
QFixed & operator=(qreal i)
Definition: qfixed_p.h:145
bool operator<=(const QFixed &other) const
Definition: qfixed_p.h:102
QFixed()
Definition: qfixed_p.h:64
QFixed operator*(qreal d) const
Definition: qfixed_p.h:153
QFixed ceil() const
Definition: qfixed_p.h:82
QFixed operator>>(int d) const
Definition: qfixed_p.h:125
QFixed & operator=(long i)
Definition: qfixed_p.h:68
QFixed & operator/=(int x)
Definition: qfixed_p.h:106
QFixed height
Definition: qfixed_p.h:208
QFixed & operator*=(uint i)
Definition: qfixed_p.h:127