svgtopt/SVG/SVGImpl/src/SVGAnimateElementImpl.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  SVG Implementation source file
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#if !defined(__E32BASE_H__)
hgs
parents:
diff changeset
    20
#include <e32base.h>
hgs
parents:
diff changeset
    21
#endif
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include "SVGAnimateElementImpl.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include "SVGElementImpl.h"
hgs
parents:
diff changeset
    26
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    27
#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
// Two phase construction
hgs
parents:
diff changeset
    34
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
CSvgAnimateElementImpl* CSvgAnimateElementImpl::NewL(  const TUint8 aElemID,
hgs
parents:
diff changeset
    36
                                                      CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    37
    {
hgs
parents:
diff changeset
    38
    CSvgAnimateElementImpl* self    = new ( ELeave )
hgs
parents:
diff changeset
    39
                                      CSvgAnimateElementImpl( aDoc );
hgs
parents:
diff changeset
    40
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    41
    self->ConstructL( aElemID );
hgs
parents:
diff changeset
    42
    CleanupStack::Pop();
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    return self;
hgs
parents:
diff changeset
    45
    }
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
CSvgAnimateElementImpl* CSvgAnimateElementImpl::NewLC(  const TUint8 aElemID,
hgs
parents:
diff changeset
    51
                                                       CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    CSvgAnimateElementImpl* self    = new ( ELeave )
hgs
parents:
diff changeset
    54
                                      CSvgAnimateElementImpl( aDoc );
hgs
parents:
diff changeset
    55
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    56
    self->ConstructL(  aElemID );
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    return self;
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
// *******************************************************
hgs
parents:
diff changeset
    62
// Protected
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
//
hgs
parents:
diff changeset
    66
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
void CSvgAnimateElementImpl::ConstructL(  const TUint8 aElemID )
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
    CSvgAnimationBase::ConstructL( aElemID );
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    iReqAttrFlag=KSVG_ANIMATE_ELEMFLAG;
hgs
parents:
diff changeset
    72
	iIsInheritedAttribute = EFalse;
hgs
parents:
diff changeset
    73
    }
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
//
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
CSvgAnimateElementImpl::~CSvgAnimateElementImpl()
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
// *******************************************************
hgs
parents:
diff changeset
    85
// Protected
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
//
hgs
parents:
diff changeset
    90
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
CSvgAnimateElementImpl::CSvgAnimateElementImpl( CSvgDocumentImpl* aDoc ) : CSvgAnimationBase( aDoc )
hgs
parents:
diff changeset
    92
    {
hgs
parents:
diff changeset
    93
    }
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
// *******************************************************
hgs
parents:
diff changeset
    96
// From SVG DOM
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
// *******************************************************
hgs
parents:
diff changeset
   100
// From MSvgEventReceiver
hgs
parents:
diff changeset
   101
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   102
//
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   104
void CSvgAnimateElementImpl::ResetReferenceElementL()
hgs
parents:
diff changeset
   105
    {
hgs
parents:
diff changeset
   106
    if(iTargetElement != NULL )
hgs
parents:
diff changeset
   107
        {
hgs
parents:
diff changeset
   108
        if( ((iTargetElement->iAnimateAttrSet == NULL) || (iTargetElement->iAnimateAttrSet->Find(iAttrId) == KErrNotFound) ) )
hgs
parents:
diff changeset
   109
            {
hgs
parents:
diff changeset
   110
            if  ( iInitDone && iAnimStatus != KAnimNotActive)
hgs
parents:
diff changeset
   111
                {
hgs
parents:
diff changeset
   112
				iCheckFirstAnim= ETrue;
hgs
parents:
diff changeset
   113
                SetToOriginalL();
hgs
parents:
diff changeset
   114
                if( !(iTargetElement->iAnimateAttrSet) )
hgs
parents:
diff changeset
   115
                    {
hgs
parents:
diff changeset
   116
                    iTargetElement->iAnimateAttrSet = new (ELeave) RArray<TUint32>(1);
hgs
parents:
diff changeset
   117
                    }
hgs
parents:
diff changeset
   118
                iTargetElement->iAnimateAttrSet->AppendL((TUint32)(iAttrId));
hgs
parents:
diff changeset
   119
                }
hgs
parents:
diff changeset
   120
            }
hgs
parents:
diff changeset
   121
        }
hgs
parents:
diff changeset
   122
    }
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   125
// From MSvgEventReceiver
hgs
parents:
diff changeset
   126
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
//
hgs
parents:
diff changeset
   128
TBool CSvgAnimateElementImpl::ReceiveEventL( MSvgEvent* aEvent )
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    return CSvgAnimationBase::ReceiveEventProcL( aEvent, this );
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
// From CSvgAnimationBase
hgs
parents:
diff changeset
   136
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   137
//
hgs
parents:
diff changeset
   138
TBool CSvgAnimateElementImpl::AnimProcL( MSvgTimerEvent* aEvent )
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    {
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
    if(iAnimStatus == KAnimActive && !iHadBegun)
hgs
parents:
diff changeset
   143
		{
hgs
parents:
diff changeset
   144
		SetFromValuesL();
hgs
parents:
diff changeset
   145
		iHadBegun = ETrue;
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
		}
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
	if((iAnimStatus != KAnimActive) || iDoFreeze)
hgs
parents:
diff changeset
   151
	   {
hgs
parents:
diff changeset
   152
	   if(iFill== KAnimFillFreeze && !iDoFreeze && iAnimStatus == KAnimFinished)
hgs
parents:
diff changeset
   153
	   		{
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
	   		}
hgs
parents:
diff changeset
   156
	   else
hgs
parents:
diff changeset
   157
		   {
hgs
parents:
diff changeset
   158
		   CSvgAnimationBase::CheckForEndTimesAndFreezeL(this);
hgs
parents:
diff changeset
   159
		   return EFalse;
hgs
parents:
diff changeset
   160
		   }
hgs
parents:
diff changeset
   161
	   }
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
    // Calc alpha from time [0-255]
hgs
parents:
diff changeset
   164
    TInt32  alpha;
hgs
parents:
diff changeset
   165
    TInt32  valix, subanimtime;
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    switch ( iDataType )
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        // x, y, width, height,
hgs
parents:
diff changeset
   170
        // rx, ry, cx, cy, radius
hgs
parents:
diff changeset
   171
        // x1, y1, x2, y2
hgs
parents:
diff changeset
   172
        case KSvgTypeOpacity:
hgs
parents:
diff changeset
   173
        case KSvgTypeLength:
hgs
parents:
diff changeset
   174
            {
hgs
parents:
diff changeset
   175
			iAnimTime->GetAnimTime( (aEvent->Time()-iNegativeBeginTime) , alpha, valix, subanimtime );
hgs
parents:
diff changeset
   176
            TFloatFixPt  v1  = iFromFloat;
hgs
parents:
diff changeset
   177
            TFloatFixPt  v2  = iToFloat;
hgs
parents:
diff changeset
   178
            TFloatFixPt  lCurValue;
hgs
parents:
diff changeset
   179
            if(iHaveBy &&  iCurrentRepeatCount > 0 && iAccumulate == KAccumSum )
hgs
parents:
diff changeset
   180
                {
hgs
parents:
diff changeset
   181
                v1= KFloatFixZero;
hgs
parents:
diff changeset
   182
                v2 = iToFloat - iFromFloat;
hgs
parents:
diff changeset
   183
                }
hgs
parents:
diff changeset
   184
            if ( iValuesFloat->Count() > 0 )
hgs
parents:
diff changeset
   185
                {
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
                // check for the range of valix
hgs
parents:
diff changeset
   188
				if(valix >= iValuesFloat->Count() )
hgs
parents:
diff changeset
   189
					{
hgs
parents:
diff changeset
   190
					valix = iValuesFloat->Count() - 1;
hgs
parents:
diff changeset
   191
					}
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
                v1 = ( *iValuesFloat )[valix];
hgs
parents:
diff changeset
   194
                if ( valix + 1 >= iValuesFloat->Count() )
hgs
parents:
diff changeset
   195
                    {
hgs
parents:
diff changeset
   196
                    v2 = ( *iValuesFloat )[valix];
hgs
parents:
diff changeset
   197
                    }
hgs
parents:
diff changeset
   198
                else
hgs
parents:
diff changeset
   199
                    {
hgs
parents:
diff changeset
   200
                    v2 = ( *iValuesFloat )[valix + 1];
hgs
parents:
diff changeset
   201
                    }
hgs
parents:
diff changeset
   202
                alpha = subanimtime;
hgs
parents:
diff changeset
   203
                }
hgs
parents:
diff changeset
   204
            lCurValue = BlendFloat( alpha, v1, v2 );
hgs
parents:
diff changeset
   205
            if( iAccumulate == KAccumSum && !iNoFrom )
hgs
parents:
diff changeset
   206
                {
hgs
parents:
diff changeset
   207
                TFloatFixPt lRepeatCount((TInt) iCurrentRepeatCount) ;
hgs
parents:
diff changeset
   208
                if(iValuesFloat->Count() > 0)
hgs
parents:
diff changeset
   209
                    {
hgs
parents:
diff changeset
   210
                    lCurValue += ((*iValuesFloat) [iValuesFloat->Count() -1]) * lRepeatCount ;
hgs
parents:
diff changeset
   211
                    }
hgs
parents:
diff changeset
   212
                else
hgs
parents:
diff changeset
   213
                    {
hgs
parents:
diff changeset
   214
                    TFloatFixPt lRepeatCount((TInt) iCurrentRepeatCount) ;
hgs
parents:
diff changeset
   215
                    lCurValue += lRepeatCount * (v2);
hgs
parents:
diff changeset
   216
                    if(iHaveBy &&  iCurrentRepeatCount > 0)
hgs
parents:
diff changeset
   217
                        {
hgs
parents:
diff changeset
   218
                        lCurValue += iFromFloat;
hgs
parents:
diff changeset
   219
                        }
hgs
parents:
diff changeset
   220
                    }
hgs
parents:
diff changeset
   221
                }
hgs
parents:
diff changeset
   222
            if ( ( iFill == KAnimFillFreeze ) )
hgs
parents:
diff changeset
   223
                {
hgs
parents:
diff changeset
   224
                iEndFloat = lCurValue;
hgs
parents:
diff changeset
   225
                }
hgs
parents:
diff changeset
   226
            if ( ( iAdditive == KAdditiveSum ) && !iNoFrom ) //.
hgs
parents:
diff changeset
   227
                {
hgs
parents:
diff changeset
   228
                TFloatFixPt  lOrig;
hgs
parents:
diff changeset
   229
                iTargetElement->GetAttributeFloat( iAttrId, lOrig );
hgs
parents:
diff changeset
   230
                lCurValue += lOrig;
hgs
parents:
diff changeset
   231
                }
hgs
parents:
diff changeset
   232
            iTargetElement->SetAttributeFloatL( iAttrId, lCurValue );
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
            }
hgs
parents:
diff changeset
   235
            break;
hgs
parents:
diff changeset
   236
        case KSvgTypeList:
hgs
parents:
diff changeset
   237
        case KSvgTypePath:
hgs
parents:
diff changeset
   238
            {
hgs
parents:
diff changeset
   239
			iAnimTime->GetAnimTime( (aEvent->Time()-iNegativeBeginTime), alpha, valix, subanimtime );
hgs
parents:
diff changeset
   240
            CGfxGeneralPath*v1  = iFromPath;
hgs
parents:
diff changeset
   241
            CGfxGeneralPath*v2  = iToPath;
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
            if ( iValuesPath->Count() > 0 )
hgs
parents:
diff changeset
   244
                {
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
				// check for the range of valix
hgs
parents:
diff changeset
   247
				if(valix >= iValuesPath->Count() )
hgs
parents:
diff changeset
   248
					{
hgs
parents:
diff changeset
   249
					valix = iValuesPath->Count() - 1;
hgs
parents:
diff changeset
   250
					}
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
                v1 = iValuesPath->operator[]( valix );
hgs
parents:
diff changeset
   253
                if ( valix + 1 >= iValuesPath->Count() )
hgs
parents:
diff changeset
   254
                    {
hgs
parents:
diff changeset
   255
                    v2 = iValuesPath->operator[]( valix );
hgs
parents:
diff changeset
   256
                    }
hgs
parents:
diff changeset
   257
                else
hgs
parents:
diff changeset
   258
                    {
hgs
parents:
diff changeset
   259
                    v2 = iValuesPath->operator[]( valix + 1 );
hgs
parents:
diff changeset
   260
                    }
hgs
parents:
diff changeset
   261
                alpha = subanimtime;
hgs
parents:
diff changeset
   262
                }
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
            CGfxGeneralPath*lCurPath    = CGfxGeneralPath::NewLC();
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
            BlendPathL( alpha, v1, v2, lCurPath );
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
            if ( iAdditive == KAdditiveSum )
hgs
parents:
diff changeset
   269
                {
hgs
parents:
diff changeset
   270
                AddPathsL( lCurPath, iOrgPath );
hgs
parents:
diff changeset
   271
                }
hgs
parents:
diff changeset
   272
            else
hgs
parents:
diff changeset
   273
                {
hgs
parents:
diff changeset
   274
                // User current blended value
hgs
parents:
diff changeset
   275
                }
hgs
parents:
diff changeset
   276
            if ( ( iFill == KAnimFillFreeze ) )
hgs
parents:
diff changeset
   277
                {
hgs
parents:
diff changeset
   278
                CopyPathsL( iEndPath, lCurPath );
hgs
parents:
diff changeset
   279
                }
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
            iTargetElement->SetAttributePathL( iAttrId, lCurPath );
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
            CleanupStack::PopAndDestroy( 1 ); // lCurPath
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
            }
hgs
parents:
diff changeset
   286
            break;
hgs
parents:
diff changeset
   287
        case KSvgTypeTransform:
hgs
parents:
diff changeset
   288
        break;
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
        case KSvgTypeColor:
hgs
parents:
diff changeset
   291
            {
hgs
parents:
diff changeset
   292
			iAnimTime->GetAnimTime((aEvent->Time()-iNegativeBeginTime), alpha, valix, subanimtime );
hgs
parents:
diff changeset
   293
            TInt32  v1  = iFromInt;
hgs
parents:
diff changeset
   294
            TInt32  v2  = iToInt;
hgs
parents:
diff changeset
   295
            TInt32  lCurValue;
hgs
parents:
diff changeset
   296
            if(iHaveBy &&  iCurrentRepeatCount > 0 && iAccumulate == KAccumSum )
hgs
parents:
diff changeset
   297
                {
hgs
parents:
diff changeset
   298
                v1= 0;
hgs
parents:
diff changeset
   299
                v2 = SubtractColor(iToInt,iFromInt);
hgs
parents:
diff changeset
   300
                }
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
            if ( iValuesInt->Count() > 0 )
hgs
parents:
diff changeset
   303
                {
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
                // check for the range of valix
hgs
parents:
diff changeset
   306
				if(valix >= iValuesInt->Count() )
hgs
parents:
diff changeset
   307
					{
hgs
parents:
diff changeset
   308
					valix = iValuesInt->Count() - 1;
hgs
parents:
diff changeset
   309
					}
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
                v1 = ( *iValuesInt )[valix];
hgs
parents:
diff changeset
   312
                if ( valix + 1 >= iValuesInt->Count() )
hgs
parents:
diff changeset
   313
                    {
hgs
parents:
diff changeset
   314
                    v2 = ( *iValuesInt )[valix];
hgs
parents:
diff changeset
   315
                    }
hgs
parents:
diff changeset
   316
                else
hgs
parents:
diff changeset
   317
                    {
hgs
parents:
diff changeset
   318
                    v2 = ( *iValuesInt )[valix + 1];
hgs
parents:
diff changeset
   319
                    }
hgs
parents:
diff changeset
   320
                alpha = subanimtime;
hgs
parents:
diff changeset
   321
                }
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
                if ( iNoFrom ) //. This is to emulate Adobe.
hgs
parents:
diff changeset
   324
                    {
hgs
parents:
diff changeset
   325
                    if ( alpha > ( KTimeMax >> 1 ) )
hgs
parents:
diff changeset
   326
                        {
hgs
parents:
diff changeset
   327
                        alpha = KTimeMax;
hgs
parents:
diff changeset
   328
                        }
hgs
parents:
diff changeset
   329
                    else
hgs
parents:
diff changeset
   330
                        {
hgs
parents:
diff changeset
   331
                        alpha = 0;
hgs
parents:
diff changeset
   332
                        }
hgs
parents:
diff changeset
   333
                    }
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
            lCurValue = BlendColor( alpha, v1, v2 );
hgs
parents:
diff changeset
   336
            if( iAccumulate == KAccumSum && !iNoFrom )
hgs
parents:
diff changeset
   337
                {
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
                    if(iValuesInt->Count() > 0)
hgs
parents:
diff changeset
   341
                        {
hgs
parents:
diff changeset
   342
                            TInt32  ColorToAdd = 0;
hgs
parents:
diff changeset
   343
                            ColorToAdd = ((*iValuesInt) [iValuesInt->Count() -1]);
hgs
parents:
diff changeset
   344
                            for( TInt i=0 ; i< iCurrentRepeatCount ; i++)
hgs
parents:
diff changeset
   345
                                {
hgs
parents:
diff changeset
   346
                                lCurValue = AddColor( lCurValue,  ColorToAdd );
hgs
parents:
diff changeset
   347
                                }
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
                        }
hgs
parents:
diff changeset
   350
                    else
hgs
parents:
diff changeset
   351
                        {
hgs
parents:
diff changeset
   352
                            for (TInt i=0; i<iCurrentRepeatCount;i++)
hgs
parents:
diff changeset
   353
                                {
hgs
parents:
diff changeset
   354
                                lCurValue = AddColor( lCurValue, v2 )   ;
hgs
parents:
diff changeset
   355
                                }
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
                            if(iHaveBy &&  iCurrentRepeatCount > 0)
hgs
parents:
diff changeset
   358
                                {
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
                                lCurValue = AddColor( lCurValue,  iFromInt );
hgs
parents:
diff changeset
   361
                                }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
                        }
hgs
parents:
diff changeset
   364
                }
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
            		// Fix for accum_addit_7.svg
hgs
parents:
diff changeset
   367
            if ( ( iFill == KAnimFillFreeze ) )
hgs
parents:
diff changeset
   368
                {
hgs
parents:
diff changeset
   369
                iEndInt = lCurValue;
hgs
parents:
diff changeset
   370
                iEndInt = lCurValue;
hgs
parents:
diff changeset
   371
                }
hgs
parents:
diff changeset
   372
            if ( ( iAdditive == KAdditiveSum ) && !iNoFrom ) //.
hgs
parents:
diff changeset
   373
                {
hgs
parents:
diff changeset
   374
                TInt32  lOrig;
hgs
parents:
diff changeset
   375
                iTargetElement->GetAttributeIntL( iAttrId, lOrig );
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
                lCurValue = AddColor( lCurValue, lOrig );
hgs
parents:
diff changeset
   380
                }
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
            iTargetElement->SetAttributeIntL( iAttrId, lCurValue );
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
            }
hgs
parents:
diff changeset
   385
            break;
hgs
parents:
diff changeset
   386
        case KSvgTypeTextAnchor:
hgs
parents:
diff changeset
   387
        case KSvgTypeVisibility:
hgs
parents:
diff changeset
   388
        case KSvgTypeGradientUnits:
hgs
parents:
diff changeset
   389
        case KSvgTypeSpreadMethod:
hgs
parents:
diff changeset
   390
        case KSvgTypeDisplay:
hgs
parents:
diff changeset
   391
            {
hgs
parents:
diff changeset
   392
			iAnimTime->GetAnimTimeForEnumeration( (aEvent->Time()-iNegativeBeginTime), alpha, valix, iKeyTimesPresent);
hgs
parents:
diff changeset
   393
            TInt32  v1  = iFromInt;
hgs
parents:
diff changeset
   394
            TInt32  v2  = iToInt;
hgs
parents:
diff changeset
   395
            TInt32  lCurValue;
hgs
parents:
diff changeset
   396
            if ( iValuesInt->Count() > 0 )
hgs
parents:
diff changeset
   397
                {
hgs
parents:
diff changeset
   398
hgs
parents:
diff changeset
   399
				  // check for the range of valix
hgs
parents:
diff changeset
   400
				if(valix >= iValuesInt->Count() )
hgs
parents:
diff changeset
   401
					{
hgs
parents:
diff changeset
   402
					valix = iValuesInt->Count() - 1;
hgs
parents:
diff changeset
   403
					}
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
                if(iKeyTimesPresent)
hgs
parents:
diff changeset
   406
					{
hgs
parents:
diff changeset
   407
					if ( valix < iValuesInt->Count() )
hgs
parents:
diff changeset
   408
						{
hgs
parents:
diff changeset
   409
           				lCurValue = (*iValuesInt)[valix];
hgs
parents:
diff changeset
   410
						}
hgs
parents:
diff changeset
   411
					else
hgs
parents:
diff changeset
   412
						{
hgs
parents:
diff changeset
   413
						lCurValue = (*iValuesInt)[valix-1];
hgs
parents:
diff changeset
   414
						}
hgs
parents:
diff changeset
   415
					}
hgs
parents:
diff changeset
   416
				else
hgs
parents:
diff changeset
   417
					{
hgs
parents:
diff changeset
   418
                TInt index = ( alpha * iValuesInt->Count() / 255 ) ;
hgs
parents:
diff changeset
   419
					if(index == iValuesInt->Count()) index--;
hgs
parents:
diff changeset
   420
                if ( index >= 0 )
hgs
parents:
diff changeset
   421
                    {
hgs
parents:
diff changeset
   422
                    lCurValue = (*iValuesInt)[index];
hgs
parents:
diff changeset
   423
                    }
hgs
parents:
diff changeset
   424
                else
hgs
parents:
diff changeset
   425
                    {
hgs
parents:
diff changeset
   426
                    lCurValue = (*iValuesInt)[0];
hgs
parents:
diff changeset
   427
                    }
hgs
parents:
diff changeset
   428
                }
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
                }
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
            else
hgs
parents:
diff changeset
   433
                {
hgs
parents:
diff changeset
   434
                if(alpha>=128) // average of 256 to determine which value should predominate
hgs
parents:
diff changeset
   435
                    {
hgs
parents:
diff changeset
   436
                    lCurValue = v2;
hgs
parents:
diff changeset
   437
                    }
hgs
parents:
diff changeset
   438
                else
hgs
parents:
diff changeset
   439
                    {
hgs
parents:
diff changeset
   440
                    lCurValue = v1;
hgs
parents:
diff changeset
   441
                    }
hgs
parents:
diff changeset
   442
                }
hgs
parents:
diff changeset
   443
            if ( ( iFill == KAnimFillFreeze ) )
hgs
parents:
diff changeset
   444
                {
hgs
parents:
diff changeset
   445
                iEndInt = lCurValue;
hgs
parents:
diff changeset
   446
                }
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
            iTargetElement->SetAttributeIntL( iAttrId, lCurValue );
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
            }
hgs
parents:
diff changeset
   451
	       break;
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
		case KSvgTypeViewBox:
hgs
parents:
diff changeset
   454
			 {
hgs
parents:
diff changeset
   455
             DoViewBoxAnimProcL(aEvent);
hgs
parents:
diff changeset
   456
             break;
hgs
parents:
diff changeset
   457
			 }
hgs
parents:
diff changeset
   458
        }
hgs
parents:
diff changeset
   459
    CSvgAnimationBase::CheckForEndTimesAndFreezeL(this);
hgs
parents:
diff changeset
   460
    return ETrue;
hgs
parents:
diff changeset
   461
    }
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
hgs
parents:
diff changeset
   464
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   465
//
hgs
parents:
diff changeset
   466
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   467
void CSvgAnimateElementImpl::BlendPathL( TInt32 aAlpha,
hgs
parents:
diff changeset
   468
                                         CGfxGeneralPath* aFromPath,
hgs
parents:
diff changeset
   469
                                         CGfxGeneralPath* aToPath,
hgs
parents:
diff changeset
   470
                                         CGfxGeneralPath*& aBlendPath )
hgs
parents:
diff changeset
   471
    {
hgs
parents:
diff changeset
   472
    if ( aFromPath && aToPath )
hgs
parents:
diff changeset
   473
        {
hgs
parents:
diff changeset
   474
        aBlendPath->SetPointTypeArrayL( aFromPath->PointTypeArray() );
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
        RArray<TFloatFixPt>* lCurPoints  = new ( ELeave ) RArray<TFloatFixPt>( 20 );
hgs
parents:
diff changeset
   477
        CleanupStack::PushL( lCurPoints );
hgs
parents:
diff changeset
   478
        lCurPoints->AppendL(NULL);
hgs
parents:
diff changeset
   479
        lCurPoints->Remove(0);
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
	    RArray<TFloatFixPt>* fromPoints  = aFromPath->PointCoordsArrayAll();
hgs
parents:
diff changeset
   482
	    RArray<TFloatFixPt>* toPoints    = aToPath->PointCoordsArrayAll();
hgs
parents:
diff changeset
   483
hgs
parents:
diff changeset
   484
	    TInt            lFromcount       = fromPoints->Count();
hgs
parents:
diff changeset
   485
		TInt            lTocount       = toPoints->Count();
hgs
parents:
diff changeset
   486
	    TInt            i           = 0;
hgs
parents:
diff changeset
   487
	    TFloatFixPt          lCurPoint;
hgs
parents:
diff changeset
   488
hgs
parents:
diff changeset
   489
	    while (i < lFromcount && i < lTocount )
hgs
parents:
diff changeset
   490
	        {
hgs
parents:
diff changeset
   491
	        lCurPoint = BlendFloat( aAlpha,
hgs
parents:
diff changeset
   492
	                                fromPoints->operator[]( i ),
hgs
parents:
diff changeset
   493
                                    toPoints->operator[]( i ) );
hgs
parents:
diff changeset
   494
            lCurPoints->AppendL( lCurPoint );
hgs
parents:
diff changeset
   495
            i++;
hgs
parents:
diff changeset
   496
            }
hgs
parents:
diff changeset
   497
hgs
parents:
diff changeset
   498
        aBlendPath->SetPointCoordsArrayL( lCurPoints );
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
	    lCurPoints->Close();
hgs
parents:
diff changeset
   501
	    CleanupStack::PopAndDestroy( 1 ); // lCurPoints
hgs
parents:
diff changeset
   502
	    }
hgs
parents:
diff changeset
   503
    }
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
hgs
parents:
diff changeset
   506
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   507
//
hgs
parents:
diff changeset
   508
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   509
void CSvgAnimateElementImpl::AddPathsL( CGfxGeneralPath*& aPathResult,
hgs
parents:
diff changeset
   510
                                        CGfxGeneralPath* aPath1 )
hgs
parents:
diff changeset
   511
    {
hgs
parents:
diff changeset
   512
    RArray<TFloatFixPt>* lCurPoints  = new ( ELeave ) RArray<TFloatFixPt>( 20 );
hgs
parents:
diff changeset
   513
    CleanupStack::PushL( lCurPoints );
hgs
parents:
diff changeset
   514
    lCurPoints->AppendL(NULL);
hgs
parents:
diff changeset
   515
    lCurPoints->Remove(0);
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
    RArray<TFloatFixPt>* points1 = aPath1->PointCoordsArrayAll();
hgs
parents:
diff changeset
   518
    RArray<TFloatFixPt>* result  = aPathResult->PointCoordsArrayAll();
hgs
parents:
diff changeset
   519
    TInt            pcount   = points1->Count();
hgs
parents:
diff changeset
   520
    TInt            rcount   = result->Count();
hgs
parents:
diff changeset
   521
    TInt            i       = 0;
hgs
parents:
diff changeset
   522
    TFloatFixPt          lCurPoint;
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
    while ( i < pcount && i < rcount )
hgs
parents:
diff changeset
   525
        {
hgs
parents:
diff changeset
   526
        lCurPoint = points1->operator[]( i ) + result->operator[]( i );
hgs
parents:
diff changeset
   527
        lCurPoints->AppendL( lCurPoint );
hgs
parents:
diff changeset
   528
        i++;
hgs
parents:
diff changeset
   529
        }
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
    aPathResult->SetPointCoordsArrayL( lCurPoints );
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
    lCurPoints->Close();
hgs
parents:
diff changeset
   534
    CleanupStack::PopAndDestroy( 1 ); // lCurPoints
hgs
parents:
diff changeset
   535
    }
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   538
//
hgs
parents:
diff changeset
   539
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   540
void CSvgAnimateElementImpl::CopyPathsL( CGfxGeneralPath*& aPathResult,
hgs
parents:
diff changeset
   541
                                         CGfxGeneralPath* aPath1 )
hgs
parents:
diff changeset
   542
    {
hgs
parents:
diff changeset
   543
    RArray<TFloatFixPt>* lCurPoints  = new ( ELeave ) RArray<TFloatFixPt>( 20 );
hgs
parents:
diff changeset
   544
    CleanupStack::PushL( lCurPoints );
hgs
parents:
diff changeset
   545
hgs
parents:
diff changeset
   546
    lCurPoints->AppendL(NULL);
hgs
parents:
diff changeset
   547
    lCurPoints->Remove(0);
hgs
parents:
diff changeset
   548
    RArray<TFloatFixPt>* points1 = aPath1->PointCoordsArrayAll();
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
    TInt            count   = points1->Count();
hgs
parents:
diff changeset
   551
    TInt            i       = 0;
hgs
parents:
diff changeset
   552
    TFloatFixPt          lCurPoint;
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
    while ( i < count )
hgs
parents:
diff changeset
   555
        {
hgs
parents:
diff changeset
   556
        lCurPoint = points1->operator[]( i );
hgs
parents:
diff changeset
   557
        lCurPoints->AppendL( lCurPoint );
hgs
parents:
diff changeset
   558
        i++;
hgs
parents:
diff changeset
   559
        }
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
    aPathResult->SetPointCoordsArrayL( lCurPoints );
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
    lCurPoints->Close();
hgs
parents:
diff changeset
   564
    CleanupStack::PopAndDestroy( 1 ); // lCurPoints
hgs
parents:
diff changeset
   565
    }
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   568
//
hgs
parents:
diff changeset
   569
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   570
void CSvgAnimateElementImpl::ResetAnimationL()
hgs
parents:
diff changeset
   571
    {
hgs
parents:
diff changeset
   572
    }
hgs
parents:
diff changeset
   573
hgs
parents:
diff changeset
   574
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   575
//
hgs
parents:
diff changeset
   576
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   577
TInt CSvgAnimateElementImpl::SetAttributeIntL( const TInt aNameId, const TInt32 aValue)
hgs
parents:
diff changeset
   578
{
hgs
parents:
diff changeset
   579
	return CSvgAnimationBase::SetAttributeIntL(aNameId,aValue);
hgs
parents:
diff changeset
   580
}
hgs
parents:
diff changeset
   581
hgs
parents:
diff changeset
   582
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   583
//
hgs
parents:
diff changeset
   584
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   585
TInt CSvgAnimateElementImpl::GetAttributeIntL( const TInt aNameId, TInt32& aValue )
hgs
parents:
diff changeset
   586
{
hgs
parents:
diff changeset
   587
	return CSvgAnimationBase::GetAttributeIntL(aNameId,aValue);
hgs
parents:
diff changeset
   588
}
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   591
//
hgs
parents:
diff changeset
   592
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   593
TInt CSvgAnimateElementImpl::SetAttributeFloatL(const TInt aNameId, TFloatFixPt aValue )
hgs
parents:
diff changeset
   594
{
hgs
parents:
diff changeset
   595
	return CSvgAnimationBase::SetAttributeFloatL(aNameId,aValue);
hgs
parents:
diff changeset
   596
}
hgs
parents:
diff changeset
   597
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   598
//
hgs
parents:
diff changeset
   599
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   600
TInt CSvgAnimateElementImpl::GetAttributeFloat(const TInt aNameId, TFloatFixPt& aValue )
hgs
parents:
diff changeset
   601
{
hgs
parents:
diff changeset
   602
	return CSvgAnimationBase::GetAttributeFloat(aNameId,aValue);
hgs
parents:
diff changeset
   603
}
hgs
parents:
diff changeset
   604
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   605
//
hgs
parents:
diff changeset
   606
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
void CSvgAnimateElementImpl::ReInitializeAnimation()
hgs
parents:
diff changeset
   609
    {
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
	if ( iAttrId == 0xffff )
hgs
parents:
diff changeset
   612
        return;
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
	CSvgAnimationBase::ReInitializeAnimation();
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
	if(iCheckFirstAnim)
hgs
parents:
diff changeset
   617
		{
hgs
parents:
diff changeset
   618
		if(iIsInheritedAttribute)
hgs
parents:
diff changeset
   619
			{
hgs
parents:
diff changeset
   620
			iTargetElement->PointToParent(iAttrId);
hgs
parents:
diff changeset
   621
			}
hgs
parents:
diff changeset
   622
		else
hgs
parents:
diff changeset
   623
			{
hgs
parents:
diff changeset
   624
			TRAPD(error, SetToOriginalL());
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
				if (error != KErrNone)
hgs
parents:
diff changeset
   627
				{
hgs
parents:
diff changeset
   628
					// error processing not processed
hgs
parents:
diff changeset
   629
					return;
hgs
parents:
diff changeset
   630
				}
hgs
parents:
diff changeset
   631
			}
hgs
parents:
diff changeset
   632
		}
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
    }
hgs
parents:
diff changeset
   636
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   637
//
hgs
parents:
diff changeset
   638
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   639
void  CSvgAnimateElementImpl::SetOriginalValues_DOMReuse()
hgs
parents:
diff changeset
   640
	{
hgs
parents:
diff changeset
   641
	 // calling base class function.
hgs
parents:
diff changeset
   642
	CSvgAnimationBase::SetOriginalValues_DOMReuse();
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
	}
hgs
parents:
diff changeset
   645
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   646
//
hgs
parents:
diff changeset
   647
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   648
CGfxGeneralPath* CSvgAnimateElementImpl::GetPathAttribute(TInt aAttributeId)
hgs
parents:
diff changeset
   649
	{
hgs
parents:
diff changeset
   650
	return 	CSvgAnimationBase::GetPathAttribute(aAttributeId);
hgs
parents:
diff changeset
   651
hgs
parents:
diff changeset
   652
	}
hgs
parents:
diff changeset
   653
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   654
//
hgs
parents:
diff changeset
   655
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   656
void CSvgAnimateElementImpl::SetPathAttribute(TInt aAttributeId, CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
   657
	{
hgs
parents:
diff changeset
   658
hgs
parents:
diff changeset
   659
		CSvgAnimationBase::SetPathAttribute(aAttributeId, aPathHandle);
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
	}
hgs
parents:
diff changeset
   662
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   663
//
hgs
parents:
diff changeset
   664
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   665
void CSvgAnimateElementImpl::Reset(MSvgEvent* aEvent)
hgs
parents:
diff changeset
   666
	{
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
	iIsUserSeek = ETrue;
hgs
parents:
diff changeset
   669
hgs
parents:
diff changeset
   670
	// first call the animation base function.
hgs
parents:
diff changeset
   671
	TSvgTimerEvent* timerEvent  = ( TSvgTimerEvent* ) aEvent;
hgs
parents:
diff changeset
   672
hgs
parents:
diff changeset
   673
hgs
parents:
diff changeset
   674
	if((TInt32)timerEvent->Time() < iAbsoluteBeginTime)
hgs
parents:
diff changeset
   675
		{
hgs
parents:
diff changeset
   676
		// let it come to initial position.
hgs
parents:
diff changeset
   677
		((CSvgDocumentImpl*)iOwnerDocument)->iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
   678
		ReInitializeAnimation();
hgs
parents:
diff changeset
   679
		return;
hgs
parents:
diff changeset
   680
		}
hgs
parents:
diff changeset
   681
	TRAPD(error,CSvgAnimationBase::ResetL( aEvent, this));
hgs
parents:
diff changeset
   682
hgs
parents:
diff changeset
   683
		if (error != KErrNone)
hgs
parents:
diff changeset
   684
		{
hgs
parents:
diff changeset
   685
			// error processing not processed
hgs
parents:
diff changeset
   686
			return;
hgs
parents:
diff changeset
   687
		}
hgs
parents:
diff changeset
   688
	}
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   691
//
hgs
parents:
diff changeset
   692
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   693
/////////////////////////////////////////////
hgs
parents:
diff changeset
   694
MXmlElement* CSvgAnimateElementImpl::CloneL(MXmlElement*
hgs
parents:
diff changeset
   695
aParentElement)
hgs
parents:
diff changeset
   696
	{
hgs
parents:
diff changeset
   697
		CSvgAnimateElementImpl* newElement = CSvgAnimateElementImpl::NewL(  this->ElemID(),
hgs
parents:
diff changeset
   698
											((CSvgDocumentImpl*)iOwnerDocument) );
hgs
parents:
diff changeset
   699
		CleanupStack::PushL( newElement );
hgs
parents:
diff changeset
   700
		newElement->iParentNode = aParentElement;
hgs
parents:
diff changeset
   701
		// copy the data
hgs
parents:
diff changeset
   702
		// end copying data from this class.
hgs
parents:
diff changeset
   703
		// this will get cloned setting the parent element to aParentElement;
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
		newElement->iOwnerDocument = this->iOwnerDocument;
hgs
parents:
diff changeset
   706
hgs
parents:
diff changeset
   707
		// set the target element this needs to be modified.
hgs
parents:
diff changeset
   708
		newElement->iTargetElement = (CSvgElementImpl*)aParentElement;
hgs
parents:
diff changeset
   709
		this->CopyL(newElement);
hgs
parents:
diff changeset
   710
		CleanupStack::Pop();
hgs
parents:
diff changeset
   711
		return newElement;
hgs
parents:
diff changeset
   712
	}
hgs
parents:
diff changeset
   713
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   714
//
hgs
parents:
diff changeset
   715
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   716
void CSvgAnimateElementImpl::CopyL(CSvgAnimateElementImpl* aDestElement )
hgs
parents:
diff changeset
   717
    {
hgs
parents:
diff changeset
   718
    if(aDestElement)
hgs
parents:
diff changeset
   719
	    {
hgs
parents:
diff changeset
   720
	    // copy from superclass
hgs
parents:
diff changeset
   721
	    this->CSvgAnimationBase::CopyL(aDestElement);
hgs
parents:
diff changeset
   722
	    // copy reference to idoc (CSvgDocumentImpl)
hgs
parents:
diff changeset
   723
	    aDestElement->iOwnerDocument = this->iOwnerDocument;
hgs
parents:
diff changeset
   724
	    }
hgs
parents:
diff changeset
   725
   }
hgs
parents:
diff changeset
   726
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   727
//
hgs
parents:
diff changeset
   728
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   729
void CSvgAnimateElementImpl::DeactivateAnimation()
hgs
parents:
diff changeset
   730
	{
hgs
parents:
diff changeset
   731
	CSvgAnimationBase::DeactivateAnimation(this);
hgs
parents:
diff changeset
   732
	}
hgs
parents:
diff changeset
   733
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   734
//
hgs
parents:
diff changeset
   735
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   736
// for calculation of interpolated values for viewBox animation.
hgs
parents:
diff changeset
   737
void CSvgAnimateElementImpl::DoViewBoxAnimProcL(MSvgTimerEvent*  aEvent)
hgs
parents:
diff changeset
   738
	{
hgs
parents:
diff changeset
   739
hgs
parents:
diff changeset
   740
    TInt32  alpha;
hgs
parents:
diff changeset
   741
    TInt32  valix;
hgs
parents:
diff changeset
   742
    TInt32  subanimtime;
hgs
parents:
diff changeset
   743
	TReal32 vBoxX=0;
hgs
parents:
diff changeset
   744
	TReal32 vBoxY=0;
hgs
parents:
diff changeset
   745
	TReal32 vBoxW=0;
hgs
parents:
diff changeset
   746
	TReal32 vBoxH=0;
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
	iAnimTime->GetAnimTime( (aEvent->Time()-iNegativeBeginTime), alpha, valix, subanimtime );
hgs
parents:
diff changeset
   749
    TGfxRectangle2D  v1  = iFromViewBox;
hgs
parents:
diff changeset
   750
    TGfxRectangle2D  v2  = iToViewBox;
hgs
parents:
diff changeset
   751
    TGfxRectangle2D  lCurValue;
hgs
parents:
diff changeset
   752
    if(iHaveBy &&  iCurrentRepeatCount > 0 && iAccumulate == KAccumSum )
hgs
parents:
diff changeset
   753
        {
hgs
parents:
diff changeset
   754
        v1= TGfxRectangle2D( vBoxX, vBoxY, vBoxW, vBoxH );
hgs
parents:
diff changeset
   755
        vBoxX = iToViewBox.iX -  iFromViewBox.iX;
hgs
parents:
diff changeset
   756
		vBoxY = iToViewBox.iY -  iFromViewBox.iY;
hgs
parents:
diff changeset
   757
		vBoxW = iToViewBox.iWidth -  iFromViewBox.iWidth;
hgs
parents:
diff changeset
   758
		vBoxH = iToViewBox.iHeight -  iFromViewBox.iHeight;
hgs
parents:
diff changeset
   759
        v2 = TGfxRectangle2D( vBoxX, vBoxY, vBoxW, vBoxH );
hgs
parents:
diff changeset
   760
        }
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
    if ( iValuesViewBox->Count() > 0 )
hgs
parents:
diff changeset
   763
       {
hgs
parents:
diff changeset
   764
hgs
parents:
diff changeset
   765
		// check for the range of valix
hgs
parents:
diff changeset
   766
		if(valix >= iValuesViewBox->Count() )
hgs
parents:
diff changeset
   767
			{
hgs
parents:
diff changeset
   768
			valix = iValuesViewBox->Count() - 1;
hgs
parents:
diff changeset
   769
			}
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
		v1 = ( *iValuesViewBox )[valix];
hgs
parents:
diff changeset
   772
        if ( valix + 1 >= iValuesViewBox->Count() )
hgs
parents:
diff changeset
   773
           {
hgs
parents:
diff changeset
   774
           v2 = ( *iValuesViewBox )[valix];
hgs
parents:
diff changeset
   775
           }
hgs
parents:
diff changeset
   776
        else
hgs
parents:
diff changeset
   777
           {
hgs
parents:
diff changeset
   778
           v2 = ( *iValuesViewBox )[valix + 1];
hgs
parents:
diff changeset
   779
           }
hgs
parents:
diff changeset
   780
           alpha = subanimtime;
hgs
parents:
diff changeset
   781
       }
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
			// to get the interpolation of each values of the viewBox
hgs
parents:
diff changeset
   784
	vBoxX = BlendFloat( alpha, v1.iX, v2.iX );
hgs
parents:
diff changeset
   785
	vBoxY = BlendFloat( alpha, v1.iY, v2.iY );
hgs
parents:
diff changeset
   786
	vBoxW = BlendFloat( alpha, v1.iWidth, v2.iWidth );
hgs
parents:
diff changeset
   787
	vBoxH = BlendFloat( alpha, v1.iHeight, v2.iHeight );
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
	lCurValue = TGfxRectangle2D( vBoxX, vBoxY, vBoxW, vBoxH );
hgs
parents:
diff changeset
   790
hgs
parents:
diff changeset
   791
    if( iAccumulate == KAccumSum && !iNoFrom)
hgs
parents:
diff changeset
   792
		{
hgs
parents:
diff changeset
   793
        TFloatFixPt lRepeatCount((TInt) iCurrentRepeatCount) ;
hgs
parents:
diff changeset
   794
        if(iValuesViewBox->Count() > 0)
hgs
parents:
diff changeset
   795
            {
hgs
parents:
diff changeset
   796
			TGfxRectangle2D  lVal= ((*iValuesViewBox) [iValuesViewBox->Count() -1]);
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
            lCurValue.iX += lVal.iX * lRepeatCount;
hgs
parents:
diff changeset
   799
			lCurValue.iY += lVal.iY * lRepeatCount;
hgs
parents:
diff changeset
   800
			lCurValue.iWidth += lVal.iWidth * lRepeatCount;
hgs
parents:
diff changeset
   801
			lCurValue.iHeight += lVal.iHeight * lRepeatCount;
hgs
parents:
diff changeset
   802
            }
hgs
parents:
diff changeset
   803
        else
hgs
parents:
diff changeset
   804
           {
hgs
parents:
diff changeset
   805
           lCurValue.iX += v2.iX * lRepeatCount;
hgs
parents:
diff changeset
   806
		   lCurValue.iY += v2.iY * lRepeatCount;
hgs
parents:
diff changeset
   807
			lCurValue.iWidth += v2.iWidth * lRepeatCount;
hgs
parents:
diff changeset
   808
	    	lCurValue.iHeight += v2.iHeight * lRepeatCount;
hgs
parents:
diff changeset
   809
           if(iHaveBy &&  iCurrentRepeatCount > 0)
hgs
parents:
diff changeset
   810
                {
hgs
parents:
diff changeset
   811
                lCurValue.iX += iFromViewBox.iX ;
hgs
parents:
diff changeset
   812
				lCurValue.iY += iFromViewBox.iY ;
hgs
parents:
diff changeset
   813
				lCurValue.iWidth += iFromViewBox.iWidth ;
hgs
parents:
diff changeset
   814
				lCurValue.iHeight += iFromViewBox.iHeight ;
hgs
parents:
diff changeset
   815
                }
hgs
parents:
diff changeset
   816
           }
hgs
parents:
diff changeset
   817
       }
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
   if ( ( iFill == KAnimFillFreeze ) )
hgs
parents:
diff changeset
   820
      {
hgs
parents:
diff changeset
   821
      iEndViewBox = lCurValue;
hgs
parents:
diff changeset
   822
      }
hgs
parents:
diff changeset
   823
   if ( ( iAdditive == KAdditiveSum ) && !iNoFrom ) //.
hgs
parents:
diff changeset
   824
      {
hgs
parents:
diff changeset
   825
      TGfxRectangle2D  lOrig;
hgs
parents:
diff changeset
   826
      if(iTargetElement->ElemID() == KSvgSvgElement)
hgs
parents:
diff changeset
   827
		{
hgs
parents:
diff changeset
   828
		((CSvgSvgElementImpl*)iTargetElement)->GetViewBox( lOrig );
hgs
parents:
diff changeset
   829
		}
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
      lCurValue.iX += lOrig.iX ;
hgs
parents:
diff changeset
   832
      lCurValue.iY += lOrig.iY ;
hgs
parents:
diff changeset
   833
	  lCurValue.iWidth += lOrig.iWidth ;
hgs
parents:
diff changeset
   834
	  lCurValue.iHeight += lOrig.iHeight ;
hgs
parents:
diff changeset
   835
      }
hgs
parents:
diff changeset
   836
hgs
parents:
diff changeset
   837
    // set the value to the target element.
hgs
parents:
diff changeset
   838
	 if(iTargetElement->ElemID() == KSvgSvgElement)
hgs
parents:
diff changeset
   839
		{
hgs
parents:
diff changeset
   840
		((CSvgSvgElementImpl*)iTargetElement)->SetViewBoxL( lCurValue );
hgs
parents:
diff changeset
   841
		}
hgs
parents:
diff changeset
   842
	}
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   845
//
hgs
parents:
diff changeset
   846
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   847
hgs
parents:
diff changeset
   848
       TBool CSvgAnimateElementImpl::DoAnimProcL(MSvgEvent* aEvent)
hgs
parents:
diff changeset
   849
	{
hgs
parents:
diff changeset
   850
	return this->AnimProcL((MSvgTimerEvent*)aEvent);
hgs
parents:
diff changeset
   851
	}
hgs
parents:
diff changeset
   852
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   853
//
hgs
parents:
diff changeset
   854
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   855
void CSvgAnimateElementImpl::InitAnimationL()
hgs
parents:
diff changeset
   856
	{
hgs
parents:
diff changeset
   857
hgs
parents:
diff changeset
   858
	if(!iTargetElement)
hgs
parents:
diff changeset
   859
		{
hgs
parents:
diff changeset
   860
		// if target element is not found then remove it.
hgs
parents:
diff changeset
   861
		((CSvgDocumentImpl*)iOwnerDocument)->RemoveFromEventReceiverList(this);
hgs
parents:
diff changeset
   862
		((CSvgDocumentImpl*)iOwnerDocument)->Engine()->UpdatePresentation(1);
hgs
parents:
diff changeset
   863
		return;
hgs
parents:
diff changeset
   864
		}
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
	if (!iHaveValues)
hgs
parents:
diff changeset
   867
		{
hgs
parents:
diff changeset
   868
		if (!iHaveTo && !iHaveBy)
hgs
parents:
diff changeset
   869
			{
hgs
parents:
diff changeset
   870
			((CSvgDocumentImpl*)iOwnerDocument)->RemoveFromEventReceiverList(this );
hgs
parents:
diff changeset
   871
            ((CSvgDocumentImpl*)iOwnerDocument)->Engine()->UpdatePresentation(1);
hgs
parents:
diff changeset
   872
			}
hgs
parents:
diff changeset
   873
		}
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
	iIsInheritedAttribute = iTargetElement->IsInherited(iAttrId);
hgs
parents:
diff changeset
   876
	CSvgAnimationBase::InitAnimationL();
hgs
parents:
diff changeset
   877
	SetFillValueL();
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
	}
hgs
parents:
diff changeset
   880
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   881
//
hgs
parents:
diff changeset
   882
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   883
void CSvgAnimateElementImpl::SetToOriginalL()
hgs
parents:
diff changeset
   884
	{
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
	// this is to make sure the inherited style attributes are made point back to the parent.
hgs
parents:
diff changeset
   887
	if(iIsInheritedAttribute && iAnimStatus == KAnimFinished)
hgs
parents:
diff changeset
   888
		{
hgs
parents:
diff changeset
   889
		// only if the animation has finished
hgs
parents:
diff changeset
   890
		iTargetElement->PointToParent(iAttrId);
hgs
parents:
diff changeset
   891
		}
hgs
parents:
diff changeset
   892
	else
hgs
parents:
diff changeset
   893
		{
hgs
parents:
diff changeset
   894
		CSvgAnimationBase::SetToOriginalL();
hgs
parents:
diff changeset
   895
		}
hgs
parents:
diff changeset
   896
	}
hgs
parents:
diff changeset
   897
hgs
parents:
diff changeset
   898
void CSvgAnimateElementImpl::Print( TBool aIsEncodeOn )
hgs
parents:
diff changeset
   899
{
hgs
parents:
diff changeset
   900
	if (!aIsEncodeOn)
hgs
parents:
diff changeset
   901
	{
hgs
parents:
diff changeset
   902
		#ifdef _DEBUG
hgs
parents:
diff changeset
   903
		RDebug::Printf("<animate attributeType=\"hmmm\" attributeName=\"hmm\" from=\"%d\" to=\"%d\" dur=\"hmm\" repeatCount=\"hmm\"/>",
hgs
parents:
diff changeset
   904
		/*iDataType,*/ (int)iFromFloat, (int)iToFloat/*, iRepeatCount*/);
hgs
parents:
diff changeset
   905
		#endif
hgs
parents:
diff changeset
   906
	}
hgs
parents:
diff changeset
   907
}
hgs
parents:
diff changeset
   908
hgs
parents:
diff changeset
   909
hgs
parents:
diff changeset
   910
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
hgs
parents:
diff changeset
   913
hgs
parents:
diff changeset
   914
hgs
parents:
diff changeset
   915
hgs
parents:
diff changeset
   916
hgs
parents:
diff changeset
   917
hgs
parents:
diff changeset
   918
hgs
parents:
diff changeset
   919
hgs
parents:
diff changeset
   920
hgs
parents:
diff changeset
   921