uifw/AvKon/src/aknAnimData.cpp
changeset 0 2f259fa3e83a
--- /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 <barsread.h>
+#include <eikenv.h>
+
+
+const TInt KAnimStepGranularity=5;
+
+
+
+EXPORT_C CAknAnimationData::CAknAnimationData()
+:CArrayFixFlat<TAnimStep>(KAnimStepGranularity)
+	{
+	}
+
+EXPORT_C CAknAnimationData::~CAknAnimationData()
+	{
+	delete iDrawStepsPerAnimStep;
+	delete iPendingSteps;
+	}
+
+
+EXPORT_C void CAknAnimationData::ConstructL()
+	{
+	if (!iPendingSteps)
+		{
+		iPendingSteps = new(ELeave)CArrayFixFlat<TAnimMultiStep>(KAnimStepGranularity);
+		}
+	if (!iDrawStepsPerAnimStep)
+		{
+		iDrawStepsPerAnimStep = new(ELeave)CArrayFixFlat<TUint8>(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; sectionCount<sections; sectionCount++)
+		{
+		CEikonEnv::Static()->CreateResourceReaderLC(sectionReader, reader.ReadInt32());		
+		TInt animSteps = sectionReader.ReadInt16();
+		for (TInt stepCount=0; stepCount<animSteps; stepCount++)
+			{
+			ReadAnimStepL(sectionReader);
+			}
+		CleanupStack::PopAndDestroy();	//sectionReader
+		if (WaitBetweenSections())
+			{
+			// Append a wait step between each loaded section
+			TAnimStep drawStep;
+			drawStep.SetType(EAnimWaitUntilComplete);
+			AppendL(drawStep);
+			iDrawStepsPerAnimStep->AppendL(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; stepCount<drawSteps; stepCount++)
+		{
+		TAnimStep drawStep;
+		TUint8 type = (TUint8)aReader.ReadInt8();
+		drawStep.SetType(type);
+		switch(type)
+			{
+			case EAnimBlitPreviousView:
+			case EAnimBlitNewView:
+				{
+				TAnimBlitStep* step = drawStep.BlitStep();
+				step->iDestX = (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; ii<drawSteps; ii++)
+			{
+			TAnimStep* drawStep = &(At(iCurrentDrawStep));
+
+			switch (drawStep->Type())
+				{
+				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; ii<count; ii++)
+		{
+		TAnimMultiStep* drawStep = &(*iPendingSteps)[ii];
+		TBool done = ExecutePendingAnimationStep(aGc, drawStep);
+		if (!done)
+			{
+			finished = EFalse;
+			}
+		else
+			{
+			// Remove step from pending list
+			iPendingSteps->Delete(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