diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknAnimData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknAnimData.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,543 @@ +/* +* Copyright (c) 2002 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: Anim Data +* +*/ + +// AknAnimData.CPP +// +// Copyright (c) 1997-1999 Symbian Ltd. All rights reserved. +// + +// Animation Data class + + +#include "aknanimdata.h" +#include "aknanim.hrh" +#include "AknPanic.h" +#include +#include + + +const TInt KAnimStepGranularity=5; + + + +EXPORT_C CAknAnimationData::CAknAnimationData() +:CArrayFixFlat(KAnimStepGranularity) + { + } + +EXPORT_C CAknAnimationData::~CAknAnimationData() + { + delete iDrawStepsPerAnimStep; + delete iPendingSteps; + } + + +EXPORT_C void CAknAnimationData::ConstructL() + { + if (!iPendingSteps) + { + iPendingSteps = new(ELeave)CArrayFixFlat(KAnimStepGranularity); + } + if (!iDrawStepsPerAnimStep) + { + iDrawStepsPerAnimStep = new(ELeave)CArrayFixFlat(KAnimStepGranularity); + } + } + + +EXPORT_C void CAknAnimationData::ConstructFromResourceL(TInt aResourceId) + { + ConstructL(); + TResourceReader reader; + CEikonEnv::Static()->CreateResourceReaderLC(reader, aResourceId); + + iFlags = (TUint16)reader.ReadInt16(); + iInterval = reader.ReadInt32(); + TInt sections = reader.ReadInt16(); + TResourceReader sectionReader; + for (TInt sectionCount=0; sectionCountCreateResourceReaderLC(sectionReader, reader.ReadInt32()); + TInt animSteps = sectionReader.ReadInt16(); + for (TInt stepCount=0; stepCountAppendL(1); + } + } + if (WaitForeverAtEnd()) + { + // Append a wait-forever step at end of animation + // (Wait-forever is set by a wait step with zero steps) + TAnimStep drawStep; + drawStep.SetType(EAnimWait); + (drawStep.WaitStep())->iSteps = 0; + AppendL(drawStep); + iDrawStepsPerAnimStep->AppendL(1); + } + + CleanupStack::PopAndDestroy(); //reader + } + +void CAknAnimationData::ReadAnimStepL(TResourceReader& aReader) + { + TInt drawSteps = aReader.ReadInt16(); + iDrawStepsPerAnimStep->AppendL((TUint8)drawSteps); + for (TInt stepCount=0; stepCountiDestX = (TInt16)aReader.ReadInt16(); + step->iDestY = (TInt16)aReader.ReadInt16(); + } + break; + case EAnimBlitPartPreviousView: + { + TAnimBlitStep* step = drawStep.BlitStep(); + step->iSrcX = (TInt16)aReader.ReadInt16(); + step->iSrcY = (TInt16)aReader.ReadInt16(); + step->iWidth = (TUint16)aReader.ReadInt16(); + step->iHeight = (TUint16)aReader.ReadInt16(); + step->iDestX = (TInt16)aReader.ReadInt16(); + step->iDestY = (TInt16)aReader.ReadInt16(); + } + case EAnimBlitPartNewView: + case EAnimRevealPartNewViewFromLeft: + case EAnimRevealPartNewViewFromRight: + case EAnimRevealPartNewViewFromTop: + case EAnimRevealPartNewViewFromBottom: + { + TAnimBlitStep* step = drawStep.BlitStep(); + step->iSteps = (TUint16)aReader.ReadInt16(); + step->iSrcX = (TInt16)aReader.ReadInt16(); + step->iSrcY = (TInt16)aReader.ReadInt16(); + step->iWidth = (TUint16)aReader.ReadInt16(); + step->iHeight = (TUint16)aReader.ReadInt16(); + step->iDestX = (TInt16)aReader.ReadInt16(); + step->iDestY = (TInt16)aReader.ReadInt16(); + if (step->iDestX == -32760) step->iDestX = step->iSrcX; + if (step->iDestY == -32760) step->iDestY = step->iSrcY; + } + break; + case EAnimBlitSlideNewView: + case EAnimBlitSlideNewViewClearBehind: + { + TAnimSlideStep* step = drawStep.SlideStep(); + step->iSteps = (TUint16)aReader.ReadInt16(); + step->iSrcX = (TInt16)aReader.ReadInt16(); + step->iSrcY = (TInt16)aReader.ReadInt16(); + step->iWidth = (TUint16)aReader.ReadInt16(); + step->iHeight = (TUint16)aReader.ReadInt16(); + step->iSlideToX = (TInt16)aReader.ReadInt16(); + step->iSlideToY = (TInt16)aReader.ReadInt16(); + step->iSlideFromX = (TInt16)aReader.ReadInt16(); + step->iSlideFromY = (TInt16)aReader.ReadInt16(); + } + break; + case EAnimWait: + { + TAnimWaitStep* step = drawStep.WaitStep(); + step->iSteps = (TUint16)aReader.ReadInt16(); + } + break; + case EAnimSetColor: + { + TAnimSetColorStep* step = drawStep.SetColorStep(); + step->iRed = (TUint8)aReader.ReadUint8(); + step->iGreen = (TUint8)aReader.ReadUint8(); + step->iBlue = (TUint8)aReader.ReadUint8(); + } + break; + case EAnimDrawLine: + case EAnimDrawRect: + case EAnimDrawFilledRect: + { + TAnimLineDrawStep* step = drawStep.LineDrawStep(); + step->iSteps = (TUint16)aReader.ReadInt16(); + step->iStartX = (TInt16)aReader.ReadInt16(); + step->iStartY = (TInt16)aReader.ReadInt16(); + step->iEndX = (TInt16)aReader.ReadInt16(); + step->iEndY = (TInt16)aReader.ReadInt16(); + } + break; + case EAnimWaitUntilComplete: + // No parameters to be read + break; + default: + ConstructUserAnimationStepL(drawStep, aReader); + break; + } + AppendL(drawStep); + } + } + +EXPORT_C void CAknAnimationData::ConstructUserAnimationStepL(TAnimStep& /*aAnimStep*/, TResourceReader& /*aReader*/) + { + Panic(EAknPanicUnknownAnimationType); + } + + + +EXPORT_C TBool CAknAnimationData::DrawUserAnimationStep(CBitmapContext& /*aGc*/, TAnimMultiStep& /*aAnimStep*/) + { + Panic(EAknPanicNoUserAnimation); + return ETrue; + } + + +EXPORT_C void CAknAnimationData::SetScreenSize(TSize aSize) + { + iScreenSize = aSize; + } + +EXPORT_C void CAknAnimationData::SetViewBitmap(CFbsBitmap* aViewBitmap) + { + iViewBitmap = aViewBitmap; + } + +EXPORT_C void CAknAnimationData::SetOldBitmap(CFbsBitmap* aOldBitmap) + { + iOldBitmap = aOldBitmap; + } + + +EXPORT_C void CAknAnimationData::SetClearOldView() + { + iFlags |= EAnimClearScreen; + } + +EXPORT_C TBool CAknAnimationData::ClearOldView() + { + return iFlags & EAnimClearScreen; + } + +EXPORT_C TBool CAknAnimationData::WaitBetweenSections() + { + return iFlags & EAnimWaitBetweenSections; + } + + +EXPORT_C void CAknAnimationData::SetWaitForeverAtEnd() + { + iFlags |= EAnimClearScreen; + } + +EXPORT_C TBool CAknAnimationData::WaitForeverAtEnd() + { + return iFlags & EAnimWaitForeverAtEnd; + } + +EXPORT_C TInt CAknAnimationData::Interval() + { + return iInterval; + } + +EXPORT_C TBool CAknAnimationData::DrawNextAnimationStep(CBitmapContext& aGc) + { + if (Count() == 0) + { + // Call the user animation step + TAnimStep step; + TAnimMultiStep nullStep(step); + nullStep.iDrawStep.SetType(EAnimNullStep); + nullStep.iSubStep = (TUint16)iCurrentDrawStep; + TBool done = DrawUserAnimationStep(aGc, nullStep); + iCurrentDrawStep++; + return done; + } + + if (iCurrentDrawStep < Count()) + { + TInt drawSteps = (*iDrawStepsPerAnimStep)[iCurrentAnimStep]; + TInt startingDrawStep = iCurrentDrawStep; + TBool repeatAnimStep = EFalse; + + for (TInt ii=0; iiType()) + { + case EAnimBlitPreviousView: + { + TAnimBlitStep* step = drawStep->BlitStep(); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iOldBitmap); + } + break; + case EAnimBlitNewView: + { + TAnimBlitStep* step = drawStep->BlitStep(); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iViewBitmap); + } + break; + case EAnimBlitPartPreviousView: + { + TAnimBlitStep* step = drawStep->BlitStep(); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iOldBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY), TSize(step->iWidth, step->iHeight))); + } + break; + case EAnimBlitPartNewView: + { + TAnimBlitStep* step = drawStep->BlitStep(); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY), TSize(step->iWidth, step->iHeight))); + } + break; + case EAnimDrawLine: + case EAnimRevealPartNewViewFromLeft: + case EAnimRevealPartNewViewFromRight: + case EAnimRevealPartNewViewFromTop: + case EAnimRevealPartNewViewFromBottom: + case EAnimBlitSlideNewView: + case EAnimBlitSlideNewViewClearBehind: + { + // Make this a pending step. Cancel the animation if the append fails + TRAPD(err, iPendingSteps->AppendL(TAnimMultiStep(*drawStep))); + if (err != KErrNone) + return ETrue; + } + break; + case EAnimSetColor: + { + TAnimSetColorStep* step = drawStep->SetColorStep(); + iDrawColor = TRgb(step->iRed, step->iGreen, step->iBlue); + } + break; + case EAnimDrawRect: + { + TAnimLineDrawStep* step = drawStep->LineDrawStep(); + aGc.SetPenColor(iDrawColor); + aGc.SetPenStyle(CGraphicsContext::ESolidPen); + aGc.DrawRect(TRect(TPoint(step->iStartX, step->iStartY),TPoint(step->iEndX, step->iEndY))); + } + break; + case EAnimDrawFilledRect: + { + TAnimLineDrawStep* step = drawStep->LineDrawStep(); + aGc.SetBrushColor(iDrawColor); + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc.SetPenStyle(CGraphicsContext::ENullPen); + aGc.DrawRect(TRect(TPoint(step->iStartX, step->iStartY),TPoint(step->iEndX, step->iEndY))); + } + break; + case EAnimWait: + { + TAnimWaitStep* step = drawStep->WaitStep(); + repeatAnimStep = ETrue; + if (step->iSteps > 0) + { + step->iSteps--; + if (step->iSteps == 0) + repeatAnimStep = EFalse; + } + } + break; + case EAnimWaitUntilComplete: + if (iPendingSteps->Count()) + repeatAnimStep = ETrue; + break; + default: + // Type is user-defined, so add to the pending steps + TRAPD(err, iPendingSteps->AppendL(TAnimMultiStep(*drawStep))); + if (err != KErrNone) + return ETrue; + break; + } + iCurrentDrawStep++; + } + + // If this step needs to be repeated, reset the draw step counter + // otherwise increment the current animation step + if (repeatAnimStep) + { + iCurrentDrawStep = startingDrawStep; + } + else + { + iCurrentAnimStep++; + } + } + + + TInt done = DrawPendingAnimationSteps(aGc); + + if (iCurrentDrawStep == Count() && done) + return ETrue; + + return EFalse; + } + + +TBool CAknAnimationData::DrawPendingAnimationSteps(CBitmapContext& aGc) + { + TBool finished = ETrue; + TInt count = iPendingSteps->Count(); + for (TInt ii=0; iiDelete(ii); + ii--; + count--; + } + } + return finished; + } + + +TBool CAknAnimationData::ExecutePendingAnimationStep(CBitmapContext& aGc, TAnimMultiStep* aStep) + { + TBool done = EFalse; + switch (aStep->iDrawStep.Type()) + { + case EAnimDrawLine: + { + TAnimLineDrawStep* step = (aStep->iDrawStep.LineDrawStep()); + + if (aStep->iSubStep == step->iSteps -1) + { + done = ETrue; + } + { + TInt diffX = step->iEndX - step->iStartX; + TInt diffY = step->iEndY - step->iStartY; + TInt startX = step->iStartX + (diffX * aStep->iSubStep / step->iSteps); + TInt startY = step->iStartY + (diffY * aStep->iSubStep / step->iSteps); + TInt endX = step->iStartX + (diffX * (aStep->iSubStep+1)/ step->iSteps); + TInt endY = step->iStartY + (diffY * (aStep->iSubStep+1) / step->iSteps); + aGc.SetBrushColor(iDrawColor); + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc.Clear(TRect(TPoint(startX,startY),TPoint(endX+1, endY+1))); + } + } + break; + case EAnimRevealPartNewViewFromLeft: + { + TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); + TPoint offset((step->iWidth * aStep->iSubStep) / step->iSteps, 0); + TSize size((step->iWidth / step->iSteps)+1, step->iHeight); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); + if (aStep->iSubStep == step->iSteps-1) + done = ETrue; + } + break; + case EAnimRevealPartNewViewFromRight: + { + TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); + TInt thisStep = (step->iSteps - aStep->iSubStep) - 1; + TPoint offset((step->iWidth * thisStep) / step->iSteps, 0); + TSize size((step->iWidth / step->iSteps)+1, step->iHeight); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); + if (aStep->iSubStep == step->iSteps-1) + done = ETrue; + } + break; + case EAnimRevealPartNewViewFromTop: + { + TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); + TPoint offset(0,(step->iHeight * aStep->iSubStep) / step->iSteps); + TSize size(step->iWidth,(step->iHeight / step->iSteps)+1); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); + if (aStep->iSubStep == step->iSteps-1) + done = ETrue; + } + break; + case EAnimRevealPartNewViewFromBottom: + { + TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); + TInt thisStep = (step->iSteps - aStep->iSubStep) - 1; + TPoint offset(0,(step->iHeight * thisStep) / step->iSteps); + TSize size(step->iWidth,(step->iHeight / step->iSteps)+1); + aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); + if (aStep->iSubStep == step->iSteps-1) + done = ETrue; + } + break; + case EAnimBlitSlideNewView: + // Slide the bitmap between two screen positions + { + TAnimSlideStep* step = (aStep->iDrawStep.SlideStep()); + TSize bitmapSize(step->iWidth, step->iHeight); + TInt slideDifferenceX = step->iSlideToX - step->iSlideFromX; + TInt slideDifferenceY = step->iSlideToY - step->iSlideFromY; + TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * aStep->iSubStep) / step->iSteps); + TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * aStep->iSubStep) / step->iSteps); + aGc.BitBlt(TPoint(slidePosX, slidePosY), iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY), bitmapSize)); + if (aStep->iSubStep == step->iSteps) + done = ETrue; + } + break; + case EAnimBlitSlideNewViewClearBehind: + // Slide the bitmap between two screen positions, clearing the screen behind it + { + TAnimSlideStep* step = (aStep->iDrawStep.SlideStep()); + TSize bitmapSize(step->iWidth, step->iHeight); + TInt slideDifferenceX = step->iSlideToX - step->iSlideFromX; + TInt slideDifferenceY = step->iSlideToY - step->iSlideFromY; + if (aStep->iSubStep > 0) + { + // This is not the first step, so clear over the area of the previous step + TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * (aStep->iSubStep-1)) / step->iSteps); + TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * (aStep->iSubStep-1)) / step->iSteps); + aGc.Clear(TRect(TPoint(slidePosX, slidePosY), bitmapSize)); + } + TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * aStep->iSubStep) / step->iSteps); + TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * aStep->iSubStep) / step->iSteps); + aGc.BitBlt(TPoint(slidePosX, slidePosY), iViewBitmap, + TRect(TPoint(step->iSrcX, step->iSrcY), bitmapSize)); + if (aStep->iSubStep == step->iSteps) + done = ETrue; + } + break; + default: + done = DrawUserAnimationStep(aGc, *aStep); + break; + } + + aStep->iSubStep++; + return done; + } + +// End of File