Revise some of the compositor performance improvements to improve correctness.
Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm.
Move transparency type simplification further up the composition code.
Remove some unnecessary fields.
Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).
// 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;
}