svgtopt/SVG/SVGImpl/src/SVGAnimateMotionElementImpl.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
#include <e32math.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "SVGAnimateMotionElementImpl.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include "SVGElementImpl.h"
hgs
parents:
diff changeset
    27
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    28
#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#include "GfxGeneralPath.h"
hgs
parents:
diff changeset
    31
#include "GfxFlatteningPathIterator.h"
hgs
parents:
diff changeset
    32
#include "SVGPathDataParser.h"
hgs
parents:
diff changeset
    33
#include "SVGPointLexer.h"
hgs
parents:
diff changeset
    34
#include "SVGStringTokenizer.h"
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
_LIT( AUTO, "auto" );
hgs
parents:
diff changeset
    37
_LIT( AUTOREVERSE, "auto-reverse" );
hgs
parents:
diff changeset
    38
_LIT( SEMICOLON, ";" );
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
// *******************************************************
hgs
parents:
diff changeset
    41
// Constructor/deconstructor
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    44
//
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
CSvgAnimateMotionElementImpl* CSvgAnimateMotionElementImpl::NewL(  const TUint8 aElemID,
hgs
parents:
diff changeset
    47
																  CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    48
	{
hgs
parents:
diff changeset
    49
	CSvgAnimateMotionElementImpl*   self    = new ( ELeave )
hgs
parents:
diff changeset
    50
											  CSvgAnimateMotionElementImpl( aDoc );
hgs
parents:
diff changeset
    51
	CleanupStack::PushL( self );
hgs
parents:
diff changeset
    52
	self->ConstructL(  aElemID );
hgs
parents:
diff changeset
    53
	CleanupStack::Pop();
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	return self;
hgs
parents:
diff changeset
    56
	}
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
//
hgs
parents:
diff changeset
    60
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    61
CSvgAnimateMotionElementImpl* CSvgAnimateMotionElementImpl::NewLC(  const TUint8 aElemID,
hgs
parents:
diff changeset
    62
																   CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    63
	{
hgs
parents:
diff changeset
    64
	CSvgAnimateMotionElementImpl* self = new ( ELeave )
hgs
parents:
diff changeset
    65
											  CSvgAnimateMotionElementImpl( aDoc );
hgs
parents:
diff changeset
    66
	CleanupStack::PushL( self );
hgs
parents:
diff changeset
    67
	self->ConstructL(  aElemID );
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
	return self;
hgs
parents:
diff changeset
    70
	}
hgs
parents:
diff changeset
    71
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
//
hgs
parents:
diff changeset
    73
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
void CSvgAnimateMotionElementImpl::ConstructL(  const TUint8 aElemID )
hgs
parents:
diff changeset
    75
	{
hgs
parents:
diff changeset
    76
	CSvgAnimationBase::ConstructL( aElemID );
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	iMotionPath = CGfxGeneralPath::NewL();
hgs
parents:
diff changeset
    79
	iAnimTime->SetCalMode( KAnimCalcModePaced ); // animateMotion has differenr default
hgs
parents:
diff changeset
    80
	iReqAttrFlag=KSVG_AMINATEMO_ELEMFLAG;
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    86
//
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    88
CSvgAnimateMotionElementImpl::~CSvgAnimateMotionElementImpl()
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
	if ( iMotionPath )
hgs
parents:
diff changeset
    91
		{
hgs
parents:
diff changeset
    92
		delete iMotionPath;
hgs
parents:
diff changeset
    93
		iMotionPath = NULL;
hgs
parents:
diff changeset
    94
		}
hgs
parents:
diff changeset
    95
	if ( iPathIterator )
hgs
parents:
diff changeset
    96
		{
hgs
parents:
diff changeset
    97
		delete iPathIterator;
hgs
parents:
diff changeset
    98
		iPathIterator = NULL;
hgs
parents:
diff changeset
    99
		}
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
// *******************************************************
hgs
parents:
diff changeset
   103
// Private
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
//
hgs
parents:
diff changeset
   108
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
CSvgAnimateMotionElementImpl::CSvgAnimateMotionElementImpl( CSvgDocumentImpl* aDoc ) : CSvgAnimationBase( aDoc ),
hgs
parents:
diff changeset
   110
                                                                                       iCurrentSeg( 0,
hgs
parents:
diff changeset
   111
                                                                                                    0,
hgs
parents:
diff changeset
   112
                                                                                                    0,
hgs
parents:
diff changeset
   113
                                                                                                    0 ),
hgs
parents:
diff changeset
   114
                                                                                       //iIsValues( EFalse ),
hgs
parents:
diff changeset
   115
                                                                                       iPrevRotate(0)
hgs
parents:
diff changeset
   116
                                                                                       
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
    iAttrId = KAtrTransform;
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
// *******************************************************
hgs
parents:
diff changeset
   122
// From SVG DOM
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
// *******************************************************
hgs
parents:
diff changeset
   126
// SVG Implementation
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// *******************************************************
hgs
parents:
diff changeset
   130
// From MSvgEventReceiver
hgs
parents:
diff changeset
   131
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
//
hgs
parents:
diff changeset
   133
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   134
void CSvgAnimateMotionElementImpl::ResetReferenceElementL()
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
    if(iTargetElement != NULL )
hgs
parents:
diff changeset
   137
    	{
hgs
parents:
diff changeset
   138
    	if( ((iTargetElement->iAnimateAttrSet == NULL) ||
hgs
parents:
diff changeset
   139
    	    (iTargetElement->iAnimateAttrSet->Find(iAttrId) == KErrNotFound) ) )
hgs
parents:
diff changeset
   140
    		{
hgs
parents:
diff changeset
   141
    		if ( iInitDone )
hgs
parents:
diff changeset
   142
    			{
hgs
parents:
diff changeset
   143
    			iCheckFirstAnim= ETrue;
hgs
parents:
diff changeset
   144
    			SetToOriginalL();
hgs
parents:
diff changeset
   145
    			if( !(iTargetElement->iAnimateAttrSet) )
hgs
parents:
diff changeset
   146
    				{
hgs
parents:
diff changeset
   147
                    iTargetElement->iAnimateAttrSet = new (ELeave) RArray<TUint32>(1);
hgs
parents:
diff changeset
   148
                    }
hgs
parents:
diff changeset
   149
                iTargetElement->iAnimateAttrSet->AppendL((TUint32)iAttrId);
hgs
parents:
diff changeset
   150
    			}
hgs
parents:
diff changeset
   151
    		}
hgs
parents:
diff changeset
   152
        }
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
// *******************************************************
hgs
parents:
diff changeset
   155
// From MXmlElement
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   158
//
hgs
parents:
diff changeset
   159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
TInt CSvgAnimateMotionElementImpl::SetAttributeL( const TDesC& aName,
hgs
parents:
diff changeset
   161
                                                  const TDesC& aValue )
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
    _LIT( KTmpAttrName, "attributeName" );
hgs
parents:
diff changeset
   164
    _LIT( KTmpPath, "path" );
hgs
parents:
diff changeset
   165
    _LIT( KTmpRotate, "rotate" );
hgs
parents:
diff changeset
   166
    _LIT( KTmpFrom, "from" );
hgs
parents:
diff changeset
   167
    _LIT( KTmpTo, "to" );
hgs
parents:
diff changeset
   168
    _LIT( KTmpValues, "values" );
hgs
parents:
diff changeset
   169
    _LIT( KTmpBy, "by" );
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
    if ( aName == KTmpAttrName )
hgs
parents:
diff changeset
   173
        {
hgs
parents:
diff changeset
   174
        // Ignore 'attributeName' attribute
hgs
parents:
diff changeset
   175
        }
hgs
parents:
diff changeset
   176
    else if ( aName == KTmpPath )
hgs
parents:
diff changeset
   177
        {
hgs
parents:
diff changeset
   178
        iMotionPath->Reset();
hgs
parents:
diff changeset
   179
		TSvgPathDataParser::ParsePathData( aValue, iMotionPath );
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
        CGfxPathIterator*   itr;
hgs
parents:
diff changeset
   182
        TFloatFixPt              tmpcoords[6];
hgs
parents:
diff changeset
   183
        iMotionPath->GetPathIteratorL( &iIdentTransform, itr );
hgs
parents:
diff changeset
   184
        CleanupStack::PushL( itr );
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
        while ( !itr->IsDone() )
hgs
parents:
diff changeset
   187
            {
hgs
parents:
diff changeset
   188
            switch ( itr->CurrentSegment( tmpcoords ) )
hgs
parents:
diff changeset
   189
                {
hgs
parents:
diff changeset
   190
                case EGfxSegMoveTo:
hgs
parents:
diff changeset
   191
                iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
   192
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   193
                break;
hgs
parents:
diff changeset
   194
                case EGfxSegLineTo:
hgs
parents:
diff changeset
   195
                iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
   196
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   197
                break;
hgs
parents:
diff changeset
   198
                case EGfxSegQuadTo:
hgs
parents:
diff changeset
   199
                iToFloatX = tmpcoords[2];
hgs
parents:
diff changeset
   200
                iToFloatY = tmpcoords[3];
hgs
parents:
diff changeset
   201
                break;
hgs
parents:
diff changeset
   202
                case EGfxSegCubicTo:
hgs
parents:
diff changeset
   203
                iToFloatX = tmpcoords[4];
hgs
parents:
diff changeset
   204
                iToFloatY = tmpcoords[5];
hgs
parents:
diff changeset
   205
                break;
hgs
parents:
diff changeset
   206
                case EGfxSegClose:
hgs
parents:
diff changeset
   207
                iToFloatX = tmpcoords[0]; //.
hgs
parents:
diff changeset
   208
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   209
                }
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
            itr->NextL();
hgs
parents:
diff changeset
   212
            }
hgs
parents:
diff changeset
   213
        iPathSeen = ETrue;
hgs
parents:
diff changeset
   214
        CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   215
		if(iReqAttrFlag == KAtrSVGAmo && (iMotionPath->PointTypeArray())->Count() != 0 )
hgs
parents:
diff changeset
   216
			{
hgs
parents:
diff changeset
   217
			iReqAttrFlag = 0;
hgs
parents:
diff changeset
   218
			}
hgs
parents:
diff changeset
   219
        }
hgs
parents:
diff changeset
   220
	else if ( aName == KTmpRotate )
hgs
parents:
diff changeset
   221
		{
hgs
parents:
diff changeset
   222
		if ( aValue == AUTO )
hgs
parents:
diff changeset
   223
			{
hgs
parents:
diff changeset
   224
			iAnimMotionRotate = KAnimMotionRotateAuto;
hgs
parents:
diff changeset
   225
			}
hgs
parents:
diff changeset
   226
		else if ( aValue == AUTOREVERSE )
hgs
parents:
diff changeset
   227
			{
hgs
parents:
diff changeset
   228
			iAnimMotionRotate = KAnimMotionRotateAutoReverse;
hgs
parents:
diff changeset
   229
			}
hgs
parents:
diff changeset
   230
		else
hgs
parents:
diff changeset
   231
			{
hgs
parents:
diff changeset
   232
			TLex    lString ( aValue );
hgs
parents:
diff changeset
   233
			if (lString.Val( iAnimMotionRotate )!= KErrNone)
hgs
parents:
diff changeset
   234
				{
hgs
parents:
diff changeset
   235
				iAnimMotionRotate= 0;
hgs
parents:
diff changeset
   236
				}
hgs
parents:
diff changeset
   237
			if ( iAnimMotionRotate < 0 )
hgs
parents:
diff changeset
   238
				{
hgs
parents:
diff changeset
   239
					// Note: A problem may occur if the value is less than -3600
hgs
parents:
diff changeset
   240
	        iAnimMotionRotate += 3600;
hgs
parents:
diff changeset
   241
				}
hgs
parents:
diff changeset
   242
			iAnimMotionRotate %= 360;
hgs
parents:
diff changeset
   243
			}
hgs
parents:
diff changeset
   244
		}
hgs
parents:
diff changeset
   245
    else if ( aName == KTmpFrom )
hgs
parents:
diff changeset
   246
	    {
hgs
parents:
diff changeset
   247
		if ( ! iHaveValues )
hgs
parents:
diff changeset
   248
			{
hgs
parents:
diff changeset
   249
			iNoFrom = EFalse;
hgs
parents:
diff changeset
   250
			iMotionPath->Reset();
hgs
parents:
diff changeset
   251
			TSvgPointLexer  svgplex ( aValue );
hgs
parents:
diff changeset
   252
			TChar           com;
hgs
parents:
diff changeset
   253
			TFloatFixPt          x, y;
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
            svgplex.GetNextPoint( com, x, y );
hgs
parents:
diff changeset
   256
            svgplex.Cleanup();
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
			iOrgFromFloatX = iFromFloatX = x;
hgs
parents:
diff changeset
   259
			iOrgFromFloatY = iFromFloatY = y;
hgs
parents:
diff changeset
   260
			iMotionPath->MoveToL( x, y, ETrue );  // 'from' -> MoveTo
hgs
parents:
diff changeset
   261
			}
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
		if(iReqAttrFlag == KAtrSVGAmo)
hgs
parents:
diff changeset
   264
			{
hgs
parents:
diff changeset
   265
			iReqAttrFlag = KAtrToBy;
hgs
parents:
diff changeset
   266
			}
hgs
parents:
diff changeset
   267
		else
hgs
parents:
diff changeset
   268
			{
hgs
parents:
diff changeset
   269
			iReqAttrFlag = 0;
hgs
parents:
diff changeset
   270
			}
hgs
parents:
diff changeset
   271
		}
hgs
parents:
diff changeset
   272
    else if ( aName == KTmpBy )
hgs
parents:
diff changeset
   273
	    {
hgs
parents:
diff changeset
   274
		if ( !iHaveTo )
hgs
parents:
diff changeset
   275
			{
hgs
parents:
diff changeset
   276
			iHaveBy = ETrue;
hgs
parents:
diff changeset
   277
			if(iReqAttrFlag == KAtrSVGAmo || iReqAttrFlag == KAtrToBy)
hgs
parents:
diff changeset
   278
				{
hgs
parents:
diff changeset
   279
				iReqAttrFlag = 0;
hgs
parents:
diff changeset
   280
				}
hgs
parents:
diff changeset
   281
		    if ( !iHaveValues )
hgs
parents:
diff changeset
   282
			    {
hgs
parents:
diff changeset
   283
	               TSvgPointLexer  svgplex ( aValue );
hgs
parents:
diff changeset
   284
	            TChar           com;
hgs
parents:
diff changeset
   285
		        TFloatFixPt          x, y;
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
                svgplex.GetNextPoint( com, x, y );
hgs
parents:
diff changeset
   288
                svgplex.Cleanup();
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
                if ( iNoFrom )
hgs
parents:
diff changeset
   291
	                {
hgs
parents:
diff changeset
   292
		            iToFloatX = x;
hgs
parents:
diff changeset
   293
			        iToFloatY = y;
hgs
parents:
diff changeset
   294
				    iNoFrom = EFalse;
hgs
parents:
diff changeset
   295
				    // this is taken from animate transforms.
hgs
parents:
diff changeset
   296
				   iAdditive = KAdditiveSum;
hgs
parents:
diff changeset
   297
				   iAdditiveOrg = KAdditiveSum;
hgs
parents:
diff changeset
   298
					}
hgs
parents:
diff changeset
   299
                else
hgs
parents:
diff changeset
   300
	                {
hgs
parents:
diff changeset
   301
		            iToFloatX = iFromFloatX + x;
hgs
parents:
diff changeset
   302
			        iToFloatY = iFromFloatY + y;
hgs
parents:
diff changeset
   303
				    }
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
	            CGfxPathIterator*   itr;
hgs
parents:
diff changeset
   306
		        iMotionPath->GetPathIteratorL( &iIdentTransform, itr );
hgs
parents:
diff changeset
   307
			    CleanupStack::PushL( itr );
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
				if ( itr->IsDone() )
hgs
parents:
diff changeset
   310
					{
hgs
parents:
diff changeset
   311
					TFloatFixPt lZero;
hgs
parents:
diff changeset
   312
					// If the animation path is empty, fill with default value.
hgs
parents:
diff changeset
   313
					iMotionPath->MoveToL( lZero, lZero, ETrue );
hgs
parents:
diff changeset
   314
					}
hgs
parents:
diff changeset
   315
				CleanupStack::PopAndDestroy( 1 ); // itr
hgs
parents:
diff changeset
   316
				iMotionPath->LineToL( x, y, ETrue );  // 'by' -> LineTo
hgs
parents:
diff changeset
   317
				}
hgs
parents:
diff changeset
   318
			}
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
		if(iReqAttrFlag == KAtrSVGAmo && (iMotionPath->PointTypeArray())->Count() != 0 )
hgs
parents:
diff changeset
   321
			{
hgs
parents:
diff changeset
   322
			iReqAttrFlag = 0;
hgs
parents:
diff changeset
   323
			}
hgs
parents:
diff changeset
   324
	    }
hgs
parents:
diff changeset
   325
	else if ( aName == KTmpTo )
hgs
parents:
diff changeset
   326
		{
hgs
parents:
diff changeset
   327
		if ( !iHaveValues )
hgs
parents:
diff changeset
   328
			{
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
			// this is taken from animate transforms.
hgs
parents:
diff changeset
   331
			if ( iNoFrom )
hgs
parents:
diff changeset
   332
               {
hgs
parents:
diff changeset
   333
	           iAdditive = KAdditiveSum;
hgs
parents:
diff changeset
   334
			   iAdditiveOrg = KAdditiveSum;
hgs
parents:
diff changeset
   335
			   }
hgs
parents:
diff changeset
   336
			TSvgPointLexer  svgplex ( aValue );
hgs
parents:
diff changeset
   337
			TChar           com;
hgs
parents:
diff changeset
   338
			TFloatFixPt          x, y;
hgs
parents:
diff changeset
   339
			iHaveTo = ETrue;
hgs
parents:
diff changeset
   340
            svgplex.GetNextPoint( com, x, y );
hgs
parents:
diff changeset
   341
            svgplex.Cleanup();
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
            iToFloatX = x;
hgs
parents:
diff changeset
   344
			iToFloatY = y;
hgs
parents:
diff changeset
   345
			CGfxPathIterator*   itr;
hgs
parents:
diff changeset
   346
			iMotionPath->GetPathIteratorL( &iIdentTransform, itr );
hgs
parents:
diff changeset
   347
			CleanupStack::PushL( itr );
hgs
parents:
diff changeset
   348
			if ( itr->IsDone() )
hgs
parents:
diff changeset
   349
				{
hgs
parents:
diff changeset
   350
				TFloatFixPt lZero;
hgs
parents:
diff changeset
   351
				// If the animation path is empty, fill with default value.
hgs
parents:
diff changeset
   352
				// should this default be zero or object position
hgs
parents:
diff changeset
   353
				iMotionPath->MoveToL( lZero, lZero, ETrue );
hgs
parents:
diff changeset
   354
				}
hgs
parents:
diff changeset
   355
			CleanupStack::PopAndDestroy( 1 ); // itr
hgs
parents:
diff changeset
   356
			iMotionPath->LineToL( x, y, ETrue );  // 'to' -> LineTo
hgs
parents:
diff changeset
   357
			}
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
		if(iReqAttrFlag == KAtrSVGAmo || iReqAttrFlag == KAtrToBy)
hgs
parents:
diff changeset
   360
			{
hgs
parents:
diff changeset
   361
			iReqAttrFlag = 0;
hgs
parents:
diff changeset
   362
			}
hgs
parents:
diff changeset
   363
		}
hgs
parents:
diff changeset
   364
	else if ( aName == KTmpValues )
hgs
parents:
diff changeset
   365
		{
hgs
parents:
diff changeset
   366
		// Process only if Path values have not been seen
hgs
parents:
diff changeset
   367
		if ( !iPathSeen )
hgs
parents:
diff changeset
   368
		    {
hgs
parents:
diff changeset
   369
    		TStringTokenizer    tkn     ( aValue, SEMICOLON );
hgs
parents:
diff changeset
   370
    		TBool               first   = ETrue;
hgs
parents:
diff changeset
   371
    		iHaveValues = ETrue;
hgs
parents:
diff changeset
   372
    		iNoFrom = EFalse; //.
hgs
parents:
diff changeset
   373
    		iMotionPath->Reset();
hgs
parents:
diff changeset
   374
    		while ( tkn.HasMoreTokens() ) // 'values' is a set of coordinates
hgs
parents:
diff changeset
   375
    			{
hgs
parents:
diff changeset
   376
    			TSvgPointLexer  svgplex ( tkn.NextToken() );
hgs
parents:
diff changeset
   377
    			TChar           com;
hgs
parents:
diff changeset
   378
    			TFloatFixPt          x, y;
hgs
parents:
diff changeset
   379
                svgplex.GetNextPoint( com, x, y );
hgs
parents:
diff changeset
   380
                svgplex.Cleanup();
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
    			if ( first )
hgs
parents:
diff changeset
   383
    				{
hgs
parents:
diff changeset
   384
    				iMotionPath->MoveToL( x, y, ETrue );
hgs
parents:
diff changeset
   385
    				iOrgFromFloatX = iFromFloatX = x; //.
hgs
parents:
diff changeset
   386
    				iOrgFromFloatY = iFromFloatY = y;
hgs
parents:
diff changeset
   387
    				first = EFalse;
hgs
parents:
diff changeset
   388
    				}
hgs
parents:
diff changeset
   389
    			else
hgs
parents:
diff changeset
   390
    				{
hgs
parents:
diff changeset
   391
    				iMotionPath->LineToL( x, y, ETrue );
hgs
parents:
diff changeset
   392
    				}
hgs
parents:
diff changeset
   393
    			iToFloatX = x; //.
hgs
parents:
diff changeset
   394
    			iToFloatY = y;
hgs
parents:
diff changeset
   395
    			}
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
    		if(iReqAttrFlag == KAtrSVGAmo || iReqAttrFlag == KAtrToBy)
hgs
parents:
diff changeset
   398
    			{
hgs
parents:
diff changeset
   399
    			iReqAttrFlag = 0;
hgs
parents:
diff changeset
   400
    			}
hgs
parents:
diff changeset
   401
		    }
hgs
parents:
diff changeset
   402
		}
hgs
parents:
diff changeset
   403
    else
hgs
parents:
diff changeset
   404
	    {
hgs
parents:
diff changeset
   405
		return CSvgAnimationBase::SetAttributeL( aName, aValue );
hgs
parents:
diff changeset
   406
		}
hgs
parents:
diff changeset
   407
hgs
parents:
diff changeset
   408
	return KErrNone;
hgs
parents:
diff changeset
   409
    }
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   412
// From MSvgEventReceiver
hgs
parents:
diff changeset
   413
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   414
TBool CSvgAnimateMotionElementImpl::ReceiveEventL( MSvgEvent* aEvent )
hgs
parents:
diff changeset
   415
    {
hgs
parents:
diff changeset
   416
    return CSvgAnimationBase::ReceiveEventProcL( aEvent, this );
hgs
parents:
diff changeset
   417
    }
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   420
// From CSvgAnimationBase
hgs
parents:
diff changeset
   421
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   422
//
hgs
parents:
diff changeset
   423
TBool CSvgAnimateMotionElementImpl::AnimProcL( MSvgTimerEvent* aEvent )
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
    {
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
  if((iAnimStatus != KAnimActive) || iDoFreeze)
hgs
parents:
diff changeset
   429
	   {
hgs
parents:
diff changeset
   430
	   if(iFill== KAnimFillFreeze && !iDoFreeze && iAnimStatus == KAnimFinished)
hgs
parents:
diff changeset
   431
	   		{
hgs
parents:
diff changeset
   432
	   		// calculate the freeze value.
hgs
parents:
diff changeset
   433
	   		}
hgs
parents:
diff changeset
   434
	   else
hgs
parents:
diff changeset
   435
		   {
hgs
parents:
diff changeset
   436
		   CSvgAnimationBase::CheckForEndTimesAndFreezeL(this);
hgs
parents:
diff changeset
   437
		   return EFalse;
hgs
parents:
diff changeset
   438
		   }
hgs
parents:
diff changeset
   439
	   }
hgs
parents:
diff changeset
   440
    if ( ( iPathIterator == NULL ) || ( iPathIterator->IsDone() ) )
hgs
parents:
diff changeset
   441
		{
hgs
parents:
diff changeset
   442
        return EFalse;  // Already end of path. Nothing to do any more.
hgs
parents:
diff changeset
   443
		}
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
    TFloatFixPt  nextPos, diff;
hgs
parents:
diff changeset
   446
    TFloatFixPt  zero    ( 0 );
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    // Get next position in [0..255] range
hgs
parents:
diff changeset
   449
    TInt32  animatetime; // Not used...
hgs
parents:
diff changeset
   450
    TInt32  valix, subanimtime;
hgs
parents:
diff changeset
   451
    iAnimTime->GetAnimTime( (aEvent->Time()-iNegativeBeginTime), animatetime, valix, subanimtime );
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
    // Get next position in actual length
hgs
parents:
diff changeset
   454
    TFloatFixPt  v2;
hgs
parents:
diff changeset
   455
    if ( valix >= iValuesFloat->Count() - 1 )
hgs
parents:
diff changeset
   456
		{
hgs
parents:
diff changeset
   457
		valix= iValuesFloat->Count() - 1;
hgs
parents:
diff changeset
   458
        v2 = ( *iValuesFloat )[valix];
hgs
parents:
diff changeset
   459
		}
hgs
parents:
diff changeset
   460
    else
hgs
parents:
diff changeset
   461
		{
hgs
parents:
diff changeset
   462
        v2 = ( *iValuesFloat )[valix + 1];
hgs
parents:
diff changeset
   463
		}
hgs
parents:
diff changeset
   464
    nextPos = CSvgAnimationBase::BlendFloat( subanimtime,
hgs
parents:
diff changeset
   465
                                             ( *iValuesFloat )[valix],
hgs
parents:
diff changeset
   466
                                             v2 );
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
    diff = nextPos - iCurrentPos;
hgs
parents:
diff changeset
   469
    TGfxSegType SegType;
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
    while ( iSubPos + diff > iSubLength && !iPathIterator->IsDone() )
hgs
parents:
diff changeset
   472
        {
hgs
parents:
diff changeset
   473
        if ( iSubLength < zero )
hgs
parents:
diff changeset
   474
			{
hgs
parents:
diff changeset
   475
            iSubLength = zero;
hgs
parents:
diff changeset
   476
			}
hgs
parents:
diff changeset
   477
        TFloatFixPt  tmpcoords[6];
hgs
parents:
diff changeset
   478
        diff -= iSubLength - iSubPos;
hgs
parents:
diff changeset
   479
        iPathIterator->NextL();
hgs
parents:
diff changeset
   480
        SegType = iPathIterator->CurrentSegment( tmpcoords );
hgs
parents:
diff changeset
   481
        iCurrentSeg.iX1 = iCurrentSeg.iX2;
hgs
parents:
diff changeset
   482
        iCurrentSeg.iY1 = iCurrentSeg.iY2;
hgs
parents:
diff changeset
   483
        iCurrentSeg.iX2 = tmpcoords[0];
hgs
parents:
diff changeset
   484
        iCurrentSeg.iY2 = tmpcoords[1];
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
        if ( SegType == EGfxSegMoveTo )
hgs
parents:
diff changeset
   487
			{
hgs
parents:
diff changeset
   488
            iSubLength = zero;
hgs
parents:
diff changeset
   489
			}
hgs
parents:
diff changeset
   490
        else
hgs
parents:
diff changeset
   491
			{
hgs
parents:
diff changeset
   492
            iSubLength = iCurrentSeg.Length();
hgs
parents:
diff changeset
   493
			}
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
        iSubPos = zero;
hgs
parents:
diff changeset
   496
        }
hgs
parents:
diff changeset
   497
    iSubPos += diff;
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
    // Calcualate or set rotation
hgs
parents:
diff changeset
   500
    TReal32 rot = 0.0f;
hgs
parents:
diff changeset
   501
    if ( iAnimMotionRotate < 0 )
hgs
parents:
diff changeset
   502
        {
hgs
parents:
diff changeset
   503
        TFloatFixPt  dx  = iCurrentSeg.iX1 - iCurrentSeg.iX2;
hgs
parents:
diff changeset
   504
        if ( dx == zero )
hgs
parents:
diff changeset
   505
        {
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
			if( iAnimMotionRotate == KAnimMotionRotateAuto )
hgs
parents:
diff changeset
   508
			{
hgs
parents:
diff changeset
   509
				if(iPrevRotate == 0 || iPrevRotate >= 3.1415926f)
hgs
parents:
diff changeset
   510
					rot = 3.1415926f + 1.5707963f;
hgs
parents:
diff changeset
   511
				else
hgs
parents:
diff changeset
   512
					rot = 1.5707963f; // pi/2
hgs
parents:
diff changeset
   513
			}
hgs
parents:
diff changeset
   514
			else // AutoReverse
hgs
parents:
diff changeset
   515
			{
hgs
parents:
diff changeset
   516
				if(iPrevRotate >= 0 )
hgs
parents:
diff changeset
   517
					rot = 1.5707963f;
hgs
parents:
diff changeset
   518
				else
hgs
parents:
diff changeset
   519
					rot = -1.5707963f;
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
            }
hgs
parents:
diff changeset
   522
		}
hgs
parents:
diff changeset
   523
        else
hgs
parents:
diff changeset
   524
            {
hgs
parents:
diff changeset
   525
            TReal   atan;
hgs
parents:
diff changeset
   526
            Math::ATan( atan, ( TReal32 )( iCurrentSeg.iY1 - iCurrentSeg.iY2 ), ( TReal32 )dx );
hgs
parents:
diff changeset
   527
            rot = ( TReal32 ) atan;
hgs
parents:
diff changeset
   528
			if ( iAnimMotionRotate == KAnimMotionRotateAuto )
hgs
parents:
diff changeset
   529
				{
hgs
parents:
diff changeset
   530
				rot += 3.1415926f;
hgs
parents:
diff changeset
   531
				}
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
			}
hgs
parents:
diff changeset
   534
		iPrevRotate = rot;
hgs
parents:
diff changeset
   535
        }
hgs
parents:
diff changeset
   536
    else
hgs
parents:
diff changeset
   537
        {
hgs
parents:
diff changeset
   538
        rot = iAnimMotionRotate * 3.1415926f / 180.0f;
hgs
parents:
diff changeset
   539
        }
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
    // Create transform
hgs
parents:
diff changeset
   542
    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   543
    TInt32              matrixIndex;
hgs
parents:
diff changeset
   544
    iTargetElement->GetTransform( trList );
hgs
parents:
diff changeset
   545
    iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex );
hgs
parents:
diff changeset
   546
    // new position
hgs
parents:
diff changeset
   547
    TInt32  subalpha;
hgs
parents:
diff changeset
   548
    if ( iSubLength == zero )
hgs
parents:
diff changeset
   549
		{
hgs
parents:
diff changeset
   550
        subalpha = 0;
hgs
parents:
diff changeset
   551
		}
hgs
parents:
diff changeset
   552
    else
hgs
parents:
diff changeset
   553
		{
hgs
parents:
diff changeset
   554
        subalpha = ( TInt32 ) ( iSubPos / iSubLength * TFloatFixPt( 255 ) );  // need to make sure value does not exceed 0x7fff
hgs
parents:
diff changeset
   555
		}
hgs
parents:
diff changeset
   556
    if ( subalpha > 0xff )
hgs
parents:
diff changeset
   557
		{
hgs
parents:
diff changeset
   558
        subalpha = 0xff;
hgs
parents:
diff changeset
   559
		}
hgs
parents:
diff changeset
   560
    if ( subalpha < 0 )
hgs
parents:
diff changeset
   561
		{
hgs
parents:
diff changeset
   562
        subalpha = 0;
hgs
parents:
diff changeset
   563
		}
hgs
parents:
diff changeset
   564
hgs
parents:
diff changeset
   565
    TFloatFixPt  trnsx, trnsy;
hgs
parents:
diff changeset
   566
    trnsx = CSvgAnimationBase::BlendFloat( subalpha,
hgs
parents:
diff changeset
   567
                                           iCurrentSeg.iX1,
hgs
parents:
diff changeset
   568
                                           iCurrentSeg.iX2 );
hgs
parents:
diff changeset
   569
    trnsy = CSvgAnimationBase::BlendFloat( subalpha,
hgs
parents:
diff changeset
   570
                                           iCurrentSeg.iY1,
hgs
parents:
diff changeset
   571
                                           iCurrentSeg.iY2 );
hgs
parents:
diff changeset
   572
hgs
parents:
diff changeset
   573
    TGfxAffineTransform deltaTr = TGfxAffineTransform::GetTranslateInstance( trnsx,
hgs
parents:
diff changeset
   574
                                                                             trnsy );
hgs
parents:
diff changeset
   575
    if ( rot != 0.0f )
hgs
parents:
diff changeset
   576
        {
hgs
parents:
diff changeset
   577
        deltaTr.Rotate( rot );
hgs
parents:
diff changeset
   578
        }
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
    // Set transform
hgs
parents:
diff changeset
   581
hgs
parents:
diff changeset
   582
    if ( iAccumulate == KAccumSum ) //.
hgs
parents:
diff changeset
   583
        {
hgs
parents:
diff changeset
   584
        TGfxAffineTransform accumulateDeltaTr = TGfxAffineTransform::GetTranslateInstance( iFromFloatX - iOrgFromFloatX, iFromFloatY - iOrgFromFloatY);
hgs
parents:
diff changeset
   585
        deltaTr.Concatenate( accumulateDeltaTr );
hgs
parents:
diff changeset
   586
        }
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
    if ( iAdditive == KAdditiveSum ) //.
hgs
parents:
diff changeset
   589
        {
hgs
parents:
diff changeset
   590
        TGfxAffineTransform curMatrix = trList->GetItem( matrixIndex );
hgs
parents:
diff changeset
   591
        curMatrix.Concatenate( deltaTr );
hgs
parents:
diff changeset
   592
        trList->ReplaceItem( curMatrix, matrixIndex );
hgs
parents:
diff changeset
   593
        }
hgs
parents:
diff changeset
   594
    else
hgs
parents:
diff changeset
   595
        {
hgs
parents:
diff changeset
   596
        trList->ReplaceItem( deltaTr, matrixIndex );
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
        }
hgs
parents:
diff changeset
   599
	if(iFill== KAnimFillFreeze)
hgs
parents:
diff changeset
   600
		{
hgs
parents:
diff changeset
   601
	 	iEndMatrix = deltaTr;
hgs
parents:
diff changeset
   602
		}
hgs
parents:
diff changeset
   603
    // update current position
hgs
parents:
diff changeset
   604
    iCurrentPos = nextPos;
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
	 	CSvgAnimationBase::CheckForEndTimesAndFreezeL(this);
hgs
parents:
diff changeset
   607
    return ETrue;
hgs
parents:
diff changeset
   608
    }
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
//
hgs
parents:
diff changeset
   612
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   613
//
hgs
parents:
diff changeset
   614
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   615
void CSvgAnimateMotionElementImpl::ResetAnimationL()
hgs
parents:
diff changeset
   616
    {
hgs
parents:
diff changeset
   617
    TFloatFixPt  tmpcoords[6];
hgs
parents:
diff changeset
   618
hgs
parents:
diff changeset
   619
    // Path iterator
hgs
parents:
diff changeset
   620
    if ( iPathIterator )
hgs
parents:
diff changeset
   621
        {
hgs
parents:
diff changeset
   622
        delete iPathIterator;
hgs
parents:
diff changeset
   623
        iPathIterator = NULL;
hgs
parents:
diff changeset
   624
        }
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
    iPathIterator = CGfxFlatteningPathIterator::NewL( iMotionPath,
hgs
parents:
diff changeset
   627
                                                      &iIdentTransform,
hgs
parents:
diff changeset
   628
                                                      3 );
hgs
parents:
diff changeset
   629
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
    // path length
hgs
parents:
diff changeset
   632
    iPathIterator->CurrentSegment( tmpcoords );
hgs
parents:
diff changeset
   633
    iCurrentSeg.iX1 = tmpcoords[0];
hgs
parents:
diff changeset
   634
    iCurrentSeg.iY1 = tmpcoords[1];
hgs
parents:
diff changeset
   635
    iCurrentSeg.iX2 = tmpcoords[0];
hgs
parents:
diff changeset
   636
    iCurrentSeg.iY2 = tmpcoords[1];
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
    iSubLength = -1;
hgs
parents:
diff changeset
   639
    iCurrentPos = 0;
hgs
parents:
diff changeset
   640
    iSubPos = 0;
hgs
parents:
diff changeset
   641
    }
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   644
//
hgs
parents:
diff changeset
   645
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   646
void CSvgAnimateMotionElementImpl::InitAnimationL()
hgs
parents:
diff changeset
   647
    {
hgs
parents:
diff changeset
   648
	if(!iTargetElement)
hgs
parents:
diff changeset
   649
		{
hgs
parents:
diff changeset
   650
		// if target element is not found then remove it.
hgs
parents:
diff changeset
   651
		((CSvgDocumentImpl*)iOwnerDocument)->RemoveFromEventReceiverList(this);
hgs
parents:
diff changeset
   652
		((CSvgDocumentImpl*)iOwnerDocument)->Engine()->UpdatePresentation(1);
hgs
parents:
diff changeset
   653
		return;
hgs
parents:
diff changeset
   654
		}
hgs
parents:
diff changeset
   655
hgs
parents:
diff changeset
   656
    TFloatFixPt len;
hgs
parents:
diff changeset
   657
    TFloatFixPt lx, ly;
hgs
parents:
diff changeset
   658
    TFloatFixPt dx, dy, int0x7f( KMAXFLOATFIX );
hgs
parents:
diff changeset
   659
    // Create values of distance from start point on motion path
hgs
parents:
diff changeset
   660
    TFloatFixPt  tmpcoords[6];
hgs
parents:
diff changeset
   661
        {
hgs
parents:
diff changeset
   662
        CGfxGeneralPath*    path    = CGfxGeneralPath::NewLC();
hgs
parents:
diff changeset
   663
        CGfxPathIterator*   itr;
hgs
parents:
diff changeset
   664
        iMotionPath->GetPathIteratorL( &iIdentTransform, itr );
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
        CleanupStack::PushL( itr );
hgs
parents:
diff changeset
   667
        TFloatFixPt  length;
hgs
parents:
diff changeset
   668
		iValuesFloat->Reset();
hgs
parents:
diff changeset
   669
        while ( !itr->IsDone() )
hgs
parents:
diff changeset
   670
            {
hgs
parents:
diff changeset
   671
            switch ( itr->CurrentSegment( tmpcoords ) )
hgs
parents:
diff changeset
   672
                {
hgs
parents:
diff changeset
   673
                case EGfxSegMoveTo:
hgs
parents:
diff changeset
   674
                path->MoveToL( tmpcoords[0], tmpcoords[1], ETrue );
hgs
parents:
diff changeset
   675
                lx = tmpcoords[0];
hgs
parents:
diff changeset
   676
                ly = tmpcoords[1];
hgs
parents:
diff changeset
   677
                len = TSvgPathDataParser::PathLengthL( path );
hgs
parents:
diff changeset
   678
                break;
hgs
parents:
diff changeset
   679
                case EGfxSegLineTo:
hgs
parents:
diff changeset
   680
                path->LineToL( tmpcoords[0], tmpcoords[1], ETrue );
hgs
parents:
diff changeset
   681
                dx = lx - tmpcoords[0];
hgs
parents:
diff changeset
   682
                dy = ly - tmpcoords[1];
hgs
parents:
diff changeset
   683
                if ( dx > int0x7f || dy > int0x7f )
hgs
parents:
diff changeset
   684
                    {
hgs
parents:
diff changeset
   685
                    // calculate as integer
hgs
parents:
diff changeset
   686
                    TInt32 tmplen, tx, ty;
hgs
parents:
diff changeset
   687
                    tx = ( TInt32 ) dx;
hgs
parents:
diff changeset
   688
                    ty = ( TInt32 ) dy;
hgs
parents:
diff changeset
   689
	#ifdef SVG_FLOAT_BUILD
hgs
parents:
diff changeset
   690
                    tmplen = TFloatFixPt::Sqrt(tx * tx + ty * ty);
hgs
parents:
diff changeset
   691
	#else
hgs
parents:
diff changeset
   692
                    tmplen = TFloatFixPt::FixedSqrtGeneral( tx * tx + ty * ty, 0 );
hgs
parents:
diff changeset
   693
	#endif
hgs
parents:
diff changeset
   694
                    len += TFloatFixPt( tmplen );
hgs
parents:
diff changeset
   695
                    }
hgs
parents:
diff changeset
   696
                else
hgs
parents:
diff changeset
   697
                    {
hgs
parents:
diff changeset
   698
                    // calculate as TFixPt
hgs
parents:
diff changeset
   699
	
hgs
parents:
diff changeset
   700
                    len += TFloatFixPt::Sqrt( dx * dx + dy * dy );
hgs
parents:
diff changeset
   701
                    }
hgs
parents:
diff changeset
   702
                lx = tmpcoords[0];
hgs
parents:
diff changeset
   703
                ly = tmpcoords[1];
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
                break;
hgs
parents:
diff changeset
   706
                case EGfxSegQuadTo:
hgs
parents:
diff changeset
   707
                path->QuadToL( tmpcoords[0],
hgs
parents:
diff changeset
   708
                               tmpcoords[1],
hgs
parents:
diff changeset
   709
                               tmpcoords[2],
hgs
parents:
diff changeset
   710
                               tmpcoords[3],
hgs
parents:
diff changeset
   711
                               ETrue );
hgs
parents:
diff changeset
   712
                len = TSvgPathDataParser::PathLengthL( path );
hgs
parents:
diff changeset
   713
                break;
hgs
parents:
diff changeset
   714
                case EGfxSegCubicTo:
hgs
parents:
diff changeset
   715
                path->CubicToL( tmpcoords[0],
hgs
parents:
diff changeset
   716
                                tmpcoords[1],
hgs
parents:
diff changeset
   717
                                tmpcoords[2],
hgs
parents:
diff changeset
   718
                                tmpcoords[3],
hgs
parents:
diff changeset
   719
                                tmpcoords[4],
hgs
parents:
diff changeset
   720
                                tmpcoords[5],
hgs
parents:
diff changeset
   721
                                ETrue );
hgs
parents:
diff changeset
   722
                len = TSvgPathDataParser::PathLengthL( path );
hgs
parents:
diff changeset
   723
                break;
hgs
parents:
diff changeset
   724
                case EGfxSegClose:
hgs
parents:
diff changeset
   725
                path->LineToL( tmpcoords[0], tmpcoords[1], ETrue );
hgs
parents:
diff changeset
   726
                len = TSvgPathDataParser::PathLengthL( path );
hgs
parents:
diff changeset
   727
				break;
hgs
parents:
diff changeset
   728
                }
hgs
parents:
diff changeset
   729
hgs
parents:
diff changeset
   730
            length = len;
hgs
parents:
diff changeset
   731
            //length = TSvgPathDataParser::PathLengthL( path );
hgs
parents:
diff changeset
   732
            iValuesFloat->AppendL( length );
hgs
parents:
diff changeset
   733
            itr->NextL();
hgs
parents:
diff changeset
   734
            }
hgs
parents:
diff changeset
   735
        CleanupStack::PopAndDestroy( 2 ); // path, itr
hgs
parents:
diff changeset
   736
        }
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
    CSvgAnimationBase::InitAnimationL();
hgs
parents:
diff changeset
   739
    if(!iKeyTimesPresent)
hgs
parents:
diff changeset
   740
    iAnimTime->CreateKeyTime( iMotionPath->PointTypeArray()->Count() );
hgs
parents:
diff changeset
   741
    iAnimTime->PrepareTimeL( iValuesFloat );
hgs
parents:
diff changeset
   742
	SetFillValueL();
hgs
parents:
diff changeset
   743
    this->ResetAnimationL();
hgs
parents:
diff changeset
   744
    }
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
hgs
parents:
diff changeset
   747
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   748
//
hgs
parents:
diff changeset
   749
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   750
void CSvgAnimateMotionElementImpl::SetFillValueL()
hgs
parents:
diff changeset
   751
    {
hgs
parents:
diff changeset
   752
    iPrevRotate = 0;
hgs
parents:
diff changeset
   753
    MSvgTransformList* trList = NULL;
hgs
parents:
diff changeset
   754
    if ( iTargetElement )
hgs
parents:
diff changeset
   755
        {
hgs
parents:
diff changeset
   756
        ((CSvgElementImpl*)iTargetElement)->GetTransform( trList );
hgs
parents:
diff changeset
   757
        TInt32 matrixIndex = -1;
hgs
parents:
diff changeset
   758
        iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex );
hgs
parents:
diff changeset
   759
        ((CSvgElementImpl*)iTargetElement)->GetTransform( trList );
hgs
parents:
diff changeset
   760
        if ( trList && matrixIndex != -1 )
hgs
parents:
diff changeset
   761
            {
hgs
parents:
diff changeset
   762
            iFillMatrix = trList->GetItem(matrixIndex);
hgs
parents:
diff changeset
   763
            }
hgs
parents:
diff changeset
   764
        }
hgs
parents:
diff changeset
   765
    }
hgs
parents:
diff changeset
   766
hgs
parents:
diff changeset
   767
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   768
//
hgs
parents:
diff changeset
   769
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   770
void CSvgAnimateMotionElementImpl::SetToOriginalL()
hgs
parents:
diff changeset
   771
    {
hgs
parents:
diff changeset
   772
    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   773
    TInt32              matrixIndex;
hgs
parents:
diff changeset
   774
	if (iTargetElement == NULL)
hgs
parents:
diff changeset
   775
		{
hgs
parents:
diff changeset
   776
		return;
hgs
parents:
diff changeset
   777
		}
hgs
parents:
diff changeset
   778
    iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex );
hgs
parents:
diff changeset
   779
    ( ( CSvgElementImpl * ) iTargetElement )->GetTransform( trList );
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
hgs
parents:
diff changeset
   782
        trList->ReplaceItem( iFillMatrix, matrixIndex );
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
hgs
parents:
diff changeset
   785
    }
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   788
//
hgs
parents:
diff changeset
   789
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   790
void CSvgAnimateMotionElementImpl::SetToInitialValueL()
hgs
parents:
diff changeset
   791
    {
hgs
parents:
diff changeset
   792
    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   793
    TInt32              matrixIndex;
hgs
parents:
diff changeset
   794
    iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex );
hgs
parents:
diff changeset
   795
    ( ( CSvgElementImpl * ) iTargetElement )->GetTransform( trList );
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
    if( iAdditive == KAdditiveSum)
hgs
parents:
diff changeset
   798
    	{
hgs
parents:
diff changeset
   799
        TGfxAffineTransform curMatrix = trList->GetItem( matrixIndex );
hgs
parents:
diff changeset
   800
        curMatrix.Concatenate(iFillMatrix);
hgs
parents:
diff changeset
   801
       	trList->ReplaceItem( curMatrix, matrixIndex );
hgs
parents:
diff changeset
   802
    	}
hgs
parents:
diff changeset
   803
    else
hgs
parents:
diff changeset
   804
    	{
hgs
parents:
diff changeset
   805
         trList->ReplaceItem( iFillMatrix, matrixIndex );
hgs
parents:
diff changeset
   806
    	}
hgs
parents:
diff changeset
   807
    }
hgs
parents:
diff changeset
   808
hgs
parents:
diff changeset
   809
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   810
//
hgs
parents:
diff changeset
   811
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   812
void CSvgAnimateMotionElementImpl::SetToEndValueL()
hgs
parents:
diff changeset
   813
    {
hgs
parents:
diff changeset
   814
    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   815
    TInt32              matrixIndex;
hgs
parents:
diff changeset
   816
    iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex );
hgs
parents:
diff changeset
   817
    ( ( CSvgElementImpl * ) iTargetElement )->GetTransform( trList );
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
	 if( iAdditive == KAdditiveSum)
hgs
parents:
diff changeset
   820
    	{
hgs
parents:
diff changeset
   821
        TGfxAffineTransform curMatrix = trList->GetItem( matrixIndex );
hgs
parents:
diff changeset
   822
        curMatrix.Concatenate(iEndMatrix);
hgs
parents:
diff changeset
   823
       	trList->ReplaceItem( curMatrix, matrixIndex );
hgs
parents:
diff changeset
   824
    	}
hgs
parents:
diff changeset
   825
    else
hgs
parents:
diff changeset
   826
    	{
hgs
parents:
diff changeset
   827
         trList->ReplaceItem( iEndMatrix, matrixIndex );
hgs
parents:
diff changeset
   828
    	}
hgs
parents:
diff changeset
   829
    }
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   832
//
hgs
parents:
diff changeset
   833
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   834
void CSvgAnimateMotionElementImpl::SetAccumulateValues()
hgs
parents:
diff changeset
   835
    {
hgs
parents:
diff changeset
   836
    TFloatFixPt              lDelta;
hgs
parents:
diff changeset
   837
	if(iHaveBy)
hgs
parents:
diff changeset
   838
		{
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
		lDelta = iToFloatX - iFromFloatX;
hgs
parents:
diff changeset
   841
	    iToFloatX = iToFloatX + lDelta;
hgs
parents:
diff changeset
   842
	    iFromFloatX = iFromFloatX + lDelta;
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
	    lDelta = iToFloatY - iFromFloatY;
hgs
parents:
diff changeset
   845
	    iToFloatY = iToFloatY + lDelta;
hgs
parents:
diff changeset
   846
	    iFromFloatY = iFromFloatY + lDelta;
hgs
parents:
diff changeset
   847
hgs
parents:
diff changeset
   848
		}
hgs
parents:
diff changeset
   849
	else
hgs
parents:
diff changeset
   850
		{
hgs
parents:
diff changeset
   851
	    lDelta = iToFloatX - iFromFloatX;
hgs
parents:
diff changeset
   852
	    iFromFloatX = iToFloatX + iOrgFromFloatX;
hgs
parents:
diff changeset
   853
	    iToFloatX = iFromFloatX + lDelta;
hgs
parents:
diff changeset
   854
hgs
parents:
diff changeset
   855
	    lDelta = iToFloatY - iFromFloatY;
hgs
parents:
diff changeset
   856
	    iFromFloatY = iToFloatY + iOrgFromFloatY;
hgs
parents:
diff changeset
   857
	    iToFloatY = iFromFloatY + lDelta;
hgs
parents:
diff changeset
   858
	    }
hgs
parents:
diff changeset
   859
    }
hgs
parents:
diff changeset
   860
hgs
parents:
diff changeset
   861
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   862
// From MXmlElementOpt
hgs
parents:
diff changeset
   863
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   864
TInt CSvgAnimateMotionElementImpl::GetAttributePath( const TInt /* aNameId */,
hgs
parents:
diff changeset
   865
                                                     CGfxGeneralPath*& /* aValue */ )
hgs
parents:
diff changeset
   866
    {
hgs
parents:
diff changeset
   867
    return KErrNoAttribute;
hgs
parents:
diff changeset
   868
    }
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   871
//
hgs
parents:
diff changeset
   872
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   873
TInt CSvgAnimateMotionElementImpl::SetAttributePathL( const TInt aNameId,
hgs
parents:
diff changeset
   874
                                                      CGfxGeneralPath* aValue )
hgs
parents:
diff changeset
   875
    {
hgs
parents:
diff changeset
   876
    if ( aNameId == KAtrData )
hgs
parents:
diff changeset
   877
        {
hgs
parents:
diff changeset
   878
        iMotionPath->Reset();
hgs
parents:
diff changeset
   879
        CGfxPathIterator*   lIter   = NULL;
hgs
parents:
diff changeset
   880
        aValue->GetPathIteratorL( &iIdentTransform, lIter );
hgs
parents:
diff changeset
   881
        CleanupStack::PushL( lIter );
hgs
parents:
diff changeset
   882
        iMotionPath->AppendL( lIter );
hgs
parents:
diff changeset
   883
        CleanupStack::PopAndDestroy( 1 ); //lIter
hgs
parents:
diff changeset
   884
        }
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
    return KErrNone;
hgs
parents:
diff changeset
   887
    }
hgs
parents:
diff changeset
   888
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   891
// Functions used by Decoder
hgs
parents:
diff changeset
   892
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   893
TInt CSvgAnimateMotionElementImpl::SetAttributePathRef( const TInt aNameId,
hgs
parents:
diff changeset
   894
                                              CGfxGeneralPath*&  aValue  )
hgs
parents:
diff changeset
   895
    {
hgs
parents:
diff changeset
   896
	iIsMotionPath= EFalse;
hgs
parents:
diff changeset
   897
    if ( aNameId == KAtrAnimateMotion )
hgs
parents:
diff changeset
   898
        {
hgs
parents:
diff changeset
   899
		if(iMotionPath)
hgs
parents:
diff changeset
   900
			{
hgs
parents:
diff changeset
   901
			delete iMotionPath;
hgs
parents:
diff changeset
   902
			iMotionPath= NULL;
hgs
parents:
diff changeset
   903
			}
hgs
parents:
diff changeset
   904
		iMotionPath= aValue;
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
		if((iMotionPath->PointTypeArray())->Count() != 0 )
hgs
parents:
diff changeset
   907
			{
hgs
parents:
diff changeset
   908
			CGfxPathIterator*   itr = NULL;
hgs
parents:
diff changeset
   909
			TFloatFixPt              tmpcoords[6];
hgs
parents:
diff changeset
   910
			TRAPD( error,iMotionPath->GetPathIteratorL( &iIdentTransform, itr ) );
hgs
parents:
diff changeset
   911
			if (error!= KErrNone)
hgs
parents:
diff changeset
   912
				{
hgs
parents:
diff changeset
   913
				return error;
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
			while ( !itr->IsDone() )
hgs
parents:
diff changeset
   919
				{
hgs
parents:
diff changeset
   920
				switch ( itr->CurrentSegment( tmpcoords ) )
hgs
parents:
diff changeset
   921
					{
hgs
parents:
diff changeset
   922
					case EGfxSegMoveTo:
hgs
parents:
diff changeset
   923
					iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
   924
					iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   925
					break;
hgs
parents:
diff changeset
   926
					case EGfxSegLineTo:
hgs
parents:
diff changeset
   927
					iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
   928
					iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   929
					break;
hgs
parents:
diff changeset
   930
					case EGfxSegQuadTo:
hgs
parents:
diff changeset
   931
					iToFloatX = tmpcoords[2];
hgs
parents:
diff changeset
   932
					iToFloatY = tmpcoords[3];
hgs
parents:
diff changeset
   933
					break;
hgs
parents:
diff changeset
   934
					case EGfxSegCubicTo:
hgs
parents:
diff changeset
   935
					iToFloatX = tmpcoords[4];
hgs
parents:
diff changeset
   936
					iToFloatY = tmpcoords[5];
hgs
parents:
diff changeset
   937
					break;
hgs
parents:
diff changeset
   938
					case EGfxSegClose:
hgs
parents:
diff changeset
   939
					iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
   940
					iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
   941
                    }
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
                TRAPD( error, itr->NextL() );
hgs
parents:
diff changeset
   944
                if ( error != KErrNone )
hgs
parents:
diff changeset
   945
                    {
hgs
parents:
diff changeset
   946
                    delete itr;
hgs
parents:
diff changeset
   947
                    return KErrNone;
hgs
parents:
diff changeset
   948
                    }
hgs
parents:
diff changeset
   949
                }
hgs
parents:
diff changeset
   950
hgs
parents:
diff changeset
   951
            delete itr;
hgs
parents:
diff changeset
   952
            itr= NULL;
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
hgs
parents:
diff changeset
   955
     		RArray<TFloatFixPt>* lArrayFix;
hgs
parents:
diff changeset
   956
			lArrayFix= iMotionPath->PointCoordsArrayAll();
hgs
parents:
diff changeset
   957
			if (lArrayFix)
hgs
parents:
diff changeset
   958
				{
hgs
parents:
diff changeset
   959
				iOrgFromFloatX = iFromFloatX = lArrayFix->operator[](0);
hgs
parents:
diff changeset
   960
				iOrgFromFloatY = iFromFloatY = lArrayFix->operator[](1);
hgs
parents:
diff changeset
   961
				}
hgs
parents:
diff changeset
   962
hgs
parents:
diff changeset
   963
			}
hgs
parents:
diff changeset
   964
		}
hgs
parents:
diff changeset
   965
hgs
parents:
diff changeset
   966
    else
hgs
parents:
diff changeset
   967
        {
hgs
parents:
diff changeset
   968
        return KErrNoAttribute;
hgs
parents:
diff changeset
   969
        }
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
    return KErrNone;
hgs
parents:
diff changeset
   972
    }
hgs
parents:
diff changeset
   973
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   974
// Functions used by Decoder
hgs
parents:
diff changeset
   975
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   976
void CSvgAnimateMotionElementImpl::SetAnimRotate(TInt16 aRotate)
hgs
parents:
diff changeset
   977
	{
hgs
parents:
diff changeset
   978
	iAnimMotionRotate= aRotate;
hgs
parents:
diff changeset
   979
	}
hgs
parents:
diff changeset
   980
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   981
// Functions used by Decoder
hgs
parents:
diff changeset
   982
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   983
TInt CSvgAnimateMotionElementImpl::SetAttributeIntL( const TInt aNameId, const TInt32 aValue)
hgs
parents:
diff changeset
   984
{
hgs
parents:
diff changeset
   985
	if(aNameId == KAtrRotate)
hgs
parents:
diff changeset
   986
		{
hgs
parents:
diff changeset
   987
		iAnimMotionRotate = (TInt16)aValue;
hgs
parents:
diff changeset
   988
		return KErrNone;
hgs
parents:
diff changeset
   989
		}
hgs
parents:
diff changeset
   990
	return CSvgAnimationBase::SetAttributeIntL(aNameId,aValue);
hgs
parents:
diff changeset
   991
}
hgs
parents:
diff changeset
   992
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   993
// Functions used by Decoder
hgs
parents:
diff changeset
   994
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   995
TInt CSvgAnimateMotionElementImpl::GetAttributeIntL( const TInt aNameId, TInt32& aValue )
hgs
parents:
diff changeset
   996
{
hgs
parents:
diff changeset
   997
	if(aNameId == KAtrRotate)
hgs
parents:
diff changeset
   998
		{
hgs
parents:
diff changeset
   999
		aValue = (TInt)(iAnimMotionRotate);
hgs
parents:
diff changeset
  1000
		return KErrNone;
hgs
parents:
diff changeset
  1001
		}
hgs
parents:
diff changeset
  1002
	return CSvgAnimationBase::GetAttributeIntL(aNameId,aValue);
hgs
parents:
diff changeset
  1003
}
hgs
parents:
diff changeset
  1004
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1005
// Functions used by Decoder
hgs
parents:
diff changeset
  1006
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1007
TInt CSvgAnimateMotionElementImpl::SetAttributeFloatL(const TInt aNameId, TFloatFixPt aValue )
hgs
parents:
diff changeset
  1008
{
hgs
parents:
diff changeset
  1009
	return CSvgAnimationBase::SetAttributeFloatL(aNameId,aValue);
hgs
parents:
diff changeset
  1010
}
hgs
parents:
diff changeset
  1011
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1012
// Functions used by Decoder
hgs
parents:
diff changeset
  1013
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1014
TInt CSvgAnimateMotionElementImpl::GetAttributeFloat(const TInt aNameId, TFloatFixPt& aValue )
hgs
parents:
diff changeset
  1015
{
hgs
parents:
diff changeset
  1016
	return CSvgAnimationBase::GetAttributeFloat(aNameId,aValue);
hgs
parents:
diff changeset
  1017
}
hgs
parents:
diff changeset
  1018
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1019
// Functions used by Decoder
hgs
parents:
diff changeset
  1020
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1021
void CSvgAnimateMotionElementImpl::ReInitializeAnimation()
hgs
parents:
diff changeset
  1022
    {
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
	if ( iAttrId == 0xffff )
hgs
parents:
diff changeset
  1025
        return;
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
	if( iCurrentRepeatCount > 0 && iAccumulate == KAccumSum )
hgs
parents:
diff changeset
  1028
		{
hgs
parents:
diff changeset
  1029
		iFromFloatX= iOrgFromFloatX;
hgs
parents:
diff changeset
  1030
		iFromFloatY= iOrgFromFloatY;
hgs
parents:
diff changeset
  1031
		iToFloatX= iOrgToFloatX;
hgs
parents:
diff changeset
  1032
		iToFloatY= iOrgToFloatY;
hgs
parents:
diff changeset
  1033
		}
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
    CSvgAnimationBase::ReInitializeAnimation();
hgs
parents:
diff changeset
  1036
hgs
parents:
diff changeset
  1037
	iCurrentSeg.iX1 = (TFloatFixPt) 0;
hgs
parents:
diff changeset
  1038
	iCurrentSeg.iX2 = (TFloatFixPt) 0;
hgs
parents:
diff changeset
  1039
	iCurrentSeg.iY1 = (TFloatFixPt) 0;
hgs
parents:
diff changeset
  1040
	iCurrentSeg.iY2 = (TFloatFixPt) 0;
hgs
parents:
diff changeset
  1041
	MSvgTransformList*  trList;
hgs
parents:
diff changeset
  1042
	TInt32              matrixIndex = 0;
hgs
parents:
diff changeset
  1043
hgs
parents:
diff changeset
  1044
	if (iTargetElement)
hgs
parents:
diff changeset
  1045
		{
hgs
parents:
diff changeset
  1046
		TRAPD(error ,iTargetElement->GetAttributeIntL( KAtrAnimMotionMatrixIndex, matrixIndex ));
hgs
parents:
diff changeset
  1047
		if ( error != KErrNone )
hgs
parents:
diff changeset
  1048
		   {
hgs
parents:
diff changeset
  1049
		   // ignore trap error
hgs
parents:
diff changeset
  1050
	      }
hgs
parents:
diff changeset
  1051
		( ( CSvgElementImpl * ) iTargetElement )->GetTransform( trList );
hgs
parents:
diff changeset
  1052
		if( trList && (trList->NumberOfItems() >  matrixIndex) )
hgs
parents:
diff changeset
  1053
			{
hgs
parents:
diff changeset
  1054
			trList->ReplaceItem( TGfxAffineTransform(), matrixIndex );
hgs
parents:
diff changeset
  1055
hgs
parents:
diff changeset
  1056
			trList->SetAdditive( iAdditive, matrixIndex );
hgs
parents:
diff changeset
  1057
			}
hgs
parents:
diff changeset
  1058
		}
hgs
parents:
diff changeset
  1059
	iFillMatrix= TGfxAffineTransform();
hgs
parents:
diff changeset
  1060
    }
hgs
parents:
diff changeset
  1061
hgs
parents:
diff changeset
  1062
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1063
//
hgs
parents:
diff changeset
  1064
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1065
void  CSvgAnimateMotionElementImpl::SetOriginalValues_DOMReuse()
hgs
parents:
diff changeset
  1066
	{
hgs
parents:
diff changeset
  1067
	iOrgToFloatX= iToFloatX;
hgs
parents:
diff changeset
  1068
	iOrgToFloatY= iToFloatY;
hgs
parents:
diff changeset
  1069
    // calling base class function.
hgs
parents:
diff changeset
  1070
	CSvgAnimationBase::SetOriginalValues_DOMReuse();
hgs
parents:
diff changeset
  1071
	}
hgs
parents:
diff changeset
  1072
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1073
// Functions used by Decoder
hgs
parents:
diff changeset
  1074
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1075
CGfxGeneralPath* CSvgAnimateMotionElementImpl::GetPathAttribute(TInt aAttributeId)
hgs
parents:
diff changeset
  1076
	{
hgs
parents:
diff changeset
  1077
	if(aAttributeId == KAtrPath)
hgs
parents:
diff changeset
  1078
		{
hgs
parents:
diff changeset
  1079
		return iMotionPath;
hgs
parents:
diff changeset
  1080
		}
hgs
parents:
diff changeset
  1081
	else
hgs
parents:
diff changeset
  1082
		{
hgs
parents:
diff changeset
  1083
		return CSvgAnimationBase::GetPathAttribute(aAttributeId);
hgs
parents:
diff changeset
  1084
		}
hgs
parents:
diff changeset
  1085
	}
hgs
parents:
diff changeset
  1086
hgs
parents:
diff changeset
  1087
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1088
//
hgs
parents:
diff changeset
  1089
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1090
void CSvgAnimateMotionElementImpl::SetPathAttribute(TInt aAttributeId, CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  1091
{
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
	if(aAttributeId == KAtrPath)
hgs
parents:
diff changeset
  1094
		{
hgs
parents:
diff changeset
  1095
		if(iMotionPath == aPathHandle)
hgs
parents:
diff changeset
  1096
			{
hgs
parents:
diff changeset
  1097
			return;
hgs
parents:
diff changeset
  1098
			}
hgs
parents:
diff changeset
  1099
		delete iMotionPath;
hgs
parents:
diff changeset
  1100
		iMotionPath = aPathHandle;
hgs
parents:
diff changeset
  1101
hgs
parents:
diff changeset
  1102
		CGfxPathIterator*   itr = NULL;
hgs
parents:
diff changeset
  1103
        TFloatFixPt              tmpcoords[6];
hgs
parents:
diff changeset
  1104
        TRAPD(error ,iMotionPath->GetPathIteratorL( &iIdentTransform, itr ));
hgs
parents:
diff changeset
  1105
        if ( error != KErrNone )
hgs
parents:
diff changeset
  1106
		   {
hgs
parents:
diff changeset
  1107
		   // ignore trap error
hgs
parents:
diff changeset
  1108
	       }
hgs
parents:
diff changeset
  1109
hgs
parents:
diff changeset
  1110
		if(itr)
hgs
parents:
diff changeset
  1111
			{
hgs
parents:
diff changeset
  1112
        while ( !itr->IsDone() )
hgs
parents:
diff changeset
  1113
            {
hgs
parents:
diff changeset
  1114
            switch ( itr->CurrentSegment( tmpcoords ) )
hgs
parents:
diff changeset
  1115
                {
hgs
parents:
diff changeset
  1116
                case EGfxSegMoveTo:
hgs
parents:
diff changeset
  1117
                iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
  1118
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
  1119
                break;
hgs
parents:
diff changeset
  1120
                case EGfxSegLineTo:
hgs
parents:
diff changeset
  1121
                iToFloatX = tmpcoords[0];
hgs
parents:
diff changeset
  1122
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
  1123
                break;
hgs
parents:
diff changeset
  1124
                case EGfxSegQuadTo:
hgs
parents:
diff changeset
  1125
                iToFloatX = tmpcoords[2];
hgs
parents:
diff changeset
  1126
                iToFloatY = tmpcoords[3];
hgs
parents:
diff changeset
  1127
                break;
hgs
parents:
diff changeset
  1128
                case EGfxSegCubicTo:
hgs
parents:
diff changeset
  1129
                iToFloatX = tmpcoords[4];
hgs
parents:
diff changeset
  1130
                iToFloatY = tmpcoords[5];
hgs
parents:
diff changeset
  1131
                break;
hgs
parents:
diff changeset
  1132
                case EGfxSegClose:
hgs
parents:
diff changeset
  1133
                iToFloatX = tmpcoords[0]; //.
hgs
parents:
diff changeset
  1134
                iToFloatY = tmpcoords[1];
hgs
parents:
diff changeset
  1135
                    }
hgs
parents:
diff changeset
  1136
                TRAPD( error, itr->NextL() );
hgs
parents:
diff changeset
  1137
                if ( error != KErrNone )
hgs
parents:
diff changeset
  1138
                    {
hgs
parents:
diff changeset
  1139
                    delete itr;
hgs
parents:
diff changeset
  1140
                    return;
hgs
parents:
diff changeset
  1141
                    }
hgs
parents:
diff changeset
  1142
                }
hgs
parents:
diff changeset
  1143
hgs
parents:
diff changeset
  1144
			delete itr;
hgs
parents:
diff changeset
  1145
			}
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
		RArray<TFloatFixPt>* lArrayFix;
hgs
parents:
diff changeset
  1148
		lArrayFix= iMotionPath->PointCoordsArrayAll();
hgs
parents:
diff changeset
  1149
		if (lArrayFix)
hgs
parents:
diff changeset
  1150
			{
hgs
parents:
diff changeset
  1151
			iOrgFromFloatX = iFromFloatX = lArrayFix->operator[](0);
hgs
parents:
diff changeset
  1152
			iOrgFromFloatY = iFromFloatY = lArrayFix->operator[](1);
hgs
parents:
diff changeset
  1153
			}
hgs
parents:
diff changeset
  1154
hgs
parents:
diff changeset
  1155
		}
hgs
parents:
diff changeset
  1156
	else
hgs
parents:
diff changeset
  1157
		{
hgs
parents:
diff changeset
  1158
		CSvgAnimationBase::SetPathAttribute(aAttributeId, aPathHandle);
hgs
parents:
diff changeset
  1159
		}
hgs
parents:
diff changeset
  1160
}
hgs
parents:
diff changeset
  1161
hgs
parents:
diff changeset
  1162
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1163
//
hgs
parents:
diff changeset
  1164
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1165
void CSvgAnimateMotionElementImpl::Reset(MSvgEvent* aEvent)
hgs
parents:
diff changeset
  1166
{
hgs
parents:
diff changeset
  1167
	iIsUserSeek = ETrue;
hgs
parents:
diff changeset
  1168
	// first call the animation base function.
hgs
parents:
diff changeset
  1169
	TSvgTimerEvent* timerEvent  = ( TSvgTimerEvent* ) aEvent;
hgs
parents:
diff changeset
  1170
	if((TInt32)timerEvent->Time() < iAbsoluteBeginTime)
hgs
parents:
diff changeset
  1171
		{
hgs
parents:
diff changeset
  1172
		// let it come to initial position.
hgs
parents:
diff changeset
  1173
		((CSvgDocumentImpl*)iOwnerDocument)->iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  1174
		ReInitializeAnimation();
hgs
parents:
diff changeset
  1175
		return;
hgs
parents:
diff changeset
  1176
		}
hgs
parents:
diff changeset
  1177
	TRAPD(error,CSvgAnimationBase::ResetL( aEvent, this));
hgs
parents:
diff changeset
  1178
hgs
parents:
diff changeset
  1179
	if (error != KErrNone)
hgs
parents:
diff changeset
  1180
	{
hgs
parents:
diff changeset
  1181
		// error processing not processed
hgs
parents:
diff changeset
  1182
		return;
hgs
parents:
diff changeset
  1183
	}
hgs
parents:
diff changeset
  1184
}
hgs
parents:
diff changeset
  1185
hgs
parents:
diff changeset
  1186
hgs
parents:
diff changeset
  1187
/////////////////////////////////////////////
hgs
parents:
diff changeset
  1188
MXmlElement* CSvgAnimateMotionElementImpl::CloneL(MXmlElement*
hgs
parents:
diff changeset
  1189
aParentElement)
hgs
parents:
diff changeset
  1190
	{
hgs
parents:
diff changeset
  1191
	CSvgAnimateMotionElementImpl* newElement = CSvgAnimateMotionElementImpl::NewL(  this->ElemID(),
hgs
parents:
diff changeset
  1192
																((CSvgDocumentImpl*)iOwnerDocument) );
hgs
parents:
diff changeset
  1193
	CleanupStack::PushL( newElement );
hgs
parents:
diff changeset
  1194
	newElement->iParentNode = aParentElement;
hgs
parents:
diff changeset
  1195
	// copy the data
hgs
parents:
diff changeset
  1196
	// end copying data from this class.
hgs
parents:
diff changeset
  1197
	// this will get cloned setting the parent element to aParentElement;
hgs
parents:
diff changeset
  1198
	newElement->iOwnerDocument = this->iOwnerDocument;
hgs
parents:
diff changeset
  1199
	// set the target element this needs to be modified.
hgs
parents:
diff changeset
  1200
	newElement->iTargetElement = (CSvgElementImpl*)aParentElement;
hgs
parents:
diff changeset
  1201
	this->CopyL(newElement);
hgs
parents:
diff changeset
  1202
	CleanupStack::Pop();
hgs
parents:
diff changeset
  1203
	return newElement;
hgs
parents:
diff changeset
  1204
	}
hgs
parents:
diff changeset
  1205
hgs
parents:
diff changeset
  1206
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1207
//
hgs
parents:
diff changeset
  1208
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1209
void CSvgAnimateMotionElementImpl::CopyL(CSvgAnimateMotionElementImpl* aDestElement )
hgs
parents:
diff changeset
  1210
    {
hgs
parents:
diff changeset
  1211
	if(aDestElement)
hgs
parents:
diff changeset
  1212
	{
hgs
parents:
diff changeset
  1213
hgs
parents:
diff changeset
  1214
hgs
parents:
diff changeset
  1215
    // copy stuff from superclass
hgs
parents:
diff changeset
  1216
    this->CSvgAnimationBase::CopyL(aDestElement);
hgs
parents:
diff changeset
  1217
hgs
parents:
diff changeset
  1218
    // copy the reference to idoc (CSvgDocumentImpl)
hgs
parents:
diff changeset
  1219
    aDestElement->iOwnerDocument = this->iOwnerDocument;
hgs
parents:
diff changeset
  1220
hgs
parents:
diff changeset
  1221
    /*Need to check Test whether Copying is proper*/
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
	aDestElement->iFillMatrix = this->iFillMatrix;
hgs
parents:
diff changeset
  1224
	if(this->iMotionPath)
hgs
parents:
diff changeset
  1225
		{
hgs
parents:
diff changeset
  1226
		/*Motion Path and iPathIterator assignment needs to be checked.*/
hgs
parents:
diff changeset
  1227
        aDestElement->iMotionPath->Reset();
hgs
parents:
diff changeset
  1228
        aDestElement->iMotionPath->SetPointCoordsArrayL(this->iMotionPath->PointCoordsArrayAll());
hgs
parents:
diff changeset
  1229
        aDestElement->iMotionPath->SetPointTypeArrayL(this->iMotionPath->PointTypeArray());
hgs
parents:
diff changeset
  1230
        }
hgs
parents:
diff changeset
  1231
	aDestElement->iIdentTransform = this->iIdentTransform;
hgs
parents:
diff changeset
  1232
    aDestElement->iSubLength = this->iSubLength;
hgs
parents:
diff changeset
  1233
    aDestElement->iCurrentPos = this->iCurrentPos;
hgs
parents:
diff changeset
  1234
    aDestElement->iSubPos = this->iSubPos;
hgs
parents:
diff changeset
  1235
    aDestElement->iCurrentSeg = this->iCurrentSeg;
hgs
parents:
diff changeset
  1236
    aDestElement->iAnimMotionRotate = this->iAnimMotionRotate;
hgs
parents:
diff changeset
  1237
    aDestElement->iEndMatrix = this->iEndMatrix;
hgs
parents:
diff changeset
  1238
    //aDestElement->iIsValues = this->iIsValues;
hgs
parents:
diff changeset
  1239
    aDestElement->iToFloatX = this->iToFloatX;
hgs
parents:
diff changeset
  1240
    aDestElement->iToFloatY = this->iToFloatY;
hgs
parents:
diff changeset
  1241
    aDestElement->iFromFloatX = this->iFromFloatX;
hgs
parents:
diff changeset
  1242
    aDestElement->iFromFloatY = this->iFromFloatY;
hgs
parents:
diff changeset
  1243
    aDestElement->iOrgFromFloatX = this->iOrgFromFloatX;
hgs
parents:
diff changeset
  1244
    aDestElement->iOrgFromFloatY = this->iOrgFromFloatY;
hgs
parents:
diff changeset
  1245
		// for DOM Reuse
hgs
parents:
diff changeset
  1246
	aDestElement->iOrgToFloatX = this->iOrgToFloatX;
hgs
parents:
diff changeset
  1247
    aDestElement->iOrgToFloatY = this->iOrgToFloatY;
hgs
parents:
diff changeset
  1248
	aDestElement->iIsMotionPath = this->iIsMotionPath;
hgs
parents:
diff changeset
  1249
hgs
parents:
diff changeset
  1250
	if(this->iPathIterator)
hgs
parents:
diff changeset
  1251
		{
hgs
parents:
diff changeset
  1252
		aDestElement->ResetAnimationL();
hgs
parents:
diff changeset
  1253
		}
hgs
parents:
diff changeset
  1254
	}
hgs
parents:
diff changeset
  1255
   }
hgs
parents:
diff changeset
  1256
hgs
parents:
diff changeset
  1257
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1258
//
hgs
parents:
diff changeset
  1259
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1260
void CSvgAnimateMotionElementImpl::DeactivateAnimation()
hgs
parents:
diff changeset
  1261
{
hgs
parents:
diff changeset
  1262
CSvgAnimationBase::DeactivateAnimation(this);
hgs
parents:
diff changeset
  1263
}
hgs
parents:
diff changeset
  1264
hgs
parents:
diff changeset
  1265
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1266
//
hgs
parents:
diff changeset
  1267
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1268
TBool CSvgAnimateMotionElementImpl::DoAnimProcL(MSvgEvent* aEvent)
hgs
parents:
diff changeset
  1269
{
hgs
parents:
diff changeset
  1270
return this->AnimProcL((MSvgTimerEvent*)aEvent);
hgs
parents:
diff changeset
  1271
}
hgs
parents:
diff changeset
  1272
hgs
parents:
diff changeset
  1273
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1274
//
hgs
parents:
diff changeset
  1275
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1276
void CSvgAnimateMotionElementImpl::SetAccumulateValuesForSetMediaTime()
hgs
parents:
diff changeset
  1277
{
hgs
parents:
diff changeset
  1278
if(iAccumulate == KAccumSum )
hgs
parents:
diff changeset
  1279
		{
hgs
parents:
diff changeset
  1280
		iFromFloatX= iOrgFromFloatX;
hgs
parents:
diff changeset
  1281
		iFromFloatY= iOrgFromFloatY;
hgs
parents:
diff changeset
  1282
		iToFloatX= iOrgToFloatX;
hgs
parents:
diff changeset
  1283
		iToFloatY= iOrgToFloatY;
hgs
parents:
diff changeset
  1284
hgs
parents:
diff changeset
  1285
		TInt i=0;
hgs
parents:
diff changeset
  1286
		while(i < iCurrentRepeatCount )
hgs
parents:
diff changeset
  1287
			{
hgs
parents:
diff changeset
  1288
			SetAccumulateValues();
hgs
parents:
diff changeset
  1289
			i++;
hgs
parents:
diff changeset
  1290
			}
hgs
parents:
diff changeset
  1291
		}
hgs
parents:
diff changeset
  1292
}
hgs
parents:
diff changeset
  1293
hgs
parents:
diff changeset
  1294
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1295
//
hgs
parents:
diff changeset
  1296
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1297
void CSvgAnimateMotionElementImpl::Print( TBool aIsEncodeOn )
hgs
parents:
diff changeset
  1298
{
hgs
parents:
diff changeset
  1299
	if (!aIsEncodeOn)
hgs
parents:
diff changeset
  1300
	{
hgs
parents:
diff changeset
  1301
		#ifdef _DEBUG
hgs
parents:
diff changeset
  1302
		RDebug::Printf("<animateMotion calcMode=\"hmm\" xlink:href=\"hmm\" path=\"hmm\" keyPoints=\"hmm\" rotate=\"%d\"/>",
hgs
parents:
diff changeset
  1303
		/*Href(),*/ (int)iAnimMotionRotate);
hgs
parents:
diff changeset
  1304
		#endif
hgs
parents:
diff changeset
  1305
	}
hgs
parents:
diff changeset
  1306
}
hgs
parents:
diff changeset
  1307
hgs
parents:
diff changeset
  1308