svgtopt/gfx2d/inc/GfxFloatFixPt.inl
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 07 Jan 2010 16:19:02 +0200
changeset 0 d46562c3d99d
permissions -rw-r--r--
Revision: 200951 Kit: 201001

/*
* 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 header file
*
*/

extern "C" {
#include "Gfxmath.h"
}
#ifdef SVG_FLOAT_BUILD
// ==========================================================================
// Constructor, default to zero
// ==========================================================================
inline TFloatFixPt::TFloatFixPt() : iValue( 0 )
    {
    }

// ==========================================================================
// Constructor
// ==========================================================================

inline TFloatFixPt::TFloatFixPt( TInt aVal )
    {
    iValue = float(aVal);
    }

// ==========================================================================
// Constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( TInt32 aVal )
    {
    iValue = float(aVal);
    }

// ==========================================================================
// Constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( TReal32 aVal )
{
    iValue = aVal;
}

// ==========================================================================
// Copy constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( const TFloatFixPt& aFixpt )
    {
    iValue = aFixpt.iValue;
    }

// ==========================================================================
// Conversion to TInt32 operator
// ==========================================================================
inline TFloatFixPt::operator TInt32() const
    {
    return ((TInt32)iValue);
    }

// ==========================================================================
// Conversion to TInt operator
// ==========================================================================
inline TFloatFixPt::operator TInt() const
    {
    return ((TInt)iValue);
    }

// ==========================================================================
// Conversion to TReal32 operator
// ==========================================================================
inline TFloatFixPt::operator TReal32() const
{
return iValue;
}

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TInt32 aVal )

    {
    iValue = (float)aVal;
    return *this;
    }

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TInt aVal )
    {
    iValue = (float)aVal;
    return *this;
    }

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TReal32 aVal )
{
    iValue = aVal;
    return *this;
}

// ==========================================================================
// Addition Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator+=( const TFloatFixPt& aVal )
    {
    iValue += aVal.iValue;
    return*this;
    }

// ==========================================================================
// Subtraction Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator-=( const TFloatFixPt& aVal )
    {
    iValue -= aVal.iValue;
    return *this;
    }


// ==========================================================================
// Multipication Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator*=( const TFloatFixPt& aVal )
{	
		iValue *= aVal.iValue;
    return *this;
}



// ==========================================================================
// Division Assignment operator
// Note:  This may require more optimization...
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator/=( const TFloatFixPt& aVal )
{
		iValue /= aVal.iValue;
    return *this;
}

// ===================================================================
// Addition operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator+( const TFloatFixPt& aVal ) const
    {
    return TFloatFixPt( iValue + aVal.iValue );
    }

// ===================================================================
// Addition operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator+( const double& aVal ) const
    {
    return TFloatFixPt( iValue + (float)aVal );
    }
    
// ===================================================================
// Addition operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator+( const float& aVal ) const
    {
    return TFloatFixPt( iValue + aVal );
    }
        
// ==========================================================================
// Subtraction operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator-( const TFloatFixPt& aVal ) const
    {
    return TFloatFixPt( iValue - aVal.iValue );
    }

// ==========================================================================
// Subtraction operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator-( const double aVal ) const
    {
    float difference = iValue - aVal;
    return TFloatFixPt( difference );
    }

// ==========================================================================
// Subtraction operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator-( const float aVal ) const
    {
    return TFloatFixPt( iValue - aVal );
    }
        
// ==========================================================================
// Multiplication operator
// ==========================================================================

inline TFloatFixPt TFloatFixPt::operator*( const TFloatFixPt& aVal ) const
    {
    TFloatFixPt tmp( iValue );
    tmp *= aVal;
    return tmp;
    }

// ==========================================================================
// Multiplication operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator*( const double aVal ) const
    {
    float multans = iValue * aVal;
    return TFloatFixPt(multans);
    }

// ==========================================================================
// Multiplication operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator*( const float aVal ) const
    {
    return TFloatFixPt(iValue * aVal);
    }
        
// ==========================================================================
// Division operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator/( const TFloatFixPt& aVal ) const
    {
    TFloatFixPt tmp( iValue );
    tmp /= aVal;
    return tmp;
    }

// ==========================================================================
// Division operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator/( const double aVal ) const
    {
    float divans = iValue / aVal;
    return TFloatFixPt(divans);
    }

// ==========================================================================
// Division operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator/( const float aVal ) const
    {
    return TFloatFixPt(iValue / aVal);
    }
        
// ==========================================================================
// Equals operator
// ==========================================================================
inline TInt TFloatFixPt::operator==( const TFloatFixPt& aVal ) const
    {
    return ( iValue == aVal.iValue );
    }

// ==========================================================================
// Not Equals operator
// ==========================================================================
inline TInt TFloatFixPt::operator!=( const TFloatFixPt& aVal ) const
    {
    return ( iValue != aVal.iValue );
    }

// ==========================================================================
// Greater than or equal to operator
// ==========================================================================
inline TInt TFloatFixPt::operator>=( const TFloatFixPt& aVal ) const
    {
    return ( iValue >= aVal.iValue );
    }

// ==========================================================================
// Less than or equal to operator
// ==========================================================================
inline TInt TFloatFixPt::operator<=( const TFloatFixPt& aVal ) const
    {
    return ( iValue <= aVal.iValue );
    }

// ==========================================================================
// Greater than operator
// ==========================================================================
inline TInt TFloatFixPt::operator>( const TFloatFixPt& aVal ) const
    {
    return ( iValue > aVal.iValue );
    }

// ==========================================================================
// Less than operator
// ==========================================================================
inline TInt TFloatFixPt::operator<( const TFloatFixPt& aVal ) const
    {
    return ( iValue < aVal.iValue );
    }

// ==========================================================================
// Round to the nearest whole number
// ==========================================================================
inline TInt32 TFloatFixPt::Round()
    {
    TInt aInt = (TInt)iValue;
    return (TInt32)aInt;
    }

// ==========================================================================
// Get 32-bit representation
// ==========================================================================
inline TInt32 TFloatFixPt::RawData()
    {
    return ((TInt32)iValue);
    }


#else

#define FIXPT_USE_INTS

// ==========================================================================
// Constructor, default to zero
// ==========================================================================
inline TFloatFixPt::TFloatFixPt() : iValue( 0 )
    {
    }

// ==========================================================================
// Constructor
// ==========================================================================

inline TFloatFixPt::TFloatFixPt( TInt aVal )
    {
    iValue = ( aVal << KFixPtFrac );
    }

inline TFloatFixPt::TFloatFixPt( TInt aVal, TBool /*a*/ )
    {
    iValue = aVal;
    }

// ==========================================================================
// Constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( TInt32 aVal )
    {
    iValue = ( aVal << KFixPtFrac );
    }

// ==========================================================================
// Constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( TReal32 aVal )
{
    iValue = svgScalarFromFloat(aVal);//( TInt32 ) ( aVal * KFixPtFracVal );
}

// ==========================================================================
// Copy constructor
// ==========================================================================
inline TFloatFixPt::TFloatFixPt( const TFloatFixPt& aFixpt )
    {
    iValue = aFixpt.iValue;
    }

// ==========================================================================
// Return the fractional portion as an integer
// ==========================================================================
inline TInt32 TFloatFixPt::FracAsInt()
    {
    return iValue & 0xFFFF;
    }

// ==========================================================================
// Conversion to TInt32 operator
// ==========================================================================
inline TFloatFixPt::operator TInt32() const
    {
    return ( iValue >> KFixPtFrac );
    }

// ==========================================================================
// Conversion to TInt operator
// ==========================================================================
inline TFloatFixPt::operator TInt() const
    {
    return ( iValue >> KFixPtFrac );
    }

// ==========================================================================
// Conversion to TReal32 operator
// ==========================================================================
inline TFloatFixPt::operator TReal32() const
{
#ifdef FIXPT_USE_INTS
    return svgFixedToFloat(iValue);
#else
    return ( ( TReal32 ) iValue ) / KFixPtFracVal;
#endif
}

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TInt32 aVal )

    {
    iValue = ( aVal << KFixPtFrac );
    return *this;
    }

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TInt aVal )
    {
    iValue = ( aVal << KFixPtFrac );
    return *this;
    }

// ==========================================================================
// Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator=( TReal32 aVal )
{
    iValue = svgScalarFromFloat(aVal);//( TInt32 ) ( aVal * KFixPtFracVal );
    return *this;
}

// ==========================================================================
// Addition Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator+=( const TFloatFixPt& aVal )
    {
    iValue += aVal.iValue;
    return*this;
    }

// ==========================================================================
// Subtraction Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator-=( const TFloatFixPt& aVal )
    {
    iValue -= aVal.iValue;
    return *this;
    }


// ==========================================================================
// Multipication Assignment operator
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator*=( const TFloatFixPt& aVal )
{
#ifdef FIXPT_USE_INTS
    iValue = svgScalarMul(iValue, aVal.iValue);
    return *this;
#else
    TInt64 rslt( ( TInt ) iValue ), val( ( TInt ) aVal.iValue );
    rslt *= val;
    iValue = ( I64HIGH(rslt) << KFixPtFrac ) | ( I64LOW ( rslt)  >> KFixPtFrac );

    return *this;
#endif
}



// ==========================================================================
// Division Assignment operator
// Note:  This may require more optimization...
// ==========================================================================
inline TFloatFixPt& TFloatFixPt::operator/=( const TFloatFixPt& aVal )
{
#ifdef FIXPT_USE_INTS
    iValue = svgScalarDiv(iValue, aVal.iValue);
    return *this;
#else
    TInt64 z = MAKE_TINT64( iValue ,0 )  ;
	TInt64 temp = aVal.iValue ;
    z /= temp;
    z >>= KFixPtFrac;
    iValue = I64INT ( z );
    return *this;
#endif
}

// ===================================================================
// Addition operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator+( const TFloatFixPt& aVal ) const
    {
    return TFloatFixPt( iValue + aVal.iValue, ETrue );
    }
// ==========================================================================
// Subtraction operation
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator-( const TFloatFixPt& aVal ) const
    {
    return TFloatFixPt( iValue - aVal.iValue, ETrue );
    }
    
// ==========================================================================
// Multiplication operator
// ==========================================================================

inline TFloatFixPt TFloatFixPt::operator*( const TFloatFixPt& aVal ) const
    {
    TFloatFixPt tmp( iValue, ETrue );
    tmp *= aVal;
    return tmp;
    }
// ==========================================================================
// Division operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator/( const TFloatFixPt& aVal ) const
    {
    TFloatFixPt tmp( iValue, ETrue );
    tmp /= aVal;
    return tmp;
    }
// ==========================================================================
// Equals operator
// ==========================================================================
inline TInt TFloatFixPt::operator==( const TFloatFixPt& aVal ) const
    {
    return ( iValue == aVal.iValue );
    }

// ==========================================================================
// Not Equals operator
// ==========================================================================
inline TInt TFloatFixPt::operator!=( const TFloatFixPt& aVal ) const
    {
    return ( iValue != aVal.iValue );
    }

// ==========================================================================
// Greater than or equal to operator
// ==========================================================================
inline TInt TFloatFixPt::operator>=( const TFloatFixPt& aVal ) const
    {
    return ( iValue >= aVal.iValue );
    }

// ==========================================================================
// Less than or equal to operator
// ==========================================================================
inline TInt TFloatFixPt::operator<=( const TFloatFixPt& aVal ) const
    {
    return ( iValue <= aVal.iValue );
    }

// ==========================================================================
// Greater than operator
// ==========================================================================
inline TInt TFloatFixPt::operator>( const TFloatFixPt& aVal ) const
    {
    return ( iValue > aVal.iValue );
    }

// ==========================================================================
// Less than operator
// ==========================================================================
inline TInt TFloatFixPt::operator<( const TFloatFixPt& aVal ) const
    {
    return ( iValue < aVal.iValue );
    }
// ==========================================================================
// Left shift operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator<<( const TInt aN ) const
    {
    TFloatFixPt tmp( iValue<<aN, ETrue );
    return tmp;
    }
// ==========================================================================
// Right shift operator
// ==========================================================================
inline TFloatFixPt TFloatFixPt::operator>>( const TInt aN ) const
    {
    TFloatFixPt tmp( iValue>>aN, ETrue );
    return tmp;
    }

// ==========================================================================
// Round to the nearest whole number
// ==========================================================================
inline TInt32 TFloatFixPt::Round()
    {
    if ( 0 != ( iValue & 0x8000 ) )
        return ( iValue >> KFixPtFrac ) + 1;
    else
        return ( iValue >> KFixPtFrac );
    }

// ==========================================================================
// Get 32-bit representation
// ==========================================================================
inline TInt32 TFloatFixPt::RawData()
    {
    return iValue;
    }

#endif