diff -r 000000000000 -r 5d03bc08d59c graphicstest/uibench/s60/src/tests_pan/tpan.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicstest/uibench/s60/src/tests_pan/tpan.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,213 @@ +// Copyright (c) 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 "tpan.h" +#include "te_gesturegenerator.h" +#include "twindow.h" + + +_LIT(KSemaphore, "SemTPanSync"); // Name of the global semaphore + +const TInt KGestureGenerationLimit = 50; + +// Test bitmap file location +_LIT(KBigBitmap,"z:\\resource\\apps\\uibench_s60_big.mbm"); +_LIT(KTestStep0001,"GRAPHICS-UI-BENCH-S60-0001"); + +CTPan::CTPan() + { + SetTestStepName(KTPan); + } + +TVerdict CTPan::doTestStepPreambleL() + { + // The semaphore has to be created before, otherwise the control can't open it. + TESTNOERRORL(iSemaphore.CreateGlobal(KSemaphore, 0)); + return CTe_ConeStepBase::doTestStepPreambleL(); + } + +TVerdict CTPan::doTestStepPostambleL() + { + iSemaphore.Close(); + return CTe_ConeStepBase::doTestStepPostambleL(); + } + +/** + Override of base class pure virtual + Our implementation only gets called if the base class doTestStepPreambleL() did + not leave. + + @return - TVerdict code +*/ +TVerdict CTPan::doTestStepL() + { + SetTestStepID(KTestStep0001); + PanBitmapL(); + //RecordTestResultL(); // not possible because of heap panic + return TestStepResult(); + } + +/** +@SYMTestCaseID +GRAPHICS-UI-BENCH-S60-0001 + +@SYMTestCaseDesc +Tests how long it takes to pan a bitmap in reaction to pointer events. + +@SYMTestActions +Create the bitmap and generate the pointer events. Depending on the location of the +pointer the bitmap is drawn to the screen. + +@SYMTestExpectedResults +Test should pass and display the average framerate for the whole test. +*/ +void CTPan::PanBitmapL() + { + iProfiler->InitResults(); + + // Simulate some horizontal drag pointer events + GestureGenerator::SimulateFlickGestureL(iSemaphore, TPoint(0, 0), + TPoint(KGestureGenerationLimit, 0)); + // Simulate some vertical drag pointer events + GestureGenerator::SimulateFlickGestureL(iSemaphore, TPoint(KGestureGenerationLimit, 0), + TPoint(KGestureGenerationLimit, KGestureGenerationLimit)); + + iProfiler->MarkResultSetL(); + TSize screenSize = CTWindow::GetDisplaySizeInPixels(); + iProfiler->ResultsAnalysisFrameRate(KTestStep0001, 0, 0, 0, + iAppUi->PanControl()->Iterations(), screenSize.iWidth * screenSize.iHeight); + } + +void CTPan::InitUIL(CCoeEnv* aCoeEnv) + { + iAppUi = new(ELeave) CPanAppUi(); + // iAppUi needs to be put on the cleanupstack until CCoeEnv takes ownership of iAppUi + CleanupStack::PushL(iAppUi); + iAppUi->ConstructL(TRect(CTWindow::GetDisplaySizeInPixels())); + CleanupStack::Pop(iAppUi); + aCoeEnv->SetAppUi(iAppUi); + } + +//============================================================================= + +CPanAppUi::CPanAppUi() + { + // empty + } + +CPanAppUi::~CPanAppUi() + { + RemoveFromStack(iPanControl); + delete iPanControl; + } + +void CPanAppUi::ConstructL(const TRect& aRect) + { + BaseConstructL(ENoAppResourceFile); + iPanControl = CPanControl::NewL(aRect); + AddToStackL(iPanControl); + } + +CPanControl* CPanAppUi::PanControl() + { + return iPanControl; + } + +//============================================================================= + +CPanControl* CPanControl::NewL(const TRect& aRect, const CCoeControl* aParent) + { + CPanControl* self = CPanControl::NewLC(aRect, aParent); + CleanupStack::Pop(self); + return self; + } + +CPanControl* CPanControl::NewLC(const TRect& aRect, const CCoeControl* aParent) + { + CPanControl* self = new(ELeave) CPanControl(); + CleanupStack::PushL(self); + self->ConstructL(aRect, aParent); + return self; + } + +CPanControl::CPanControl() : iWsSession(CCoeEnv::Static()->WsSession()) + { + // empty + } + +CPanControl::~CPanControl() + { + delete iSourceBitmap; + iSemaphore.Close(); + } + +void CPanControl::ConstructL(const TRect& aRect, const CCoeControl* aParent) + { + User::LeaveIfError(iSemaphore.OpenGlobal(KSemaphore)); + iSourceBitmap = new(ELeave) CFbsBitmap; + User::LeaveIfError(iSourceBitmap->Load(KBigBitmap, 0)); + + // No owner, so create an own window + if(!aParent) + { + CreateWindowL(); + DrawableWindow()->PointerFilter(EPointerFilterDrag, 0); + SetRect(aRect); + ActivateL(); + } + else + { + // use parent window as compound control + SetContainerWindowL(*aParent); + SetRect(aRect); + } + } + +void CPanControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + if((aPointerEvent.iType == TPointerEvent::EDrag) || (aPointerEvent.iType == TPointerEvent::EButton1Down)) + { + iCurrentPointerPos = aPointerEvent.iPosition; + } + DrawNow(); // Draws the entire control + iWsSession.Finish(); // Wait until WServ has finished drawing + iIterations++; // Update frame counter + iSemaphore.Signal(); // Signal test that control was drawn + } + +void CPanControl::Draw(const TRect& aRect) const + { + CWindowGc& gc = SystemGc(); + TRect sourceRect = Rect(); + sourceRect.Move(iCurrentPointerPos); + gc.DrawBitmap(aRect, iSourceBitmap, sourceRect); + } + +TInt CPanControl::Iterations() + { + return iIterations; + } + +CFbsBitmap* CPanControl::Bitmap() + { + return iSourceBitmap; + }