svgtopt/SVG/SVGEngine/src/Svgdecoder.cpp
changeset 46 88edb906c587
child 19 df65ec4f2d28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/SVG/SVGEngine/src/Svgdecoder.cpp	Wed Nov 03 18:56:10 2010 +0200
@@ -0,0 +1,4422 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  SVG Engine source file
+ *
+*/
+
+#include <e32def.h>
+#include <e32base.h>
+#include <s32mem.h>
+#include "Svgdecoder.h"
+#include "SVGClrCssValueImpl.h"
+#include "SVGFloatCssValueImpl.h"
+#include "SVGIntCssValueImpl.h"
+#include "SVGStrCssValueImpl.h"
+#include "SVGVectorCssValueImpl.h"
+#include "GfxAffineTransform.h"
+#include "SVGTextElementImpl.h"
+#include "SVGFontFaceElementImpl.h"
+#include "SvgStopElementImpl.h"
+#include "SVGUseElementImpl.h"
+#include "SVGAnimationBase.h"
+#include "SVGAnimateMotionElementImpl.h"
+#include "SVGMpathElementImpl.h"
+#include "SVGGradientElementImpl.h"
+#include "SVGDiscardElementImpl.h"
+#include "SVGMediaElementBase.h"
+#include "SVGMediaAnimationElementImpl.h"
+#include "SVGTimedEntityInterface.h"
+#include "SVGAudioElementImpl.h"
+
+#include "SVGDocumentImpl.h"
+#include "SVGEngineImpl.h"
+#include "SVGMemoryManager.h"
+
+#include <languages.hrh>
+
+_LIT(OFFSET, "offset");
+_LIT(ZEROVALUE, "0");
+
+// --------------------------------------------------------------------------
+// CSvgDecoder* CSvgDecoder::NewL(const TDesC& aFileName )
+// ---------------------------------------------------------------------------
+CSvgDecoder* CSvgDecoder::NewL(const TDesC& aFileName )
+{
+	CSvgDecoder *self = new (ELeave) CSvgDecoder();
+
+	CleanupStack::PushL(self);
+
+    self->ConstructL(aFileName);
+
+	CleanupStack::Pop();
+
+	return self;
+}
+
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::ConstructL(const TDesC& aFileName)
+// ---------------------------------------------------------------------------
+void CSvgDecoder::ConstructL(const TDesC& aFileName)
+{
+	User::LeaveIfError(iFs.Connect() );
+	User::LeaveIfError (iFStream.Open(iFs, aFileName, EFileRead));
+	iStream= iFStream;
+
+	/*Arrays Added For forward referencing in USE and Animate elements*/
+	iUseElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iUseElementArray->Reset();
+
+	iAnimRefElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iAnimRefElementArray->Reset();
+}
+
+
+// --------------------------------------------------------------------------
+// CSvgDecoder* CSvgDecoder::NewL(const TDesC8& aByteData )
+// ---------------------------------------------------------------------------
+CSvgDecoder* CSvgDecoder::NewL(const TDesC8& aByteData )
+{
+	CSvgDecoder *self = new (ELeave) CSvgDecoder();
+
+	CleanupStack::PushL(self);
+
+    self->ConstructL(aByteData);
+
+	CleanupStack::Pop();
+
+	return self;
+}
+
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::ConstructL(const TDesC8& aByteData)
+// ---------------------------------------------------------------------------
+void CSvgDecoder::ConstructL(const TDesC8& aByteData)
+{
+	iDStream.Open(aByteData);
+	iStream= iDStream;
+
+	iUseElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iUseElementArray->Reset();
+
+	iAnimRefElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iAnimRefElementArray->Reset();
+
+	// added to hold switch element handles so we can go back and delete false children of the switch
+	iSwitchElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+    iSwitchElementArray->Reset();
+
+	// Arrays added to reset event listeners for animation element
+	iAnimationElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iAnimationElementArray->Reset();
+
+    //added to hold elements with required features, attributes, or sys language
+    //so we can go back and delete the ones that dont pass at the start.
+    iReqFetAttSysArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+	iReqFetAttSysArray->Reset();
+}
+
+
+// --------------------------------------------------------------------------
+// CSvgDecoder::CSvgDecoder()
+// ---------------------------------------------------------------------------
+CSvgDecoder::CSvgDecoder()
+		:iRootElement( NULL ),
+		 iIsAnimElement(EFalse),
+		 iIsFixPt(EFalse),
+		 iIsRGB(EFalse),
+		 iEmbeddedImagesCount(0)
+
+{
+}
+
+
+// --------------------------------------------------------------------------
+// CSvgDecoder::~CSvgDecoder()
+// ---------------------------------------------------------------------------
+CSvgDecoder::~CSvgDecoder()
+{
+	iStream.Close();
+	iDStream.Close();
+	iFStream.Close();
+
+	iFs.Close();
+
+	if(iUseElementArray)
+	    {
+		iUseElementArray->Reset();
+		iUseElementArray->Close();
+		delete iUseElementArray;
+		iUseElementArray = NULL;
+		}
+
+	if(iAnimRefElementArray)
+	    {
+		iAnimRefElementArray->Reset();
+		iAnimRefElementArray->Close();
+		delete iAnimRefElementArray;
+		iAnimRefElementArray = NULL;
+		}
+
+	if(iSwitchElementArray)
+        {
+        iSwitchElementArray->Close();
+        delete iSwitchElementArray;
+        }
+    if (iReqFetAttSysArray)
+        {
+        iReqFetAttSysArray->Close();
+        delete iReqFetAttSysArray;
+        }
+    if(iAnimationElementArray)
+        {
+		iAnimationElementArray->Reset();
+        iAnimationElementArray->Close();
+        delete iAnimationElementArray;
+        }
+    
+        iImageElements.Close();
+    
+}
+
+
+// --------------------------------------------------------------------------
+// TDesC& CSvgDecoder::DecodeTDesCLC()
+// ---------------------------------------------------------------------------
+TDesC& CSvgDecoder::DecodeTDesCLC()
+{
+
+	TUint8 lUniCodeLen = 2;
+
+	TUint8 uStrLen;
+	iStream >> uStrLen ;
+	HBufC *lBuf = NULL;
+
+	if (uStrLen)
+		{
+
+		lBuf = HBufC::NewLC(uStrLen/lUniCodeLen);
+        TPtr lTmp= lBuf->Des();
+    	iStream.ReadL (lTmp, (TInt)  (uStrLen/lUniCodeLen));
+		}
+
+	else
+		{
+		lBuf = HBufC::NewLC(0);
+		}
+
+		return (TDesC &) *lBuf;
+}
+
+// --------------------------------------------------------------------------
+// TDesC& CSvgDecoder::DecodeImageEmbeddedTDesCLC()
+// ---------------------------------------------------------------------------
+TDesC& CSvgDecoder::DecodeImageEmbeddedTDesCLC()
+{
+
+//	TUint8 lUniCodeLen = 2;
+
+	TInt32 lImageSize;
+	iStream >> lImageSize ;
+
+	HBufC *lBuf = NULL;
+    HBufC8* lBuffer =NULL;
+
+	if (lImageSize)
+		{
+        lBuffer = HBufC8::NewLC(lImageSize);
+        TPtr8 lTemp= lBuffer->Des();
+    	iStream.ReadL (lTemp, (TInt)  (lImageSize));
+
+		lBuf = HBufC::NewLC(lImageSize);
+        TPtr lTmp= lBuf->Des();
+        lTmp.Copy(lTemp);
+		}
+
+	else
+		{
+        lBuffer = HBufC8::NewLC(0);
+		lBuf = HBufC::NewLC(0);
+		}
+
+
+	return (TDesC &) *lBuf;
+}
+
+
+
+// ==========================================================================
+// Decodig Attribute
+// ==========================================================================
+TInt CSvgDecoder::DecodeAttributeL(const TUint16 aName)
+	{
+
+	if( DecodePresentationAttributeL (aName) ||
+		DecodeSVGTAttributeL (aName) ||
+		DecodeSvgElementAttributeL (aName) ||
+		DecodeIdAndXmlAttributeL ( aName ) ||
+		DecodeUriRefAttributeL ( aName ) ||
+		DecodeAnimationAttributeL (aName) ||
+		DecodeTransformAttributeL (aName) ||
+		DecodeLangSpaceAttributeL (aName) ||
+		DecodeTestAttributeL ( aName ) ||
+		DecodeDiscardAttributeL ( aName )
+	  )
+		{
+		return KErrNone;
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodePresentationAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodePresentationAttributeL(const TUint16 aName)
+	{
+
+	if(aName<=KCSS_MAX_ATTR)
+		{
+
+		if (aName== KCSS_ATTR_FILL )
+			{
+
+		    CCssValue* tParentValue = NULL;
+			CCssValue* tValue = NULL;
+
+			iCurrentElement->FindProperty (KCSS_ATTR_FILL,tValue);
+
+			if(iCurrentElement!= iRootElement)
+				{
+				iCurrentParentElement->FindProperty (KCSS_ATTR_FILL,tParentValue);
+				}
+
+			if (tParentValue == tValue || tValue == NULL)
+				{
+				if (iDocument)
+				{
+					tValue = iDocument->iMemoryManager->GetCssPaintObjectL(iCurrentElement);
+				}
+				SetPaintValueL (tValue);
+			    iCurrentElement->SetPresentationAttribute (KCSS_ATTR_FILL,tValue);
+				}
+			else
+				{
+				SetPaintValueL (tValue);
+				}
+
+			return ETrue;
+			}
+
+		if (aName== KCSS_ATTR_STROKE || aName== KCSS_ATTR_COLOR)
+			{
+		 	return DecodeColorCssValueL(aName);
+			}
+
+		if (aName== KCSS_ATTR_GROUP_OPACITY)
+			{
+			iDocument->iHasGroupOpacity = ETrue;
+			return DecodeFloatCssValueL(aName);
+			}
+		if (aName== KCSS_ATTR_FILL_OPACITY ||
+			aName== KCSS_ATTR_STROKE_OPACITY ||
+			aName== KCSS_ATTR_STROKEWIDTH ||
+			aName== KCSS_ATTR_FONTSIZE ||
+			aName== KCSS_ATTR_STROKE_MITERLIMIT ||
+			aName== KCSS_ATTR_STROKE_DASHOFFSET
+			)
+
+			{
+			return DecodeFloatCssValueL(aName);
+			}
+
+		if (aName== KCSS_ATTR_VISIBILITY ||
+			aName== KCSS_ATTR_FONTSTYLE ||
+			aName== KCSS_ATTR_FONTWEIGHT ||
+			aName== KCSS_ATTR_DISPLAY ||
+            aName== KCSS_ATTR_TEXTANCHOR ||
+			aName== KCSS_ATTR_TEXTDECORATION
+			)
+
+			{
+			return DecodeIntCssValueL(aName);
+			}
+
+		if (aName== KCSS_ATTR_FONTFAMILY ||
+			aName== KCSS_ATTR_FILLRULE ||
+			aName== KCSS_ATTR_STROKE_LINECAP ||
+			aName== KCSS_ATTR_STROKE_LINEJOIN
+			)
+
+			{
+			return DecodeStringCssValueL(aName);
+			}
+
+
+		if (aName== KCSS_ATTR_STROKE_DASHARRAY)
+			{
+			CArrayFix<TFloatFixPt>* lArrayFix;
+			TInt8 lCount;
+			iStream >> lCount;
+			if (lCount)
+				{
+				lArrayFix= new ( ELeave ) CArrayFixFlat<TFloatFixPt>( lCount );
+				}
+			else
+				{
+				lArrayFix= new ( ELeave ) CArrayFixFlat<TFloatFixPt>( 1 );
+				}
+
+			 CleanupStack::PushL(lArrayFix); //cleanup
+
+			TFloatFixPt lTempFix;
+			TReal32 lTempReal;
+			
+			for(TInt8 i=0; i<lCount; i++)
+				{
+					if (iIsFixPt)
+					{
+					//was encoded as fixed point
+					lTempFix.iValue = iStream.ReadInt32L();
+					lArrayFix->AppendL( lTempFix );	
+					}
+					else
+					{
+					//was encoded as floats
+					
+					iStream >> lTempReal;
+					lArrayFix->AppendL( (TFloatFixPt) lTempReal);	
+					}
+				}
+
+			CCssValue* tParentValue = NULL;
+		    CCssValue* tValue = NULL;
+
+			iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+			if(iCurrentElement!= iRootElement)
+				{
+				iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+				}
+
+            if ( tParentValue == tValue || tValue == NULL )
+                {
+                // This attribute is inherited from parent, or not 
+                // defined in parent
+                if ( iDocument )
+                    {
+                    // Create a new Vector object and clone lArrayFix
+                    tValue = iDocument->iMemoryManager->GetCssVectorObjectL( lArrayFix );
+                    // Associate tValue with the current element
+                    iCurrentElement->SetPresentationAttribute ( ( TInt8 ) aName,tValue );
+                    }
+                // tValue contains a copy of lArrayFix, hence lArrayFix is not needed
+                // anymore. 
+                // tValue is owned by the element.
+                CleanupStack::PopAndDestroy( lArrayFix ); //cleanup
+                }
+            else
+                {
+                // stroke dash array was already present in the element
+                // SetValueL function takes ownership of lArrayFix
+                ((CVectorCssValueImpl*)tValue)->SetValueL ( lArrayFix );
+                // No need to destroy lArrayFix as it is now owned 
+                // by the element.
+                CleanupStack::Pop( lArrayFix ); //cleanup
+                }
+
+
+			return ETrue;
+
+			}
+
+		else
+			{
+			return ETrue;
+			}
+
+		}
+
+	else
+		{
+		return EFalse;
+		}
+
+	}
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeSVGTAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeSVGTAttributeL(const TUint16 aName)
+	{
+
+	if( (iCurrentElement->ElemID() == KSvgSvgElement) &&
+      ( aName== KAtrWidth || aName== KAtrHeight ) )
+		{
+		TUint8 lFlag;
+		
+		iStream >> lFlag ;
+		
+		if (iIsFixPt)
+		{
+			TFloatFixPt lAtrValue;
+			lAtrValue.iValue = iStream.ReadInt32L();
+			
+				// Flag is used to ckech whether height and width are percentage or not.
+			if(lFlag)
+			{
+			    if(aName == KAtrWidth)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInPercentage = ETrue;
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInUserCoordinate = lAtrValue;
+			    }
+			    else if(aName == KAtrHeight)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInPercentage = ETrue;
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInUserCoordinate = lAtrValue;
+			    }
+			}
+			else
+			{
+			    if(aName == KAtrWidth)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInPercentage = EFalse;
+			    }
+			    else if(aName == KAtrHeight)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInPercentage = EFalse;
+			    }
+			iCurrentElement->SetAttributeFloatL( (TInt)aName, lAtrValue );
+			}
+		}
+		else
+		{
+			TReal32 lAtrValue;
+			iStream >> lAtrValue;
+			
+				// Flag is used to ckech whether height and width are percentage or not.
+			if(lFlag)
+			{
+			    if(aName == KAtrWidth)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInPercentage = ETrue;
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInUserCoordinate = lAtrValue;  
+			    }
+			    else if (aName == KAtrHeight)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInPercentage = ETrue;
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInUserCoordinate = lAtrValue;
+			    }
+
+			}
+			else
+			{
+			    if(aName == KAtrWidth)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iWidthInPercentage = EFalse;
+			    }
+			    else if(aName == KAtrHeight)
+			    {
+			        ((CSvgSvgElementImpl *)iCurrentElement)->iHeightInPercentage = EFalse;
+			    }   
+			iCurrentElement->SetAttributeFloatL( (TInt)aName, (TFloatFixPt)lAtrValue );
+			}
+		}
+		
+	    return ETrue;
+		}
+
+	if(iCurrentElement->ElemID() == KSvgTextElement)
+		{
+		if (aName== KAtrX || aName== KAtrY)
+			{
+			CArrayFixFlat<TFloatFixPt>* lArrayFix;
+			TInt8 lCount;
+			iStream >> lCount;
+			if (lCount)
+				{
+				lArrayFix= new ( ELeave ) CArrayFixFlat<TFloatFixPt>( lCount );
+				}
+			else
+				{
+				lArrayFix= new ( ELeave ) CArrayFixFlat<TFloatFixPt>( 1 );
+				}
+
+			CleanupStack::PushL(lArrayFix); //cleanup
+
+			for(TInt8 i=0; i<lCount; i++)
+				{
+				if (iIsFixPt)
+				{
+					TFloatFixPt lTemp;
+					lTemp.iValue = iStream.ReadInt32L();
+					lArrayFix->AppendL( lTemp );
+				}
+				else
+				{
+					TReal32 lTemp;
+					iStream >> lTemp ;
+					lArrayFix->AppendL( (TFloatFixPt) lTemp);	
+				}
+				
+				}
+
+			((CSvgTextElementImpl*)iCurrentElement)->SetXYArray(aName,lArrayFix);
+			CleanupStack::Pop(lArrayFix); //cleanup
+			return ETrue;
+			}
+		}
+
+
+	if( aName<KSvgFloatAttrEndIndex ||
+		aName== KAtrFx ||
+		aName== KAtrFy ||
+		aName== KAtrOffset ||
+		aName== KAtrStopOpacity
+	  )
+		{
+
+		return DecodeAttributeFloatL(aName);
+		}
+
+	else if(aName == KAtrK)
+		{
+		iCurrentElement->iReqAttrFlag =0;
+		return DecodeAttributeFloatL(aName);
+		}
+
+	else if( aName<= KSvgDesAttrEndIndex ||
+    		 aName== KAtrMedia ||
+			 aName== KAtrTitle
+		   )
+		{
+
+		return DecodeAttributeDesL(aName);
+		}
+ else if (aName== KAtrVolume)
+			{
+			if (iIsFixPt)
+			{
+				TFloatFixPt lTemp;
+				lTemp.iValue = iStream.ReadInt32L();
+				TBuf<16> lTemp2;
+				_LIT(KAudioLevelFormat, "%f");
+				lTemp2.Format(KAudioLevelFormat, (float)lTemp );
+				//lTemp2.AppendNum((float)lTemp );
+				((CSvgAudioElementImpl *)iCurrentElement)->SetAttributeL (_L("volume"),lTemp2);
+			}
+			else
+			{
+				TReal32 lTemp;
+				iStream >> lTemp;
+				TBuf<16> lTemp2;
+				_LIT(KAudioLevelFormat, "%f");
+				lTemp2.Format(KAudioLevelFormat, (float)lTemp );
+				//lTemp2.AppendNum(lTemp);
+				((CSvgAudioElementImpl *)iCurrentElement)->SetAttributeL (_L("volume"),lTemp2);
+			}
+			return ETrue;
+			}
+	else if (aName== KAtrAudioLevel)
+			{
+			if (iIsFixPt)
+			{
+				TFloatFixPt lTemp;
+				lTemp.iValue = iStream.ReadInt32L();
+				TBuf<16> lTemp2;
+				_LIT(KAudioLevelFormat, "%f");
+				lTemp2.Format(KAudioLevelFormat, (float)lTemp );
+				//lTemp2.AppendNum((float)lTemp );
+				((CSvgAudioElementImpl *)iCurrentElement)->SetAttributeL (_L("audio-level"),lTemp2);
+			}
+			else
+			{
+				TReal32 lTemp;
+				iStream >> lTemp;
+				TBuf<16> lTemp2;
+				_LIT(KAudioLevelFormat, "%f");
+				lTemp2.Format(KAudioLevelFormat, (float)lTemp );
+				//lTemp2.AppendNum(lTemp);
+				((CSvgAudioElementImpl *)iCurrentElement)->SetAttributeL (_L("audio-level"),lTemp2);
+			}
+			return ETrue;
+			}
+
+	switch( aName )
+		{
+		case KAtrType:
+			{
+			if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+				{
+				if (iCurrentElement->iReqAttrFlag == KAtrSVGTrf)
+					{
+					iCurrentElement->iReqAttrFlag=KAtrAttributeName;
+					}
+				else
+					{
+					iCurrentElement->iReqAttrFlag= 0;
+					}
+				TUint8 lType, lSize;
+				iStream >> lType;
+				((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+				iStream >> lSize;
+				((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetMatrixDataSize(lSize);
+				return ETrue;
+				}
+			else if(iCurrentElement->ElemID()== KSvgAudioElement)
+				    {
+				    TPtrC lPtr(DecodeTDesCLC());
+				    ((CSvgAudioElementImpl*)iCurrentElement)->SetAttributeL(_L("type"),lPtr);
+		            CleanupStack::PopAndDestroy( 1 );				    
+				return ETrue;
+				}
+			else
+				{
+				return DecodeAttributeDesL(aName);
+				}
+			}
+
+        case KAtrCdata:
+            {
+            if ( iCurrentElement->ElemID() == KSvgTextElement )
+                {
+                // DecodeTDesCLC() allocates the string on the cleanup stack 
+                // and advances the file pointer beyond the CData
+                // SetTextL() makes a copy of the CData in the text element. 
+                ( ( CSvgTextElementImpl* )iCurrentElement )->SetTextL( 
+                        DecodeTDesCLC() ); 
+                }
+            else
+                {
+                // Skip the CData
+                DecodeTDesCLC();
+                }
+            // Free the CData allocated inside DecodeTDesCLC()
+            CleanupStack::PopAndDestroy( 1 );
+            return ETrue;
+            }
+
+		case KAtrD:
+		case KAtrPoints:
+			{
+			iCurrentElement->iReqAttrFlag = 0;
+			return DecodeAttributePathL(aName);
+			}
+
+		case KAtrSpreadMethods:
+		case KAtrGradientUnits:
+			{
+			return DecodeAttributeIntL(aName);
+			}
+
+		case KAtrRotate:
+			{
+			// for AnimateMotion Element
+			if (iCurrentElement->ElemID()== KSvgAnimateMotionElement)
+				{
+				TInt16 lRotate;
+				iStream >> lRotate;
+				((CSvgAnimateMotionElementImpl*)iCurrentElement)->SetAnimRotate(lRotate);
+				}
+
+			// For Text Element
+			else
+				{
+				TInt8 lCount;
+				CArrayFixFlat<TReal32>*   lArray;
+				iStream >> lCount;
+				if(lCount)
+					{
+					lArray= new ( ELeave ) CArrayFixFlat<TReal32>( lCount );
+					CleanupStack::PushL(lArray); //cleanup
+					for (TInt i=0; i<lCount; i++)
+						{
+							TReal32 lTemp;
+							iStream >> lTemp;
+							lArray->AppendL((TReal32) lTemp);
+						}
+    			
+    			    if ( iCurrentElement->ElemID() == KSvgTextElement )	
+	    		        {
+		    	        ((CSvgTextElementImpl*)iCurrentElement)->SetRotateArray (lArray);
+			            }
+					
+					CleanupStack::Pop(lArray); //cleanup
+					}
+				}
+
+			return ETrue;
+			}
+
+		case KAtrStopColor:
+			{
+			TUint32 lColor;
+			iStream >> lColor;
+			// Shift from XBGR to XRGB
+			if(!iIsRGB)
+				{
+				lColor = (  lColor & 0xFF000000) |
+					  	 ( (lColor & 0x00FF0000) >> 16 ) |
+				    	 (  lColor & 0x0000FF00       ) |
+				     	 ( (lColor & 0x000000FF) << 16 );
+				}
+			
+			if ( iCurrentElement->ElemID() == KSvgStopElement )	
+			    {
+    		    ((CSvgStopElementImpl*)iCurrentElement)->SetStopColorL(lColor);			    
+			    }
+
+			return ETrue;
+			}
+
+		default:
+			{
+			return EFalse;
+			}
+		}
+	}
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeAnimationAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeAnimationAttributeL(const TUint16 aName)
+	{
+
+	if (aName== KAtrAttributeName)
+		{
+		TUint16 lAtrId;
+		TUint8 lType;
+		iStream >> lAtrId;
+
+		// For Animate Transform element
+		if (iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+			{
+			// Attribute Id of the animate transform has been changed. For binary compatibility
+			if (lAtrId == KAtrTransform )
+				{
+                 lAtrId= KAtrAnimateTransformAttrId;
+				}
+			((CSvgAnimationBase*)iCurrentElement)->SetAttributeId(lAtrId);
+
+			if (iCurrentElement->iReqAttrFlag == KAtrSVGTrf)
+				{
+				iCurrentElement->iReqAttrFlag=KAtrType;
+				}
+			else
+				{
+				iCurrentElement->iReqAttrFlag= 0;
+				}
+			}
+
+		//For other animation elements
+		else
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetAttributeId(lAtrId);
+			iCurrentElement->iReqAttrFlag= 0;
+			iStream >> lType;
+			((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+			((CSvgAnimationBase*)iCurrentElement)->GetAttrValueL();
+			}
+		return ETrue;
+		}
+
+	if (aName== KAtrBegin)
+		{
+        // Although discard element belongs to animation, the discard element isn't
+        // necessary inherited from giant AnimationBase, so handle attribute separately.
+        //
+    	if ( iCurrentElement->ElemID() == KSvgDiscardElement /*|| 
+             iCurrentElement->ElemID() == KSvgMediaAnimationElement*/ )
+            {
+    	    return EFalse;
+            }
+
+		TInt8 lCheck, lCount;
+		iStream >> lCheck;
+		// Flag is used to check for Indefinite value.
+		if(lCheck)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetAbsoluteBeginTime(KTimeIndefinite);
+            ((CSvgAnimationBase*)iCurrentElement)->SetBeginTime(KTimeIndefinite);
+			}
+		else
+			{
+			CArrayFixFlat<CSvgAnimationBase::TEventListItem>*  lEventList;
+			RArray<TInt32>*    lTimeList;
+        // event list
+			iStream >> lCount;
+			if (lCount)
+				{
+                lEventList= new (ELeave) CArrayFixFlat<CSvgAnimationBase::TEventListItem>(lCount);
+				}
+			else
+				{
+				lEventList= new (ELeave) CArrayFixFlat<CSvgAnimationBase::TEventListItem>(1);
+				}
+
+			CleanupStack::PushL(lEventList); //cleanup
+
+            for( TInt i=0; i<lCount; i++)
+				{
+				CSvgAnimationBase::TEventListItem lItem;
+				TInt32 lTime;
+				iStream >> lTime;
+				lItem.iTime= lTime;
+
+				TInt32 lOffset;
+				iStream >> lOffset;
+				lItem.iOffset= lOffset;
+
+				if (iIsFixPt)
+				{
+					TFloatFixPt temp;
+					temp.iValue = iStream.ReadInt32L();
+					lItem.iRepeatValue = (TReal32)temp;
+				}
+				else
+				{
+					TReal32 lValue;
+					iStream >> lValue;
+					lItem.iRepeatValue= lValue;
+				}
+				
+
+				TPtrC lPtr(DecodeTDesCLC());
+				// check for the use of unique Id of the target element
+				if(lPtr == _L("unid"))
+					{
+					lItem.iTargetElement = (((CSvgAnimationBase*)iCurrentElement)->GetTargetElem());
+					lItem.iReferenceElemeId= NULL;
+					}
+				else
+					{
+					// get element by id and append its pointer.
+
+                	// there can be an issue if the id is not found. in  case of forward reference.
+                	// for this we will store the id if it is not found at this time.
+					lItem.iTargetElement =  (CSvgElementImpl*)iDocument->GetElementById( lPtr );
+					if( lItem.iTargetElement == NULL)
+                     	{
+                     	// this indicates that this is a forward reference in case of begin.
+
+                     	lItem.iReferenceElemeId = lPtr.AllocL();
+                     	}
+					else
+                     	{
+                     	// otherwise the element is found and we
+                     	// do not need to keep iReferenceElemeId so
+                     	// make it NULL;
+                     	lItem.iReferenceElemeId = NULL;
+                     	}
+					}
+
+				CleanupStack::PopAndDestroy( 1 );
+
+				TUint16 lCode;
+				iStream >> lCode;
+				lItem.iAccessKeyCode= lCode;
+
+				TInt8 lEvent;
+				iStream >> lEvent;
+				lItem.iEvent= (TSvgEvent) lEvent;
+
+				switch(lItem.iEvent)
+					{
+					case ESvgEventKey:
+					case ESvgEventNone:
+						{
+						lItem.iTargetElement =NULL;
+						break;
+						}
+					}
+                lEventList->AppendL((CSvgAnimationBase::TEventListItem) lItem);
+				}
+
+			((CSvgAnimationBase*)iCurrentElement)->SetEventList(lEventList);
+			CleanupStack::Pop(lEventList); //cleanup
+
+       //begin time list
+			iStream >> lCount;
+			if (lCount)
+				{
+                lTimeList= new (ELeave) RArray<TInt32>(lCount);
+				}
+			else
+				{
+				lTimeList= new (ELeave) RArray<TInt32>(1);
+				}
+
+                // For proper cleanup
+            ((CSvgAnimationBase*)iCurrentElement)->SetBeginTimeList(lTimeList);
+            lTimeList->AppendL(NULL);
+            lTimeList->Remove(0);
+
+             for( TInt i=0; i<lCount; i++)
+                {
+                TInt32 lTime;
+                iStream >> lTime;
+                lTimeList->AppendL( (TInt32) lTime);
+                }
+
+			 TInt32 lTime;
+			 iStream >> lTime;
+			 ((CSvgAnimationBase*)iCurrentElement)->SetAbsoluteBeginTime(lTime);
+			 iStream >> lTime;
+			 ((CSvgAnimationBase*)iCurrentElement)->SetBeginTime(lTime);
+
+
+			 iStream >> lCheck;
+			 // flag to ckeck Adding to the Reciever EventList
+			 if(lCheck)
+				{
+				iDocument->AddToEventReceiverListL( iCurrentElement,
+                                                        KSvgEventMaskExternalUI );
+				}
+			}
+		return ETrue;
+		}
+
+
+	if (aName== KAtrEnd)  //End Time
+		{
+		TInt8 lCheck;
+		iStream >> lCheck;
+
+		// Flag is used to check for Indefinite value
+		if(lCheck)
+			{
+            ((CSvgAnimationBase*)iCurrentElement)->SetEndTime(KTimeIndefinite);
+			}
+		else
+			{
+		  	CArrayFixFlat<CSvgAnimationBase::TEventListItem>*  lTimeList;
+        // event list
+
+			lTimeList= new (ELeave) CArrayFixFlat<CSvgAnimationBase::TEventListItem>(1);
+			CleanupStack::PushL(lTimeList); //cleanup
+
+			CSvgAnimationBase::TEventListItem lItem;
+			TInt8 lEvent;
+			iStream >> lEvent;
+			lItem.iEvent = (TSvgEvent) lEvent;
+
+			if (iIsFixPt)
+			{
+				TFloatFixPt temp;
+				temp.iValue = iStream.ReadInt32L();
+				lItem.iRepeatValue = (TReal32)temp;
+			}
+			else
+			{
+				TReal32 lValue;
+				iStream >> lValue;
+				lItem.iRepeatValue= lValue;
+			}
+			
+
+			TPtrC lPtr( DecodeTDesCLC() );
+
+			if (lPtr == _L("unid") )
+				{
+				lItem.iTargetElement = ((CSvgAnimationBase*)iCurrentElement)->GetTargetElem();
+				lItem.iReferenceElemeId = NULL;
+				}
+			else
+				{
+				// get element by id and append its pointer.
+				lItem.iTargetElement = ( CSvgElementImpl * )
+							 iDocument->GetElementById( lPtr );
+				if(lItem.iTargetElement == NULL)
+					 {
+					 lItem.iReferenceElemeId = lPtr.AllocL();
+					 }
+				 else
+					{
+					// Set the iEndReferenceElemeId to NULL:
+					lItem.iReferenceElemeId = NULL;
+					}
+				}
+
+			CleanupStack::PopAndDestroy( 1 );
+
+			switch ( lItem.iEvent )
+                {
+                case ESvgEventKey:
+					{
+         			((CSvgAnimationBase*)iCurrentElement)->SetEndTime(KTimeIndefinite );  // same as indefinite
+
+					TUint16 lCode;
+					iStream >> lCode;
+					lItem.iAccessKeyCode= lCode;
+					lItem.iTargetElement =NULL;
+		           iDocument->AddToEventReceiverListL( iCurrentElement,
+                                                        KSvgEventMaskExternalUI );
+	               break;
+					}
+                case ESvgEventWallClock:
+                // not supported yet
+                break;
+                case ESvgEventNone:
+					{
+					TInt32 lTime;
+					iStream >> lTime;
+					lItem.iTime= lTime;
+					((CSvgAnimationBase*)iCurrentElement)->AddEndTime(lTime);
+					lItem.iTargetElement =NULL;
+				    break;
+					}
+                default:
+					{
+				    ((CSvgAnimationBase*)iCurrentElement)->SetEndTime( KTimeIndefinite );  // same as indifinite
+					TInt32 lOffset;
+					iStream >> lOffset;
+					lItem.iOffset= lOffset;
+
+					lItem.iTime = KTimeIndefinite;
+		            iDocument->AddToEventReceiverListL( iCurrentElement,
+                                                       KSvgEventMaskInternal );
+					}
+
+                }
+			lTimeList->AppendL( (CSvgAnimationBase::TEventListItem) lItem);
+			((CSvgAnimationBase*)iCurrentElement)->SetEndTimeList( lTimeList);
+			CleanupStack::Pop(lTimeList); //cleanup
+
+			}
+
+		return ETrue;
+		}
+
+////////// for multiple end times
+
+	if (aName== KMultipleEndTime)
+		{
+		TInt8  lCount;
+
+		CArrayFixFlat<CSvgAnimationBase::TEventListItem>*  lTimeList;
+       // event list
+		iStream >> lCount;
+		if (lCount)
+			{
+            lTimeList= new (ELeave) CArrayFixFlat<CSvgAnimationBase::TEventListItem>(lCount);
+			}
+		else
+			{
+			lTimeList= new (ELeave) CArrayFixFlat<CSvgAnimationBase::TEventListItem>(1);
+			}
+
+		CleanupStack::PushL(lTimeList); //cleanup
+
+		for( TInt i=0; i<lCount; i++)
+			{
+			CSvgAnimationBase::TEventListItem lItem;
+			TInt32 lTime;
+			iStream >> lTime;
+			lItem.iTime= lTime;
+
+			TInt32 lOffset;
+			iStream >> lOffset;
+			lItem.iOffset= lOffset;
+
+			if (iIsFixPt)
+			{
+				TFloatFixPt temp;
+				temp.iValue = iStream.ReadInt32L();
+				lItem.iRepeatValue = (TReal32)temp;
+			}
+			else
+			{
+				TReal32 lValue;
+				iStream >> lValue;
+				lItem.iRepeatValue= lValue;
+			}	
+			
+
+			TPtrC lPtr(DecodeTDesCLC());
+			// check for the use of unique Id of the target element
+			if(lPtr == _L("unid"))
+				{
+				lItem.iTargetElement = (((CSvgAnimationBase*)iCurrentElement)->GetTargetElem());
+				lItem.iReferenceElemeId= NULL;
+				}
+			else
+				{
+				// get element by id and append its pointer.
+               	// there can be an issue if the id is not found. in  case of forward reference.
+               	// for this we will store the id if it is not found at this time.
+				lItem.iTargetElement =  (CSvgElementImpl*)iDocument->GetElementById( lPtr );
+				if( lItem.iTargetElement == NULL)
+                   	{
+                   	// this indicates that this is a forward reference in case of begin.
+
+					lItem.iReferenceElemeId = lPtr.AllocL();
+                   	}
+				else
+                   	{
+                   	// otherwise the element is found and we
+                   	// do not need to keep iReferenceElemeId so
+                   	// make it NULL;
+                   	lItem.iReferenceElemeId = NULL;
+                   	}
+				}
+
+			CleanupStack::PopAndDestroy( 1 );
+
+			TUint16 lCode;
+			iStream >> lCode;
+			lItem.iAccessKeyCode= lCode;
+
+			TInt8 lEvent;
+			iStream >> lEvent;
+			lItem.iEvent= (TSvgEvent) lEvent;
+
+			switch ( lItem.iEvent )
+                {
+                case ESvgEventKey:
+                lItem.iTargetElement =NULL;
+                ((CSvgAnimationBase*)iCurrentElement)->SetEndTime( KTimeIndefinite );  // same as indefinite
+
+                iDocument->AddToEventReceiverListL( iCurrentElement,
+                                                        KSvgEventMaskExternalUI );
+                break;
+
+                case ESvgEventWallClock:
+                // not supported yet
+                break;
+
+                case ESvgEventNone:
+                lItem.iTargetElement =NULL;
+                // Simple Offset-value
+                ((CSvgAnimationBase*)iCurrentElement)->AddEndTime( lItem.iTime );
+
+                break;
+
+                default:
+                // <id>.<event> +/- <offeset>
+                ((CSvgAnimationBase*)iCurrentElement)->SetEndTime( KTimeIndefinite );  // same as indifinite
+
+                iDocument->AddToEventReceiverListL( iCurrentElement,
+                                                        KSvgEventMaskInternal );
+                }
+
+			lTimeList->AppendL((CSvgAnimationBase::TEventListItem) lItem);
+			}
+
+		((CSvgAnimationBase*)iCurrentElement)->SetEndTimeList(lTimeList);
+		CleanupStack::Pop(lTimeList); //cleanup
+
+
+
+
+		return ETrue;
+		}
+
+
+		if (aName== KAtrDur)
+			{
+			TInt32 lTime;
+			TInt8 lCheck;
+			iStream >> lTime;
+			((CSvgAnimationBase*)iCurrentElement)->SetDurationTime(lTime);
+			iStream >> lCheck;
+			// Flag is used to check for Indefinite value
+			if(lCheck)
+				{
+				((CSvgAnimationBase*)iCurrentElement)->SetBeginTime(KTimeIndefinite);
+				}
+			return ETrue;
+			}
+
+		if (aName== KAtrFrom)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+
+			//For Animate Transform element
+			if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+				{
+				CSvgAnimateTransformElementImpl::TMatrixData  lMatrix;
+				
+				if (iIsFixPt)
+				{
+					for (TInt i=0; i<3; i++)
+					{
+					lMatrix.iData[i].iValue = iStream.ReadInt32L();
+					}	
+				}
+				else
+				{
+					TReal32 lTemp;
+					for (TInt i=0; i<3; i++)
+					{
+					iStream >> lTemp;
+					lMatrix.iData[i]= (TFloatFixPt) lTemp;
+					}	
+				}
+		
+				((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetMatrixData(0,lMatrix);
+				}
+
+			// for other Animation elements
+			else
+				{
+
+				TUint8 lType;
+				iStream >>lType;
+				((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+				switch ( lType )
+					{
+					case KSvgTypeOpacity:
+					case KSvgTypeLength:
+						{
+						if (iIsFixPt)
+						{	
+							TFloatFixPt lValue; 
+							lValue.iValue = iStream.ReadInt32L();
+							((CSvgAnimationBase*)iCurrentElement)->SetFromFloat(lValue);
+						}
+						else
+						{
+							TReal32 lValue;
+							iStream >> lValue;
+							((CSvgAnimationBase*)iCurrentElement)->SetFromFloat((TFloatFixPt)lValue);
+						}
+						
+						break;
+						}
+					case KSvgTypeList:
+					case KSvgTypePath:
+						{
+						CGfxGeneralPath* lPath;
+						DecodeAnimationPathL(lPath);
+						((CSvgAnimationBase*)iCurrentElement)->SetFromPathL(lPath);
+						break;
+						}
+					case KSvgTypeColor:
+						{	
+						TInt32 lColor;
+						iStream >> lColor;
+						// Shift from XBGR to XRGB
+						if(!iIsRGB)
+							{
+							lColor = (  lColor & 0xFF000000) |
+						         ( (lColor & 0x00FF0000) >> 16 ) |
+							     (  lColor & 0x0000FF00       ) |
+							     ( (lColor & 0x000000FF) << 16 );
+							}
+						((CSvgAnimationBase*)iCurrentElement)->SetFromInt(lColor);
+						break;
+						}
+					case KSvgTypeTextAnchor:
+                    case KSvgTypeGradientUnits:
+					case KSvgTypeSpreadMethod:
+					case KSvgTypeInteger:
+					case KSvgTypeDisplay:
+					case KSvgTypeVisibility:
+						{
+						TInt32 lTemp;
+						iStream >> lTemp;
+						((CSvgAnimationBase*)iCurrentElement)->SetFromInt(lTemp);
+						break;
+						}
+
+				    // viewBox attribute
+					case KSvgTypeViewBox:
+						{
+						
+						if (iIsFixPt)
+						{
+							TGfxRectangle2D temp;
+							temp.iX.iValue = iStream.ReadInt32L();
+							
+							temp.iY.iValue = iStream.ReadInt32L();
+							temp.iWidth.iValue = iStream.ReadInt32L();
+							temp.iHeight.iValue = iStream.ReadInt32L();
+
+							((CSvgAnimationBase*)iCurrentElement)->SetFromViewBox(temp);
+						}
+						else
+						{
+							TReal32 lValue;
+							TGfxRectangle2D temp;
+
+							this->iStream >> lValue;
+							temp.iX = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iY = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iWidth = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iHeight = (TFloatFixPt) lValue;
+
+							((CSvgAnimationBase*)iCurrentElement)->SetFromViewBox(temp);	
+						}
+						break;
+						}
+					}
+				}
+			 return ETrue;
+			}
+
+		if (aName== KAtrTo)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetToFlag();
+
+			// For Animate Transform
+			if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+				{
+				if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+					{
+					((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+					}
+				CSvgAnimateTransformElementImpl::TMatrixData  lMatrix;
+				
+				if (iIsFixPt)
+				{
+					for (TInt i=0; i<3; i++)
+					{
+					lMatrix.iData[i].iValue = iStream.ReadInt32L();
+					}
+				}
+				else
+				{
+					TReal32 lTemp;
+					for (TInt i=0; i<3; i++)
+					{
+					iStream >> lTemp;
+					lMatrix.iData[i]= (TFloatFixPt) lTemp;
+					}
+				}
+			
+				((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetMatrixData(1,lMatrix);
+				((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetAccumMatrix();
+				}
+
+			// for Other Animation Elements
+			else
+				{
+				TUint8 lType;
+				iStream >>lType;
+				((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+				switch ( lType )
+					{
+					case KSvgTypeOpacity:
+					case KSvgTypeLength:
+						{
+						
+						if (iIsFixPt)
+						{
+							TFloatFixPt lValue;
+							lValue.iValue = iStream.ReadInt32L();
+							((CSvgAnimationBase*)iCurrentElement)->SetToFloat(lValue);
+						}
+						else
+						{
+							TReal32 lValue;
+							iStream >> lValue;
+							((CSvgAnimationBase*)iCurrentElement)->SetToFloat((TFloatFixPt)lValue);
+						}
+					
+						break;
+						}
+					case KSvgTypeList:
+					case KSvgTypePath:
+						{
+						CGfxGeneralPath* lPath;
+						DecodeAnimationPathL(lPath);
+						((CSvgAnimationBase*)iCurrentElement)->SetToPath(lPath);
+						break;
+						}
+					case KSvgTypeColor:
+					{
+						TInt32 lColor;
+						iStream >> lColor;
+						// Shift from XBGR to XRGB
+						if(!iIsRGB)
+							{
+							lColor = (  lColor & 0xFF000000) |
+						         ( (lColor & 0x00FF0000) >> 16 ) |
+							     (  lColor & 0x0000FF00       ) |
+							     ( (lColor & 0x000000FF) << 16 );
+							}
+						((CSvgAnimationBase*)iCurrentElement)->SetToInt(lColor);
+						break;
+					}
+					case KSvgTypeTextAnchor:
+					case KSvgTypeGradientUnits:
+					case KSvgTypeSpreadMethod:
+					case KSvgTypeInteger:
+					case KSvgTypeDisplay:
+					case KSvgTypeVisibility:
+						{
+						TInt32 lTemp;
+						iStream >> lTemp;
+						((CSvgAnimationBase*)iCurrentElement)->SetToInt(lTemp);
+						break;
+						}
+
+					 // viewBox attribute
+					case KSvgTypeViewBox:
+						{
+						if (iIsFixPt)
+						{
+							TGfxRectangle2D temp;
+							temp.iX.iValue = iStream.ReadInt32L();
+							temp.iY.iValue = iStream.ReadInt32L();
+							temp.iWidth.iValue = iStream.ReadInt32L();
+							temp.iHeight.iValue = iStream.ReadInt32L();
+
+							((CSvgAnimationBase*)iCurrentElement)->SetToViewBox(temp);
+						}
+						else
+						{
+							TReal32 lValue;
+							TGfxRectangle2D temp;
+
+							this->iStream >> lValue;
+							temp.iX = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iY = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iWidth = (TFloatFixPt) lValue;
+							this->iStream >> lValue;
+							temp.iHeight = (TFloatFixPt) lValue;
+
+							((CSvgAnimationBase*)iCurrentElement)->SetToViewBox(temp);	
+						}
+			
+						break;
+						}
+
+					}
+				}
+			 return ETrue;
+
+			}
+
+		if (aName== KAtrBy) //by
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetByFlag();
+
+			// For Animate Transform
+			if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+				{
+				if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+					{
+					((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+					}
+				CSvgAnimateTransformElementImpl::TMatrixData  lMatrix;
+				
+				if (iIsFixPt)
+				{
+					for (TInt i=0; i<3; i++)
+					{
+					lMatrix.iData[i].iValue = iStream.ReadInt32L();
+					}
+				}
+				else
+				{
+					TReal32 lTemp;
+					for (TInt i=0; i<3; i++)
+					{
+					iStream >> lTemp;
+					lMatrix.iData[i]= (TFloatFixPt) lTemp;
+					}
+				}
+				
+				((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetMatrixData(1,lMatrix);
+				}
+
+			// for Other Animation Elements
+			else
+				{
+				TUint8 lType;
+				iStream >>lType;
+				((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+				switch ( lType )
+					{
+					case KSvgTypeOpacity:
+					case KSvgTypeLength:
+						{
+						if (iIsFixPt)
+						{
+							TFloatFixPt lValue;
+							lValue.iValue = iStream.ReadInt32L();
+							
+							((CSvgAnimationBase*)iCurrentElement)->SetToFloat( lValue );
+							if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+							{
+							((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+                            ((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+							((CSvgAnimationBase*)iCurrentElement)->SetFromFloat((TFloatFixPt)0);
+							}
+						}
+						else
+						{
+							TReal32 lValue;
+							iStream >> lValue;
+							
+							((CSvgAnimationBase*)iCurrentElement)->SetToFloat((TFloatFixPt)lValue);
+							if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+							{
+							((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+                            ((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+							((CSvgAnimationBase*)iCurrentElement)->SetFromFloat((TFloatFixPt)0);
+							}
+						}
+						
+						break;
+						}
+					case KSvgTypeList:
+					case KSvgTypePath:
+						{
+						CGfxGeneralPath* lPath;
+						DecodeAnimationPathL(lPath);
+						((CSvgAnimationBase*)iCurrentElement)->SetToPath(lPath);
+						break;
+						}
+
+                    case KSvgTypeColor:
+						{
+						TInt32 lColor;
+						iStream >> lColor;
+						// Shift from XBGR to XRGB
+						if(!iIsRGB)
+							{
+							lColor = (  lColor & 0xFF000000) |
+						         ( (lColor & 0x00FF0000) >> 16 ) |
+							     (  lColor & 0x0000FF00       ) |
+							     ( (lColor & 0x000000FF) << 16 );
+							}
+						((CSvgAnimationBase*)iCurrentElement)->SetToInt(lColor);
+						if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+							{
+							((CSvgAnimationBase*)iCurrentElement)->SetFromInt((TInt32)0);
+							}
+						break;
+						}
+					case KSvgTypeTextAnchor:
+                    case KSvgTypeGradientUnits:
+					case KSvgTypeSpreadMethod:
+					case KSvgTypeInteger:
+						{
+						TInt32 lTemp;
+						iStream >> lTemp;
+						((CSvgAnimationBase*)iCurrentElement)->SetToInt(lTemp);
+						if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+							{
+							((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+                            ((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+							((CSvgAnimationBase*)iCurrentElement)->SetFromInt((TInt32)0);
+							}
+						break;
+						}
+
+                    case KSvgTypeDisplay:
+					case KSvgTypeVisibility:
+						{
+						TInt32 lTemp;
+						iStream >> lTemp;
+						((CSvgAnimationBase*)iCurrentElement)->SetToInt(lTemp);
+						break;
+						}
+
+					 // viewBox attribute
+					case KSvgTypeViewBox:
+						{
+						if (iIsFixPt)
+						{
+							TGfxRectangle2D temp;
+							temp.iX.iValue = iStream.ReadInt32L();
+							temp.iY.iValue = iStream.ReadInt32L();
+							temp.iWidth.iValue = iStream.ReadInt32L();
+							temp.iHeight.iValue = iStream.ReadInt32L();
+							
+							((CSvgAnimationBase*)iCurrentElement)->SetToViewBox(temp);
+						}
+						else
+						{
+							TReal32 lValue;
+							TGfxRectangle2D temp;
+
+							iStream >> lValue;
+							temp.iX = (TFloatFixPt) lValue;
+							iStream >> lValue;
+							temp.iY = (TFloatFixPt) lValue;
+							iStream >> lValue;
+							temp.iWidth = (TFloatFixPt) lValue;
+							iStream >> lValue;
+							temp.iHeight = (TFloatFixPt) lValue;
+							
+							((CSvgAnimationBase*)iCurrentElement)->SetToViewBox(temp);
+						}
+						
+						if( ((CSvgAnimationBase*)iCurrentElement)->GetFromFlag() )
+							{
+							((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+                            ((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+							((CSvgAnimationBase*)iCurrentElement)->SetFromViewBox
+								                    (TGfxRectangle2D( 0, 0, 0, 0 ) );
+							}
+						break;
+						}
+					}
+				}
+			return ETrue;
+
+			}
+
+
+		if (aName== KAtrValues)  // values
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetFromFlag();
+			((CSvgAnimationBase*)iCurrentElement)->SetValuesFlag();
+
+			// For Animate Transform
+			if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+				{
+				TUint16 lCount;
+				RArray<CSvgAnimateTransformElementImpl::TMatrixData>* lValues= NULL;
+
+				iStream >>lCount;
+				if (lCount)
+					{
+					lValues= new (ELeave) RArray<CSvgAnimateTransformElementImpl::TMatrixData>(lCount);
+					}
+				else
+					{
+					lValues= new (ELeave) RArray<CSvgAnimateTransformElementImpl::TMatrixData>(1);
+					}
+
+				// for proper cleanup
+                ((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetTransformValues(lValues);
+                CSvgAnimateTransformElementImpl::TMatrixData  lMatrix1;
+                lValues->AppendL(lMatrix1);
+                lValues->Remove(0);
+
+                for (TInt i=0; i<lCount; i++)
+                        {
+                        CSvgAnimateTransformElementImpl::TMatrixData  lMatrix;
+                        
+                        if (iIsFixPt)
+                        {
+                        	for (TInt i=0; i<3; i++)
+                            {
+                            lMatrix.iData[i].iValue = iStream.ReadInt32L();
+                            }
+                        }
+                        else
+                        {
+                        	TReal32 lTemp;
+                        	for (TInt i=0; i<3; i++)
+                            {
+                            iStream >> lTemp;
+                            lMatrix.iData[i]= (TFloatFixPt) lTemp;
+                            }
+                        }
+                        
+                        lValues->AppendL( (CSvgAnimateTransformElementImpl::TMatrixData) lMatrix);
+                        }
+				if(iCurrentElement->ElemID()== KSvgAnimateTransformElement)
+					{
+					((CSvgAnimateTransformElementImpl*)iCurrentElement)->SetAccumMatrix();
+					}
+				}
+
+
+			// For other Animation elements
+			else
+				{
+				TUint8 lType;
+				iStream >>lType;
+				((CSvgAnimationBase*)iCurrentElement)->SetAttributeType(lType);
+				switch ( lType )
+					{
+					case KSvgTypeOpacity:
+					case KSvgTypeLength:
+						{
+						RArray<TFloatFixPt>* lArray;
+						TUint16 lCount;
+						iStream >> lCount;
+						if (lCount)
+							{
+							lArray= new (ELeave) RArray<TFloatFixPt>(lCount);
+							}
+						else
+							{
+							lArray= new (ELeave) RArray<TFloatFixPt>(1);
+							}
+
+                        // for proper cleanup
+                        ((CSvgAnimationBase*)iCurrentElement)->SetFloatValuesArray(lArray);
+                        lArray->AppendL(NULL);
+                        lArray->Remove(0);
+                        
+                        TFloatFixPt lValueFix;
+                        TReal32 lValueFloat;
+                        
+                        for(TInt i=0; i<lCount; i++)
+                            {
+                            
+                            if(iIsFixPt)
+                            {
+                            	lValueFix.iValue = iStream.ReadInt32L();
+                            	lArray->AppendL( lValueFix );
+                            }
+                            else
+                            {
+                            	iStream >> lValueFloat;
+                            	lArray->AppendL((TFloatFixPt) lValueFloat);
+                            }
+                            
+                            }
+						break;
+						}
+					case KSvgTypeList:
+					case KSvgTypePath:
+						{
+						TUint16 lCount;
+						RPointerArray<CGfxGeneralPath>* lArray;
+						iStream >> lCount;
+						if (lCount)
+							{
+							lArray= new (ELeave) RPointerArray<CGfxGeneralPath>(lCount);
+							}
+						else
+							{
+							lArray= new (ELeave) RPointerArray<CGfxGeneralPath>(1);
+							}
+
+						// for proper cleanup
+                        ((CSvgAnimationBase*)iCurrentElement)->ResetFloatValuesArray();
+                        ((CSvgAnimationBase*)iCurrentElement)->SetPathValuesArray(lArray);
+                        lArray->AppendL(NULL);
+                        lArray->Remove(0);
+                        for(TInt i=0; i<lCount; i++)
+                            {
+                            CGfxGeneralPath* lPath;
+                            DecodeAnimationPathL(lPath);
+                            lArray->AppendL( (CGfxGeneralPath*)lPath );
+                            }
+                        break;
+                        }
+
+					case KSvgTypeColor:
+						{
+						RArray<TInt32>* lArray;
+						TUint16 lCount;
+						iStream >> lCount;
+						if (lCount)
+							{
+							lArray= new (ELeave) RArray<TInt32>(lCount);
+							}
+						else
+							{
+							lArray= new (ELeave) RArray<TInt32>(1);
+							}
+
+						// for proper cleanup
+                        ((CSvgAnimationBase*)iCurrentElement)->ResetFloatValuesArray();
+                        ((CSvgAnimationBase*)iCurrentElement)->SetIntValuesArray(lArray);
+                        lArray->AppendL(NULL);
+                        lArray->Remove(0);
+
+                        for(TInt i=0; i<lCount; i++)
+                            {
+                            TInt32 lColor;
+                            iStream >> lColor;
+							if(!iIsRGB)
+								{
+								lColor = (  lColor & 0xFF000000) |
+							         ( (lColor & 0x00FF0000) >> 16 ) |
+								     (  lColor & 0x0000FF00       ) |
+								     ( (lColor & 0x000000FF) << 16 );
+								}
+                            lArray->AppendL((TInt32) lColor);
+							}
+						break;
+						}
+
+                    case KSvgTypeGradientUnits:
+					case KSvgTypeSpreadMethod:
+					case KSvgTypeInteger:
+					case KSvgTypeDisplay:
+					case KSvgTypeVisibility:
+					case KSvgTypeTextAnchor:
+						{
+						RArray<TInt32>* lArray;
+						TUint16 lCount;
+						iStream >> lCount;
+						if (lCount)
+							{
+							lArray= new (ELeave) RArray<TInt32>(lCount);
+							}
+						else
+							{
+							lArray= new (ELeave) RArray<TInt32>(1);
+							}
+
+						// for proper cleanup
+                        ((CSvgAnimationBase*)iCurrentElement)->ResetFloatValuesArray();
+                        ((CSvgAnimationBase*)iCurrentElement)->SetIntValuesArray(lArray);
+                        lArray->AppendL(NULL);
+                        lArray->Remove(0);
+
+                        for(TInt i=0; i<lCount; i++)
+                            {
+                            TInt32 lValue;
+                            iStream >> lValue;
+                            lArray->AppendL((TInt32) lValue);
+							}
+						break;
+						}
+
+					// viewBox
+					case KSvgTypeViewBox:
+						{
+						RArray<TGfxRectangle2D>* lArray;
+						TUint16 lCount;
+						iStream >> lCount;
+						if (lCount)
+							{
+							lArray= new (ELeave) RArray<TGfxRectangle2D>(lCount);
+							}
+						else
+							{
+							lArray= new (ELeave) RArray<TGfxRectangle2D>(1);
+							}
+						TGfxRectangle2D temp1;
+                        // for proper cleanup
+                        ((CSvgAnimationBase*)iCurrentElement)->SetViewBoxValuesArray(lArray);
+                        lArray->AppendL(temp1);
+                        lArray->Remove(0);
+                        
+                        
+                        TGfxRectangle2D temp;
+                        TReal32 lValueFloat;
+                        for(TInt i=0; i<lCount; i++)
+                            {
+                            
+                            if (iIsFixPt)
+                            {
+								temp.iX.iValue = iStream.ReadInt32L();
+								temp.iY.iValue = iStream.ReadInt32L();
+                            	temp.iWidth.iValue = iStream.ReadInt32L();
+                            	temp.iHeight.iValue = iStream.ReadInt32L();
+
+                            	lArray->AppendL((TGfxRectangle2D) temp);
+                            }
+                            else
+                            {
+								iStream >> lValueFloat;
+								temp.iX = (TFloatFixPt) lValueFloat;
+								iStream >> lValueFloat;
+                            	temp.iY = (TFloatFixPt) lValueFloat;
+                            	iStream >> lValueFloat;
+                            	temp.iWidth = (TFloatFixPt) lValueFloat;
+                            	iStream >> lValueFloat;
+                            	temp.iHeight = (TFloatFixPt) lValueFloat;
+
+                            	lArray->AppendL((TGfxRectangle2D) temp);
+                            }
+                            }
+						break;
+						}
+					}
+				}
+			 return ETrue;
+
+			}
+
+			// Used to set the Fill attribute of Animation elements
+		if (aName== KAnimFreeze)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetAnimFreeze();
+			return ETrue;
+			}
+
+		if (aName== KAtrRepeatDur)
+			{
+			TUint32 lDur;
+			iStream >> lDur;
+			((CSvgAnimationBase*)iCurrentElement)->SetRepeatDuration(lDur);
+			return ETrue;
+			}
+
+		if (aName== KAtrRepeatCount)
+			{
+			
+			if (iIsFixPt)
+			{
+				TFloatFixPt lCount;
+				lCount.iValue = iStream.ReadInt32L();
+				((CSvgAnimationBase*)iCurrentElement)->SetRepeatCount(lCount.iValue);
+			}
+			else
+			{
+				TReal32 lCount;
+				iStream >> lCount;
+				((CSvgAnimationBase*)iCurrentElement)->SetRepeatCount(lCount);
+			}
+			
+			return ETrue;
+			}
+
+	    if (aName== KAtrRestart)
+			{
+			TUint8 lMode;
+			iStream >> lMode;
+		    ((CSvgAnimationBase*)iCurrentElement)->SetRestartMode((TRestartMode)lMode);
+			return ETrue;
+			}
+
+		if (aName== KAtrAccumulate)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetAccumulate(KAccumSum);
+			return ETrue;
+			}
+
+		if (aName== KAtrAdditive)
+			{
+			((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+			return ETrue;
+			}
+
+		if (aName== KAtrCalcMode)
+			{
+			TUint8 lMode;
+			iStream >> lMode;
+			((CSvgAnimationBase*)iCurrentElement)->SetCalcMode((TAnimCalcMode) lMode);
+			return ETrue;
+			}
+
+		if (aName== KAtrKeyTimes)
+			{
+			TUint16 lCount;
+			RArray<CSvgAnimTimeController::TKeyTime>* lArray;
+			iStream >> lCount;
+			if (lCount)
+				{
+				((CSvgAnimationBase*)iCurrentElement)->SetKeyTimeFlag();
+				lArray= new (ELeave) RArray<CSvgAnimTimeController::TKeyTime>(lCount);
+				}
+			else
+				{
+				lArray= new (ELeave) RArray<CSvgAnimTimeController::TKeyTime>(1);
+				}
+			CSvgAnimTimeController::TKeyTime  lTime1;
+            // for proper cleanup
+            ((CSvgAnimationBase*)iCurrentElement)->SetKeyTimeArray(lArray);
+            lArray->AppendL(lTime1);
+            lArray->Remove(0);
+
+            for (TInt i=0; i<lCount; i++)
+                {
+                TUint8 lTemp;
+                CSvgAnimTimeController::TKeyTime  lTime;
+                iStream >> lTemp;
+                lTime.iX = (TUint16) (lTemp);
+                iStream >> lTemp;
+                lTime.iY = (TUint16) (lTemp);
+                lArray->AppendL( (CSvgAnimTimeController::TKeyTime) lTime);
+                }
+			return ETrue;
+			}
+
+		if (aName== KAtrKeySplines)
+			{
+			TUint16 lCount;
+			RArray<CSvgAnimTimeController::TKeyTime>* lArray;
+			RArray<TUint32>* lAnimArray;
+
+			// keyTime Array
+			iStream >> lCount;
+			if (lCount)
+				{
+				lArray= new (ELeave) RArray<CSvgAnimTimeController::TKeyTime>(lCount);
+				}
+			else
+				{
+				lArray= new (ELeave) RArray<CSvgAnimTimeController::TKeyTime>(1);
+				}
+			CSvgAnimTimeController::TKeyTime  lTime1;
+            // for proper cleanup
+            ((CSvgAnimationBase*)iCurrentElement)->SetKeyTimeArray(lArray);
+            lArray->AppendL(lTime1);
+            lArray->Remove(0);
+            for (TInt i=0; i<lCount; i++)
+                {
+                TUint8 lTemp;
+                CSvgAnimTimeController::TKeyTime  lTime;
+                iStream >> lTemp;
+                lTime.iX = (TUint16) (lTemp);
+                iStream >> lTemp;
+                lTime.iY = (TUint16) (lTemp);
+                lArray->AppendL( (CSvgAnimTimeController::TKeyTime) lTime);
+                }
+
+			//AnimTime Array
+			iStream >> lCount;
+			if (lCount)
+				{
+				lAnimArray = new (ELeave) RArray<TUint32>(lCount);
+				}
+			else
+				{
+				lAnimArray= new (ELeave) RArray<TUint32>(1);
+				}
+
+            ((CSvgAnimationBase*)iCurrentElement)->SetAnimTimeArray(lAnimArray);
+            lAnimArray->AppendL(NULL);
+            lAnimArray->Remove(0);
+
+            for (TInt i=0; i<lCount; i++)
+                {
+                TUint8 lTemp;
+                iStream >> lTemp;
+                lAnimArray->AppendL( (TUint32) lTemp);
+                }
+			return ETrue;
+		}
+
+
+	// Animate motion Element is handled here
+	if (aName== KAtrAnimateMotion)
+		{
+		DecodeAttributePathL(KAtrAnimateMotion);
+		TUint8 lFlag;
+		iStream >> lFlag;
+		if(lFlag == KAtrAdditiveSet)
+			{
+            iCurrentElement->iReqAttrFlag= 0;
+			((CSvgAnimationBase*)iCurrentElement)->SetAdditive(KAdditiveSum);
+			return ETrue;
+			}
+        iCurrentElement->iReqAttrFlag= lFlag;
+		return ETrue;
+		}
+
+	if (aName== KAtrXlinkhref)
+		{
+	    _LIT( KXlink, "xlink:href" );
+		TPtrC lPtr(DecodeTDesCLC());
+		CSvgMediaAnimationElementImpl* mediaElement = static_cast<CSvgMediaAnimationElementImpl*>(iCurrentElement);
+		mediaElement->SetAttributeL(KXlink, lPtr);
+		CleanupStack::PopAndDestroy(1);
+		return ETrue;
+		}
+		
+	if( aName == KAtrSyncBehavior )
+		{
+		TUint8 syncBehavior;
+		iStream>>syncBehavior;
+		((CSvgMediaElementBase*)iCurrentElement)->SetSyncBehavior( (TSvgSyncBehaviour) syncBehavior );
+		return ETrue;
+		}
+	else if( aName == KAtrSyncTolerance)
+		{
+		TUint8 syncTolerance;
+		iStream>>syncTolerance;
+		((CSvgMediaElementBase*)iCurrentElement)->SetSyncTolerance( syncTolerance, EFalse );
+		return ETrue;
+		}
+	else if( aName == KAtrSyncMaster )
+		{
+		TUint8 syncMaster ;
+		iStream>>syncMaster ;
+		((CSvgMediaElementBase*)iCurrentElement)->SetSyncMaster( syncMaster );
+		return ETrue;
+		}
+					
+	return EFalse;
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeSvgElementAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeSvgElementAttributeL(const TUint16 aName)
+	{
+	if ( ( aName<= KSvgSVGAttrEndIndex) ||
+		 ( aName == KAtrSyncBehaviorDefault ) ||	// To support backward compatibility
+		 ( aName == KAtrSyncToleranceDefault ))
+		{
+
+		if (aName== KAtrViewBox)
+			{
+			TGfxRectangle2D lRect;
+			
+			if (iIsFixPt)
+			{
+				lRect.iX.iValue = iStream.ReadInt32L();
+				lRect.iY.iValue = iStream.ReadInt32L();
+				lRect.iWidth.iValue = iStream.ReadInt32L();
+				lRect.iHeight.iValue = iStream.ReadInt32L();
+
+				((CSvgSvgElementImpl *)iCurrentElement)->SetViewBoxL(lRect);
+			}
+			else
+			{
+				TReal32 lTemp;
+
+				iStream >> lTemp;
+				lRect.iX= (TFloatFixPt) lTemp;
+				iStream >> lTemp;
+				lRect.iY= (TFloatFixPt) lTemp;
+				iStream >> lTemp;
+				lRect.iWidth= (TFloatFixPt) lTemp;
+				iStream >> lTemp;
+				lRect.iHeight= (TFloatFixPt) lTemp;
+
+				((CSvgSvgElementImpl *)iCurrentElement)->SetViewBoxL(lRect);
+			}
+			return ETrue;
+			}
+
+		if (aName== KAtrBaseProfile)
+			{
+			((CSvgSvgElementImpl *)iCurrentElement)->SetBaseProfileL(DecodeTDesCLC());
+			 CleanupStack::PopAndDestroy( 1 );
+			 return ETrue;
+			}
+
+		if (aName== KAtrVersion)
+			{
+			
+			if (iIsFixPt)
+			{
+				TFloatFixPt lTemp;
+				lTemp.iValue = iStream.ReadInt32L();
+				TBuf<16> lTemp2;
+				lTemp2.AppendNum( (float)lTemp );
+				((CSvgSvgElementImpl *)iCurrentElement)->SetVersion (lTemp2);
+			}
+			else
+			{
+				TReal32 lTemp;
+				iStream >> lTemp;
+				TBuf<16> lTemp2;
+				lTemp2.AppendNum(lTemp);
+				((CSvgSvgElementImpl *)iCurrentElement)->SetVersion (lTemp2);
+			}
+			
+			return ETrue;
+
+			/*
+			((CSvgSvgElementImpl *)iCurrentElement)->SetVersion (DecodeTDesCLC());
+			CleanupStack::PopAndDestroy( 1 );
+			return ETrue;
+			*/
+			}
+
+		if (aName== KAtrZoomAndPan)
+			{
+			TInt8 lTemp;
+			iStream >> lTemp;
+			TSvgZoomAndPanType lType= (TSvgZoomAndPanType) lTemp;
+			((CSvgSvgElementImpl *)iCurrentElement)->SetZoomAndPan(lType);
+			return ETrue;
+			}
+
+		if (aName== KAtrPreserveAspectRatio)
+			{
+			if (iCurrentElement->ElemID()== KSvgSvgElement)
+				{
+				TInt8 lTemp;
+				iStream >> lTemp;
+				TSvgPreserveAspectAlignType lAType= (TSvgPreserveAspectAlignType) lTemp;
+				iStream >> lTemp;
+				TSvgMeetOrSliceType lMType= (TSvgMeetOrSliceType) lTemp;
+				((CSvgSvgElementImpl *)iCurrentElement)->SetPreserveAspectRatioL(lAType, lMType);
+				return ETrue;
+				}
+			else if(iCurrentElement->ElemID()== KSvgMediaAnimationElement)
+				{
+				TInt8 lTemp;
+				iStream >> lTemp;
+				TSvgPreserveAspectAlignType lAType= (TSvgPreserveAspectAlignType) lTemp;
+				iStream >> lTemp;
+				TSvgMeetOrSliceType lMType= (TSvgMeetOrSliceType) lTemp;
+				((CSvgMediaAnimationElementImpl*)iCurrentElement)->SetPreserveAspectRatioL(lAType, lMType);
+				return ETrue; 
+				}
+			else
+				{
+				((CSvgImageElementImpl *)iCurrentElement)->SetParL(DecodeTDesCLC());
+				CleanupStack::PopAndDestroy( 1 );
+				return ETrue;
+				}
+			}
+
+		if( aName == KAtrSyncBehaviorDefault )
+			{
+			TUint8 syncBehaviorDefault;
+			iStream>>syncBehaviorDefault;
+			((CSvgSvgElementImpl*)iCurrentElement)->SetSyncBehaviorDefault( (TSvgSyncBehaviour) syncBehaviorDefault );
+			return ETrue;
+			}
+		else if( aName == KAtrSyncToleranceDefault )
+			{
+			TUint8 syncToleranceDefault;
+			iStream>>syncToleranceDefault;
+			((CSvgSvgElementImpl*)iCurrentElement)->SetSyncToleranceDefault( syncToleranceDefault );
+			return ETrue;
+			}
+		else
+			{
+			return EFalse;
+			}
+		}
+
+	else
+		{
+		return EFalse;
+		}
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeLangSpaceAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeLangSpaceAttributeL(const TUint16 aName)
+	{
+	if (aName<= KSvgLangAttrEndIndex)
+		{
+
+		if (aName== KAtrXmlLang)
+			{
+			iCurrentElement->SetXMLLangL (DecodeTDesCLC());
+			 CleanupStack::PopAndDestroy( 1 );
+			return ETrue;
+			}
+
+		if (aName== KAtrXmlSpace)
+			{
+			iCurrentElement->SetXMLSpaceL (DecodeTDesCLC());
+			 CleanupStack::PopAndDestroy( 1 );
+			return ETrue;
+			}
+
+		else
+			{
+			return EFalse;
+			}
+		}
+
+	else
+		{
+		return EFalse;
+		}
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeTransformAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeTransformAttributeL(const TUint16 aName)
+	{
+
+	if (aName== KAtrTransform)
+		{
+		
+		if (iIsFixPt)
+		{
+			TUint32 lTemp1;
+			TGfxAffineTransform lTransform;
+			
+			lTransform.iM00.iValue = iStream.ReadInt32L();
+			lTransform.iM01.iValue = iStream.ReadInt32L();
+			lTransform.iM02.iValue = iStream.ReadInt32L();
+			lTransform.iM10.iValue = iStream.ReadInt32L();
+			lTransform.iM11.iValue = iStream.ReadInt32L();
+			lTransform.iM12.iValue = iStream.ReadInt32L();
+			iStream >> lTemp1;
+			lTransform.iTransType= (TGfxTransformType) lTemp1;
+
+			iCurrentElement->SetTransformList(lTransform);
+		}
+		else
+		{
+			TReal32 lTemp;
+			TUint32 lTemp1;
+			TGfxAffineTransform lTransform;
+
+			iStream >> lTemp;
+			lTransform.iM00= (TFloatFixPt) lTemp;
+			iStream >> lTemp;
+			lTransform.iM01= (TFloatFixPt) lTemp;
+			iStream >> lTemp;
+			lTransform.iM02= (TFloatFixPt) lTemp;
+			iStream >> lTemp;
+			lTransform.iM10= (TFloatFixPt) lTemp;
+			iStream >> lTemp;
+			lTransform.iM11= (TFloatFixPt) lTemp;
+			iStream >> lTemp;
+			lTransform.iM12= (TFloatFixPt) lTemp;
+			iStream >> lTemp1;
+			lTransform.iTransType= (TGfxTransformType) lTemp1;
+
+			iCurrentElement->SetTransformList(lTransform);
+		}
+		
+		return ETrue;
+		}
+
+	else if	( aName== KAtrGradientTransform)
+		{
+		
+		if (iIsFixPt)
+		{
+			SVGReal lMatrix[2][3];
+			
+			TFloatFixPt lTemp;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[0][0]= lTemp.iValue;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[0][1]= lTemp.iValue;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[0][2]= lTemp.iValue;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[1][0]= lTemp.iValue;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[1][1]= lTemp.iValue;
+			lTemp.iValue = iStream.ReadInt32L();
+			lMatrix[1][2]= lTemp.iValue;
+
+			((CSvgGradientElementImpl*)iCurrentElement)->SetGradientTransMatrix(lMatrix);
+		}
+		else
+		{
+			TReal32 lTemp;
+			SVGReal lMatrix[2][3];
+
+			iStream >> lTemp;
+			lMatrix[0][0]= (SVGReal) lTemp;
+			iStream >> lTemp;
+			lMatrix[0][1]= (SVGReal) lTemp;
+			iStream >> lTemp;
+			lMatrix[0][2]= (SVGReal) lTemp;
+			iStream >> lTemp;
+			lMatrix[1][0]= (SVGReal) lTemp;
+			iStream >> lTemp;
+			lMatrix[1][1]= (SVGReal) lTemp;
+			iStream >> lTemp;
+			lMatrix[1][2]= (SVGReal) lTemp;
+
+			((CSvgGradientElementImpl*)iCurrentElement)->SetGradientTransMatrix(lMatrix);
+		}
+
+		return ETrue;
+		}
+
+
+
+	else
+		{
+		return EFalse;
+		}
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeTestAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeTestAttributeL(const TUint16 aName)
+	{
+	if(aName<= KSvgTestAttrEndIndex)
+		{
+
+		if (
+			aName== KAtrRequiredFeatures ||
+			aName== KAtrRequiredExtensions ||
+			aName== KAtrSystemLanguage
+		   )
+			{
+			CDesCArrayFlat* lFeatures;
+			TInt8 lCount;
+			iStream >> lCount;
+			if(lCount)
+				{
+				lFeatures= new ( ELeave ) CDesCArrayFlat( lCount );
+				}
+			else
+				{
+				lFeatures= new ( ELeave ) CDesCArrayFlat( 1 );
+				}
+
+			CleanupStack::PushL(lFeatures); //cleanup
+
+			for(TInt8 i=0; i<lCount; i++)
+				{
+				lFeatures->AppendL((const TDesC&)DecodeTDesCLC());
+				CleanupStack::PopAndDestroy( 1 );
+				}
+
+            iCurrentElement->CreateSvgTestL(aName);  //instantiates iSvgTest
+			if (aName==	 KAtrRequiredFeatures)
+				{
+		         iCurrentElement->SetRequiredFeatures (lFeatures);
+				}
+			else if (aName== KAtrRequiredExtensions)
+				{
+				iCurrentElement->SetRequiredExtensions (lFeatures);
+				}
+			else
+				{
+		         iCurrentElement->SetSystemLanguage (lFeatures);
+				}
+
+			CleanupStack::Pop(lFeatures); //cleanup
+
+		 return ETrue;
+			}
+
+		else
+			{
+			return EFalse;
+			}
+		}
+
+	else
+		{
+		return EFalse;
+		}
+	}
+
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeIdAndXmlAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeIdAndXmlAttributeL(const TUint16 aName)
+	{
+
+	if (aName== KAtrId)
+		{
+		iCurrentElement->SetIdandXmlbaseL( _L("id"), DecodeTDesCLC());
+		 CleanupStack::PopAndDestroy( 1 );
+		return ETrue;
+		}
+
+	if (aName== KAtrXmlBase)
+		{
+		iCurrentElement->SetIdandXmlbaseL( _L("xml:base"), DecodeTDesCLC());
+		 CleanupStack::PopAndDestroy( 1 );
+		return ETrue;
+		}
+
+	else
+		{
+		return EFalse;
+		}
+	}
+
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeUriRefAttributeL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeUriRefAttributeL(const TUint16 aName)
+	{
+   	if (aName<= KSvgUriAttrEndIndex)
+		{
+ 		if (aName== KAtrXlinkhref)
+			{
+            // Although discard element belongs to animation, the discard element isn't
+            // necessary inherited from giant AnimationBase, so handle attribute separately.
+            //
+        	if ( iCurrentElement->ElemID() == KSvgDiscardElement || iCurrentElement->ElemID() == KSvgMediaAnimationElement )
+        	    return EFalse;
+
+			TPtrC lPtr(DecodeTDesCLC());
+			/*Code modified for Forward refrence support in animation*/
+			iCurrentElement->SetUriRefDesL (aName, lPtr );
+			// For Animation Elements
+			if(iIsAnimElement)
+				{
+				CSvgElementImpl* lElement;
+				lElement= (CSvgElementImpl*) iDocument->GetElementById(lPtr);
+				if(lElement)
+					{
+					((CSvgAnimationBase*)iCurrentElement)->SetTarget(lElement);
+					}
+				else
+					{
+					 if (!iAnimRefElementArray)
+						 {
+                         iAnimRefElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+                         }
+                     iAnimRefElementArray->AppendL((CSvgElementImpl*)iCurrentElement);
+                    }
+
+				CleanupStack::PopAndDestroy( 1 );
+				return ETrue;
+				}
+
+
+			//Only for Image Element
+			if (iCurrentElement->ElemID() == KSvgImageElement)
+				{
+                ((CSvgImageElementImpl*)iCurrentElement)->SetUriL(lPtr);
+                iImageElements.Append((CSvgImageElementImpl*)iCurrentElement);
+				}
+			CleanupStack::PopAndDestroy( 1 );
+
+			// setting reference element of use Element
+			if (iCurrentElement->ElemID() == KSvgUseElement)
+				{
+			    if( ((CSvgUseElementImpl*)iCurrentElement)->SetRefElemById
+			             (DecodeTDesCLC()) != KErrNone)
+			        {
+					// if it is null reallocate the memeory again.
+					 if (!iUseElementArray)
+						 {
+                         iUseElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+                         }
+                     iUseElementArray->AppendL((CSvgElementImpl*)iCurrentElement);
+                    }
+                CleanupStack::PopAndDestroy( 1 );
+                return ETrue;
+				}
+// for future animation element
+//		    else if (iCurrentElement->ElemID() == KSvgAnimationElement)
+//				{
+//			    if( ((CSvgAnimationElementImpl*)iCurrentElement)->SetRefElemById
+//			             (DecodeTDesCLC()) == KErrNone)
+//			        {
+					// if it is null reallocate the memeory again.
+//					 if (!iAnimationElementArray)
+//						 {
+//     					 iAnimationElementArray = new (ELeave)RPointerArray<CSvgElementImpl> (1);
+//						 }
+//			         User::LeaveIfError(iAnimationElementArray->Append((CSvgElementImpl*)iCurrentElement));
+//			        }
+//				CleanupStack::PopAndDestroy( 1 );
+//				return ETrue;
+//				}
+
+			// setting Path of Mpath element
+			if (iCurrentElement->ElemID() == KSvgMpathElement)
+				{
+				iCurrentElement->iReqAttrFlag =0;
+				TInt8 lCheck;
+				iStream >> lCheck;
+				//  Flag is used to check the validity of reference element
+				if (lCheck)
+					{
+					((CSvgMpathElementImpl*)iCurrentElement)->SetAttributePathByIdL(DecodeTDesCLC());
+					CleanupStack::PopAndDestroy( 1 );
+					}
+				}
+
+			return ETrue;
+			}
+
+		else if (aName== KAtrXlinkactuate ||
+			     aName== KAtrXlinkarcrole ||
+				 aName== KAtrXlinkrole ||
+				 aName== KAtrXlinktitle ||
+				 aName== KAtrXlinktype ||
+				 aName== KAtrXlinkshow
+			    )
+			{
+			iCurrentElement->SetUriRefDesL (aName, DecodeTDesCLC() );
+			CleanupStack::PopAndDestroy( 1 );
+			return ETrue;
+			}
+
+		else
+			{
+			return EFalse;
+			}
+		}
+
+	else if (aName== KXlinkhrefImageEmbedded)
+		{
+		TPtrC lPtr(DecodeImageEmbeddedTDesCLC());
+
+		iCurrentElement->SetUriRefDesL (aName, lPtr );
+
+			//Only for Image Element
+		if (iCurrentElement->ElemID() == KSvgImageElement)
+            {
+            // Keep track of embedded images
+            iEmbeddedImagesCount++;
+            ((CSvgImageElementImpl*)iCurrentElement)->SetUriL(lPtr);
+            ((CSvgImageElementImpl*)iCurrentElement)->LoadUriL();
+            }
+        CleanupStack::PopAndDestroy( 2 );
+        return ETrue;
+        }
+    else
+		{
+		return EFalse;
+		}
+	}
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeDiscardAttributeL (const TUint16& aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeDiscardAttributeL (const TUint16& aName)
+	{
+	if ( iCurrentElement->ElemID() != KSvgDiscardElement )
+	    return EFalse;
+
+	TInt8 lCheck;
+	TInt16 lTemp;
+
+	if (aName== KAtrBegin)
+	    {
+		// Flag is used to check for SyncValue flag.
+		iStream >> lCheck;
+		if ( lCheck )
+			{
+            ((CSvgDiscardElementImpl*)iCurrentElement)->SetSyncValueDefined(ETrue);
+			}
+        else
+            {
+			((CSvgDiscardElementImpl*)iCurrentElement)->SetSyncValueDefined(EFalse);
+            }
+
+		// Flag is used to check for EventValue flag.
+		iStream >> lCheck;
+		if ( lCheck )
+			{
+            ((CSvgDiscardElementImpl*)iCurrentElement)->SetEventValueDefined(ETrue);
+            }
+        else
+            {
+            ((CSvgDiscardElementImpl*)iCurrentElement)->SetEventValueDefined(EFalse);
+            }
+
+
+		// Flag is used to check for SyncElement's id.
+		iStream >> lCheck;
+		if ( lCheck )
+			{
+    		TPtrC lPtr(DecodeTDesCLC());
+    		((CSvgDiscardElementImpl*)iCurrentElement)->SetBeginSyncElementId(lPtr);
+	        CleanupStack::PopAndDestroy( 1 );
+            }
+
+
+		iStream >> lTemp;
+		((CSvgDiscardElementImpl*)iCurrentElement)->SetAbsoluteBeginTime(lTemp);
+
+		iStream >> lTemp;
+		((CSvgDiscardElementImpl*)iCurrentElement)->SetRefBeginTime(lTemp);
+
+		iStream >> lTemp;
+		((CSvgDiscardElementImpl*)iCurrentElement)->SetKeyValue(lTemp);
+
+		iStream >> lTemp;
+		((CSvgDiscardElementImpl*)iCurrentElement)->SetBeginReferenceEvent((TSvgEvent)lTemp);
+
+	    }
+	else
+	if (aName== KAtrXlinkhref)
+        {
+		// Flag is used to check for HrefValue flag.
+		iStream >> lCheck;
+		if ( lCheck )
+			{
+            ((CSvgDiscardElementImpl*)iCurrentElement)->SetHrefValueDefined(ETrue);
+    		TPtrC lPtr(DecodeTDesCLC());
+    		((CSvgDiscardElementImpl*)iCurrentElement)->SetTargetId(lPtr);
+            CleanupStack::PopAndDestroy( 1 );
+            }
+        else
+            ((CSvgDiscardElementImpl*)iCurrentElement)->SetHrefValueDefined(EFalse);
+
+        }
+
+    return ETrue;
+    }
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeAttributeFloatL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeAttributeFloatL(const TUint16 aName)
+	{
+	if (iIsFixPt)
+	{
+		TFloatFixPt lTemp;
+		lTemp.iValue = iStream.ReadInt32L();
+		iCurrentElement->SetAttributeFloatL( (TInt)aName, lTemp );
+	}
+	else
+	{
+		TReal32 lTemp;
+		iStream >> lTemp;
+		iCurrentElement->SetAttributeFloatL( (TInt)aName, (TFloatFixPt)lTemp );
+	}
+	
+	return ETrue;
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeAttributeIntL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeAttributeIntL(const TUint16 aName)
+	{
+	TInt8 lTemp;
+	iStream >> lTemp;
+	iCurrentElement->SetAttributeIntL( (TInt)aName, (TInt32)lTemp );
+	return ETrue;
+	}
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeAttributePathL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeAttributePathL(const TUint16 aName)
+	{
+	CGfxGeneralPath* lPath;
+	DecodeAnimationPathL(lPath);
+
+	iCurrentElement->SetAttributePathRef( (TInt)aName, lPath);
+
+	return  ETrue;
+	}
+
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::DecodeAnimationPathL(CGfxGeneralPath*& aPath)
+// ---------------------------------------------------------------------------
+void CSvgDecoder::DecodeAnimationPathL(CGfxGeneralPath*& aPath)
+    {
+
+    aPath = CGfxGeneralPath::NewLC();
+
+    {
+        const TInt KLargePathTypeCount = 4*256;
+
+        TUint16 typeCount = 0;
+        iStream >> typeCount;
+
+        /******************************************************************/
+        // Path Type
+        /******************************************************************/
+        RArray<TUint32>* pathTypeArray = NULL;
+        // Put path-type-array to path to handle cleanup
+        if ( typeCount == 0 )
+            {
+            pathTypeArray = new (ELeave)RArray<TUint32>( 1 );
+            aPath->SetPointTypeArrayRef( pathTypeArray );
+            }
+        else
+            {
+            pathTypeArray = new (ELeave)RArray<TUint32>( typeCount );
+            aPath->SetPointTypeArrayRef( pathTypeArray );
+            }
+
+        // Occurs only for very large paths
+        if ( typeCount > KLargePathTypeCount )
+            {
+            TUint8* byteData = new (ELeave) TUint8[typeCount];
+            CleanupArrayDeletePushL( byteData );
+
+            iStream.ReadL( byteData, typeCount );
+            
+            for ( TInt i = 0; i < typeCount; i++ )
+                {
+            
+                if(byteData[i] == EGfxEncodedSegMoveTo)
+                {
+                	byteData[i] = EGfxSegMoveTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegLineTo )
+                {
+                	byteData[i]  = EGfxSegLineTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegQuadTo)
+                {
+                	byteData[i]  = EGfxSegQuadTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegCubicTo)
+                {
+                	byteData[i]  = EGfxSegCubicTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegClose)
+                {
+                	byteData[i]  = EGfxSegClose;
+                }
+                // Path will close RArray if Leave occurs
+                pathTypeArray->AppendL( byteData[i] );
+                }
+                //Transfering ownership to Path
+            aPath->PathSegmentTypeArray(byteData);
+            aPath->Count(typeCount);
+            CleanupStack::Pop( 1 );
+            //delete [] byteData;
+            }
+        else
+            {
+            TUint8 *byteData = new (ELeave) TUint8[KLargePathTypeCount];
+            CleanupArrayDeletePushL( byteData );
+            iStream.ReadL( byteData, typeCount );
+            for ( TInt i = 0; i < typeCount; i++ )
+                {
+            
+                if(byteData[i] == EGfxEncodedSegMoveTo)
+                {
+                	byteData[i] = EGfxSegMoveTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegLineTo )
+                {
+                	byteData[i]  = EGfxSegLineTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegQuadTo)
+                {
+                	byteData[i]  = EGfxSegQuadTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegCubicTo)
+                {
+                	byteData[i]  = EGfxSegCubicTo;
+                }
+                else if(byteData[i] == EGfxEncodedSegClose)
+                {
+                	byteData[i]  = EGfxSegClose;
+                }
+                // Path will close RArray if Leave occurs
+                pathTypeArray->AppendL( byteData[i] );
+                }
+            aPath->PathSegmentTypeArray(byteData);
+            aPath->Count(typeCount);
+             CleanupStack::Pop( 1 );
+            }
+    }
+
+    /******************************************************************/
+    // Path Points
+    /******************************************************************/
+    {
+        const TInt KLargePathPointsCount = 256;
+
+        TUint16 valueCount = 0;
+        iStream >> valueCount;
+
+        RArray<TFloatFixPt>* pathPointsArray = NULL;
+
+        if ( valueCount == 0 )
+            {
+            pathPointsArray = new (ELeave)RArray<TFloatFixPt>( 1 );
+            aPath->SetPointCoordsArrayRef( pathPointsArray );
+            }
+        else
+            {
+            pathPointsArray = new (ELeave)RArray<TFloatFixPt>( valueCount );
+            aPath->SetPointCoordsArrayRef( pathPointsArray );
+            }
+
+        if ( valueCount > KLargePathPointsCount )
+            {
+            if (iIsFixPt)
+	            {
+	            TFloatFixPt* fixedData = new (ELeave) TFloatFixPt[valueCount];
+                CleanupArrayDeletePushL( fixedData );
+
+	            TInt byteCount = sizeof( TFloatFixPt ) * valueCount;
+	            iStream.ReadL( (TUint8*)fixedData, byteCount );
+
+	            for ( TInt i = 0; i < valueCount; i++ )
+	                {
+	                // Path will close RArray if Leave occurs
+	                pathPointsArray->AppendL( fixedData[i] );
+	                }
+
+	            CleanupStack::Pop( 1 ); // fixedData 
+	            delete [] fixedData;         	
+            	}
+            else
+	            {
+	            TReal32* real32Data = new (ELeave) TReal32[valueCount];
+                CleanupArrayDeletePushL( real32Data );
+
+	            TInt byteCount = sizeof( TReal32 ) * valueCount;
+	            iStream.ReadL( (TUint8*)real32Data, byteCount );
+
+	            for ( TInt i = 0; i < valueCount; i++ )
+	                {
+	                // Path will close RArray if Leave occurs
+	                pathPointsArray->AppendL( (TFloatFixPt)real32Data[i] );
+	                }
+
+	            CleanupStack::Pop( 1 ); // real32Data    
+	            delete [] real32Data;       	
+	            }
+            }
+         else
+            {
+            if (iIsFixPt)
+            	{
+            	TFloatFixPt fixedData[KLargePathPointsCount];
+            	TInt byteCount = sizeof( TFloatFixPt ) * valueCount;
+            	iStream.ReadL( (TUint8*)fixedData, byteCount );
+
+            	for ( TInt i = 0; i < valueCount; i++ )
+                	{
+               	 	pathPointsArray->AppendL( fixedData[i] );
+                	}            	
+            	}
+            else
+            	{
+            	TReal32 real32Data[KLargePathPointsCount];
+            	TInt byteCount = sizeof( TReal32 ) * valueCount;
+            	iStream.ReadL( (TUint8*)real32Data, byteCount );
+
+            	for ( TInt i = 0; i < valueCount; i++ )
+                	{
+                	pathPointsArray->AppendL( (TFloatFixPt)real32Data[i] );
+                	}            	
+            	}
+            }
+
+    }
+
+    CleanupStack::Pop( 1 ); // aPath
+    }
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeAttributeDesL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeAttributeDesL(const TUint16 aName)
+	{
+	iCurrentElement->SetAttributeDesL ((TInt)aName, DecodeTDesCLC());
+	CleanupStack::PopAndDestroy( 1 );
+	return ETrue;
+	}
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeStringCssValueL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeStringCssValueL(const TUint16 aName)
+	{
+
+	CCssValue* tParentValue = NULL;
+    CCssValue* tValue = NULL;
+
+	iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+	TPtrC lPtr(DecodeTDesCLC());
+
+	if(iCurrentElement->ElemID() == KSvgFontfaceElement)
+		{
+		((CSvgFontFaceElementImpl *)iCurrentElement)->SetFontFamilyL(lPtr);
+		}
+
+	if(iCurrentElement!= iRootElement)
+		{
+		iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+		}
+
+	if (tParentValue == tValue || tValue == NULL)
+		{
+
+		if (iDocument)
+		{
+			tValue = iDocument->iMemoryManager->GetCssStrObjectL( lPtr );
+		}
+
+
+
+		CleanupStack::PopAndDestroy( 1 );// cleanup : for lPtr
+	    iCurrentElement->SetPresentationAttribute ((TInt8)aName,tValue);
+		}
+	else
+		{
+		((CStrCssValueImpl*)tValue)->SetValueL ( lPtr );
+		 CleanupStack::PopAndDestroy( 1 );
+		}
+
+	return ETrue;
+	}
+
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeIntCssValueL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeIntCssValueL(const TUint16 aName)
+	{
+
+	TInt32  lInt32;
+	iStream >> lInt32;
+
+	CCssValue* tParentValue = NULL;
+    CCssValue* tValue = NULL;
+
+	iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+	if(iCurrentElement!= iRootElement)
+		{
+		iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+		}
+
+	if (tParentValue == tValue || tValue == NULL)
+		{
+
+		if (iDocument)
+		{
+			tValue = iDocument->iMemoryManager->GetCssIntObjectL( (TInt)lInt32 );
+		}
+
+	    iCurrentElement->SetPresentationAttribute ((TInt8)aName,tValue);
+		}
+	else
+		{
+		((CIntCssValueImpl*)tValue)->SetValueL ((TInt)lInt32);
+		}
+
+	return ETrue;
+	}
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeFloatCssValueL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeFloatCssValueL(const TUint16 aName)
+	{
+
+	if (iIsFixPt)
+	{
+		TFloatFixPt lFixed;
+		lFixed.iValue = iStream.ReadInt32L();
+		
+		CCssValue* tParentValue = NULL;
+    	CCssValue* tValue = NULL;
+
+		iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+		if(iCurrentElement!= iRootElement)
+		{
+		iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+		}
+
+		if (tParentValue == tValue || tValue == NULL)
+		{
+		if (iDocument)
+		{
+			tValue = iDocument->iMemoryManager->GetCssFloatObjectL( lFixed );
+		}
+
+	    iCurrentElement->SetPresentationAttribute ((TInt8)aName,tValue);
+		}
+		else
+		{
+		((CFloatCssValueImpl*)tValue)->SetValueL ( lFixed );
+		}		
+	}
+	else
+	{
+		TReal32  lFlt32;
+		iStream >> lFlt32;
+		
+		CCssValue* tParentValue = NULL;
+    	CCssValue* tValue = NULL;
+
+		iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+		if(iCurrentElement!= iRootElement)
+		{
+		iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+		}
+
+		if (tParentValue == tValue || tValue == NULL)
+		{
+		if (iDocument)
+		{
+			tValue = iDocument->iMemoryManager->GetCssFloatObjectL((TFloatFixPt)lFlt32);
+		}
+
+	    iCurrentElement->SetPresentationAttribute ((TInt8)aName,tValue);
+		}
+		else
+		{
+		((CFloatCssValueImpl*)tValue)->SetValueL ((TFloatFixPt)lFlt32);
+		}
+	}
+
+	return ETrue;
+	}
+
+
+// --------------------------------------------------------------------------
+// TBool CSvgDecoder::DecodeColorCssValueL(const TUint16 aName)
+// ---------------------------------------------------------------------------
+TBool CSvgDecoder::DecodeColorCssValueL(const TUint16 aName)
+	{
+	TUint32 lColor;
+	iStream >> lColor;
+
+	// Shift from XBGR to XRGB
+	if(!iIsRGB)
+		{
+		lColor = (  lColor & 0xFF000000) |
+			 ( (lColor & 0x00FF0000) >> 16 ) |
+		     (  lColor & 0x0000FF00       ) |
+		     ( (lColor & 0x000000FF) << 16 );
+		}
+	
+	CCssValue* tParentValue = NULL;
+    CCssValue* tValue = NULL;
+
+	iCurrentElement->FindProperty ((TInt8)aName,tValue);
+
+	if(iCurrentElement!= iRootElement)
+		{
+		iCurrentParentElement->FindProperty ((TInt8)aName,tParentValue);
+		}
+
+	if (tParentValue == tValue || tValue == NULL)
+		{
+		if ( iDocument )
+		{
+			tValue = iDocument->iMemoryManager->GetCssClrObjectL();
+		
+		CleanupStack::PushL(tValue); //cleanup
+
+		((CClrCssValueImpl*)tValue)->CloneRGBValueL (lColor);
+	    iCurrentElement->SetPresentationAttribute ((TInt8)aName,tValue);
+	    CleanupStack::Pop(tValue); //cleanup
+	    }
+		}
+	else
+		{
+		((CClrCssValueImpl*)tValue)->CloneRGBValueL (lColor);
+		}
+
+	return ETrue;
+	}
+
+
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::SetPaintValueL (CCssValue*& aValue)
+// ---------------------------------------------------------------------------
+void CSvgDecoder::SetPaintValueL (CCssValue*& aValue)
+	{
+	TUint8 lCheckGradient;
+	iStream >> lCheckGradient;
+
+	if( lCheckGradient)
+		{
+		((CPaintCssValueImpl *)aValue)->SetUrlflag();
+		((CPaintCssValueImpl *)aValue)->SetUrlIdL( DecodeTDesCLC() );
+		 CleanupStack::PopAndDestroy( 1 );
+		}
+	else
+		{
+		TUint32 lColor;
+ 		iStream >> lColor;
+		// Shift from XBGR to ARGB
+		if(!iIsRGB)
+			{
+			lColor = (  lColor & 0xFF000000) |
+			     ( (lColor & 0x00FF0000) >> 16 ) |
+			     (  lColor & 0x0000FF00       ) |
+			     ( (lColor & 0x000000FF) << 16 );
+			}
+		((CPaintCssValueImpl *)aValue)->CloneRGBValueL (lColor);
+		}
+	}
+
+
+
+
+
+// ==========================================================================
+// Start Decoding
+// ==========================================================================
+CSvgElementImpl* CSvgDecoder::StartDecodingL(CSvgDocumentImpl *aDocument,
+											CSvgErrorImpl& aError )
+	{
+
+	iDocument= aDocument;
+
+	iSvgError = &aError;
+    aError.SetErrorCode( ESvgNoError );
+
+	TUint32 lValidBinary;
+	iStream >> lValidBinary;
+
+	if (lValidBinary != KBinaryFile && 
+		lValidBinary != KBinaryFile2 && 
+		lValidBinary != KBinaryFile3 && 
+		lValidBinary != KBinaryFile4)
+		{
+		iSvgError->SetErrorCode ( ESvgbFileNotValid );
+        iSvgError->SetDescription( _L( "Not a valid binary file." ) );
+        iSvgError->SetIsWarning( EFalse );
+        return NULL;
+	}
+	
+	if (lValidBinary == KBinaryFile2)
+		{
+		iIsFixPt = ETrue;
+		iIsRGB = EFalse;
+		}
+		
+	if (lValidBinary == KBinaryFile3)
+		{
+		iIsFixPt = ETrue;
+		iIsRGB = ETrue;
+		}
+		
+	if(lValidBinary == KBinaryFile4)
+		{
+		iIsFixPt = EFalse;
+		iIsRGB = ETrue;
+		}
+
+	TUint8 lElemId;
+	TUint16 lAttrName;
+
+	MXmlElement* newElement;
+
+	iStream >> lElemId;
+	while (lElemId != KEndSvgFile)
+		{
+
+		 // checks end of element
+		while (lElemId==KEndElemIndex)
+			{
+			if ( iCurrentParentElement != iRootElement )
+				{
+				// Depth is decreased, so the current parent should be one level up
+				iCurrentParentElement = ( CSvgElementImpl * )
+			                       iCurrentParentElement->ParentNode();
+				}
+
+			iStream >> lElemId;
+			}
+
+		// checks for Cdata
+  		if (lElemId == KCDataPresent)
+			{
+			iCurrentElement= iCurrentParentElement;
+			DecodeAttributeL((TUint16)KAtrCdata);
+			iStream >> lElemId;
+			continue;
+			}
+
+
+
+		 //checks end of file.
+		if (lElemId == KEndSvgFile)
+			{
+			break;
+			}
+
+
+		newElement  = iDocument->CreateElementL( lElemId );
+
+		if( newElement == NULL)
+			{
+				User::Leave(KErrCorrupt);
+			}
+
+	    iCurrentElement = ( CSvgElementImpl * ) newElement;
+
+
+		if ( lElemId == KSvgSvgElement && !iRootElement )
+			{
+	        iRootElement = iCurrentElement;
+
+	      	//CleanupStack::PushL(iRootElement);
+	        iDocument->AppendChildL( newElement );
+	        //CleanupStack::Pop(iRootElement);
+
+		    }
+		// for all other elements
+		else
+			{
+    		 iCurrentParentElement->AppendChildL( newElement );
+		    }
+
+		// Setting target element for animations
+		if( iCurrentElement->IsAnimatedElement() )
+			{
+            ((CSvgAnimationBase*)iCurrentElement)->SetTarget( iCurrentParentElement);
+            // For media elements do not set iIsAnimElement as 
+            // the Xlink:Href  is for external files rather
+            // than internal elements
+            if (!( iCurrentElement->ElemID() >= KSvgMediaElemsStartIndex &&
+             iCurrentElement->ElemID() <= KSvgMediaElemsEndIndex ) )
+                {
+			    iIsAnimElement= ETrue;                
+                }
+			}
+
+
+		iStream >> lAttrName;
+
+		// for attribute list.
+		while (lAttrName!= KStartNewElem)
+			{
+			DecodeAttributeL(lAttrName);
+			iStream >> lAttrName;
+			}
+		if( iCurrentElement->ElemID() == KSvgStopElement)
+		   {
+		   if( ((CSvgElementImpl*)iCurrentElement->ParentNode()) != NULL )
+              {
+              if((((((CSvgElementImpl*)iCurrentElement->ParentNode())->ElemID()) == KSvgRadialGradientElement) ||
+	              ((((CSvgElementImpl*)iCurrentElement->ParentNode())->ElemID()) == KSvgLinearGradientElement) ) )
+		         {
+	    	     CSvgGradientElementImpl *parent = ((CSvgGradientElementImpl *)iCurrentElement->ParentNode());
+        
+                 if(parent)
+		            {
+	                // Initialize the offset value to 0 if its still -1.
+	                TFloatFixPt lOffsetValue;
+	                TFloatFixPt lDefaultOffsetValue(-1);
+	                TBuf<6>     lAttributeName;
+	                TBuf<1>     lValueBuffer;
+	                      
+	                lAttributeName.Append(OFFSET);
+	                lValueBuffer.Append(ZEROVALUE);
+	                       
+	                ((CSvgStopElementImpl*)iCurrentElement)->GetOffset( lOffsetValue );
+	                      
+	                // Offset Value of -1 indicates that Offset Attribute is not declared in
+	                // stop element.
+	                if( lOffsetValue == lDefaultOffsetValue )
+	                   {
+	                    // Deliberately calling SetAttributeL in place of SetAttributeFloatL as the latter inturn
+	                    // calls UpdateOffsetValues which should be called on any Stop element once it is added to
+	                    // to the Stop element array Owned by parent Gradient element.
+	                    ((CSvgStopElementImpl*)iCurrentElement)->SetAttributeL( lAttributeName, lValueBuffer );
+	                   }
+	                   
+	                // The function not only adds the element in Stop element array but also
+                    // adjusts the offset values of all the previously added elements such that
+                    // each gradient offset value is greater than the previous gradient stop's
+                    // offset value.It calls UpdateOffsetValues to adjust the values.
+	                ((CSvgGradientElementImpl *)parent)->AddStopElementInArray((CSvgStopElementImpl*)iCurrentElement);
+		            }
+	              }
+            }
+		}
+
+
+		if (iCurrentElement->ElemID() == KSvgUseElement)
+			{
+			((CSvgUseElementImpl *)iCurrentElement)->SetReferenceElementL();
+			}
+/*		else if (iCurrentElement->ElemID() == KSvgAnimationElement)
+			{
+			((CSvgAnimationElementImpl *)iCurrentElement)->SetReferenceElementL();
+			if(((CSvgAnimationElementImpl *)iCurrentElement)->RecursionVariable())
+				{
+				iSvgError->SetErrorCode( ESvgDocumentNotValid );
+				iSvgError->SetIsWarning( EFalse );
+				iSvgError->SetDescription( _L( "Invalid Document \n" ) );
+				iSvgError->AppendDescription( _L("Animation element in loop") );
+                return iRootElement;
+                }
+            }
+*/
+        if (iCurrentElement->HasAnyTests())
+        {
+            iReqFetAttSysArray->AppendL(iCurrentElement);
+        }
+
+        if (iCurrentElement->ElemID() == KSvgSwitchElement)
+        {
+            iSwitchElementArray->AppendL(iCurrentElement);
+        }
+
+		// For DOM reuse
+		if( iCurrentElement->IsAnimatedElement() )
+            {
+            ((CSvgAnimationBase*)iCurrentElement)->SetOriginalValues_DOMReuse() ;
+            iAnimationElementArray->AppendL(iCurrentElement);
+            }
+
+
+		if( iCurrentElement->ElemID() >= KSvgLinearGradientElement &&
+			iCurrentElement->ElemID() <= KSvgStopElement )
+			{
+			iCurrentElement->SetAttributeIntL(KCSS_ATTR_DISPLAY,0);
+			}
+
+		if (	iCurrentElement->ElemID() == KSvgMpathElement &&
+				iCurrentParentElement->ElemID() == KSvgAnimateMotionElement &&
+				iSvgError->ErrorCode() == ESvgMissingRequiredAttribute &&
+				iSvgError->IsWarning()
+		   )
+
+
+			{
+			iSvgError->SetErrorCode( ESvgNoError );
+			// add to event receiver list will have only one copy
+			iDocument->AddToEventReceiverListL( iCurrentParentElement, KSvgEventMaskTimer );
+			}
+
+		CheckRequiredAttributesL( lElemId);
+		iIsAnimElement= EFalse;
+
+		iCurrentParentElement = iCurrentElement;
+
+		iStream >> lElemId;
+
+		}
+    //Load Images
+    
+    TInt lImageElementCnt = iImageElements.Count();
+    TInt lTotalImagesCount = lImageElementCnt + iEmbeddedImagesCount;
+    iDocument->SetImageElementsCount(lTotalImagesCount);
+    for( TInt index = 0 ; index < lImageElementCnt ; index++)
+        {
+          iImageElements[index]->LoadUriL();
+        }
+    
+	if(iUseElementArray)
+		{
+	 // support for forward reference in use element
+	TInt lCount = iUseElementArray->Count();
+	TInt lIndex= 0;
+	while(lIndex < lCount)
+	{
+		TPtrC tPtr2 = ((CSvgElementImpl*)iUseElementArray->operator[](lIndex))->Href();
+		TInt Pos1= tPtr2.Locate('#');
+        HBufC*  tBufC   = HBufC::NewLC( tPtr2.Length() );
+	    TPtr    tPtr3    ( tBufC->Des() );
+	    tPtr3.Copy( tPtr2 );
+	    tPtr3.TrimAll();
+	    // remove '#'
+		if(Pos1 != KErrNotFound)
+			{
+			tPtr3.Delete(Pos1,1);
+			}
+		if(((CSvgUseElementImpl *)iUseElementArray->operator[](lIndex))->SetRefElemById(tPtr3) != KErrNotFound)
+			{
+			((CSvgUseElementImpl *)iUseElementArray->operator[](lIndex))->SetReferenceElementL();
+
+			}
+			lIndex++;
+		CleanupStack::PopAndDestroy( 1 );
+	}
+		}
+	// support for forward reference in use element
+	if(iAnimRefElementArray)
+		{
+		TInt lCount = iAnimRefElementArray->Count();
+		TInt lIndex= 0;
+	while(lIndex < lCount)
+		{
+		TPtrC tPtr2 = ((CSvgElementImpl*)iAnimRefElementArray->operator[](lIndex))->Href();
+		((CSvgAnimationBase *)iAnimRefElementArray->operator[](lIndex))->SetRefElemById(tPtr2);
+		lIndex++;
+			}
+		}
+
+	// For Animation elements
+	if (iAnimationElementArray)
+		{
+		TInt lCount = iAnimationElementArray->Count();
+		TInt lIndex = 0;
+		while(lIndex < lCount)
+	    	{
+		    ((CSvgAnimationBase *)iAnimationElementArray->operator[](lIndex))->CheckBeginTime();
+		    lIndex ++;
+		    }
+		}
+    // Reset iCurrentElement, as it is no longer used
+    iCurrentElement = NULL;
+	RemoveFalseElements();
+	RemoveFalseSwitchCases();
+
+	return iRootElement;
+	}
+
+
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::CheckRequiredAttributesL(const TUint8 aName )
+// ---------------------------------------------------------------------------
+void CSvgDecoder::CheckRequiredAttributesL(const TUint8 aName )
+	{
+
+
+	if( iCurrentElement->iReqAttrFlag != 0)
+
+			{
+
+			iSvgError->SetErrorCode( ESvgMissingRequiredAttribute );
+			iSvgError->SetIsWarning( ETrue );
+			iSvgError->SetDescription( _L( "Missing required attribute \"" ) );
+			switch(iCurrentElement->iReqAttrFlag)
+			{
+			case KSVG_PATH_ELEMFLAG:
+				iSvgError->AppendDescription( _L("d") );
+				break;
+			case KAtrWidth:
+				iSvgError->AppendDescription( _L("width") );
+				break;
+			case KAtrHeight:
+				iSvgError->AppendDescription( _L("height") );
+				break;
+			case KSVG_POLYLINE_ELEMFLAG:
+				iSvgError->AppendDescription( _L("points") );
+				break;
+			case KAtrRy:
+				iSvgError->AppendDescription( _L("Ry") );
+				break;
+			case KAtrRx:
+				iSvgError->AppendDescription( _L("Rx") );
+				break;
+			case KAtrSVGRec:
+				iSvgError->AppendDescription( _L("width") );
+				iSvgError->AppendDescription( _L( "\" and \"" ) );
+				iSvgError->AppendDescription(_L("height"));
+				break;
+			case KAtrSVGElp:
+				iSvgError->AppendDescription( _L("Rx") );
+				iSvgError->AppendDescription( _L( "\" and \"" ) );
+				iSvgError->AppendDescription(_L("Ry"));
+				break;
+			case KAtrSVGTrf:
+				iSvgError->AppendDescription( _L("attributeName") );
+				iSvgError->AppendDescription( _L( "\" and \"" ) );
+				iSvgError->AppendDescription(_L("type"));
+				break;
+			case KSVG_ANIMATE_ELEMFLAG:
+				iSvgError->AppendDescription( _L("attributeName") );
+				break;
+			case KSVG_CIRCLE_ELEMFLAG:
+				iSvgError->AppendDescription( _L("r") );
+				break;
+			case KSVG_HKERN_ELEMFLAG:
+				iSvgError->AppendDescription( _L("k") );
+				break;
+			case KAtrType:
+				iSvgError->AppendDescription( _L("type") );
+				break;
+			case KAtrXlinkhref:
+				iSvgError->AppendDescription (_L("Xlink:href"));
+				break;
+			case KAtrSVGAmo:
+				iSvgError->AppendDescription( _L("path") );
+				((CSvgDocumentImpl*)iDocument)->RemoveFromEventReceiverList( iCurrentElement );
+				break;
+			case KAtrToBy:
+				iSvgError->AppendDescription( _L("to/by") );
+				((CSvgDocumentImpl*)iDocument)->RemoveFromEventReceiverList( iCurrentElement );
+				break;
+			}
+			iSvgError->AppendDescription( _L( "\" for <" ) );
+			// access schema data to get the name of the attribute which is missing
+			// currently the error msg doesnt not report the name of the attribute
+
+			TBuf<20> lElemName = _L("svg");
+			((CSvgDocumentImpl*)iDocument)->SchemaData()->GetSVGElementName(aName,lElemName);
+			iSvgError->AppendDescription( lElemName );
+			iSvgError->AppendDescription( _L( ">." ) );
+			// turn off element
+
+			  ((CSvgElementImpl*)iCurrentElement)->SetTurnOff( ETrue );
+
+			((CSvgElementImpl*)iCurrentElement)->SetPropertyL(KCSS_ATTR_DISPLAY,_L("none"));
+
+
+		}
+	}
+
+//---------------------------------------------------
+//Removal of elements that dont pass
+//required extensions, required features, and system language
+//requirements
+//switch statement is special case were only the first one
+//that passes these requirements will be used so toss the rest
+//---------------------------------------------------
+void CSvgDecoder::RemoveFalseElements()
+    {
+    if (iReqFetAttSysArray == NULL)
+        {
+        // Error Case
+        return;        
+        }
+
+    //loop through the list of elements with required features, attributes, or sys language
+    TInt reqFetSysArrayCnt = iReqFetAttSysArray->Count();
+    while ( reqFetSysArrayCnt > 0 )
+        {
+        CSvgElementImpl* lCurElement = ( CSvgElementImpl* )
+            iReqFetAttSysArray->operator[]( reqFetSysArrayCnt - 1 );
+
+        if ( lCurElement != NULL )
+            {
+            CSvgElementImpl* lCurParent = ( CSvgElementImpl* )
+                lCurElement->ParentNode();
+ 
+            //just a normal element check it and remove it if it doesnt pass
+            TBool lResult = EFalse;
+            TRAPD( error, lResult  = VerifyReqExReqFtrSysL( lCurElement ) );
+            if ( error == KErrNone && !lResult )
+                {
+                // Remove internal references to the element about to be 
+                // removed
+                // This function would also remove the lCurElement from
+                // iReqFetAttSysArray.
+                RemoveInternalReferences( lCurElement );
+                //element doesnt have proper required extension, attributes, or system language
+                lCurParent->RemoveChild( lCurElement );
+                delete (CXmlElementImpl*)lCurElement;
+                lCurElement = NULL;
+                }
+            else
+                {
+                // Remove the last element from the array as it is processed
+                iReqFetAttSysArray->Remove( reqFetSysArrayCnt - 1 );
+                } // if ( error == KErrNone && !lResult )
+            }
+        else
+            {
+            // Remove the last element from the array as it is processed
+            iReqFetAttSysArray->Remove( reqFetSysArrayCnt - 1 );
+            } // if ( lCurElement != NULL )
+        // Update the count of elements in the array
+        reqFetSysArrayCnt = iReqFetAttSysArray->Count();
+        } // while ( reqFetSysArrayCnt > 0 )
+    // Clear the array as it is no longer required.
+    iReqFetAttSysArray->Reset();    
+    }
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::RemoveFalseSwitchCases()
+// ---------------------------------------------------------------------------
+void CSvgDecoder::RemoveFalseSwitchCases()
+    {
+    if (iSwitchElementArray == NULL)
+        {
+        // Error Case
+        return;
+        }
+        
+    TInt switchEleArrayCnt = iSwitchElementArray->Count();
+    while ( switchEleArrayCnt > 0 )
+        {
+        TBool foundTrue = EFalse;
+        CSvgElementImpl* curSwitchElem = ( CSvgElementImpl* )
+            iSwitchElementArray->operator[]( switchEleArrayCnt - 1 );
+
+        if ( curSwitchElem != NULL )
+            {
+            //get the first child...which is where the first
+            CSvgElementImpl* curCaseElem = (CSvgElementImpl*)curSwitchElem->FirstChild();
+
+            while ( curCaseElem != NULL )
+                {
+                CSvgElementImpl* nextCaseElem = (CSvgElementImpl*)curCaseElem->NextSibling();
+                // foundTrue is set to TRUE when an element whose test passes is found. The
+                // subsequent elements are to be removed.
+                if ( foundTrue )
+                    {
+                    // Remove internal references of the element from 
+                    // decoder's lists
+                    RemoveInternalReferences( curCaseElem );
+                    //already found the true case in the switch delete the rest
+                    curSwitchElem->RemoveChild( curCaseElem );
+                    delete ( CXmlElementImpl* )curCaseElem;
+                    curCaseElem = NULL;
+                    }
+                else
+                    {
+                    TBool lResult = EFalse;
+                    TRAPD(error, lResult  = VerifyReqExReqFtrSysL(curCaseElem));
+                    if ( error == KErrNone && !lResult )
+                        {
+                        // Remove internal references of the element from 
+                        // decoder's lists
+                        RemoveInternalReferences( curCaseElem );
+                        //this element doesnt meet the switch requirements delete it and its children
+                        curSwitchElem->RemoveChild(curCaseElem);
+                        delete (CXmlElementImpl*)curCaseElem;
+                        curCaseElem = NULL;
+                        }
+                    else
+                        {
+                        //one evaluated to true so keep it but go ahead and delete the rest in the switch
+                        //should only be one child for switch in end
+                        foundTrue = ETrue;
+                        } // if ( error == KErrNone && !lResult )
+                    } // if ( foundTrue )
+                // Proceed checking the next sibling
+                curCaseElem = nextCaseElem;
+                } // while ( curCaseElem != NULL )
+            } // if ( curSwitchElem != NULL )
+        // Remove the last switch element which was processed
+        iSwitchElementArray->Remove( switchEleArrayCnt - 1 );
+        // Update the count of the array
+        switchEleArrayCnt = iSwitchElementArray->Count();
+        } // while ( switchEleArrayCnt > 0 )
+    // Clear the array as it is no longer needed
+    iSwitchElementArray->Reset();    
+    }
+
+//---------------------------------------------------
+//Check to see
+//required extensions, required features, and system language
+//requirements
+//---------------------------------------------------
+TBool CSvgDecoder::VerifyReqExReqFtrSysL( CSvgElementImpl* aElement )
+{
+    const CDesCArrayFlat* tempTestArray = NULL; // 'const' keyword added due to S60 (CW) build team recommendation
+
+	TBool   doDraw  = ETrue;
+
+    // First check for requiredExtensions
+    aElement->GetRequiredExtensions( tempTestArray );
+
+    if ( tempTestArray && tempTestArray->MdcaCount() )
+    {
+    	// Check for all entries in requiredExtensions
+
+    	TInt lCount = tempTestArray->MdcaCount();
+
+      	for ( TInt i = 0; i < lCount; i++ )
+      	{
+      		TPtrC tmpPtr = tempTestArray->MdcaPoint( i );
+       	 	if ( tmpPtr.Length() )
+       	 	{
+        		doDraw = EFalse;
+          		break;
+        	}
+        	else if ( aElement->HasExtension( tmpPtr ) == EFalse )
+        	{
+        		doDraw = EFalse;
+          		break;
+        	}
+      	}
+    }
+
+    // Second, check for requiredFeatures
+    aElement->GetRequiredFeatures( tempTestArray );
+    if ( tempTestArray && tempTestArray->MdcaCount() && doDraw)
+    {
+    	// Check for all entries in requiredFeatures
+      TInt lCount = tempTestArray->MdcaCount();
+      for ( TInt i = 0; i < lCount; i++ )
+      {
+      	TPtrC tmpPtr = tempTestArray->MdcaPoint( i );
+        if ( aElement->HasFeature( tmpPtr ) == EFalse )
+        {
+        	doDraw = EFalse;
+          	break;
+        }
+      }
+    }
+
+	TBufC<5> iSystemLanguage;
+	SystemLanguage( iSystemLanguage.Des() );
+
+	// Third, check for systemLanguage
+	// Future enhancement: System language doesnt need to be stored in seperate array indexes
+	// could have just stored it as one big string and use findf without the loop
+    aElement->GetSystemLanguage( tempTestArray );
+    TBool doDrawSystem = EFalse;
+    if ( tempTestArray && tempTestArray->MdcaCount() && doDraw)
+	{
+    	TInt lCount = tempTestArray->MdcaCount();
+
+      	for ( TInt i = 0; i < lCount; i++ )
+      	{
+      		TPtrC tmpPtr = tempTestArray->MdcaPoint( i );
+
+        	if ( tmpPtr.FindF( iSystemLanguage ) >= 0 )
+			{
+        		doDrawSystem = ETrue;
+          		break;
+			}
+      	}
+
+      	if (doDrawSystem == EFalse)
+     	{
+     		doDraw = EFalse;
+     	}
+     }
+
+	return doDraw;
+}
+
+// --------------------------------------------------------------------------
+// void CSvgDecoder::SystemLanguage( TPtr aValue )
+// ---------------------------------------------------------------------------
+void CSvgDecoder::SystemLanguage( TPtr aValue )
+    {
+    _LIT( KEn, "en" );
+    _LIT( KFr, "fr" );
+    _LIT( KDe, "de" );
+    _LIT( KEs, "es" );
+
+    _LIT( KAf, "af" );
+    _LIT( KAm, "am" );
+    _LIT( KAr, "ar" );
+    _LIT( KBg, "bg" );
+    _LIT( KBn, "bn" );
+    _LIT( KBo, "bo" );
+    _LIT( KCa, "ca" );
+    _LIT( KCs, "cs" );
+    _LIT( KCy, "cy" );
+    _LIT( KDa, "da" );
+    _LIT( KEl, "el" );
+    _LIT( KEt, "et" );
+    _LIT( KFa, "fa" );
+    _LIT( KFi, "fi" );
+    _LIT( KGa, "ga" );
+    _LIT( KGd, "gd" );
+    _LIT( KGu, "gu" );
+    _LIT( KHe, "he" );
+    _LIT( KHi, "hi" );
+    _LIT( KHu, "hu" );
+    _LIT( KHr, "hr" );
+    _LIT( KHy, "hy" );
+    _LIT( KId, "id" );
+    _LIT( KIs, "is" );
+    _LIT( KIt, "it" );
+    _LIT( KJa, "ja" );
+    _LIT( KKa, "ka" );
+    _LIT( KKk, "kk" );
+    _LIT( KKm, "km" );
+    _LIT( KKn, "kn" );
+    _LIT( KKo, "ko" );
+    _LIT( KLo, "lo" );
+    _LIT( KLt, "lt" );
+    _LIT( KLv, "lv" );
+    _LIT( KMk, "mk" );
+    _LIT( KMl, "ml" );
+    _LIT( KMn, "mn" );
+    _LIT( KMo, "mo" );
+    _LIT( KMr, "mr" );
+    _LIT( KMs, "ms" );
+    _LIT( KMy, "my" );
+    _LIT( KNo, "no" );
+    _LIT( KNl, "nl" );
+    _LIT( KPa, "pa" );
+    _LIT( KPl, "pl" );
+    _LIT( KPt, "pt" );
+    _LIT( KRo, "ro" );
+    _LIT( KRu, "ru" );
+    _LIT( KSi, "si" );
+    _LIT( KSk, "sk" );
+    _LIT( KSl, "sl" );
+    _LIT( KSo, "so" );
+    _LIT( KSr, "sr" );
+    _LIT( KSq, "sq" );
+    _LIT( KSv, "sv" );
+    _LIT( KSw, "sw" );
+    _LIT( KTa, "ta" );
+    _LIT( KTe, "te" );
+    _LIT( KTh, "th" );
+    _LIT( KTi, "ti" );
+    _LIT( KTk, "tk" );
+    _LIT( KTl, "tl" );
+    _LIT( KTr, "tr" );
+    _LIT( KUk, "uk" );
+    _LIT( KUr, "ur" );
+    _LIT( KVi, "vi" );
+    //_LIT( KZh, "zh" );
+    _LIT( KZu, "zu" );
+
+    _LIT( KEnB, "en-UK");
+    _LIT( KEnUS, "en-US");
+    _LIT( KZhTW, "zh-TW");
+    _LIT( KZhHK, "zh-HK");
+    _LIT( KZhCN, "zh-CN");
+    _LIT( KFrCA, "fr-CA");
+    _LIT( KPtBR, "pt-BR");
+    _LIT( KEnTW, "en-TW");
+    _LIT( KEnHK, "en-HK");
+    _LIT( KEnCN, "en-CN");
+    _LIT( KEnJP, "en-JP");
+    _LIT( KEnTH, "en-TH");
+    _LIT( KEsAR, "es-AR");
+    _LIT( KMsAP, "ms-AP");
+    _LIT( KEnAP, "en-AP" );    // KLangApacEnglish
+    _LIT( KIdAP, "id-AP" );    // KLangApacIndonesian
+    _LIT( KEu, "eu" );    // KLangBasque
+    _LIT( KGl, "gl" );    // KLangGalician
+
+    _LIT(KDefault, "qqqqq");
+
+    switch ( User::Language() )
+        {
+        case ELangTest:
+        aValue = KEn;
+        break;
+
+        case ELangEnglish:
+        aValue = KEnB;
+        break;
+        case ELangAmerican:
+        aValue = KEnUS;
+        break;
+        case ELangAustralian:
+        case ELangNewZealand:
+        case ELangCanadianEnglish:
+        case ELangSouthAfricanEnglish:
+        case ELangInternationalEnglish:
+        aValue = KEn;
+        break;
+
+        case ELangFrench:
+        case ELangSwissFrench:
+        case ELangBelgianFrench:
+        aValue = KFr;
+        break;
+
+        case ELangGerman:
+        case ELangAustrian:
+        case ELangSwissGerman:
+        aValue = KDe;
+        break;
+
+        case ELangSpanish:
+        case ELangInternationalSpanish:
+        aValue = KEs;
+        break;
+
+        case ELangLatinAmericanSpanish:
+        aValue = KEsAR;
+        break;
+
+        case ELangItalian:
+        case ELangSwissItalian:
+        aValue = KIt;
+        break;
+
+        case ELangSwedish:
+        case ELangFinlandSwedish:
+        aValue = KSv;
+        break;
+
+        case ELangDanish:
+        aValue = KDa;
+        break;
+
+        case ELangNorwegian:
+        case ELangNorwegianNynorsk:
+        aValue = KNo;
+        break;
+
+        case ELangFinnish:
+        aValue = KFi;
+        break;
+
+        case ELangBrazilianPortuguese:
+        aValue = KPtBR;
+        break;
+
+        case ELangPortuguese:
+        aValue = KPt;
+        break;
+
+        case ELangTurkish:
+        case ELangCyprusTurkish:
+        aValue = KTr;
+        break;
+
+        case ELangIcelandic:
+        aValue = KIs;
+        break;
+
+        case ELangRussian:
+        case ELangBelarussian:
+        aValue = KRu;
+        break;
+
+        case ELangHungarian:
+        aValue = KHu;
+        break;
+
+        case ELangDutch:
+        case ELangBelgianFlemish:
+        aValue = KNl;
+        break;
+
+        case ELangCzech:
+        aValue = KCs;
+        break;
+
+        case ELangSlovak:
+        aValue = KSk;
+        break;
+
+        case ELangPolish:
+        aValue = KPl;
+        break;
+
+        case ELangSlovenian:
+        aValue = KSl;
+        break;
+
+        case ELangPrcChinese:
+        aValue = KZhCN;
+        break;
+        case ELangTaiwanChinese:
+        aValue = KZhTW;
+        break;
+        case ELangHongKongChinese:
+        aValue = KZhHK;
+        break;
+
+        case ELangJapanese:
+        aValue = KJa;
+        break;
+
+        case ELangThai:
+        aValue = KTh;
+        break;
+
+        case ELangAfrikaans:
+        aValue = KAf;
+        break;
+
+        case ELangAlbanian:
+        aValue = KSq;
+        break;
+
+        case ELangAmharic:
+        aValue = KAm;
+        break;
+
+        case ELangArabic:
+        aValue = KAr;
+        break;
+
+        case ELangArmenian:
+        aValue = KHy;
+        break;
+
+        case ELangTagalog:
+        aValue = KTl;
+        break;
+
+        case ELangBengali:
+        aValue = KBn;
+        break;
+
+        case ELangBulgarian:
+        aValue = KBg;
+        break;
+
+        case ELangBurmese:
+        aValue = KMy;
+        break;
+
+        case ELangCatalan:
+        aValue = KCa;
+        break;
+
+        case ELangCroatian:
+        aValue = KHr;
+        break;
+
+        case ELangEstonian:
+        aValue = KEt;
+        break;
+
+        case ELangFarsi:
+        aValue = KFa;
+        break;
+
+        case ELangCanadianFrench:
+        aValue = KFrCA;
+        break;
+
+        case ELangScotsGaelic:
+        aValue = KGd;
+        break;
+
+        case ELangGeorgian:
+        aValue = KKa;
+        break;
+
+        case ELangGreek:
+        case ELangCyprusGreek:
+        aValue = KEl;
+        break;
+
+        case ELangGujarati:
+        aValue = KGu;
+        break;
+
+        case ELangHebrew:
+        aValue = KHe;
+        break;
+
+        case ELangHindi:
+        aValue = KHi;
+        break;
+
+        case ELangIndonesian:
+        aValue = KId;
+        break;
+
+        case ELangIrish:
+        aValue = KGa;
+        break;
+
+        case ELangKannada :
+        aValue = KKn;
+        break;
+
+
+        case ELangKazakh:
+        aValue = KKk;
+        break;
+
+        case ELangKhmer:
+        aValue = KKm;
+        break;
+
+        case ELangKorean:
+        aValue = KKo;
+        break;
+
+        case ELangLao:
+        aValue = KLo;
+        break;
+
+        case ELangLatvian:
+        aValue = KLv;
+        break;
+
+        case ELangLithuanian:
+        aValue = KLt;
+        break;
+
+        case ELangMacedonian:
+        aValue = KMk;
+        break;
+
+        case ELangMalay:
+        aValue = KMs;
+        break;
+
+        case ELangMalayalam:
+        aValue = KMl;
+        break;
+
+        case ELangMarathi:
+        aValue = KMr;
+        break;
+
+        case ELangMoldavian:
+        aValue = KMo;
+        break;
+
+        case ELangMongolian:
+        aValue = KMn;
+        break;
+
+        case ELangPunjabi:
+        aValue = KPa;
+        break;
+
+        case ELangRomanian:
+        aValue = KRo;
+        break;
+
+        case ELangSerbian:
+        aValue = KSr;
+        break;
+
+        case ELangSinhalese:
+        aValue = KSi;
+        break;
+
+        case ELangSomali:
+        aValue = KSo;
+        break;
+
+        case ELangSwahili:
+        aValue = KSw;
+        break;
+
+        case ELangTamil:
+        aValue = KTa;
+        break;
+
+        case ELangTelugu:
+        aValue = KTe;
+        break;
+
+        case ELangTibetan:
+        aValue = KBo;
+        break;
+
+        case ELangTigrinya:
+        aValue = KTi;
+        break;
+
+        case ELangTurkmen:
+        aValue = KTk;
+        break;
+
+        case ELangUkrainian:
+        aValue = KUk;
+        break;
+
+        case ELangUrdu:
+        aValue = KUr;
+        break;
+
+        case ELangVietnamese:
+        aValue = KVi;
+        break;
+
+        case ELangWelsh:
+        aValue = KCy;
+        break;
+
+        case ELangZulu:
+        aValue = KZu;
+        break;
+
+        // from \\epoc32\\include\\oem\\languages.hrh
+
+        case KLangTaiwanEnglish:
+        aValue = KEnTW;
+        break;
+
+        case KLangHongKongEnglish:
+        aValue = KEnHK;
+                break;
+
+        case KLangPrcEnglish:
+        aValue = KEnCN;
+        break;
+
+        case KLangJapaneseEnglish:
+        aValue = KEnJP;
+        break;
+
+        case KLangThaiEnglish:
+        aValue = KEnTH;
+        break;
+
+        case KLangApacMalay:
+        aValue = KMsAP;
+        break;
+
+        case KLangApacEnglish:
+            {
+            aValue = KEnAP;
+            break;
+            }
+        case KLangApacIndonesian:
+            {
+            aValue = KIdAP;
+            break;
+            }
+        case KLangBasque:
+            {
+            aValue = KEu;
+            break;
+            }
+        case KLangGalician:
+            {
+            aValue = KGl;
+            break;
+            }
+
+        // Cingular English
+        case 6154:
+        aValue = KEnUS;
+        break;
+
+        default:
+        aValue = KDefault;
+        break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// TInt CSvgDecoder::RemoveInternalReferences( CSvgElementImpl* )
+// ---------------------------------------------------------------------------
+void CSvgDecoder::RemoveInternalReferences( CSvgElementImpl* aElement )
+    {
+    // Remove the references of aElement in content handler's lists
+
+    // Use Elements 
+    TInt lIndex = 0;
+    if ( aElement->ElemID() == KSvgUseElement )
+        {
+        lIndex = iUseElementArray->Find( aElement );
+        if ( lIndex != KErrNotFound )
+            {
+            iUseElementArray->Remove( lIndex );
+            }
+        }
+    else if ( aElement->ElemID() == KSvgSwitchElement )
+        {
+        // Switch Elements    
+        lIndex = iSwitchElementArray->Find( aElement );
+        if ( lIndex != KErrNotFound )
+            {
+            iSwitchElementArray->Remove( lIndex );
+            }
+        }
+    else if ( aElement->IsAnimatedElement() )
+        {
+        // Animation elements include animate* elements, set, 
+        // "animation",  audio elements etc.
+        lIndex = iAnimationElementArray->Find( aElement );
+        if ( lIndex != KErrNotFound )
+            {
+            iAnimationElementArray->Remove( lIndex );
+            }        
+        lIndex = iAnimRefElementArray->Find( aElement );
+        if ( lIndex != KErrNotFound )
+            {
+            iAnimRefElementArray->Remove( lIndex );
+            }
+        }
+    // Elements with test attributes - requiredFeatures, 
+    // requiredExtensions, systemLanguage
+    lIndex = iReqFetAttSysArray->Find( aElement );
+    if ( lIndex != KErrNotFound )
+        {
+        iReqFetAttSysArray->Remove( lIndex );
+        }
+
+    // Remove Internal references of subtree elements as well
+    CSvgElementImpl* lChild = ( CSvgElementImpl* )aElement->FirstChild();
+    while ( lChild != NULL )
+        {
+        RemoveInternalReferences( lChild );
+        lChild = ( CSvgElementImpl* )lChild->NextSibling();
+        }
+
+    }