diff -r 000000000000 -r 5d03bc08d59c graphicstest/graphicstestharness/src/thashreferenceimages.cpp --- /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 +#include +#include +#include + +_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 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 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 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; + }