1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _MCVMATH_HXX
25*b1cdbd2cSJim Jagielski #define _MCVMATH_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/solar.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski class FixCpx;
30*b1cdbd2cSJim Jagielski class ColWheel;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski // No of fractal bits
33*b1cdbd2cSJim Jagielski // allowed range 0..14, must be even
34*b1cdbd2cSJim Jagielski #define FIX_POST 14
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski // scale for ...Big() -Functions
37*b1cdbd2cSJim Jagielski #if (FIX_POST>=4)
38*b1cdbd2cSJim Jagielski #define FIX_P2  4
39*b1cdbd2cSJim Jagielski #define FIX_P3  (FIX_POST-FIX_P2)
40*b1cdbd2cSJim Jagielski #else
41*b1cdbd2cSJim Jagielski #define FIX_P2  0
42*b1cdbd2cSJim Jagielski #define FIX_P3  FIX_POST
43*b1cdbd2cSJim Jagielski #endif
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #if (FIX_POST>=1)
46*b1cdbd2cSJim Jagielski #define FIX_ADD (1<<(FIX_POST-1))
47*b1cdbd2cSJim Jagielski #else
48*b1cdbd2cSJim Jagielski #define FIX_ADD 0
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #if (FIX_P2>=1)
52*b1cdbd2cSJim Jagielski #define FIX_A2 (1<<(FIX_P2-1))
53*b1cdbd2cSJim Jagielski #else
54*b1cdbd2cSJim Jagielski #define FIX_A2 0
55*b1cdbd2cSJim Jagielski #endif
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski #if (FIX_P3>=1)
58*b1cdbd2cSJim Jagielski #define FIX_A3 (1<<(FIX_P3-1))
59*b1cdbd2cSJim Jagielski #else
60*b1cdbd2cSJim Jagielski #define FIX_A3 0
61*b1cdbd2cSJim Jagielski #endif
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski // -------
64*b1cdbd2cSJim Jagielski // - Fix -
65*b1cdbd2cSJim Jagielski // -------
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski class Fix
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski private:
70*b1cdbd2cSJim Jagielski 	friend	class FixCpx;
71*b1cdbd2cSJim Jagielski 	friend	class ColWheel;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski //	friend	Fix ImpMultBig2( const Fix& a, const Fix& b );
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski public:
76*b1cdbd2cSJim Jagielski 	long            x;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski public:
Fix()79*b1cdbd2cSJim Jagielski 					Fix() { x=0; }
Fix(int i)80*b1cdbd2cSJim Jagielski 					Fix( int i ) { x=(long(i)<<FIX_POST); }
Fix(short l)81*b1cdbd2cSJim Jagielski 					Fix( short l ) { x=(long(l)<<FIX_POST); }
Fix(sal_uInt16 l)82*b1cdbd2cSJim Jagielski 					Fix( sal_uInt16 l ) { x=(long(l)<<FIX_POST); }
Fix(long l)83*b1cdbd2cSJim Jagielski 					Fix( long l ) { x=(l<<FIX_POST); }
Fix(long Z,long N)84*b1cdbd2cSJim Jagielski 					Fix( long Z, long N ) { x=(Z<<FIX_POST)/N; }
85*b1cdbd2cSJim Jagielski 
SetInternVal(long nVal)86*b1cdbd2cSJim Jagielski 	void            SetInternVal( long nVal ) { x=nVal; }
GetInternVal() const87*b1cdbd2cSJim Jagielski 	long            GetInternVal() const { return x; }
88*b1cdbd2cSJim Jagielski 
operator +=(const Fix & a)89*b1cdbd2cSJim Jagielski 	void            operator+= ( const Fix& a ) { x+=a.x; }
operator -=(const Fix & a)90*b1cdbd2cSJim Jagielski 	void            operator-= ( const Fix& a ) { x-=a.x; }
operator *=(const Fix & a)91*b1cdbd2cSJim Jagielski 	void            operator*= ( const Fix& a ) { x=(x*a.x+FIX_ADD)>>FIX_POST; }
operator /=(const Fix & a)92*b1cdbd2cSJim Jagielski 	void            operator/= ( const Fix& a ) { x=(x<<FIX_POST)/a.x; }
93*b1cdbd2cSJim Jagielski 	friend Fix      operator-  ( const Fix& a );
94*b1cdbd2cSJim Jagielski 
MultBig(const Fix & a)95*b1cdbd2cSJim Jagielski 	void            MultBig( const Fix& a )
96*b1cdbd2cSJim Jagielski 						{ x=((((a.x+FIX_A2)>>FIX_P2)*x+FIX_A3)>>FIX_P3); }
DivBig(const Fix & a)97*b1cdbd2cSJim Jagielski 	void            DivBig( const Fix& a )
98*b1cdbd2cSJim Jagielski 						{ x=((x<<FIX_P3)/a.x)<<FIX_P2; }
99*b1cdbd2cSJim Jagielski 
operator >(const Fix & a,const Fix & b)100*b1cdbd2cSJim Jagielski 	friend sal_Bool     operator> ( const Fix& a, const Fix& b ) { return a.x > b.x; }
operator <(const Fix & a,const Fix & b)101*b1cdbd2cSJim Jagielski 	friend sal_Bool     operator< ( const Fix& a, const Fix& b ) { return a.x < b.x; }
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	operator        long() const    { return (x+FIX_ADD) >> FIX_POST; }
104*b1cdbd2cSJim Jagielski 	operator        double() const  { return double(x)/(1<<FIX_POST); }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	friend Fix      operator+ ( const Fix& a, const Fix& b );
107*b1cdbd2cSJim Jagielski 	friend Fix      operator- ( const Fix& a, const Fix& b );
108*b1cdbd2cSJim Jagielski 	friend Fix      operator* ( const Fix& a, const Fix& b );
109*b1cdbd2cSJim Jagielski 	friend Fix      operator/ ( const Fix& a, const Fix& b );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	friend FixCpx   operator-( const FixCpx& a );
112*b1cdbd2cSJim Jagielski };
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski // ----------
115*b1cdbd2cSJim Jagielski // - FixCpx -
116*b1cdbd2cSJim Jagielski // ----------
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski class FixCpx
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski //	friend	FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb );
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski public:
123*b1cdbd2cSJim Jagielski 	Fix             r;
124*b1cdbd2cSJim Jagielski 	Fix             i;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski public:
FixCpx()127*b1cdbd2cSJim Jagielski 					FixCpx()               : r(), i() {}
FixCpx(Fix a)128*b1cdbd2cSJim Jagielski 					FixCpx( Fix a )        : r( a ), i() {}
FixCpx(Fix a,Fix b)129*b1cdbd2cSJim Jagielski 					FixCpx( Fix a, Fix b ) : r( a ), i( b ) {}
130*b1cdbd2cSJim Jagielski 
GetReal()131*b1cdbd2cSJim Jagielski 	Fix&            GetReal() { return r; }
GetImag()132*b1cdbd2cSJim Jagielski 	Fix&            GetImag() { return i; }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	void            operator*= ( const FixCpx& ra );
135*b1cdbd2cSJim Jagielski 	void            MultBig( const FixCpx& ra, const FixCpx& rb );
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 	friend FixCpx   operator+ ( const FixCpx& a, const FixCpx& b );
138*b1cdbd2cSJim Jagielski 	friend FixCpx   operator- ( const FixCpx& a, const FixCpx& b );
139*b1cdbd2cSJim Jagielski 	friend FixCpx   operator* ( const FixCpx& a, const FixCpx& b );
140*b1cdbd2cSJim Jagielski 	friend FixCpx   operator/ ( const FixCpx& a, const FixCpx& b );
141*b1cdbd2cSJim Jagielski 	friend FixCpx   operator- ( const FixCpx& a );
142*b1cdbd2cSJim Jagielski };
143*b1cdbd2cSJim Jagielski 
operator -(const Fix & a)144*b1cdbd2cSJim Jagielski inline Fix operator- ( const Fix& a )
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski 	Fix f;
147*b1cdbd2cSJim Jagielski 	f.x = -a.x;
148*b1cdbd2cSJim Jagielski 	return f;
149*b1cdbd2cSJim Jagielski }
150*b1cdbd2cSJim Jagielski 
operator +(const Fix & a,const Fix & b)151*b1cdbd2cSJim Jagielski inline Fix operator+ ( const Fix& a, const Fix& b )
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski 	long l = a.x+b.x;
154*b1cdbd2cSJim Jagielski 	return *((Fix*)&l);
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
operator -(const Fix & a,const Fix & b)157*b1cdbd2cSJim Jagielski inline Fix operator- ( const Fix& a, const Fix& b )
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski 	long l = a.x-b.x;
160*b1cdbd2cSJim Jagielski 	return *((Fix*)&l);
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski 
operator *(const Fix & a,const Fix & b)163*b1cdbd2cSJim Jagielski inline Fix operator* ( const Fix& a, const Fix& b )
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	long l=(a.x*b.x+FIX_ADD)>>FIX_POST;
166*b1cdbd2cSJim Jagielski 	return *((Fix*)&l);
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
operator /(const Fix & a,const Fix & b)169*b1cdbd2cSJim Jagielski inline Fix operator/ ( const Fix& a, const Fix& b )
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski 	long l=(a.x<<FIX_POST)/b.x;
172*b1cdbd2cSJim Jagielski 	return *((Fix*)&l);
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski 
operator -(const FixCpx & a)175*b1cdbd2cSJim Jagielski inline FixCpx operator- ( const FixCpx& a )
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski 	FixCpx fc;
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	fc.r.x = -a.r.x;
180*b1cdbd2cSJim Jagielski 	fc.i.x = -a.i.x;
181*b1cdbd2cSJim Jagielski 	return fc;
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
operator +(const FixCpx & a,const FixCpx & b)184*b1cdbd2cSJim Jagielski inline FixCpx operator+ ( const FixCpx& a, const FixCpx& b )
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	return FixCpx( a.r+b.r, a.i+b.i );
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
operator -(const FixCpx & a,const FixCpx & b)189*b1cdbd2cSJim Jagielski inline FixCpx operator- ( const FixCpx& a, const FixCpx& b )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski 	return FixCpx( a.r-b.r, a.i-b.i );
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
operator *=(const FixCpx & ra)194*b1cdbd2cSJim Jagielski inline void FixCpx::operator*= ( const FixCpx& ra )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski 	Fix rr = ra.r*r-ra.i*i;
197*b1cdbd2cSJim Jagielski 	i = ra.r*i+ra.i*r;
198*b1cdbd2cSJim Jagielski 	r = rr;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
operator *(const FixCpx & a,const FixCpx & b)201*b1cdbd2cSJim Jagielski inline FixCpx operator* ( const FixCpx& a, const FixCpx& b )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski 	return FixCpx( a.r*b.r-a.i*b.i, a.r*b.i+a.i*b.r );
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
operator /(const FixCpx & a,const FixCpx & b)206*b1cdbd2cSJim Jagielski inline FixCpx operator/ ( const FixCpx& a, const FixCpx& b )
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	return FixCpx( (a.r*b.r+a.i*b.i)/(b.r*b.r+b.i*b.i),
209*b1cdbd2cSJim Jagielski 				   (b.r*a.r-a.r*b.i)/(b.r*b.r+b.i*b.i) );
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski Fix ImpMultBig2( const Fix& a, const Fix& b );
215*b1cdbd2cSJim Jagielski FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski void ImpCartToPolar( const short x, const short y, Fix& rRad, sal_uInt16& rPhi );
218*b1cdbd2cSJim Jagielski void ImpPolarToCart( const Fix& rR, const sal_uInt16 Phi, short& rX, short& rY );
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski sal_uInt16 ImpSqrt( sal_uLong nRadi );
221*b1cdbd2cSJim Jagielski sal_uInt16 ImpATan2( const short x, const short y );
222*b1cdbd2cSJim Jagielski FixCpx ImpExPI( sal_uInt16 nPhi );
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski #endif // _MCVMATH_HXX
225