graphicstest/graphicstestharness/src/thashreferenceimages.cpp
changeset 0 5d03bc08d59c
child 70 5e51caaeeb72
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/src/thashreferenceimages.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,223 @@
+// Copyright (c) 2006-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 <test/testexecutestepbase.h>
+#include <openfont.h>
+#include <test/thashreferenceimages.h>
+#include <hash.h>
+
+_LIT(KHashIDFormat, "%S_%d_%S_%S_%d");
+const TInt KLengthOfHashValue = 256;
+const TInt KNumOfDisplayModes = 12;
+
+/* This is a list of display modes used - the parameter passed to the string 
+   creation function is an index into this table
+ 
+ 	EGray2,
+	EGray4,
+	EGray16,
+	EGray256,
+	EColor16,
+	EColor256,
+	EColor64K,
+	EColor16M,
+	EColor4K,
+	EColor16MU,
+	EColor16MA,
+	EColor16MAP
+	
+   */
+
+_LIT(KMode0,"EGray2");
+_LIT(KMode1,"EGray4");
+_LIT(KMode2,"EGray16");
+_LIT(KMode3,"EGray256");
+_LIT(KMode4,"EColor16");
+_LIT(KMode5,"EColor256");
+_LIT(KMode6,"EColor64K");
+_LIT(KMode7,"EColor16M");
+_LIT(KMode8,"EColor4K");
+_LIT(KMode9,"EColor16MU");
+_LIT(KMode10,"EColor16MA");
+_LIT(KMode11,"EColor16MAP");
+
+//Uncomment the line below to save the image of the screen to a mbm file.
+//#define SAVEBITMAP
+
+//Note: To updated existing hash values in toutlineandshadow.ini, you need to delete the previous entries along with hashid's in toutlineandshadow.ini and export this ini
+//If a existing test case need updating that will change the hash value, then the hash for this test case needs to be removed from the .ini file 
+//Uncomment the line below to add a new hash value for any test cases that do not already have a hash.
+//#define APPEND_NEW_OR_MISSING_HASH_DATA
+
+// Constructor
+CTHashReferenceImages::CTHashReferenceImages(CTestStep* aStep, RFbsSession* aFbs):CBase(),iFbs(aFbs),iStep(aStep) { }
+
+EXPORT_C CTHashReferenceImages* CTHashReferenceImages::NewL(CTestStep* aStep, RFbsSession* aFbs, const TDesC *aPath)
+	{
+	CTHashReferenceImages* ptr = new (ELeave)CTHashReferenceImages(aStep,aFbs);
+	CleanupStack::PushL(ptr);
+	ptr->ConstructL(aPath);
+	CleanupStack::Pop();
+	return ptr;
+	}
+
+void CTHashReferenceImages::ConstructL(const TDesC *aPath)
+	{
+	iPath = aPath->AllocL();
+	}
+
+// Destructor
+EXPORT_C CTHashReferenceImages::~CTHashReferenceImages()
+	{
+	//nothing is owned by this class, except iPath
+	delete iPath;
+	}
+
+/**
+Auxilary function should be called only when we need to generate hash values from the screen and returns its hex format.
+@param aHexString the output MD5 hash hex string obtained from iBitmapDevice
+*/
+EXPORT_C void CTHashReferenceImages::GenerateHashAndReturnInHexFormatL(TDes &aHexString)
+	{
+	TInt bufLen = CFbsBitmap::ScanLineLength(iBitmapDevice->SizeInPixels().iWidth, iBitmapDevice->DisplayMode());
+	RBuf8 buff;
+	buff.CreateL(bufLen);
+	CleanupClosePushL(buff);	
+	CMD5 *md = CMD5::NewL();
+	CleanupStack::PushL(md);
+	for (TPoint pos(0, 0); pos.iY < iBitmapDevice->SizeInPixels().iHeight; pos.iY++)
+		{
+		iBitmapDevice->GetScanLine(buff,pos,iBitmapDevice->SizeInPixels().iWidth,iBitmapDevice->DisplayMode());
+		md->Update(buff);
+		}
+
+	TBuf8<KLengthOfHashValue> hashString;
+	//md will be reset after calling CMD5::Final() as Final will call Reset.
+	hashString.Copy(md->Final());
+	aHexString.Zero();
+
+	for(TInt icount=0; icount < hashString.Length(); icount++)
+		{
+		aHexString.AppendNumFixedWidth(hashString[icount], EHex, 4);
+		}
+	CleanupStack::PopAndDestroy(2, &buff);
+	}
+
+/**
+Auxilary function called to compare generated hash with reference hash and report error if they don't match.
+@param aHashIndex holds the hashId.
+*/
+EXPORT_C void CTHashReferenceImages::CompareHashValuesL(const TDesC& aHashIndex)
+	{
+	TBuf<KLengthOfHashValue>  hexString;
+	//Gets the hash value for the current drawings
+	GenerateHashAndReturnInHexFormatL(hexString);
+	TPtrC hashFromConfig;
+	TBool stringFound = iStep->GetStringFromConfig(iStep->ConfigSection(), aHashIndex, hashFromConfig);
+	if (stringFound)
+		{
+		//cannot use the macro //TEST((hashFromConfig.Compare(hexString)) == 0); since iStep needs to be 
+		//referenced
+		iStep->testBooleanTrue((hashFromConfig.Compare(hexString)) == 0, (TText8*)__FILE__, __LINE__);
+		}
+	else
+		{
+#ifdef APPEND_NEW_OR_MISSING_HASH_DATA
+		//Hash data will be written to ini file if hash id is not found.
+		//If written the status will be as INI WRITE with the new hash id and value in test log file.
+		iStep->testBooleanTrue(iStep->WriteStringToConfig(iStep->ConfigSection(), aHashIndex, hexString), (TText8*)__FILE__, __LINE__);
+#ifdef SAVEBITMAP
+		CopyScreenToBitmapL(aHashIndex);
+#endif
+#else
+		//Report error in case hash data is missing and APPEND_NEW_OR_MISSING_HASH_DATA is not defined
+		iStep->testBooleanTrue( 0, (TText8*)__FILE__, __LINE__);
+#endif
+		}
+	}
+
+/**
+Auxilary function called to generate Hash ID String based on the parameters (test case ID, subtest etc...) and returns
+HashId looks like:Testcasecame_0010_9_Swiss_EGray2_0 (aTestCase = DrawText_0010 or DrawTextVertical_0010, aSubTestNumber = 9, aFontFaceIndex = Swiss, aDisplayMode = EGray2, aOrientation = 0)
+@param aTestCase holds the testcase ID
+@param aSubTestNumber holds the subtest number
+@param aFontFaceIndex holds the font face index (index used in KFontFace[])
+@param aDisplayMode holds the display mode
+@param aOrientation holds the orientation number
+*/
+EXPORT_C HBufC* CTHashReferenceImages::GenerateHashIdStringLC(const TDesC& aTestCase, TInt aSubTestNumber, const TPtrC aName[], TInt aNameIndex,
+												TInt aDisplayMode, TInt aOrientation)
+	{
+	//this is here because at file scope there is uninitialised writable data
+	const TDesC * KDisplayModeNames[KNumOfDisplayModes] = 
+		{
+		&KMode0,
+		&KMode1,
+		&KMode2,
+		&KMode3,
+		&KMode4,
+		&KMode5,
+		&KMode6,
+		&KMode7,
+		&KMode8,
+		&KMode9,
+		&KMode10,
+		&KMode11,
+		};	
+	
+	TBuf<KLengthOfHashValue> tempBuffer;
+	tempBuffer.Format(KHashIDFormat, &aTestCase, aSubTestNumber, &aName[aNameIndex], KDisplayModeNames[aDisplayMode], aOrientation);
+	return tempBuffer.AllocLC();
+	}
+
+
+
+/**
+Auxilary function called to Copy the screen to bitmap (mbm) file.
+@param aHashIndex contains hashID. Bitmap is created with the aHashIndex as name
+*/
+EXPORT_C void CTHashReferenceImages::CopyScreenToBitmapL(const TDesC& aHashIndex)
+	{
+	CFbsBitmap *bitmap = new(ELeave)CFbsBitmap();
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Create(iBitmapDevice->SizeInPixels(), iBitmapDevice->DisplayMode()));
+	TRect rect = TRect(iBitmapDevice->SizeInPixels());
+	CFbsBitmapDevice *device=CFbsBitmapDevice::NewL(bitmap);
+	CleanupStack::PushL(device);
+	CFbsBitGc *gc;
+	User::LeaveIfError(device->CreateContext(gc));
+	gc->BitBlt(TPoint(), iBitmap, rect);
+	TFileName mbmFile;
+	mbmFile.Format(iPath->Des(), &aHashIndex);
+	bitmap->Save(mbmFile);
+	delete gc;
+	CleanupStack::PopAndDestroy(2);
+	}
+
+/* 
+Auxilary function used to change the referenced member data (ownership is not transferred)
+*/
+EXPORT_C void CTHashReferenceImages::SetScreenDeviceAndBitmap(CBitmapDevice* aBitmapDevice, CFbsBitmap* aBitmap, CFbsBitGc* aGc )
+	{
+	iBitmapDevice = aBitmapDevice;
+	iBitmap = aBitmap;
+	iGc = aGc;
+	}