graphicstest/uibench/src/te_graphicsperformanceSuiteStepBase.h
author Matt Plumtree <matt.plumtree@nokia.com>
Fri, 23 Apr 2010 17:57:02 +0100
branchNewGraphicsArchitecture
changeset 39 a4b63488e0b0
parent 0 5d03bc08d59c
permissions -rw-r--r--
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) 2005-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 
*/

#ifndef __TE_GRAPHICSPERFORMANCE_STEP_BASE__
#define __TE_GRAPHICSPERFORMANCE_STEP_BASE__

#include <e32math.h>
#include <bitdev.h>
#include <test/tprofiler.h>
#include <test/testexecutestepbase.h>
#include <test/ttmsgraphicsstep.h>
#include "te_graphicsperformanceSuiteDefs.h"
#include "tdisplaymode_mapping.h"

TSize GetPixmapSizeInPixels();

// Define TRgb constants to be used in test cases
#define TRANSPARENT_BLACK TRgb(0,0,0,0)
#define BLACK_SEMI_TRANSPARENT TRgb(0,0,0,0x40)
#define RED_SEMI_TRANSPARENT TRgb(0xff,0,0,0x40)
#define GREEN_SEMI_TRANSPARENT TRgb(0,0xff,0,0x40)
#define BLUE_SEMI_TRANSPARENT TRgb(0,0,0xff,0x40)
#define YELLOW_SEMI_TRANSPARENT TRgb(0xff,0xff,0,0x40)

/**
Creates a virtual bitmap device if a real screen device of the specified display mode is not supported by the hardware
*/
class CVirtualBitmapDevice : public CBase
	{
public:
	virtual ~CVirtualBitmapDevice();
	static CVirtualBitmapDevice* NewL(TDisplayMode aDisplayMode, TBool aForceOffscreen);
	void Update();
	CBitmapDevice& BitmapDevice();
	CFbsBitmap& Bitmap();
	virtual int CreateContext(CGraphicsContext *&aGc);
	virtual TSize SizeInPixels() const;
	TInt isScreenDevice();
private:
	void ConstructL(TDisplayMode aDisplayMode, TBool aForceOffscreen);
	
private:
	CBitmapDevice* iBitmapDevice;	// The virtual or real screen device
	CFbsBitmap* iBitmap;			// Virtual bitmap
	TBool iIsScreenDevice; 			// ETrue if the hardware supports the screen device at the specified display mode	
	};
	
/**
Creates a virtual bitmap device if a real screen device of the specified display mode is not supported by the hardware.
It is similar to CVirtualBitmapDevice but it uses CFbsDrawDevice directly.
*/
class CVirtualDrawDevice : public CBase
	{
public:
	virtual ~CVirtualDrawDevice();
	static CVirtualDrawDevice* NewL(TDisplayMode aDisplayMode);
	CFbsDrawDevice& DrawDevice();
	TBool IsDrawDevice();
private:
	void ConstructL(TDisplayMode aDisplayMode);
	TInt ByteSize(const TSize& aSize, TDisplayMode aDisplayMode);
	
private:
	CFbsDrawDevice* iDrawDevice;	// The virtual or real screen device
	TUint8* iDeviceMemory;			// Used for virtual draw device
	TSize	iSize;					// Used for Clear
	TBool iIsDrawDevice;		    // ETrue if the hardware supports the screen device at the specified display mode	
	};

/****************************************************************************
* The reason to have a new step base is that it is very much possible
* that the all individual test steps have project related common variables 
* and members 
* and this is the place to define these common variable and members.
* 
****************************************************************************/
class CTe_graphicsperformanceSuiteStepBase : public CTTMSGraphicsStep
	{
public:
	static const TDesC& ColorModeName(TDisplayMode aMode);
	virtual ~CTe_graphicsperformanceSuiteStepBase();
	CTe_graphicsperformanceSuiteStepBase();
	CVirtualBitmapDevice* ScreenDevice();

	void SetScreenModeL(TDisplayMode aScreenMode, TBool aForceUseOffscreen=EFalse);
	CFbsBitmap* CreateSoftwareBitmapLC(const TSize& aSize, TDisplayMode aMode);
	void CopyBitmapL(CFbsBitmap* aDst, CFbsBitmap* aSrc);
	CFbsBitmap* CopyIntoNewBitmapL(CFbsBitmap* aSrc, TDisplayMode aDisplayMode);
	CFbsBitmap* LoadBitmapL(const TDesC& aName, TInt aIndex);
	static TRgb InterpolateColour(TRgb aLo, TRgb aHi, TInt aX, TInt aN);
	static void VerticalGradientAlphaL(CFbsBitmap* aBitmap, TRgb aLo, TRgb aHi);
	void SetDrawDeviceModeL(TDisplayMode aScreenMode);
	TInt GetDrawDeviceInterfaceL(TInt aInterfaceId, TAny *&aInterface);
	void ClearDrawDeviceL(TRgb aColor);
	CFbsBitmap* CreateCheckedBoardL(TDisplayMode aDisplayMode, TSize aSize, TSize aChecksPerAxis) const;
	virtual CFbsBitmap* GetTargetAsBitmapL();
	TInt WriteTargetOutput(TPtrC aName);
	static void ExtractListL(TPtrC aList, RArray<TPtrC>& aListItems);

protected:
	// From CTestStep
	virtual TVerdict doTestStepPreambleL(); 
	virtual TVerdict doTestStepPostambleL();	
	TUint32 TimeMax();
	TUint32 TimeMin();
	
private:
	//TBool IsFoundScreenMode(TDisplayMode aScreenMode);

protected:
	CVirtualBitmapDevice * iScreenDevice;	
	CFbsBitGc* iGc;
	CVirtualDrawDevice* iDrawDevice;
    CTProfiler*         iProfiler;
		
private:
	TSize 				iScreenSize;
	TInt 				iDoProfiling;
	TInt				iCPUSpeed;
	CActiveScheduler* 	iScheduler;
	
	// Sanity checking flag as read in from the ini file. If ETrue, WriteTargetOutput() will generate
	// a bitmap of the target, otherwise it will perform no operation.
	TBool iShowBitmaps;
	__PROFILERMEMBERS
	};

	// Define 16 RGB colors
#define KRgbBlack		TRgb(0x000000)
#define KRgbDarkGray	TRgb(0x555555)
#define KRgbDarkRed		TRgb(0x000080)
#define KRgbDarkGreen	TRgb(0x008000)
#define KRgbDarkYellow	TRgb(0x008080)
#define KRgbDarkBlue	TRgb(0x800000)
#define KRgbDarkMagenta	TRgb(0x800080)
#define KRgbDarkCyan	TRgb(0x808000)
#define KRgbRed			TRgb(0x0000ff)
#define KRgbGreen		TRgb(0x00ff00)
#define KRgbYellow		TRgb(0x00ffff)
#define KRgbBlue		TRgb(0xff0000)
#define KRgbMagenta		TRgb(0xff00ff)
#define KRgbCyan		TRgb(0xffff00)
#define KRgbGray		TRgb(0xaaaaaa)
#define KRgbWhite		TRgb(0xffffff)

// A 16 RGB color table
const TRgb KColor16Table[] = 
	{		
	KRgbWhite,		
	KRgbGray,		
	KRgbCyan,		
	KRgbMagenta,		
	KRgbBlue,		
	KRgbYellow,		
	KRgbGreen,		
	KRgbRed,			
	KRgbDarkCyan,	
	KRgbDarkMagenta,	
	KRgbDarkBlue,	
	KRgbDarkYellow,	
	KRgbDarkGreen,	
	KRgbDarkRed,	
	KRgbDarkGray,	
	KRgbBlack,					
	};

#endif