diff -r 000000000000 -r 88edb906c587 svgtopt/SVG/SVGImpl/src/Svgsvgelementimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtopt/SVG/SVGImpl/src/Svgsvgelementimpl.cpp Wed Nov 03 18:56:10 2010 +0200 @@ -0,0 +1,944 @@ +/* +* 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 Implementation source file + * +*/ + + +#if !defined(__E32BASE_H__) +#include +#endif + +#include "SVGSvgElementImpl.h" +#include "SVGDocumentImpl.h" +#include "SVGEngineImpl.h" +#include "SVGSchemaData.h" + +#include "SVGClrCssValueImpl.h" +#include "SVGPaintCssValueImpl.h" +#include "SVGIntCssValueImpl.h" +#include "SVGFloatCssValueImpl.h" +#include "SVGStrCssValueImpl.h" +#include "SVGVectorCssValueImpl.h" +#include "SVGPathElementImpl.h" +#include "SVGAnimTimingParser.h" + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +CSvgSvgElementImpl* CSvgSvgElementImpl::NewL( const TUint8 aElemID, + CSvgDocumentImpl* aDoc ) + { + CSvgSvgElementImpl* self = new ( ELeave ) CSvgSvgElementImpl( aDoc ); + CleanupStack::PushL( self ); + self->ConstructL( aElemID); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +CSvgSvgElementImpl* CSvgSvgElementImpl::NewLC( const TUint8 aElemID, + CSvgDocumentImpl* aDoc ) + { + CSvgSvgElementImpl* self = new ( ELeave ) CSvgSvgElementImpl( aDoc ); + CleanupStack::PushL( self ); + self->ConstructL( aElemID); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::ConstructL( const TUint8 aElemID ) + { + + CSvgElementImpl::InitializeL( aElemID ); + + iSvgStyleProperties = new(ELeave) RPointerArray(KCSS_MAX_ATTR); + + CSvgDocumentImpl* lDocument = (CSvgDocumentImpl*)OwnerDocument(); + + if (!lDocument) + return; + + // This is required to allocate buffer up to granularity so that the + // following Insert calls cannot leave. + + User::LeaveIfError( iSvgStyleProperties->Append( NULL ) ); + iSvgStyleProperties->Remove( 0 ); + + iSvgTransformable = CSvgTransformableImpl::NewL(); + + // Initilaise Svg Element with default values + + CPaintCssValueImpl* lPaintObject = lDocument->iMemoryManager->GetCssPaintObjectL( _L("black"),(CSvgElementImpl *)this ); + iSvgStyleProperties->InsertL(lPaintObject,KCSS_ATTR_FILL); + + CClrCssValueImpl* lClrObject = lDocument->iMemoryManager->GetCssClrObjectL(_L("none")); + iSvgStyleProperties->InsertL(lClrObject,KCSS_ATTR_STROKE); + + CFloatCssValueImpl* lFloatObject = lDocument->iMemoryManager->GetCssFloatObjectL(_L("1")); + iSvgStyleProperties->InsertL(lFloatObject,KCSS_ATTR_STROKEWIDTH); + + //set default to visible + CIntCssValueImpl* lIntObject = lDocument->iMemoryManager->GetCssIntObjectL(_L("0")); + iSvgStyleProperties->InsertL(lIntObject,KCSS_ATTR_VISIBILITY); + + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_FONTFAMILY); + + CFloatCssValueImpl* lFloatObject2 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("10")); + iSvgStyleProperties->InsertL(lFloatObject2,KCSS_ATTR_FONTSIZE); + + CIntCssValueImpl* lIntObject2 = lDocument->iMemoryManager->GetCssIntObjectL(_L("0")); + iSvgStyleProperties->InsertL(lIntObject2,KCSS_ATTR_FONTSTYLE); + + CIntCssValueImpl* lIntObject3 = lDocument->iMemoryManager->GetCssIntObjectL(_L("0")); + iSvgStyleProperties->InsertL(lIntObject3,KCSS_ATTR_FONTWEIGHT); + + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_STROKE_DASHARRAY); + + //set default to inline + CIntCssValueImpl* lIntObject4 = lDocument->iMemoryManager->GetCssIntObjectL(_L("0")); + iSvgStyleProperties->InsertL(lIntObject4,KCSS_ATTR_DISPLAY); + + CStrCssValueImpl* lStrObject1 = lDocument->iMemoryManager->GetCssStrObjectL(_L("nonzero")); + iSvgStyleProperties->InsertL(lStrObject1,KCSS_ATTR_FILLRULE); + + CStrCssValueImpl* lStrObject2 = lDocument->iMemoryManager->GetCssStrObjectL(_L("butt")); + iSvgStyleProperties->InsertL(lStrObject2,KCSS_ATTR_STROKE_LINECAP); + + CStrCssValueImpl* lStrObject3 = lDocument->iMemoryManager->GetCssStrObjectL(_L("miter")); + iSvgStyleProperties->InsertL(lStrObject3,KCSS_ATTR_STROKE_LINEJOIN); + + CFloatCssValueImpl* lFloatObject3 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("0")); + iSvgStyleProperties->InsertL(lFloatObject3,KCSS_ATTR_STROKE_DASHOFFSET); + + CFloatCssValueImpl* lFloatObject4 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("4")); + iSvgStyleProperties->InsertL(lFloatObject4,KCSS_ATTR_STROKE_MITERLIMIT); + + CClrCssValueImpl* lClrObject2 = lDocument->iMemoryManager->GetCssClrObjectL(_L("black")); + iSvgStyleProperties->InsertL(lClrObject2,KCSS_ATTR_COLOR); + + CIntCssValueImpl* lIntObject5 = lDocument->iMemoryManager->GetCssIntObjectL(_L("0")); + iSvgStyleProperties->InsertL(lIntObject5,KCSS_ATTR_TEXTANCHOR); + + CIntCssValueImpl* lIntObject6 = lDocument->iMemoryManager->GetCssIntObjectL(_L("-1")); + iSvgStyleProperties->InsertL(lIntObject6,KCSS_ATTR_TEXTDECORATION); + + //default value is indeterminate at this point + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_COLORINTERPOLATION); + + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_COLORRENDERING); + + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_LETTERSPACING); + + iSvgStyleProperties->InsertL(NULL,KCSS_ATTR_WORDSPACING); + + CFloatCssValueImpl* lFloatObject5 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("1")); + iSvgStyleProperties->InsertL(lFloatObject5,KCSS_ATTR_FILL_OPACITY); + + CFloatCssValueImpl* lFloatObject6 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("1")); + iSvgStyleProperties->InsertL(lFloatObject6,KCSS_ATTR_STROKE_OPACITY); + + CFloatCssValueImpl* lFloatObject7 = lDocument->iMemoryManager->GetCssFloatObjectL(_L("1")); + iSvgStyleProperties->InsertL(lFloatObject7,KCSS_ATTR_GROUP_OPACITY); + + iViewBoxImpl = CSvgFitToViewBoxImpl::NewL(); + + iBaseProfile = HBufC::NewL( 0 ); + iVersion = HBufC::NewL( 0 ); + SetBaseProfileL(_L("tiny")); + SetVersion(_L("1.1")); + + iWidthInUserCoordinate = 100; + iHeightInUserCoordinate= 100; + + } + + + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +CSvgSvgElementImpl::~CSvgSvgElementImpl() + { + + if (iContent) + { + delete iContent; + iContent = NULL; + } + + if ( iViewBoxImpl ) + { + delete iViewBoxImpl; + iViewBoxImpl = NULL; + } + + if ( iBaseProfile ) + { + delete iBaseProfile; + iBaseProfile = NULL; + } + if ( iVersion ) + { + delete iVersion; + iVersion = NULL; + } + + if ( iSvgStyleProperties ) + { + iSvgStyleProperties->Close(); + delete iSvgStyleProperties; + iSvgStyleProperties = NULL; + } + + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- + +CSvgSvgElementImpl::CSvgSvgElementImpl( CSvgDocumentImpl* aDoc ) : iZoomAndPan( ESvgZoomAndPanMagnify ), + iWidth(100), + iHeight(100), + iWidthInPercentage(ETrue), + iHeightInPercentage(ETrue), + iIsWidthSet(EFalse), + iIsHeightSet(EFalse) + { + SetOwnerDocument(aDoc); + + // Obtain the default sync behaviour/tolerance from the document + if ( aDoc ) + { + iSyncBehaviorDefault = aDoc->SyncBehaviorDefault(); + iSyncToleranceDefault = aDoc->SyncToleranceDefault(); + } + + } + + + +// ******************************************************* +// From SVG DOM + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TFloatFixPt CSvgSvgElementImpl::X() + { + return iX; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TFloatFixPt CSvgSvgElementImpl::Y() + { + return iY; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TFloatFixPt CSvgSvgElementImpl::Width() + { + return iWidth; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TFloatFixPt CSvgSvgElementImpl::Height() + { + return iHeight; + } + +// --------------------------------------------------------------------------- +// Accessor funciton for SyncBehaviorDefault value +// --------------------------------------------------------------------------- +TSvgSyncBehaviour CSvgSvgElementImpl::SyncBehaviorDefault() + { + return iSyncBehaviorDefault; + } + +// --------------------------------------------------------------------------- +// Accessor funciton for SyncBehaviorDefault value +// --------------------------------------------------------------------------- +TUint32 CSvgSvgElementImpl::SyncToleranceDefault() + { + return iSyncToleranceDefault; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +MXmlElement* CSvgSvgElementImpl::GetElementById( const TDesC& /* aElementId */ ) + { + return ( CSvgElementImpl * ) NULL; + } + +// ******************************************************* +// SVG Implementation + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetWidth( TFloatFixPt aWidth ) + { + iWidth = aWidth; + } + + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetHeight( TFloatFixPt aHeight ) + { + iHeight = aHeight; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- + +// ******************************************************* +// From MXmlElement + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +EXPORT_C TInt CSvgSvgElementImpl::GetAttribute( const TDesC& aName, + TDes& aValue ) + { + _LIT( KTmpWidth, "width" ); + _LIT( KTmpHeight, "height" ); + + if ( aName == KTmpWidth ) + { + TFloatFixPt width; + GetAttributeFloat( KAtrWidth, width ); + #ifdef SVG_FLOAT_BUILD + TFloatFixPt::GetString( width, aValue ); + #else + width.GetString( aValue ); + #endif + } + else if ( aName == KTmpHeight ) + { + TFloatFixPt height; + GetAttributeFloat( KAtrHeight, height ); + #ifdef SVG_FLOAT_BUILD + TFloatFixPt::GetString( height, aValue ); + #else + height.GetString( aValue ); + #endif + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TInt CSvgSvgElementImpl::SetAttributeL( const TDesC& aName, + const TDesC& aValue ) + { + + + CSvgElementImpl::SetAttributeL(aName,aValue); + + // Encapsulates both viewBox and preserveAspectRatio attributes. + if ( iViewBoxImpl->SetViewBoxL( aName, aValue ) ) + { + return KErrNone; + } + + + _LIT( KTmpBaseProfile, "baseProfile" ); + _LIT( KTmpVersion, "version" ); + _LIT( KTmpZoomAndPan, "zoomAndPan" ); + _LIT( KTmpDisable, "disable" ); + _LIT( KTmpMagnify, "magnify" ); + _LIT( KNameSpace, "xmlns" ); + _LIT( KSvgNameSpace, "http://www.w3.org/2000/svg" ); + _LIT( KTmpSyncBehaviorDefault, "syncBehaviorDefault" ); + _LIT( KTmpSyncToleranceDefault,"syncToleranceDefault" ); + + + TLex input ( aValue ); + + if ( aName == KTmpBaseProfile ) + { + SetBaseProfileL( aValue ); + } + else if ( aName == KTmpVersion ) + { + //if (input.Val( tmpFloat, '.' ) == KErrNone) + SetVersion( aValue ); + } + else if ( aName == KTmpZoomAndPan ) + { + if ( aValue == KTmpDisable ) + iZoomAndPan = ESvgZoomAndPanDisable; + else if ( aValue == KTmpMagnify ) + iZoomAndPan = ESvgZoomAndPanMagnify; + } + else if ( aName == KNameSpace && aValue != KSvgNameSpace ) + { + if ( iOwnerDocument ) + { + _LIT( KMsg, "Invalid namespace: " ); + ((CSvgDocumentImpl*)iOwnerDocument)->SetError( KErrNotFound, KMsg, aValue ); + } + } + else if ( aName == KTmpSyncBehaviorDefault ) + { + SetSyncBehaviorDefault( aValue ); + } + else if ( aName == KTmpSyncToleranceDefault ) + { + SetSyncToleranceDefault( aValue ); + } + + return KErrNone; + } + +// ******************************************************* +// From MXmlElementOpt + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TInt CSvgSvgElementImpl::GetAttributeFloat( const TInt aNameId, TFloatFixPt& aValue ) + { + switch ( aNameId ) + { + case KAtrX: + aValue = X(); + break; + case KAtrY: + aValue = Y(); + break; + case KAtrWidth: + aValue = Width(); + break; + case KAtrHeight: + aValue = Height(); + break; + default: +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- + return CSvgElementImpl::GetAttributeFloat( aNameId, aValue ); + } + return KErrNone; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TInt CSvgSvgElementImpl::SetAttributeFloatL( const TInt aNameId, + const TFloatFixPt aValue ) + { + TGfxRectangle2D lViewBox; + switch ( aNameId ) + { + case KAtrX: + iX = aValue; + break; + case KAtrY: + iY = aValue; + break; + case KAtrWidth: + + iWidth = aValue; + if(!iIsWidthSet) // make sure that this is set only once + { + iWidthInUserCoordinate = (TReal32)aValue; + iIsWidthSet = ETrue; + } + break; + case KAtrHeight: + + iHeight = aValue; + if(!iIsHeightSet ) // make sure that this is set only once + { + iHeightInUserCoordinate = (TReal32)aValue; + iIsHeightSet= ETrue; + } + break; + + default: +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- + return CSvgElementImpl::SetAttributeFloatL( aNameId, aValue ); + } + return KErrNone; + } + +// ******************************************************* +// From CSvgElementImpl + +// perform a deep clone of this object +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +MXmlElement* CSvgSvgElementImpl::CloneL(MXmlElement* aParentElement) + { + + CSvgSvgElementImpl* retValue = CSvgSvgElementImpl::NewL(this->ElemID(), ((CSvgDocumentImpl*)iOwnerDocument)); + + CleanupStack::PushL(retValue); + retValue->iParentNode = aParentElement; + + // *** have base class copy what it needs to + this->CopyL(retValue); + + // *** copy iViewBoxImpl + if (this->iViewBoxImpl != NULL) + { + if (retValue->iViewBoxImpl != NULL) + { + delete retValue->iViewBoxImpl; + retValue->iViewBoxImpl= NULL; + } + retValue->iViewBoxImpl = this->iViewBoxImpl->CloneL(); + } + + // *** copy iBaseProfile + if (retValue->iBaseProfile != NULL) + { + delete retValue->iBaseProfile; + retValue->iBaseProfile = NULL; + } + retValue->iBaseProfile = this->iBaseProfile->AllocL(); + + // *** copy others + retValue->iZoomAndPan = this->iZoomAndPan; + retValue->iX = this->iX; + retValue->iY = this->iY; + retValue->iWidth = this->iWidth; + retValue->iHeight = this->iHeight; + retValue->iVersion = this->iVersion->AllocL(); + CleanupStack::Pop(); + + return retValue; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TBool CSvgSvgElementImpl::DrawL( CGfx2dGc* /* aGc */, + CSvgElementImpl* /* aElement */ ) + { + return ETrue; + } + +// ******************************************************* +// From MSvgZoomAndPan + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TSvgZoomAndPanType CSvgSvgElementImpl::GetZoomAndPan() + { + return iZoomAndPan; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetZoomAndPan( TSvgZoomAndPanType aZoomAndPan ) + { + iZoomAndPan = aZoomAndPan; + } + +// ******************************************************* +// From MSvgFitToWindow + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::GetPreserveAspectRatio( MSvgPreserveAspectRatio*& aAspectRatio ) + { + iViewBoxImpl->GetPreserveAspectRatio( aAspectRatio ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetPreserveAspectRatioL( TSvgPreserveAspectAlignType aAlign, TSvgMeetOrSliceType aMeetslice ) + { + iViewBoxImpl->SetPreserveAspectRatioL( aAlign, aMeetslice); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TBool CSvgSvgElementImpl::GetViewBox( TGfxRectangle2D& aViewBox ) + { + return iViewBoxImpl->GetViewBox( aViewBox ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetViewBoxL( TGfxRectangle2D aViewBox ) + { + iViewBoxImpl->SetViewBoxL(aViewBox); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +TBool CSvgSvgElementImpl::ViewBoxDefined() + { + return iViewBoxImpl->ViewBoxDefined(); + } + +// ******************************************************* +// Baseprofile + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +const TDesC& CSvgSvgElementImpl::BaseProfile() + { + return *iBaseProfile; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetBaseProfileL( const TDesC& aValue ) + { + if ( iBaseProfile ) + { + delete iBaseProfile; + iBaseProfile = NULL; + } + iBaseProfile = aValue.AllocL(); + } + +// Version + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +const TDesC& CSvgSvgElementImpl::Version() + { + return *iVersion; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetVersion( const TDesC& aValue ) + { + if ( iVersion ) + { + delete iVersion; + iVersion = NULL; + } + TInt error = KErrNone; + TRAP(error,iVersion = aValue.AllocL()); + } + +// --------------------------------------------------------------------------- +// set synchronised behaviour default +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetSyncBehaviorDefault( const TDesC& aValue ) + { + _LIT( KTmpCanSlip, "canSlip" ); + _LIT( KTmpLocked, "locked" ); + _LIT( KTmpIndependent, "independent" ); + _LIT( KTmpInherit, "inherit" ); + + if ( !aValue.CompareF( KTmpCanSlip ) ) + { + iSyncBehaviorDefault = ESvgSyncCanSlip; + } + else if ( !aValue.CompareF( KTmpLocked ) ) + { + iSyncBehaviorDefault = ESvgSyncLocked; + } + else if ( !aValue.CompareF( KTmpIndependent ) ) + { + iSyncBehaviorDefault = ESvgSyncIndependent; + } + else if ( !aValue.CompareF( KTmpInherit ) ) + { + // Obtain the sync behaviour from the document + CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* ) + iOwnerDocument); + iSyncBehaviorDefault = lSvgDoc->SyncBehaviorDefault(); + } + } + +// --------------------------------------------------------------------------- +// set synchronised tolerance default +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetSyncToleranceDefault( const TDesC& aValue ) + { + _LIT( KTmpInherit, "inherit" ); + if ( !aValue.CompareF( KTmpInherit ) ) + { + CSvgAnimTimingParser* lATParserPtr = NULL; + // Treat as clock value + TRAPD( lCreateATPErr, + { + lATParserPtr = CSvgAnimTimingParser::NewL( aValue, this ); + } ); + + if ( lCreateATPErr != KErrNone ) + { + // Error Processing + return; + } + TInt32 lClockValue; + TLex lLex( aValue ); + lATParserPtr->ParseClockValue( lLex, lClockValue ); + delete lATParserPtr; + iSyncToleranceDefault = lClockValue; // TODO: Convert Units + } + else + { + // Get clock value from parent + CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* ) + iOwnerDocument); + iSyncToleranceDefault = lSvgDoc->SyncToleranceDefault(); + } + } + +// ----------------------------------------------------------------------------- +// CSvgSvgElementImpl::SetSyncBehaviorDefault +// Set the Synchronised behaviour(default) +// ----------------------------------------------------------------------------- +// +void CSvgSvgElementImpl::SetSyncBehaviorDefault( + const TSvgSyncBehaviour aValue ) + { + if ( aValue == ESvgSyncDefault ) + { + // Obtain the sync behaviour from the document + CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* ) + iOwnerDocument); + iSyncBehaviorDefault = lSvgDoc->SyncBehaviorDefault(); + } + else + { + iSyncBehaviorDefault = aValue; + } + } + +// ----------------------------------------------------------------------------- +// CSvgSvgElementImpl::SetSyncToleranceDefault +// Set the Synchronised Tolerance (Default) +// ----------------------------------------------------------------------------- +// +void CSvgSvgElementImpl::SetSyncToleranceDefault( const TInt32 aValue , + const TBool aUseDefault ) + { + if ( aUseDefault ) + { + // Get clock value from parent + CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* ) + iOwnerDocument); + iSyncToleranceDefault = lSvgDoc->SyncToleranceDefault(); + } + else + { + iSyncToleranceDefault = aValue; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::GetBBox( TGfxRectangle2D& aBbox ) + { + if (!HasChildNodes()) + { + return; + } + + CSvgGElementImpl::GetGroupBounding( aBbox, this ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::GetUnscaledBBox( TGfxRectangle2D& aBbox ) + { + if (!HasChildNodes()) + { + return; + } + + CSvgGElementImpl::GetGroupBoundingUnscaled( aBbox, this ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgSvgElementImpl::SetWindowViewportTrans( TGfxRectangle2D aXYWH, + TGfxAffineTransform& aTr ) + { + //this is a problem for the JSR. There isn't an engine associated here yet. + if ( (CSvgDocumentImpl*)iOwnerDocument) + { + TSize lSize; + + TFloatFixPt width, height; + TGfxRectangle2D viewBox; + + // Is engine defined + TBool engine = EFalse; + + // Does the client define the viewPort + TBool clientDefinedViewport = EFalse; + + TBool viewBoxDefined = iViewBoxImpl->GetViewBox(viewBox); + if(((CSvgDocumentImpl*)iOwnerDocument)->Engine()) + engine = ETrue; + + // if Client like browser or viewer has set the viewport + // take the width/height got by using GetViewPort() + if ( engine ) + { + clientDefinedViewport = ((CSvgDocumentImpl*)iOwnerDocument )->Engine()->iClientDefinedViewPort; + } + + if( clientDefinedViewport ) + { + width = Width(); + height = Height(); + } + else + { + if(iWidthInPercentage && engine) + { + lSize = ((CSvgDocumentImpl*)iOwnerDocument)->Engine()->GetSize(); + TReal32 per = 100; + width = ( TFloatFixPt ) (( lSize.iWidth/per ) * iWidthInUserCoordinate); + } + else if(iWidthInPercentage && !engine && viewBoxDefined) + { + aXYWH.iWidth = viewBox.iWidth; + aXYWH.iX = viewBox.iX; + width = viewBox.iWidth; + } + else + { + width = Width(); + } + + if(iHeightInPercentage && engine) + { + lSize = ((CSvgDocumentImpl*)iOwnerDocument)->Engine()->GetSize(); + TReal32 per = 100; + height = ( TFloatFixPt ) (( lSize.iHeight/per ) * iHeightInUserCoordinate); + } + else if( iHeightInPercentage && !engine && viewBoxDefined) + { + aXYWH.iHeight = viewBox.iHeight; + aXYWH.iY = viewBox.iY; + height = viewBox.iHeight; + } + else + { + height = Height(); + } + + } + + + TFloatFixPt KZero; + if ( ( width < KZero ) && ( height < KZero ) ) + { + width = lSize.iWidth; + height = lSize.iHeight; + } + else if ( width <= KZero ) + { + width = height; + } + else if ( height <= KZero ) + { + height = width; + } + + TSize lTmpViewBox(width,height); + + //this should update the CTM based for the new viewbox...hopefully + iViewBoxImpl->SetWindowViewportTrans( aXYWH, aTr, lTmpViewBox ); + } + else + { + #ifdef _DEBUG + RDebug::Printf("SvgSvgElement:SetWindowViewportTrans Owner Document Not Found! Maybe JSR226?"); + #endif + } +} + +//Added as a part of update of Set/Get API's +TInt CSvgSvgElementImpl::GetAttributeDes( const TInt aNameId, + TPtrC16& aValue ) +{ + if(aNameId == KAtrBaseProfile) + { + aValue.Set( BaseProfile() ); + return KErrNone; + } + else if (aNameId == KAtrVersion) + { + aValue.Set( Version() ); + return KErrNone; + } + + return CSvgElementImpl::GetAttributeDes( aNameId, aValue ); +} +TInt CSvgSvgElementImpl::SetAttributeDesL( const TInt aNameId, + TDesC& aValue ) +{ + if(aNameId == KAtrBaseProfile) + { + SetBaseProfileL(aValue); + return KErrNone; + } + else if (aNameId == KAtrVersion) + { + SetVersion(aValue); + return KErrNone; + } + return CSvgElementImpl::SetAttributeDesL( aNameId, aValue ); + +} + +void CSvgSvgElementImpl::Print( TBool aIsEncodeOn ) +{ + if (!aIsEncodeOn) + { + #ifdef _DEBUG + RDebug::Printf("", (int)iX, (int)iY, (int)iWidth, (int)iHeight); + #endif + } +} +