SmartPDF - lightweight pdf viewer app for rosapps
[reactos.git] / rosapps / smartpdf / poppler / goo / FixedPoint.h
1 //========================================================================
2 //
3 // FixedPoint.h
4 //
5 // Fixed point type, with C++ operators.
6 //
7 // Copyright 2004 Glyph & Cog, LLC
8 //
9 //========================================================================
10
11 #ifndef FIXEDPOINT_H
12 #define FIXEDPOINT_H
13
14 #include <config.h>
15
16 #if USE_FIXEDPOINT
17
18 #ifdef USE_GCC_PRAGMAS
19 #pragma interface
20 #endif
21
22 #include <stdio.h>
23 #include <stdlib.h>
24
25 #define fixptShift 16
26 #define fixptMaskL ((1 << fixptShift) - 1)
27 #define fixptMaskH (~fixptMaskL)
28
29 typedef long long FixPtInt64;
30
31 class FixedPoint {
32 public:
33
34 FixedPoint() { val = 0; }
35 FixedPoint(const FixedPoint &x) { val = x.val; }
36 FixedPoint(double x) { val = (int)(x * (1 << fixptShift) + 0.5); }
37 FixedPoint(int x) { val = x << fixptShift; }
38 FixedPoint(long x) { val = x << fixptShift; }
39
40 operator float()
41 { return (float) val * ((float)1 / (float)(1 << fixptShift)); }
42 operator double()
43 { return (double) val * (1.0 / (double)(1 << fixptShift)); }
44 operator int()
45 { return val >> fixptShift; }
46
47 int getRaw() { return val; }
48
49 FixedPoint operator =(FixedPoint x) { val = x.val; return *this; }
50
51 int operator ==(FixedPoint x) { return val == x.val; }
52 int operator ==(double x) { return *this == (FixedPoint)x; }
53 int operator ==(int x) { return *this == (FixedPoint)x; }
54 int operator ==(long x) { return *this == (FixedPoint)x; }
55
56 int operator !=(FixedPoint x) { return val != x.val; }
57 int operator !=(double x) { return *this != (FixedPoint)x; }
58 int operator !=(int x) { return *this != (FixedPoint)x; }
59 int operator !=(long x) { return *this != (FixedPoint)x; }
60
61 int operator <(FixedPoint x) { return val < x.val; }
62 int operator <(double x) { return *this < (FixedPoint)x; }
63 int operator <(int x) { return *this < (FixedPoint)x; }
64 int operator <(long x) { return *this < (FixedPoint)x; }
65
66 int operator <=(FixedPoint x) { return val <= x.val; }
67 int operator <=(double x) { return *this <= (FixedPoint)x; }
68 int operator <=(int x) { return *this <= (FixedPoint)x; }
69 int operator <=(long x) { return *this <= (FixedPoint)x; }
70
71 int operator >(FixedPoint x) { return val > x.val; }
72 int operator >(double x) { return *this > (FixedPoint)x; }
73 int operator >(int x) { return *this > (FixedPoint)x; }
74 int operator >(long x) { return *this > (FixedPoint)x; }
75
76 int operator >=(FixedPoint x) { return val >= x.val; }
77 int operator >=(double x) { return *this >= (FixedPoint)x; }
78 int operator >=(int x) { return *this >= (FixedPoint)x; }
79 int operator >=(long x) { return *this >= (FixedPoint)x; }
80
81 FixedPoint operator -() { return make(-val); }
82
83 FixedPoint operator +(FixedPoint x) { return make(val + x.val); }
84 FixedPoint operator +(double x) { return *this + (FixedPoint)x; }
85 FixedPoint operator +(int x) { return *this + (FixedPoint)x; }
86 FixedPoint operator +(long x) { return *this + (FixedPoint)x; }
87
88 FixedPoint operator +=(FixedPoint x) { val = val + x.val; return *this; }
89 FixedPoint operator +=(double x) { return *this += (FixedPoint)x; }
90 FixedPoint operator +=(int x) { return *this += (FixedPoint)x; }
91 FixedPoint operator +=(long x) { return *this += (FixedPoint)x; }
92
93 FixedPoint operator -(FixedPoint x) { return make(val - x.val); }
94 FixedPoint operator -(double x) { return *this - (FixedPoint)x; }
95 FixedPoint operator -(int x) { return *this - (FixedPoint)x; }
96 FixedPoint operator -(long x) { return *this - (FixedPoint)x; }
97
98 FixedPoint operator -=(FixedPoint x) { val = val - x.val; return *this; }
99 FixedPoint operator -=(double x) { return *this -= (FixedPoint)x; }
100 FixedPoint operator -=(int x) { return *this -= (FixedPoint)x; }
101 FixedPoint operator -=(long x) { return *this -= (FixedPoint)x; }
102
103 FixedPoint operator *(FixedPoint x) { return make(mul(val, x.val)); }
104 FixedPoint operator *(double x) { return *this * (FixedPoint)x; }
105 FixedPoint operator *(int x) { return *this * (FixedPoint)x; }
106 FixedPoint operator *(long x) { return *this * (FixedPoint)x; }
107
108 FixedPoint operator *=(FixedPoint x) { val = mul(val, x.val); return *this; }
109 FixedPoint operator *=(double x) { return *this *= (FixedPoint)x; }
110 FixedPoint operator *=(int x) { return *this *= (FixedPoint)x; }
111 FixedPoint operator *=(long x) { return *this *= (FixedPoint)x; }
112
113 FixedPoint operator /(FixedPoint x) { return make(div(val, x.val)); }
114 FixedPoint operator /(double x) { return *this / (FixedPoint)x; }
115 FixedPoint operator /(int x) { return *this / (FixedPoint)x; }
116 FixedPoint operator /(long x) { return *this / (FixedPoint)x; }
117
118 FixedPoint operator /=(FixedPoint x) { val = div(val, x.val); return *this; }
119 FixedPoint operator /=(double x) { return *this /= (FixedPoint)x; }
120 FixedPoint operator /=(int x) { return *this /= (FixedPoint)x; }
121 FixedPoint operator /=(long x) { return *this /= (FixedPoint)x; }
122
123 static FixedPoint abs(FixedPoint x) { return make(::abs(x.val)); }
124
125 static int floor(FixedPoint x) { return x.val >> fixptShift; }
126
127 static int ceil(FixedPoint x)
128 { return (x.val & fixptMaskL) ? ((x.val >> fixptShift) + 1)
129 : (x.val >> fixptShift); }
130
131 static int round(FixedPoint x)
132 { return (x.val + (1 << (fixptShift - 1))) >> fixptShift; }
133
134 static FixedPoint sqrt(FixedPoint x);
135
136 static FixedPoint pow(FixedPoint x, FixedPoint y);
137
138 private:
139
140 static FixedPoint make(int valA) { FixedPoint x; x.val = valA; return x; }
141
142 static int mul(int x, int y);
143 static int div(int x, int y);
144
145 int val; // 16.16 fixed point
146 };
147
148 #endif // USE_FIXEDPOINT
149
150 #endif