--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/gfx2d/src/GfxFloatFixPt.cpp Thu Jan 07 16:19:02 2010 +0200
@@ -0,0 +1,435 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Graphics Extension Library source file
+*
+*/
+
+
+#include <e32std.h>
+#include "GfxFloatFixPt.h"
+
+
+#ifdef SVG_FLOAT_BUILD
+#include <e32math.h>
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ void TFloatFixPt::GetString( float aFloat, TDes& aBuf )
+ {
+ TRealFormat rf( 10, 3 );
+ rf.iType = KRealFormatFixed | KDoNotUseTriads;
+ aBuf.Num( ( aFloat ), rf );
+ }
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::ConvertString( const TDesC& aVal )
+ {
+ TLex aString( aVal );
+ TReal32 val;
+ aString.SkipSpace();
+ aString.Val( val, '.' );
+ return float( val );
+ }
+
+// --------------------------------------------------------------------------
+// Error code is returned
+// ---------------------------------------------------------------------------
+ TInt TFloatFixPt::ConvertString( const TDesC& aString, float& aValue )
+ {
+ TLex lex( aString );
+ lex.SkipSpace();
+ return lex.Val( aValue, '.' );
+ }
+
+// --------------------------------------------------------------------------
+// Error code is returned
+// ---------------------------------------------------------------------------
+ TInt TFloatFixPt::ConvertString( const TDesC& aString, TFloatFixPt& aValue )
+ {
+ TLex lex( aString );
+ lex.SkipSpace();
+ return lex.Val( aValue.iValue, '.' );
+ }
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::Sqrt( float number )
+{
+ long i;
+ float x, y;
+ const float f = 1.5F;
+
+ x = number * 0.5F;
+ y = number;
+ i = * ( long * ) &y;
+ i = 0x5f3759df - ( i >> 1 );
+ y = * ( float * ) &i;
+ y = y * ( f - ( x * y * y ) );
+ y = y * ( f - ( x * y * y ) );
+ return number * y;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::SinFloatDouble(float angle)
+{
+ double sn = 0;
+ Math::Sin(sn, double(angle));
+ return float(sn);
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::CosFloatDouble(float angle)
+{
+ //double cs = 0;
+ float cs = 0;
+ //Math::Cos(cs, double(angle));
+ //cs = CosineDouble(double(angle));
+ cs = CosineDouble(angle);
+ return float(cs);
+}
+
+float TFloatFixPt::CosineDouble(float x)
+{
+float p0,p1,p2,p3,p4,p5,y,t,absx,frac,quad,pi2;
+p0= 0.999999999781;
+p1=-0.499999993585;
+p2= 0.041666636258;
+p3=-0.0013888361399;
+p4= 0.00002476016134;
+p5=-0.00000026051495;
+pi2=1.570796326794896; /* pi/2 */
+absx=x;
+if (x<0) absx=-absx; /* absolute value of input */
+quad=(int) (absx/pi2); /* quadrant (0 to 3) */
+frac= (absx/pi2) - quad; /* fractional part of input */
+if(quad==0) t=frac * pi2;
+if(quad==1) t=(1-frac) * pi2;
+if(quad==2) t=frac * pi2;
+if(quad==3) t=(frac-1) * pi2;
+t=t * t;
+y=p0 + (p1*t) + (p2*t*t) + (p3*t*t*t) + (p4*t*t*t*t) + (p5*t*t*t*t*t);
+if(quad==2 | quad==1) y=-y; /* correct sign */
+return(y);
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::TanFloatDouble(float angle)
+{
+ double tn = 0;
+ Math::Tan(tn, double(angle));
+ return float(tn);
+}
+
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::SinApprox(float angle)
+{
+ float c = 0.70710678118654752440f;
+ return ((2 - 4 * c) * angle * angle + c + angle);
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::CosApprox(float angle)
+{
+ float c = 0.70710678118654752440f;
+ return ((2 - 4 * c) * angle * angle + c - angle);
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastSin(const float val)
+{
+ float fASqr = val*val;
+ float fResult = -2.39e-08f;
+ fResult *= fASqr;
+ fResult += 2.7526e-06f;
+ fResult *= fASqr;
+ fResult -= 1.98409e-04f;
+ fResult *= fASqr;
+ fResult += 8.3333315e-03f;
+ fResult *= fASqr;
+ fResult -= 1.666666664e-01f;
+ fResult *= fASqr;
+ fResult += 1.0f;
+ fResult *= val;
+
+ return fResult;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastCos(const float val)
+{
+ float fASqr = val*val;
+ float fResult = -2.605e-07f;
+ fResult *= fASqr;
+ fResult += 2.47609e-05f;
+ fResult *= fASqr;
+ fResult -= 1.3888397e-03f;
+ fResult *= fASqr;
+ fResult += 4.16666418e-02f;
+ fResult *= fASqr;
+ fResult -= 4.999999963e-01f;
+ fResult *= fASqr;
+ fResult += 1.0f;
+
+ return fResult;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastTan(const float val)
+{
+ float fASqr = val*val;
+ float fResult = 9.5168091e-03f;
+ fResult *= fASqr;
+ fResult += 2.900525e-03f;
+ fResult *= fASqr;
+ fResult += 2.45650893e-02f;
+ fResult *= fASqr;
+ fResult += 5.33740603e-02f;
+ fResult *= fASqr;
+ fResult += 1.333923995e-01f;
+ fResult *= fASqr;
+ fResult += 3.333314036e-01f;
+ fResult *= fASqr;
+ fResult += 1.0f;
+ fResult *= val;
+
+ return fResult;
+
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastASin(float val)
+{
+ float fRoot = Sqrt(1.0f-val);
+ float fResult = -0.0187293f;
+ fResult *= val;
+ fResult += 0.0742610f;
+ fResult *= val;
+ fResult -= 0.2121144f;
+ fResult *= val;
+ fResult += 1.5707288f;
+ fResult = 1.57079632679489661923 - fRoot*fResult;
+
+ return fResult;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastACos(float val)
+{
+ float fRoot = Sqrt(1.0f-val);
+ float fResult = -0.0187293f;
+ fResult *= val;
+ fResult += 0.0742610f;
+ fResult *= val;
+ fResult -= 0.2121144f;
+ fResult *= val;
+ fResult += 1.5707288f;
+ fResult *= fRoot;
+
+ return fResult;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::FastATan(float val)
+{
+ float fVSqr = val*val;
+ float fResult = 0.0028662257f;
+ fResult *= fVSqr;
+ fResult -= 0.0161657367f;
+ fResult *= fVSqr;
+ fResult += 0.0429096138f;
+ fResult *= fVSqr;
+ fResult -= 0.0752896400f;
+ fResult *= fVSqr;
+ fResult += 0.1065626393f;
+ fResult *= fVSqr;
+ fResult -= 0.1420889944f;
+ fResult *= fVSqr;
+ fResult += 0.1999355085f;
+ fResult *= fVSqr;
+ fResult -= 0.3333314528f;
+ fResult *= fVSqr;
+ fResult += 1.0f;
+ fResult *= val;
+
+ return fResult;
+}
+
+// --------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+ float TFloatFixPt::Cos(float angle)
+/* computes cos of x (x in radians) by an expansion */
+{
+ float result = 1.0;
+ int factor = 1;
+ float power = angle;
+
+ for ( int i = 2; i <= 10; i++ )
+ {
+ factor = factor * i;
+ power = power * angle;
+
+ if ( (i & 1) == 0 )
+ {
+ if ( (i & 3) == 0 )
+ {
+ result += power/factor;
+ }
+ else
+ {
+ result -= power/factor;
+ }
+ }
+ }
+ return (result);
+}
+
+// --------------------------------------------------------------------------
+// TFloatFixPt TFloatFixPt::Sqrt( TFloatFixPt aA )
+// ---------------------------------------------------------------------------
+ TFloatFixPt TFloatFixPt::Sqrt( TFloatFixPt aA )
+ {
+ TFloatFixPt tmp;
+ tmp.iValue = Sqrt( aA.iValue );
+ return tmp;
+ }
+
+// --------------------------------------------------------------------------
+// TFloatFixPt TFloatFixPt::Abs( TFixPt& aA )
+// ---------------------------------------------------------------------------
+ TFloatFixPt TFloatFixPt::Abs( TFloatFixPt& aA )
+ {
+ return ( aA.iValue > 0.0f ) ? TFloatFixPt( aA.iValue ) : ( TFloatFixPt( -aA.iValue ) );
+ }
+
+// --------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+#else /*FIXED POINT BUILD*/
+// --------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+
+// --------------------------------------------------------------------------
+// void TFixPt::GetString( TDes& aBuf ) const
+// ---------------------------------------------------------------------------
+ void TFloatFixPt::GetString( TDes& aBuf ) const
+ {
+ TRealFormat rf( 10, 3 );
+ rf.iType = KRealFormatFixed | KDoNotUseTriads;
+ aBuf.Num( ( ( TReal32 ) iValue ) / KFixPtFracVal, rf );
+ }
+
+// --------------------------------------------------------------------------
+// TFloatFixPt TFloatFixPt::ConvertString( const TDesC& aVal )
+// ---------------------------------------------------------------------------
+ TFloatFixPt TFloatFixPt::ConvertString( const TDesC& aVal )
+ {
+ TLex aString( aVal );
+ TReal32 val;
+ aString.SkipSpace();
+ aString.Val( val, '.' );
+ return TFloatFixPt( val );
+ }
+
+// --------------------------------------------------------------------------
+// TInt TFloatFixPt::ConvertString( const TDesC& aValueString, TFloatFixPt& aValue )
+// ---------------------------------------------------------------------------
+ TInt TFloatFixPt::ConvertString( const TDesC& aValueString, TFloatFixPt& aValue )
+ {
+ TLex aString( aValueString );
+ TReal32 value;
+ aString.SkipSpace();
+ TInt errorCode = aString.Val( value, '.' );
+ aValue = (float)value;
+ return errorCode;
+ }
+// --------------------------------------------------------------------------
+// TFloatFixPt TFloatFixPt::Abs( TFixPt& aA )
+// ---------------------------------------------------------------------------
+ TFloatFixPt TFloatFixPt::Abs( TFloatFixPt& aA )
+ {
+ TFloatFixPt KZero;
+ return ( aA > KZero ) ? aA : ( KZero - aA );
+ }
+
+// ==========================================================================
+// fixed point SQRT from Graphics Gems
+// ==========================================================================
+// --------------------------------------------------------------------------
+// TFloatFixPt TFloatFixPt::Sqrt( TFloatFixPt aA )
+// ---------------------------------------------------------------------------
+ TFloatFixPt TFloatFixPt::Sqrt( TFloatFixPt aA )
+ {
+ TFloatFixPt tmp;
+ tmp.iValue = FixedSqrtGeneral( aA.iValue, KFixPtFrac );
+ return tmp;
+ }
+
+// ==========================================================================
+// Fixed point sqrt from Graphics Gems
+// ==========================================================================
+// --------------------------------------------------------------------------
+// TInt32 TFloatFixPt::FixedSqrtGeneral( TInt32 aX, TUint32 aFracbits )
+// ---------------------------------------------------------------------------
+ TInt32 TFloatFixPt::FixedSqrtGeneral( TInt32 aX, TUint32 aFracbits )
+ {
+ TUint32 root, remHi, remLo, testDiv, count;
+ root = 0;
+ remHi = 0;
+ remLo = aX;
+ count = 15 + ( aFracbits >> 1 );
+
+ do
+ {
+ remHi = ( remHi << 2 ) | ( remLo >> 30 );
+ remLo <<= 2;
+ root <<= 1;
+ testDiv = ( root << 1 ) + 1;
+ if ( remHi >= testDiv )
+ {
+ remHi -= testDiv;
+ root += 1;
+ }
+ }
+ while ( count-- != 0 );
+
+ return root;
+ }
+#endif