/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _MCVMATH_HXX
#define _MCVMATH_HXX

#include <tools/solar.h>

class FixCpx;
class ColWheel;

// No of fractal bits
// allowed range 0..14, must be even
#define FIX_POST 14

// scale for ...Big() -Functions
#if (FIX_POST>=4)
#define FIX_P2  4
#define FIX_P3  (FIX_POST-FIX_P2)
#else
#define FIX_P2  0
#define FIX_P3  FIX_POST
#endif

#if (FIX_POST>=1)
#define FIX_ADD (1<<(FIX_POST-1))
#else
#define FIX_ADD 0
#endif

#if (FIX_P2>=1)
#define FIX_A2 (1<<(FIX_P2-1))
#else
#define FIX_A2 0
#endif

#if (FIX_P3>=1)
#define FIX_A3 (1<<(FIX_P3-1))
#else
#define FIX_A3 0
#endif

// -------
// - Fix -
// -------

class Fix
{
private:
	friend	class FixCpx;
	friend	class ColWheel;

//	friend	Fix ImpMultBig2( const Fix& a, const Fix& b );

public:
	long            x;

public:
					Fix() { x=0; }
					Fix( int i ) { x=(long(i)<<FIX_POST); }
					Fix( short l ) { x=(long(l)<<FIX_POST); }
					Fix( sal_uInt16 l ) { x=(long(l)<<FIX_POST); }
					Fix( long l ) { x=(l<<FIX_POST); }
					Fix( long Z, long N ) { x=(Z<<FIX_POST)/N; }

	void            SetInternVal( long nVal ) { x=nVal; }
	long            GetInternVal() const { return x; }

	void            operator+= ( const Fix& a ) { x+=a.x; }
	void            operator-= ( const Fix& a ) { x-=a.x; }
	void            operator*= ( const Fix& a ) { x=(x*a.x+FIX_ADD)>>FIX_POST; }
	void            operator/= ( const Fix& a ) { x=(x<<FIX_POST)/a.x; }
	friend Fix      operator-  ( const Fix& a );

	void            MultBig( const Fix& a )
						{ x=((((a.x+FIX_A2)>>FIX_P2)*x+FIX_A3)>>FIX_P3); }
	void            DivBig( const Fix& a )
						{ x=((x<<FIX_P3)/a.x)<<FIX_P2; }

	friend sal_Bool     operator> ( const Fix& a, const Fix& b ) { return a.x > b.x; }
	friend sal_Bool     operator< ( const Fix& a, const Fix& b ) { return a.x < b.x; }

	operator        long() const    { return (x+FIX_ADD) >> FIX_POST; }
	operator        double() const  { return double(x)/(1<<FIX_POST); }

	friend Fix      operator+ ( const Fix& a, const Fix& b );
	friend Fix      operator- ( const Fix& a, const Fix& b );
	friend Fix      operator* ( const Fix& a, const Fix& b );
	friend Fix      operator/ ( const Fix& a, const Fix& b );

	friend FixCpx   operator-( const FixCpx& a );
};

// ----------
// - FixCpx -
// ----------

class FixCpx
{
//	friend	FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb );

public:
	Fix             r;
	Fix             i;

public:
					FixCpx()               : r(), i() {}
					FixCpx( Fix a )        : r( a ), i() {}
					FixCpx( Fix a, Fix b ) : r( a ), i( b ) {}

	Fix&            GetReal() { return r; }
	Fix&            GetImag() { return i; }

	void            operator*= ( const FixCpx& ra );
	void            MultBig( const FixCpx& ra, const FixCpx& rb );

	friend FixCpx   operator+ ( const FixCpx& a, const FixCpx& b );
	friend FixCpx   operator- ( const FixCpx& a, const FixCpx& b );
	friend FixCpx   operator* ( const FixCpx& a, const FixCpx& b );
	friend FixCpx   operator/ ( const FixCpx& a, const FixCpx& b );
	friend FixCpx   operator- ( const FixCpx& a );
};

inline Fix operator- ( const Fix& a )
{
	Fix f;
	f.x = -a.x;
	return f;
}

inline Fix operator+ ( const Fix& a, const Fix& b )
{
	long l = a.x+b.x;
	return *((Fix*)&l);
}

inline Fix operator- ( const Fix& a, const Fix& b )
{
	long l = a.x-b.x;
	return *((Fix*)&l);
}

inline Fix operator* ( const Fix& a, const Fix& b )
{
	long l=(a.x*b.x+FIX_ADD)>>FIX_POST;
	return *((Fix*)&l);
}

inline Fix operator/ ( const Fix& a, const Fix& b )
{
	long l=(a.x<<FIX_POST)/b.x;
	return *((Fix*)&l);
}

inline FixCpx operator- ( const FixCpx& a )
{
	FixCpx fc;

	fc.r.x = -a.r.x;
	fc.i.x = -a.i.x;
	return fc;
}

inline FixCpx operator+ ( const FixCpx& a, const FixCpx& b )
{
	return FixCpx( a.r+b.r, a.i+b.i );
}

inline FixCpx operator- ( const FixCpx& a, const FixCpx& b )
{
	return FixCpx( a.r-b.r, a.i-b.i );
}

inline void FixCpx::operator*= ( const FixCpx& ra )
{
	Fix rr = ra.r*r-ra.i*i;
	i = ra.r*i+ra.i*r;
	r = rr;
}

inline FixCpx operator* ( const FixCpx& a, const FixCpx& b )
{
	return FixCpx( a.r*b.r-a.i*b.i, a.r*b.i+a.i*b.r );
}

inline FixCpx operator/ ( const FixCpx& a, const FixCpx& b )
{
	return FixCpx( (a.r*b.r+a.i*b.i)/(b.r*b.r+b.i*b.i),
				   (b.r*a.r-a.r*b.i)/(b.r*b.r+b.i*b.i) );
}

// -----------------------------------------------------------------------

Fix ImpMultBig2( const Fix& a, const Fix& b );
FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb );

void ImpCartToPolar( const short x, const short y, Fix& rRad, sal_uInt16& rPhi );
void ImpPolarToCart( const Fix& rR, const sal_uInt16 Phi, short& rX, short& rY );

sal_uInt16 ImpSqrt( sal_uLong nRadi );
sal_uInt16 ImpATan2( const short x, const short y );
FixCpx ImpExPI( sal_uInt16 nPhi );

#endif // _MCVMATH_HXX
