windowing/windowserver/tauto/TTransptAnim.cpp
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// Copyright (c) 2003-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 "TTransptAnim.h"

struct FrameSet
	{
	TRgb* iFrames;
	const TInt iFrameCount;
	FrameSet(TRgb* aFrames, const TInt aFrameCount)
	: iFrames(aFrames),
	iFrameCount(aFrameCount)
		{
		}
	};

TRgb FrameSequenceAlpha[]= 
{ TRgb(255, 0, 0, 50), TRgb(0, 255, 0, 70), TRgb(0, 0, 255, 100), TRgb(255, 255, 0, 150), TRgb(0, 255, 255, 200) };
TRgb FrameSequenceNoAlpha[] =
{ TRgb(255, 0, 0), TRgb(0, 255, 0), TRgb(0, 0, 255), TRgb(255, 255, 0), TRgb(0, 255, 255) };

FrameSet frameSetAlpha(FrameSequenceAlpha, 	sizeof(FrameSequenceAlpha)/sizeof(TRgb));
FrameSet frameSetNoAlpha(FrameSequenceNoAlpha, sizeof(FrameSequenceNoAlpha)/sizeof(TRgb));
FrameSet TestFrameSets[] =
	{
	frameSetAlpha, frameSetNoAlpha
	};

static const TInt 	FRAME_DELAY 			= 2000000;
static const TInt 	DRAW_LINE_ANIMATION 	= 36;
static const TBool 	ALPHATRANSPARENCY_ON 	= ETrue;
static const TInt	ALPHA_FRAMESET 			= 0;

//*****************************************************************************
CTTestCase* CTTransparentAnim::CreateTestCaseL(CTTransparentAnim* aTransAnim, TInt aTestCaseId)
	{
	CTTestCase* testCase = aTransAnim->GetCurrent();
	
	if (!testCase)
		{
		switch (aTestCaseId)
			{
		case GraphicsWServ0483 :
			testCase =  CTGraphicsWServ0483::NewL();
			break;
			}
		}
	
	return testCase;
	}

//*****************************************************************************
CTTransparentAnim::CTTransparentAnim(CTestStep* aStep)
: CTWsGraphicsBase(aStep), iCurrentTestCase(NULL)
	{}

CTTransparentAnim::~CTTransparentAnim()
	{
	TheClient->iWs.SetAutoFlush(EFalse);
	}

void CTTransparentAnim::ConstructL()
	{
	TheClient->iWs.SetAutoFlush(ETrue);
	}

void CTTransparentAnim::RunTestCaseL(TInt)
	{
	((CTTransparentAnimStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0483"));
	CTTestCase* testCase = CTTransparentAnim::CreateTestCaseL(this, iTest->iState);
	
	if (!testCase)
		{
		TestComplete();
		return ;
		}

	TInt err = KErrNone;
	
	if (!testCase->IsAlreadyRunning())
		{
		SetCurrent(testCase);
		iTest->LogSubTest(testCase->TestCaseName());
		TRAP(err, testCase->StartL());
		testCase->SetError(err);
		}
	
	if (testCase->IsComplete() || err != KErrNone)
		{
		((CTTransparentAnimStep*)iStep)->RecordTestResultL();
		((CTTransparentAnimStep*)iStep)->CloseTMSGraphicsStep();
		if (testCase->HasFailed())
			{
			INFO_PRINTF3(_L("ErrorStatus  - Expected: %d, Actual: %d"), ETrue, EFalse);
			}
		++iTest->iState;
		SetCurrent(NULL);
		delete testCase;
		}
	else
		{
		// Prevent test harness from repeatedly running the test case too quickly.
		User::After(TTimeIntervalMicroSeconds32(FRAME_DELAY));
		}
	}

void CTTransparentAnim::SetCurrent(CTTestCase* aTestCase)
	{
	iCurrentTestCase = aTestCase;
	}

CTTestCase* CTTransparentAnim::GetCurrent()
	{
	return iCurrentTestCase;
	}

//*****************************************************************************
CTTAnimation::CTTAnimation(CTWin* aWin, TInt aDrawArg)
: iWin(aWin), iFrameCount(0), iCurrentFrameSet(0), iIsComplete(EFalse), iDrawArg(aDrawArg)
	{
	iAnimDll = RAnimDll(TheClient->iWs);
	iAnimDll.Load(KAnimDLLName);
	iDrawAnim = RTestAnim(iAnimDll);
	iDrawAnim.Construct(*iWin->BaseWin(), EAnimTypeTrans, TPckgBuf<TRect>(aWin->Size()));
	}

CTTAnimation::~CTTAnimation()
	{
	iDrawAnim.Close();
	iAnimDll.Close();
	delete iWin;
	}

void CTTAnimation::StartL()
	{
	iAnimTimer.ConstructL();
	iAnimTimer.Start(FRAME_DELAY, TCallBack(CTTAnimation::NextFrame,this));
	}

TBool CTTAnimation::IsComplete()
	{
	return iIsComplete;
	}

void CTTAnimation::SetCurrentFrameSet(TInt aFrameSet)
	{
	iCurrentFrameSet = aFrameSet;
	}

CTWin* CTTAnimation::GetWindow()
	{
	return iWin;
	}

void CTTAnimation::Attach(MAnimationObserver* aObserver)
	{
	iObserver = aObserver;
	}

TInt CTTAnimation::NextFrame(TAny* aAnim)
	{
	STATIC_CAST(CTTAnimation*,aAnim)->NextFrame();

	return KErrNone;
	}

void CTTAnimation::NextFrame()
	{
	TRgb Color;
	TPckgBuf<TFrameData> paramsPckg;

	if (iFrameCount == TestFrameSets[iCurrentFrameSet].iFrameCount)
		{
		iIsComplete = ETrue;
		iObserver->Update(this);
		return ;
		}
	
	Color = TestFrameSets[iCurrentFrameSet].iFrames[iFrameCount++];
	
	paramsPckg().draw = iDrawArg;
	paramsPckg().color = Color;
	
	iDrawAnim.Command(EADllNextFrame, paramsPckg);

	iAnimTimer.Start(FRAME_DELAY, TCallBack(CTTAnimation::NextFrame,this));
	}

//*****************************************************************************
CTransAnimTimer::CTransAnimTimer() 
: CTimer(EPriorityStandard)
	{}

CTransAnimTimer::~CTransAnimTimer()
	{}

void CTransAnimTimer::ConstructL()
	{
	CTimer::ConstructL();
	CActiveScheduler::Add(this);
	}

void CTransAnimTimer::RunL()
	{
	iCallBack.CallBack();
	}

void CTransAnimTimer::Start(TTimeIntervalMicroSeconds32 aInterval,TCallBack aCallBack)
	{
	iCallBack = aCallBack;
	After(aInterval);
	}

//*****************************************************************************
CTTestCase::CTTestCase()
: iError(KErrNone), iIsComplete(EFalse), iIsRunning(EFalse)
	{}

TBool CTTestCase::IsAlreadyRunning()
	{
	return iIsRunning;
	}

void CTTestCase::Update(CTTAnimation* aAnim)
	{
	iIsComplete = aAnim->IsComplete();
	}

TBool CTTestCase::IsComplete()
	{
	return iIsComplete;
	}

void CTTestCase::StartL()
	{
	if (!iIsRunning)
		{
		RunTestCaseL();
		iIsRunning = ETrue;
		}
	}

TBool CTTestCase::HasFailed()
	{
	TBool ret = EFalse;
	if (iError != KErrNone)
		{
		ret = ETrue;
		}
	return ret;
	}

void CTTestCase::SetIsCompleted(TBool aIsComplete)
	{
	iIsComplete = aIsComplete;
	}

void CTTestCase::SetError(TInt aError)
	{
	iError = aError;
	}

//*********************** New Test Case Classes go here************************

/**
 * @SYMTestCaseID GRAPHICS-WSERV-0483
 *
 * @SYMTestCaseDesc There are two animations running, one attached to a transparent
 * window using SetTransparencyAlphaChannel and a second animation with a non-transparent
 * window. The animations draw a line and then change the color of the line in subsequent
 * frames. After the last frame the alpha channel for the first animation is set to
 * opaque and then compared with the second animation to make certain that no artifacts
 * are present.
 *
 * @SYMTestPriority High
 *
 * @SYMTestStatus Implemented
 *
 * @SYMTestActions An anim is attached with a Transparent window.
 * 	The anim draws several frames using WSERV's Anim animation functionality.
 *
 * @SYMTestExpectedResults Both animations draw a line and then change it's color, the first
 * animation doing it in a tranparent window and the second doing it in a non-transparent window.
 **/
CTGraphicsWServ0483* CTGraphicsWServ0483::NewL()
	{
	CTGraphicsWServ0483* testCase = new(ELeave) CTGraphicsWServ0483();
	
	CleanupStack::PushL(testCase);
	testCase->ConstructL();
	CleanupStack::Pop();
	
	return testCase;
	}

CTGraphicsWServ0483::~CTGraphicsWServ0483()
	{
	delete iAnim;
	delete iCheckAnim;
	}

void CTGraphicsWServ0483::ConstructL()
	{
	iAnim = new(ELeave) CTTAnimation(CTAnimWin<ALPHATRANSPARENCY_ON>::NewL(
										BaseWin->GetBorderWin()->Position(),
										BaseWin->GetBorderWin()->Size()), DRAW_LINE_ANIMATION);
	
	iCheckAnim = new(ELeave) CTTAnimation(CTAnimWin<>::NewL(
										TestWin->GetBorderWin()->Position(),
										TestWin->GetBorderWin()->Size()), DRAW_LINE_ANIMATION);
	TheClient->WaitForRedrawsToFinish();
	}

void CTGraphicsWServ0483::RunTestCaseL()
	{
	iAnim->Attach(this);
	iCheckAnim->Attach(this);
	
	iAnim->SetCurrentFrameSet(ALPHA_FRAMESET);
	iAnim->StartL();
	
	iCheckAnim->SetCurrentFrameSet(ALPHA_FRAMESET);
	iCheckAnim->StartL();	
	}

void CTGraphicsWServ0483::Update(CTTAnimation*)
	{
	if (iAnim->IsComplete() && iCheckAnim->IsComplete())
		{
		TRgb bgColor(150, 150, 150, 255); 
		iAnim->GetWindow()->Win()->SetBackgroundColor(bgColor);
		iAnim->GetWindow()->Win()->Invalidate();
		TheClient->iWs.Finish();
		TheClient->WaitForRedrawsToFinish();
		if (!DoCheckRect(iAnim->GetWindow(), iCheckAnim->GetWindow()))
			{
			SetError(KErrGeneral);
			}
		SetIsCompleted(ETrue);
		}
	}

TPtrC CTGraphicsWServ0483::TestCaseName()
	{
	_LIT(KTransparentAlphaChannelAnimationTest, "Transparent Anim Test");
	
	return TPtrC(KTransparentAlphaChannelAnimationTest);
	}

__WS_CONSTRUCT_STEP__(TransparentAnim)