diff -r 000000000000 -r 40261b775718 mmplugins/imagingplugins/imagedisplay/plugins/mng/MngObjects.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmplugins/imagingplugins/imagedisplay/plugins/mng/MngObjects.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,296 @@ +// Copyright (c) 2004-2009 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: +// + +/** @file + @internalTechnology */ +#include "MngPlayer.h" +#include "MngPanic.h" +#include "MngRenderer.h" + +#include "MngObjects.h" + +/*virtual*/ +void CMngObject::Reset() + { + } + +/*virual*/ +TBool CMngObject::IsSubFrame() const + { + return EFalse; + } + +/*virual*/ +TBool CMngObject::IsLayer() const + { + return EFalse; + } + +/*virual*/ +void CMngObject::OnAddToPlayerL(const CMngPlayer& /*aPlayer*/) + { + } + +/*virual*/ +TBool CMngLayer::IsLayer() const + { + return ETrue; + } + +/*static*/ +CMngTermination* CMngTermination::NewL(TTermChunk*& aTermChunk, TBool aMngSubframesNoLoops) //Subframes with No Loops + { + TTermChunk* pChunk=aTermChunk; + CleanupDeletePushL(pChunk); + aTermChunk = NULL; + CMngTermination* self=new (ELeave) CMngTermination(*pChunk, aMngSubframesNoLoops); //Subframes with No Loops + CleanupStack::PopAndDestroy(pChunk); + return self; + } + +void CMngTermination::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& aResult) + { + TMngTerminationAction Action=iPostIterationAction; + + //Subframes with No Loops + if(iMngSubframesNoLoops) + { + iIterationCounter = 1; + Action =EMngShowLastFrameIndef; + } + + ASSERT(iIterationCounter > -1); + iIterationCounter -= (iIterationCounter>0 && iIterationCounter!=KMngInfinity); + aResult.iDelayInTicks = iDelay; + if (iIterationCounter) + { + Action=iTerminationAction; + } + switch (Action) + { + case EMngShowLastFrameIndef: + aResult.iCommand=ECmdTerminate; + break; + case EMngCeaseDisplAnything: + aResult.iCommand=ECmdTerminateClearOutput; + break; + case EMngShowFirstFrmAfterTerm: + aResult.iCommand=ECmdTerminateAfter1stFrame; + aPlayer.SetTerminationFrameNum(1); + break; + case EMngRepeatImmidiately: + aResult.iCommand=ECmdStartFromBeginning; + break; + default: + User::Leave(KErrCorrupt); + } + } + +void CMngTermination::Reset() + { + iIterationCounter = iIterationMax; + } + +/*static*/ +CMngObject* CMngKeyFrame::NewL(TMngChunk*& aFramChunk) + { + CleanupDeletePushL(aFramChunk); + TFramChunk* FrameChunk=static_cast(aFramChunk); + aFramChunk=NULL; + CMngKeyFrame* self=new (ELeave) CMngKeyFrame(FrameChunk); + CleanupStack::Pop(); + return self; + } + +inline +CMngKeyFrame::CMngKeyFrame(TFramChunk* aFramChunk):iFramChunk(aFramChunk) + { + } + +CMngKeyFrame::~CMngKeyFrame() + { + delete iFramChunk; + } + +void CMngKeyFrame::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { + aPlayer.SetFramingMode(iFramChunk->iFramingMode); + if (EMngFramDoNotChange != iFramChunk->iChangeInterFrmDelay) + { + aPlayer.SetInterFrameDelay(iFramChunk->iChangeInterFrmDelay, iFramChunk->iInterframeDelay); + } + + if (EMngFramDoNotChange != iFramChunk->iChangeClippingBoundaries) + { + aPlayer.SetLayerClipping(iFramChunk->iChangeClippingBoundaries, + TRect(iFramChunk->iLeftLayerClippingB, iFramChunk->iTopLayerClippingB, + iFramChunk->iRightLayerClippingB, iFramChunk->iBottomLayerClippingB), + iFramChunk->iAddLayerClipping); + } + } + +TBool CMngKeyFrame::IsSubFrame() const + { + return ETrue; + } + +/*static*/ +CMngObject* CMngBackground::NewL(TMngChunk*& aBackChunk) + { + TBackChunk* BackChunk=static_cast(aBackChunk); + aBackChunk = NULL; + CleanupDeletePushL(BackChunk); + CMngBackground* self=new (ELeave) CMngBackground(*BackChunk); + CleanupStack::PopAndDestroy(BackChunk); + return self; + } + +void CMngBackground::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { + aPlayer.Renderer()->SetBackground(iBackgroundColour, (iBgMandatory&EMngTermBgColorMandatoryImgAdvisory) ); + } + +/*static*/ +CMngObject* CMngRawChunkHolder::NewL(TMngChunk*& aChunk) + { + TMngRawChunk* RawChunk=static_cast(aChunk); + aChunk = NULL; + CleanupDeletePushL(RawChunk); + CMngRawChunkHolder* self=new (ELeave) CMngRawChunkHolder(RawChunk); + CleanupStack::Pop(RawChunk); + return self; + } + +void CMngRawChunkHolder::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { + aPlayer.AddUniqueChunkProviderL(iChunk->iHeader.iChunkId, *this); + } + +TInt CMngRawChunkHolder::GetChunkData(const TText8* aChunkId, const TUint8*& aDataPtr, TInt& aSizeInBites) + { + TInt res=KErrNone; + if (iChunk->iHeader.iChunkId == TPtrC8(aChunkId, sizeof(TChunkId)) ) + { + aDataPtr = iChunk->Data(); + aSizeInBites = iChunk->iHeader.iLength; + } + else + { + res = KErrNotFound; + aSizeInBites = 0; + aDataPtr = NULL; + } + return res; + } + +CMngRawChunkHolder::~CMngRawChunkHolder() + { + delete iChunk; + } + +/*static*/ +CMngObject* CMngImageDefinition::NewL(TMngChunk*& aDefiChunk) + { + TDefiChunk* DefiChunk=static_cast(aDefiChunk); + aDefiChunk = NULL; + CleanupDeletePushL(DefiChunk); + CMngImageDefinition* self = new (ELeave) CMngImageDefinition(*DefiChunk); + CleanupStack::PopAndDestroy(DefiChunk); + return self; + } + +void CMngImageDefinition::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { + CMngRenderer* Renderer = aPlayer.Renderer(); + Renderer->SetOutputEnabled(!iDoNotShow); + Renderer->SetImageOrigin(iOrigin); + Renderer->SetImageClipRect(iClippingRect); + } + +void CMngImageDefinition::OnAddToPlayerL(const CMngPlayer& aPlayer) + { + if (iClippingRect.iBr.iX==-1 && iClippingRect.iTl.iX==0) + { + iClippingRect.iBr.iX= 0; + iClippingRect.iBr = aPlayer.FrameSize().AsPoint(); + } + } + +/*static*/ +CMngObject* CMngLoopEntry::NewL(TMngChunk*& aLoopChunk) + { + TLoopChunk* LoopChunk=static_cast(aLoopChunk); + aLoopChunk = NULL; + CleanupDeletePushL(LoopChunk); + CMngLoopEntry* self = new (ELeave) CMngLoopEntry(*LoopChunk); + CleanupStack::PopAndDestroy(LoopChunk); + return self; + } + +void CMngLoopEntry::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { + ASSERT(iIterationsLeft>-1); + TLoopStackItem item; + item.iLoopObjectLabel = ObjectLabel(); + item.iNestLevel = iNestLevel; + if (iIterationsLeft > 0) + { + --iIterationsLeft; + } + if (iIterationsLeft > 0) + { + item.iMoreIterationsNeeded = ETrue; + } + else + { + iIterationsLeft = iIterationCount; + item.iMoreIterationsNeeded = EFalse; + } + aPlayer.LoopStack().PushL(item); + } + +void CMngLoopEntry::Reset() + { + iIterationsLeft = iIterationCount; + } + +/*static*/ +CMngObject* CMngLoopEnd::NewL(TMngChunk*& aEndlChunk) + { + TEndlChunk* EndlChunk=static_cast(aEndlChunk); + aEndlChunk = NULL; + CleanupDeletePushL(EndlChunk); + CMngLoopEnd* self = new (ELeave) CMngLoopEnd(*EndlChunk); + CleanupStack::PopAndDestroy(EndlChunk); + return self; + } + +void CMngLoopEnd::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& aResult) + { + TLoopStackItem item; + if (KErrNone != aPlayer.LoopStack().Pop(item)) + { + User::Leave(KErrCorrupt); + } + if (item.iNestLevel != iNestLevel) + { + User::Leave(KErrCorrupt); + } + if (item.iMoreIterationsNeeded) + { + aResult.iCommand = ECmdJumpToObject; + aResult.iObjectLabel= item.iLoopObjectLabel; + } + }