lafagnosticuifoundation/bmpanimation/tef/Tanctl.cpp
changeset 0 2f259fa3e83a
child 18 0aa5fbdfbc30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/bmpanimation/tef/Tanctl.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,272 @@
+// Copyright (c) 2006-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
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+#include <barsread.h>
+#include <eikenv.h>
+#include <eikappui.h>
+#include <eikapp.h>
+#include <fbs.h>
+#include <bmpancli.h>
+#include "Tanctl.h"
+
+
+void CAnimateFramesCtl::Panic(TEikAnimationPanic aPanic)
+	{
+	_LIT(KPanicCat,"TBMPANIM-Animation");
+	User::Panic(KPanicCat, aPanic);
+	}
+
+CAnimateFramesCtl* CAnimateFramesCtl::NewL()
+	{ // static
+	CAnimateFramesCtl* self=new(ELeave) CAnimateFramesCtl();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CAnimateFramesCtl::CAnimateFramesCtl() :
+	iAnimDll(iEikonEnv->WsSession()),
+	iFlags(EWaitForRedrawing)
+	{
+	}
+
+CAnimateFramesCtl::~CAnimateFramesCtl()
+	{
+	delete iAnimation;
+	delete iBitmapAnimData;
+	delete iStartAnimationIdler;
+	iAnimDll.Close();
+	}
+
+//
+//
+void CAnimateFramesCtl::BaseConstructL()
+	{
+	iBitmapAnimData = CBitmapAnimClientData::NewL();
+	iAnimation = new (ELeave) RBitmapAnim(iAnimDll);
+	_LIT(DllName, "BMPANSRV.DLL");
+	User::LeaveIfError(iAnimDll.Load(DllName));
+	}
+
+// Creates a resource reader from the animation aResourceId
+void CAnimateFramesCtl::StaticConstructL(TInt aResourceId)
+    {
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC(reader,aResourceId);
+    ConstructFromResourceL(reader);
+	CleanupStack::PopAndDestroy();
+    }
+
+//
+// 
+void CAnimateFramesCtl::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	iBitmapAnimData->SetFrameInterval(aReader.ReadInt16());
+	iBitmapAnimData->SetPlayMode((CBitmapAnimClientData::TPlayMode)aReader.ReadInt16());
+	iBitmapAnimData->SetFlash(aReader.ReadInt8());
+	TFileName ptr(aReader.ReadTPtrC());	// filename
+    if (!ptr.Length())
+		ptr = KTBmpAnimMBMFilePath;//vm iEikonEnv->EikAppUi()->Application()->BitmapStoreName();
+// Start reading the data frames
+    TInt listFrameLink=aReader.ReadInt32();
+	if (listFrameLink)
+		{
+		TResourceReader framesReader;
+		iCoeEnv->CreateResourceReaderLC(framesReader, listFrameLink);
+		const TInt count=framesReader.ReadInt16();
+		CBitmapFrameData* frameData = NULL;
+		for (TInt ii=0;ii<count;++ii)
+			{
+			//read the frame data from resource	
+			frameData = ReadFrameDataFromResourceL(framesReader, ptr);
+			CleanupStack::PushL(frameData);
+			iBitmapAnimData->AppendFrameL(frameData);
+			CleanupStack::Pop(); // frameData
+			}
+		CleanupStack::PopAndDestroy();
+		}
+    TInt backgroundLink=aReader.ReadInt32();
+	if (backgroundLink > 0)
+		{
+		TResourceReader backgroundReader;
+		iCoeEnv->CreateResourceReaderLC(backgroundReader, backgroundLink);
+		//read the frame data from resource
+		CBitmapFrameData* backgroundData = ReadFrameDataFromResourceL(backgroundReader, ptr);
+		CleanupStack::PushL(backgroundData);
+		iBitmapAnimData->SetBackgroundFrame(backgroundData);
+		CleanupStack::Pop(); // backgroundData
+		CleanupStack::PopAndDestroy(); // backgroundReader
+		}
+	}
+
+
+//
+//
+CBitmapFrameData* CAnimateFramesCtl::ReadFrameDataFromResourceL(TResourceReader& aFramesReader, const TDesC& aFileName)
+	{
+	CBitmapFrameData* frameData = CBitmapFrameData::NewL();
+	CleanupStack::PushL(frameData);
+	frameData->SetInterval(aFramesReader.ReadInt16());
+	TPoint position;
+	position.iX = aFramesReader.ReadInt16();
+	position.iY = aFramesReader.ReadInt16();
+	frameData->SetPosition(position);
+	const TInt bmpId = aFramesReader.ReadInt16();
+	const TInt maskId = aFramesReader.ReadInt16();
+	if (bmpId >= 0)
+		{
+		CFbsBitmap* bitmap = iEikonEnv->CreateBitmapL(aFileName, bmpId);
+		frameData->SetBitmap(bitmap);
+		if (maskId >= 0)
+			{
+			CFbsBitmap* mask = iEikonEnv->CreateBitmapL(aFileName, maskId);
+			frameData->SetMask(mask);
+			}
+		}
+	CleanupStack::Pop();
+	return frameData;
+	}
+
+//
+//
+void CAnimateFramesCtl::CancelAnimationL()
+	{
+	__ASSERT_ALWAYS(iAnimation, Panic(EEikPanicAnimationNoRAnimation));
+	if (IsInitialisationComnpleted())
+		iAnimation->StopL();
+	}
+
+//
+//
+void CAnimateFramesCtl::CompleteAnimationInitialisationL()
+	{
+	__ASSERT_ALWAYS(iAnimation, Panic(EEikPanicAnimationNoRAnimation));
+	__ASSERT_ALWAYS(SetAnimationWindowL(), Panic(EEikPanicAnimationNoWindow));
+	iAnimation->SetBitmapAnimDataL(*iBitmapAnimData);
+	iAnimation->SetPositionL(iPosition);
+	iFlags |= EInitialisationCompleted;
+	}
+
+//
+//
+TSize CAnimateFramesCtl::MinimumSize()
+	{
+	return iBitmapAnimData->Size();
+	}
+
+//
+//
+void CAnimateFramesCtl::PositionChanged()
+	{
+	if ( (iAnimation) && IsInitialisationComnpleted() )
+		iAnimation->SetPositionL(iPosition);
+	}
+
+//
+//
+TBool CAnimateFramesCtl::SetAnimationWindowL()
+	{
+	RWindow* window = &Window();
+	if (window)
+		{	
+		iAnimation->ConstructL(*window);
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CAnimateFramesCtl::SetAnimationCtlWindowL(CCoeControl* aParent)
+	{
+	if (aParent)
+		SetContainerWindowL(*aParent);
+	else
+		CreateWindowL();
+	}
+
+//
+void CAnimateFramesCtl::SetFrameIndexL(TInt aIndex)
+	{
+	if (IsInitialisationComnpleted())
+		iAnimation->DisplayFrameL(aIndex);
+	}
+
+//
+void CAnimateFramesCtl::SetFrameIntervalL(TInt aInterval)
+	{
+	if (IsInitialisationComnpleted())
+		iAnimation->SetFrameIntervalL(aInterval);
+	}
+//
+//
+void CAnimateFramesCtl::SizeChanged()
+	{
+	if ( (iAnimation) && IsInitialisationComnpleted() )
+		iAnimation->SetPositionL(iPosition);
+	}
+
+//
+//
+void CAnimateFramesCtl::StartAnimationL()
+	{
+	if (iFlags&EWaitForRedrawing)
+		{
+		CreateAndStartIdlerL();
+		iFlags &= ~EWaitForRedrawing;
+		}
+	else
+		{
+		if (!IsInitialisationComnpleted())
+			CompleteAnimationInitialisationL();
+		iAnimation->StartL();
+		}
+	}
+
+void CAnimateFramesCtl::SetBitmapAnimationDataL()
+	{
+	}
+
+void CAnimateFramesCtl::CreateAndStartIdlerL()
+	{
+	if (!iStartAnimationIdler)
+		iStartAnimationIdler = CBitmapAnimIdler::NewL();
+	iStartAnimationIdler->Cancel();
+	iStartAnimationIdler->Start(TCallBack(StartAnimationCallBackL,this));
+	}
+
+TInt CAnimateFramesCtl::StartAnimationCallBackL(TAny* aThis)
+	{ // static
+	CAnimateFramesCtl* self=(CAnimateFramesCtl*)aThis;
+	self->StartAnimationL();
+	return(EFalse); // single shot callback
+	}
+
+
+// Idle class
+
+CBitmapAnimIdler* CBitmapAnimIdler::NewL()
+	{
+	CBitmapAnimIdler* self=new(ELeave) CBitmapAnimIdler;
+	CActiveScheduler::Add(self);
+	return(self);
+	}
+
+