lafagnosticuifoundation/animation/tef/AnimationTestStep.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/animation/tef/AnimationTestStep.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,279 @@
+// Copyright (c) 2008-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
+ @internalComponent - Internal Symbian test code 
+*/
+
+
+#include <e32base.h>
+#include <charconv.h>
+
+#include "TestWindows.h"
+#include "TestEventHandler.h"
+#include "TestRedrawHandler.h"
+#include "ActiveWait.h"
+#include "AnimationTestStep.h"
+#include "AnimationConfig.h"
+
+const TInt KFontHeight = 17;
+
+//
+// Windows:
+//
+// Backdrop window:
+CAnimBackdropWindow::CAnimBackdropWindow(RWsSession& aWsSession, CTestWindowGroup& aGroup, CWindowGc& aGc) : CTestWindow(aWsSession, aGroup, aGc)
+	{
+	}
+	
+// Output window:
+CAnimationTestWindow::CAnimationTestWindow(RWsSession& aWsSession, CTestWindowGroup& aGroup, CWindowGc& aGc, CWsScreenDevice& aScreen) :
+CTestWindow(aWsSession, aGroup, aGc),
+iScreen(aScreen)
+	{
+	}
+
+CAnimationTestWindow::~CAnimationTestWindow()
+	{
+	}
+
+void CAnimationTestWindow::DrawL()
+	{
+	if(!iFont)
+		{
+		TFontSpec fspec(_L("Arial"),KFontHeight);
+		User::LeaveIfError(iScreen.GetNearestFontInPixels((CFont *&)iFont, fspec));
+		}
+	iGc.UseFont(iFont);
+	iGc.SetPenColor(KRgbBlack);
+	TSize size = Window()->Size();
+	for (TInt i = 0; i < iNumLines; ++i)
+		{
+		iGc.DrawText(iText[(iFirstLine + i) % KMaxLogWinLines], TRect(TPoint(0,i * KFontHeight), size), KFontHeight);
+		}
+	}
+
+void CAnimationTestWindow::AppendText(const TDesC& aText)
+	{
+	TInt line = (iFirstLine + iNumLines) % KMaxLogWinLines;
+	if (iNumLines < KMaxLogWinLines)
+		++iNumLines;
+	else
+		iFirstLine = (iFirstLine + 1) % KMaxLogWinLines;
+		
+	iText[line].Copy(aText.Left(iText[line].MaxLength()));
+	Window()->Invalidate();
+	}
+	
+void CAnimationTestWindow::Clear()
+	{
+	iNumLines = 0;
+	Window()->Invalidate();
+	}
+
+//
+// The test:
+//
+CAnimationTestStep::CAnimationTestStep():
+	iBackgroundColor1(TRgb(0xFF8080)),
+	iBackgroundColor2(TRgb(0xFF0000))
+	{
+	}
+	
+CAnimationTestStep::~CAnimationTestStep()
+	{
+	if (iWaiter)
+		{
+		iWaiter->Cancel();
+		delete iWaiter;
+		}
+	delete iRedrawHandler;
+	delete iEventHandler;
+	delete iAnimTestWin;
+	delete iAnimBackdropWin;
+	delete iGroupWin;
+	delete iGc;
+	iFs.Close();
+	iWs.Close();
+	delete iConverter;
+	iColors.Close();
+	}
+
+void CAnimationTestStep::InitialiseL()
+	{
+	iWaiter = CActiveWait::NewL();
+	
+	User::LeaveIfError(iWs.Connect());
+	User::LeaveIfError(iFs.Connect());
+	iScreen = new (ELeave) CWsScreenDevice(iWs);
+	User::LeaveIfError(iScreen->Construct());
+	iDisplayMode = iScreen->DisplayMode();
+	iGc = new (ELeave) CWindowGc(iScreen);
+	User::LeaveIfError(iGc->Construct());
+	
+	iConverter = CCnvCharacterSetConverter::NewL();
+	iConverterState = CCnvCharacterSetConverter::KStateDefault;
+	iConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierAscii, iFs);
+
+	iEventHandler = new (ELeave) CTestEventHandler(iWs);
+	iEventHandler->Start();
+	iRedrawHandler = new (ELeave) CTestRedrawHandler(iWs);
+	iRedrawHandler->Start();
+	
+	iGroupWin = new (ELeave) CTestWindowGroup(iWs);
+
+	// EColor64K is 16bpp in RGB 5-6-5 format, some color might be truncated during conversion 
+	// from TRgb to TUint16
+	// The solution is to convert RGB to RGB565 and back to RGB to allow direct color comparison 
+    // with value of drawn pixel on the screen 
+	if (iScreen->DisplayMode()==EColor64K)
+		{
+		iBackgroundColor1 = TRgb::Color64K(iBackgroundColor1.Color64K());
+		iBackgroundColor2 = TRgb::Color64K(iBackgroundColor2.Color64K());
+		}
+
+	iStepWinSize = iScreen->SizeInPixels();
+	iStepWinSize.iWidth /= 2;
+	iAnimTestWin = new (ELeave) CAnimationTestWindow(iWs, *iGroupWin, *iGc, *iScreen);
+	iAnimTestWin->Window()->SetRequiredDisplayMode(EGray2);
+	iAnimTestWin->Window()->SetExtent(TPoint(0,0), iStepWinSize);
+	iAnimTestWin->Window()->SetBackgroundColor(KRgbWhite);
+	iAnimTestWin->Window()->SetVisible(ETrue);
+	iAnimTestWin->Window()->Activate();
+	
+	iAnimBackdropWin = new (ELeave) CAnimBackdropWindow(iWs, *iGroupWin, *iGc);
+	iAnimBackdropWin->Window()->SetRequiredDisplayMode(EGray2);
+	iAnimBackdropWin->Window()->SetExtent(TPoint(iStepWinSize.iWidth,0), iStepWinSize);
+	iAnimBackdropWin->Window()->SetBackgroundColor(KRgbBlack);
+	iAnimBackdropWin->Window()->SetVisible(ETrue);
+	iAnimBackdropWin->Window()->Activate();
+	}
+
+// This is not a completely safe function, but then this is only a test harness
+void CAnimationTestStep::Log(const TDesC& aText)
+	{
+	iAnimTestWin->AppendText(aText);
+	}
+	
+void CAnimationTestStep::ClearLog()
+	{
+	iAnimTestWin->Clear();
+	}
+	
+void CAnimationTestStep::Wait(TInt aDelay)
+	{
+	iWaiter->Wait(aDelay);
+	}
+	
+TBool CAnimationTestStep::RectCompare(const TRect& a, const TRect& b)
+	{
+	if(iScreen->RectCompare(a,b,CWsScreenDevice::EIncludeSprite))
+		{
+		return ETrue;
+		}
+	else
+		{
+		return EFalse; // This is a good place for a break point
+		}
+	}
+
+TInt CAnimationTestStep::CountColorsL(const TRect& aRect, TInt aMin, TInt aMax)
+	{
+	TDisplayMode displayMode = iScreen->DisplayMode();
+	TInt width = CFbsBitmap::ScanLineLength(aRect.Width(),displayMode);
+	HBufC8* buf=HBufC8::NewMaxLC(width);
+	TPtr8 ptr=buf->Des();
+	iColors.Reset();
+	TInt inc = width/aRect.Width();
+	for (TInt row = aRect.iTl.iY; row < aRect.iBr.iY; ++row)
+		{
+		ptr.SetLength(0);
+		iScreen->GetScanLine(ptr,TPoint(aRect.iTl.iX,row),aRect.Width(),displayMode);
+		for (TInt col = 0; col < ptr.Length(); col+=inc)
+			{
+			TUint clr = ptr[col];
+			// Pixel buffer represented in block of bytes, if color mode is 8bpp (1byte) we can
+			// simply access the buffer sequentially eg clr = ptr[col], however if the color mode
+			// is 16bpp or more, access must be adjusted accordingly. 
+			// The "inc" variable indicates how many bytes each pixel's colour takes
+			// and could be any value from 1 to 4 depending on the color mode.
+			for (TInt byteNumber = 1; byteNumber < inc; byteNumber++)
+				{
+				clr = clr << 8;
+				clr += ptr[col + byteNumber];
+				}
+			if (iColors.Find(clr) == KErrNotFound)
+				{
+				iColors.Append(clr);
+				}
+			}
+		}
+	TInt count = iColors.Count();
+	CleanupStack::PopAndDestroy(buf);
+	
+	if (count < aMin)
+		{
+		return (count - aMin);	// This is a good place for a break point
+		}
+	else if (count > aMax)
+		{
+		return (count - aMax);	// This is a good place for a break point
+		}
+	else
+		{
+		return 0;
+		}
+	
+	}
+
+//
+// Wait till redraws finished //
+//
+
+class CStopTheScheduler : public CAsyncOneShot
+	{
+public:
+	CStopTheScheduler(TInt aPriority);
+	static CStopTheScheduler* NewL(TInt aPriority);
+	void RunL();
+	};
+
+CStopTheScheduler* CStopTheScheduler::NewL(TInt aPriority)
+	{
+	return new(ELeave)CStopTheScheduler(aPriority);
+	}
+
+CStopTheScheduler::CStopTheScheduler(TInt aPriority)
+	:CAsyncOneShot(aPriority)
+	{
+	}
+
+void CStopTheScheduler::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CAnimationTestStep::WaitForRedrawsToFinish()
+	{
+	CStopTheScheduler* ps=new CStopTheScheduler(-11);
+	if(ps)
+		{
+		ps->Call();
+		CActiveScheduler::Start();
+		delete ps;
+		}
+	}
+