source: trunk/poppler/mypoppler/goo/FixedPoint.h @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 16 years ago

First import

File size: 5.4 KB
Line 
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
29typedef long long FixPtInt64;
30
31class FixedPoint {
32public:
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
138private:
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
Note: See TracBrowser for help on using the repository browser.