Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_fixed_point_maths.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_FIXED_POINT_MATHS_H
8#define __KIS_FIXED_POINT_MATHS_H
9
10#include <boost/operators.hpp>
11#include <QDataStream>
12
13class KisFixedPoint : boost::ordered_field_operators<KisFixedPoint>
14{
15public:
17 : d(0){};
18
19 KisFixedPoint(int iValue)
20 : d(iValue * 256)
21 {
22 }
23
24 KisFixedPoint(qreal fValue)
25 : d(static_cast<int>(fValue * 256))
26 {
27 }
28
29 qint32 toInt() const {
30 return d >= 0 ? d >> 8 : -((-d) >> 8);
31 }
32
33 qint32 toIntRound() const {
34 return d >= 0 ? (d + (1 << 7)) >> 8 : -((-d + (1 << 7)) >> 8);
35 }
36
37 qint32 toIntCeil() const {
38 return d >= 0 ? (d + ((1 << 8) - 1)) >> 8 : -((-d) >> 8);
39 }
40
41 qint32 toIntFloor() const {
42 return d >= 0 ? d >> 8 : -((-d + ((1 << 8) - 1)) >> 8);
43 }
44
45 qreal toFloat() const {
46 return qreal(d) / qreal(1 << 8);
47 }
48
50 d = v;
51 return *this;
52 }
53
54 qint32 to256Frac() const {
55 return d;
56 }
57
59 d++;
60 return *this;
61 }
62
64 d--;
65 return *this;
66 }
67
68 bool isInteger() const {
69 return !(d & ((1 << 8) -1 ));
70 }
71
72 bool operator<(const KisFixedPoint& x) const {
73 return d < x.d;
74 }
75
76 bool operator==(const KisFixedPoint& x) const {
77 return d == x.d;
78 }
79
81 d += x.d;
82 return *this;
83 }
84
86 d -= x.d;
87 return *this;
88 }
89
91 {
98 d *= x.d;
99 d >>= 8;
100 return *this;
101 }
102
104 {
111 d *= 256;
112 d /= x.d;
113 return *this;
114 }
115
116private:
118 friend QDebug operator<<(QDebug dbg, const KisFixedPoint &v);
119
120private:
121 qint32 d;
122};
123
125 x.d = -x.d;
126 return x;
127}
128
129QDebug operator<<(QDebug dbg, const KisFixedPoint &v) {
130 dbg.nospace() << v.toFloat() << " (d = " << v.d << ")";
131 return dbg.space();
132}
133
134#endif /* __KIS_FIXED_POINT_MATHS_H */
qreal v
KisFixedPoint & operator*=(const KisFixedPoint &x)
qint32 toIntRound() const
qint32 toIntFloor() const
qreal toFloat() const
friend QDebug operator<<(QDebug dbg, const KisFixedPoint &v)
friend KisFixedPoint operator-(KisFixedPoint x)
KisFixedPoint & operator+=(const KisFixedPoint &x)
KisFixedPoint & dec256Frac()
KisFixedPoint(int iValue)
KisFixedPoint & from256Frac(qint32 v)
qint32 toIntCeil() const
bool operator<(const KisFixedPoint &x) const
KisFixedPoint & operator/=(const KisFixedPoint &x)
qint32 toInt() const
KisFixedPoint(qreal fValue)
KisFixedPoint & operator-=(const KisFixedPoint &x)
bool operator==(const KisFixedPoint &x) const
KisFixedPoint & inc256Frac()
qint32 to256Frac() const
QDebug operator<<(QDebug dbg, const KisFixedPoint &v)
KisFixedPoint operator-(KisFixedPoint x)