skins/AknSkins/alsrc/AknsAlTimingModelRealTime.cpp
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/alsrc/AknsAlTimingModelRealTime.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,331 @@
+/*
+* Copyright (c) 2004-2008 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:  Real-time timing model.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <AknsRlParameter.h>
+#include "AknsAlTimingModelRealTime.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::CAknsAlTimingModelRealTime
+// -----------------------------------------------------------------------------
+//
+CAknsAlTimingModelRealTime::CAknsAlTimingModelRealTime():
+    iDuration( 0 ),
+    iTotalDuration( 0 ),
+    iElapsedTime( 0 ),
+    iRelative( 0 ),
+    iWrap( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::NewL
+// -----------------------------------------------------------------------------
+//
+CAknsAlTimingModelRealTime* CAknsAlTimingModelRealTime::NewL()
+    {
+    CAknsAlTimingModelRealTime* self = new(ELeave) CAknsAlTimingModelRealTime();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::CAknsAlTimingModelRealTime
+// -----------------------------------------------------------------------------
+//
+CAknsAlTimingModelRealTime::~CAknsAlTimingModelRealTime()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::Duration
+// -----------------------------------------------------------------------------
+//
+TInt CAknsAlTimingModelRealTime::Duration() const
+    {
+    return iDuration;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::TotalDuration
+// -----------------------------------------------------------------------------
+//
+TInt CAknsAlTimingModelRealTime::TotalDuration() const
+    {
+    return iTotalDuration;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::Configure
+// -----------------------------------------------------------------------------
+//
+void CAknsAlTimingModelRealTime::Configure( TInt aD, TInt aRC, TInt aRD, TBool aWrap )
+    {
+    iElapsedTime = 0;
+    iWrap = aWrap;
+    iRelative = 0;
+
+    // Because we use fixed point arithmetic, duration and repeat duration
+    // absolute value must be clamped.
+    if( Defined( aRD ) && aRD > KAlMaxDurationVal )
+        {
+        aRD = KAlMaxDurationVal;
+        }
+
+    if( Defined( aD ) && aD > KAlMaxDurationVal )
+        {
+        aD = KAlMaxDurationVal;
+        }
+
+    // Determine duration and total duration
+    if( Defined( aD ) ) // Cases from #6 to #14
+        {
+        // Duration is the same in all cases
+        iDuration = aD;
+
+        if( Infinite( aRC ) )
+            {
+            if( Undefined( aRD ) ) // #6
+                {
+                iTotalDuration = -1;
+                }
+            else if( Defined( aRD ) ) // #7
+                {
+                iTotalDuration = aRD;
+                }
+            else // aRD must be infinite, #8
+                {
+                iTotalDuration = -1;
+                }
+            }
+        else if( Undefined( aRC ) )
+            {
+            if( Undefined( aRD ) ) // #9
+                {
+                iTotalDuration = aD;
+                }
+            else if( Defined( aRD ) ) // #10
+                {
+                iTotalDuration = aRD;
+                }
+            else // aRD must be infinite, #11
+                {
+                iTotalDuration = -1;
+                }
+            }
+        else // aRC must be defined
+            {
+            if( Undefined( aRD ) ) // #12
+                {
+                iTotalDuration = aD * aRC;
+                }
+            else if( Defined( aRD ) ) // #13
+                {
+                // total duration = MIN( D * RC, RD )
+                iTotalDuration = aD * aRC < aRD ? aD * aRC: aRD;
+                }
+            else // aRD must be infinite, #14
+                {
+                iTotalDuration = aD * aRC;
+                }
+            }
+        }
+    else if( Infinite( aD ) ) // Cases from #15 to #17
+        {
+        // Repeat count is ignored
+
+        if( Defined( aRD ) ) // #15
+            {
+            iDuration      = aRD;
+            iTotalDuration = aRD;
+            }
+        else // #16 and #17
+            {
+            // Undefined and infinite produce the same result
+            iDuration      = -1;
+            iTotalDuration = -1;
+            }
+        }
+    else // Duration is undefined, cases from #1 to #5
+        {
+        // Cases, #4 and #5
+        if( Undefined( aRD ) && !Infinite( aRC ) )
+            {
+            // These are basically impossible cases
+            iDuration      = 0;
+            iTotalDuration = 0;
+            }
+        // Case #1
+        else if( Defined( aRD ) )
+            {
+            iDuration      = aRD;
+            iTotalDuration = aRD;
+            }
+        else // Must be cases #2 and #3
+            {
+            iDuration      = -1;
+            iTotalDuration = -1;
+            }
+         }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::SetParametersL
+// -----------------------------------------------------------------------------
+//
+void CAknsAlTimingModelRealTime::SetParametersL(
+    MAknsRlParameterIterator& aParameters )
+    {
+    TInt duration = 0;
+    TInt repeatCount = 0;
+    TInt repeatDuration = 0;
+    TBool wrap = EFalse;
+
+    // Iterate over available parameters
+    while( aParameters.HasNext() )
+        {
+        const TAknsRlParameterData* param = aParameters.NextL();
+
+        if( param->iName->Compare( KAknsAlRealTimeDuration ) == 0 )
+            {
+            if( param->iType != EAknsRlParameterTypeNumber )
+                User::Leave( KErrArgument );
+
+            duration = param->iNumber;
+            }
+        else if( param->iName->Compare( KAknsAlRealTimeRepeatCount ) == 0 )
+            {
+            if( param->iType != EAknsRlParameterTypeNumber )
+                User::Leave( KErrArgument );
+
+            repeatCount = param->iNumber;
+            }
+        else if( param->iName->Compare( KAknsAlRealTimeRepeatDuration ) == 0 )
+            {
+            if( param->iType != EAknsRlParameterTypeNumber )
+                User::Leave( KErrArgument );
+
+            repeatDuration = param->iNumber;
+            }
+        else if( param->iName->Compare( KAknsAlRealTimeWrap ) == 0 )
+            {
+            if( param->iType != EAknsRlParameterTypeNumber )
+                User::Leave( KErrArgument );
+
+            wrap = ( param->iNumber != 0 ) ? ETrue: EFalse;
+            }
+        }
+
+    // Configure the model
+    Configure( duration, repeatCount, repeatDuration, wrap );
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::Tick
+// -----------------------------------------------------------------------------
+//
+void CAknsAlTimingModelRealTime::Tick( const TInt aDeltaTime )
+    {
+    iElapsedTime = iElapsedTime + aDeltaTime;
+
+    // Cases #4 and #5 are the only ones that will produce undefined durations
+    // in Configure. This kind of animation will never run properly
+    if( Undefined( iDuration ) || Undefined( iTotalDuration ) )
+        return;
+
+    // Starting from here the durations are either defined or infinite
+
+    // Check if the the total duration has been exceeded
+    if( IsFinished() )
+        return;
+
+    // Relative value is undefined if duration is either undefined or infinite
+    if( !Defined( iDuration ) ) // iDuration <= 0
+        {
+        iRelative = 0;
+        }
+    else // Duration is defined, relative value can be calculated
+        {
+        // Note: iDuration is always > 0 here
+
+        // Elapsed time and duration always >= 0 -> conversion ok
+        TUint32 durationPos = TUint32( iElapsedTime % iDuration ); //lint !e414 iDuration > 0
+        TBool ascending = ETrue;
+
+        // When wrapping, odd durations are descending, even ascending
+        if( iWrap && ( iElapsedTime / iDuration ) % 2 ) //lint !e414 iDuration > 0 Remainder != 0
+            ascending = EFalse;
+
+        // TODO Allow longer durations -> promote results to 64bit integer
+        // Calculate the relative value
+        if( ascending )
+            {
+            iRelative = ( durationPos << 16 ) / TUint32( iDuration ); //lint !e414 iDuration > 0
+            }
+        else // Current range must be descending
+            {
+            iRelative = ( ( iDuration - durationPos ) << 16 ) / TUint32( iDuration ); //lint !e414 iDuration > 0
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::Tick
+// -----------------------------------------------------------------------------
+//
+void CAknsAlTimingModelRealTime::Tick( const TTime& /*aStamp*/ )
+    {
+    // Not supported
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::RelativeValue
+// -----------------------------------------------------------------------------
+//
+TUint32 CAknsAlTimingModelRealTime::RelativeValue() const
+    {
+    return iRelative;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::IsFinished
+// -----------------------------------------------------------------------------
+//
+TBool CAknsAlTimingModelRealTime::IsFinished() const
+    {
+    if( Defined( iTotalDuration ) && iElapsedTime > iTotalDuration )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsAlTimingModelRealTime::Begin
+// -----------------------------------------------------------------------------
+//
+void CAknsAlTimingModelRealTime::Begin()
+    {
+    iElapsedTime = 0;
+    iRelative = 0;
+    }
+
+// End of file