fbs/fontandbitmapserver/tfbs/trfile.cpp
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// 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:
//

#include <f32file.h>
#include <fbs.h>
#include <bitdev.h>
#include <bitstd.h>
#include <graphics/gdi/gdiconsts.h>
#include "../sfbs/UTILS.H"
#include "trfile.h"
#include "fbsmessage.h"
#include "fbsdefs.h"

// Define FBSTEST_SCREENSHOT to save the screen to a .mbm file
//#define FBSTEST_SCREENSHOT

const TInt KNumBitmap = 3;
const TDisplayMode KDisplayMode = EColor64K;
const TSize KLargeSize(128,128);
const TSize KMidSize(64,64);
const TSize KSmallSize(32,32);


_LIT(KRamFile1,"c:\\rf1.mbm");
_LIT(KRamFile2,"c:\\rf2.mbm");
_LIT(KRamFile3,"c:\\rf3.mbm");
_LIT(KRamFile4,"c:\\rf123.mbm");
_LIT(KRomFile1,"z:\\system\\data\\rf1.mbm");
_LIT(KRomFile2,"z:\\system\\data\\rf2.mbm");
_LIT(KRomFile3,"z:\\system\\data\\rf3.mbm");
_LIT(KRomFile4,"z:\\system\\data\\rf123.mbm");


CTFile::CTFile(CTestStep* aStep):
	CTGraphicsBase(aStep),
	iFbs(NULL),
	iSource(KNumBitmap)
	{
	}

CTFile::~CTFile()
	{
	CleanUp();
	if (iShutdownFbs)
		iFbs->SendCommand(EFbsMessShutdown);
	iFbs->Disconnect();
	}
	

void CTFile::ConstructL()
	{
	if(RFbsSession::Connect()==KErrNone)
		{
		RFbsSession::Disconnect();
		iShutdownFbs = EFalse;
		}
	else
		{
		FbsStartup();
		iShutdownFbs = ETrue;
		}

	TInt ret = RFbsSession::Connect();
	TEST(ret==KErrNone);
	iFbs = RFbsSession::GetSession();
	TEST(iFbs != NULL);

	ret = iFs.Connect();
	TEST(ret==KErrNone);
	// required to allow file handle to be adopted by another process
	iFs.ShareProtected();
	
	TUint32* romAddress = NULL;
	if(!CFbsBitmap::IsFileInRom(KRomFile1, romAddress)) //any ROM bitmap
		{
		INFO_PRINTF2(_L("Skipping ROM bitmap tests since file \"%S\" is reported to not be a ROM bitmap."),
				&KRomFile1);
		INFO_PRINTF1(_L("This should only occur on non-XIP ROMs, e.g. NAND ROMs, where ROM bitmaps aren't supported."));
		iSkipRomBitmapTests = ETrue;
		}
	}

void CTFile::CleanUp()
	{
	const TBufC<32> names[KNumBitmap] =
		{
		(const TDesC&)KRamFile1,
		(const TDesC&)KRamFile2,
		(const TDesC&)KRamFile3
		};
	TInt i;
	for (i=0; i<KNumBitmap; ++i)
		{
		delete iSource[i];
		iFs.Delete(names[i]);
		}
	iSource.Close();
	iFs.Delete(KRamFile4);
	iFs.Close();	
	}
	
void CTFile::RunTestCaseL(TInt aCurTestCase)
	{
	((CTFileStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(aCurTestCase)
		{
	case 1:
		((CTFileStep*)iStep)->SetTestStepID(_L("	GRAPHICS-FBSERV-0588"));
		CreateL();
		break;
	case 2:
		((CTFileStep*)iStep)->SetTestStepID(_L("	GRAPHICS-FBSERV-0589"));
		SaveL();
		break;
	case 3:
		((CTFileStep*)iStep)->SetTestStepID(_L("	GRAPHICS-FBSERV-0590"));
		StoreL();
		break;
	case 4:
		((CTFileStep*)iStep)->SetTestStepID(_L("	GRAPHICS-FBSERV-0591"));
		LoadL();
		break;
	case 5:
		((CTFileStep*)iStep)->SetTestStepID(_L("	GRAPHICS-FBSERV-0592"));
		LoadAndCompressL();
		break;
	case 6:
		((CTFileStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
		((CTFileStep*)iStep)->CloseTMSGraphicsStep();
		TestComplete();
		break;
		}
	((CTFileStep*)iStep)->RecordTestResultL();
	}


/**
	Draw union jack
*/
void CTFile::Draw(CFbsBitGc* aGc, const TSize& aSize)
	{
	const TSize thick(aSize.iWidth/4,aSize.iWidth/4);
	const TSize thin(thick.iWidth/2,thick.iWidth/2);
	
	// background
	aGc->SetBrushColor(KRgbBlue);
	aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc->SetPenStyle(CGraphicsContext::ESolidPen);
	aGc->DrawRect(aSize);

	// corner to corner section
	aGc->SetPenColor(KRgbWhite);
	aGc->SetPenSize(thick);
	aGc->DrawLine(TPoint(0,0),TPoint(aSize.iWidth,aSize.iHeight));
	aGc->DrawLine(TPoint(aSize.iWidth,0),TPoint(0,aSize.iHeight));	
	aGc->SetPenColor(KRgbRed);
	aGc->SetPenSize(thin);
	aGc->DrawLine(TPoint(0,0),TPoint(aSize.iWidth,aSize.iHeight));
	aGc->DrawLine(TPoint(aSize.iWidth,0),TPoint(0,aSize.iHeight));	
	
	// cross section
	aGc->SetPenColor(KRgbWhite);
	aGc->SetPenSize(thick);
	aGc->DrawLine(TPoint(aSize.iWidth/2,0),TPoint(aSize.iWidth/2,aSize.iHeight));	
	aGc->DrawLine(TPoint(0,aSize.iHeight/2),TPoint(aSize.iWidth,aSize.iHeight/2));	
	aGc->SetPenColor(KRgbRed);
	aGc->SetPenSize(thin);
	aGc->DrawLine(TPoint(aSize.iWidth/2,0),TPoint(aSize.iWidth/2,aSize.iHeight));	
	aGc->DrawLine(TPoint(0,aSize.iHeight/2),TPoint(aSize.iWidth,aSize.iHeight/2));	
	}

/**

*/	
/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0588

	@SYMTestCaseDesc
	Create various size bitmap for testing (original bitmaps) 
	ie small (<4KB), mid (=4KB) and large (>4KB).
	
	@SYMTestActions	
	
	@SYMTestExpectedResults
	Test should pass
*/
void CTFile::CreateL()
	{
	const TSize sizes[KNumBitmap] = 
		{
		KSmallSize,
		KMidSize,
		KLargeSize
		};
	TInt i;
	for (i=0; i<KNumBitmap; ++i)
		{
		CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
		CleanupStack::PushL(bmp);
		User::LeaveIfError(bmp->Create(sizes[i],KDisplayMode));
		
		CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(bmp);
		CleanupStack::PushL(dev);
		
		CFbsBitGc* gc;
		User::LeaveIfError(dev->CreateContext(gc));
		
		Draw(gc,sizes[i]);
		
		delete gc;
		CleanupStack::PopAndDestroy(dev);
		
		iSource.AppendL(bmp);
		
		CleanupStack::Pop(bmp);
		}
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0589

	@SYMTestCaseDesc
	Save single bitmap to file using an opened file handle
	
	@SYMTestActions
	Save original bitmap to file using file handle (saved bitmap)
	Load saved bitmap using file name and compare against original
	Leave saved bitmap files for next test (Load,LoadAndCompress)
	
	@SYMTestExpectedResults
	Saved bitmap match original bitmap
*/
void CTFile::SaveL()
	{
	const TBufC<32> names[KNumBitmap] =
		{
		(const TDesC&)KRamFile1,
		(const TDesC&)KRamFile2,
		(const TDesC&)KRamFile3
		};
		
	INFO_PRINTF1(_L("Saving bitmap"));		
	TInt i;
	for (i=0; i<KNumBitmap; ++i)
		{
		RFile f;
		TInt mode = EFileWrite;
		TInt ret = f.Open(iFs,names[i],mode);
		if (ret==KErrNotFound)
			ret = f.Create(iFs,names[i],mode);
		TEST(ret==KErrNone);
		
		TEST(iSource[i]->Save(f)==KErrNone);
		f.Close();
		
		CFbsBitmap bmp;
		TEST(bmp.Load(names[i])==KErrNone);
		
		CFbsBitmap* orig = iSource[i];
		TSize size = orig->SizeInPixels();
		TInt bytes = orig->ScanLineLength(size.iWidth,KDisplayMode)*size.iHeight;
		orig->LockHeap();
		bmp.LockHeap();
		TEST(Mem::Compare((TUint8*)orig->DataAddress(),bytes,(TUint8*)bmp.DataAddress(),bytes)==0);
		orig->UnlockHeap();
		bmp.UnlockHeap();
		}
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0590

	@SYMTestCaseDesc
	Save multi bitmaps to file using an opened file handle.
	
	@SYMTestActions
	Save original bitmaps to file (saved bitmaps).
	Load saved bitmaps and compare it against originals.
	
	@SYMTestExpectedResults
	Saved bitmaps match original bitmaps
*/
void CTFile::StoreL()
	{
	const TBufC<32> names[KNumBitmap] =
		{
		(const TDesC&)KRamFile1,
		(const TDesC&)KRamFile2,
		(const TDesC&)KRamFile3
		};
	INFO_PRINTF1(_L("Storing bitmaps"));
	RFile f;
	TInt mode = EFileWrite;
	TInt ret = f.Open(iFs,KRamFile4,mode);
	if (ret==KErrNotFound)
		ret = f.Create(iFs,KRamFile4,mode);
	TEST(ret==KErrNone);
	
	const TDesC* bmps[] = {&names[0],&names[1],&names[2]};
	TInt32 ids[] = {0,0,0};
	TRAP(ret,CFbsBitmap::StoreL(f,KNumBitmap,bmps,ids));
	TEST(ret==KErrNone);
	f.Close();
	
	TInt id;
	for (id=0; id<KNumBitmap; ++id)
		{
		CFbsBitmap bmp;
		TEST(bmp.Load(KRamFile4,id)==KErrNone);
		
		CFbsBitmap* orig = iSource[id];
		TSize size = orig->SizeInPixels();
		TInt bytes = orig->ScanLineLength(size.iWidth,KDisplayMode)*size.iHeight;
		orig->LockHeap();
		bmp.LockHeap();
		TEST(Mem::Compare((TUint8*)orig->DataAddress(),bytes,(TUint8*)bmp.DataAddress(),bytes)==0);
		orig->UnlockHeap();
		bmp.UnlockHeap();
		}
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0591

	@SYMTestCaseDesc
	Load bitmap from file using an opened file handle.
	
	@SYMTestActions
	Load bitmap using file handle.
	Compare loaded bitmaps against original.
	
	@SYMTestExpectedResults
	Loaded bitmap match original
*/
void CTFile::LoadL()
	{
	// Load single bitmap file
	const TBufC<32> names[2*KNumBitmap] =
		{
		(const TDesC&)KRamFile1, //keep ram files at the top to make it easier to skip rom bitmaps
		(const TDesC&)KRamFile2,
		(const TDesC&)KRamFile3,
		(const TDesC&)KRomFile1,
		(const TDesC&)KRomFile2,
		(const TDesC&)KRomFile3
		};
	INFO_PRINTF1(_L("Loading bitmaps"));
	TInt i;
	TInt maxIndex = (iSkipRomBitmapTests ? KNumBitmap - 1 : 2 * KNumBitmap - 1);
	for (i=0; i <= maxIndex; ++i)
		{
		RFile f;
		TInt mode = EFileShareReadersOnly;
		TInt ret = f.Open(iFs,names[i],mode);
		TEST(ret==KErrNone);
		CFbsBitmap bmp;
		TEST(bmp.Load(f)==KErrNone);
		f.Close();
		
		CFbsBitmap* orig = iSource[i%KNumBitmap];
		TSize size = orig->SizeInPixels();
		TInt bytes = orig->ScanLineLength(size.iWidth,KDisplayMode)*size.iHeight;
		orig->LockHeap();
		bmp.LockHeap();
		TEST(Mem::Compare((TUint8*)orig->DataAddress(),bytes,(TUint8*)bmp.DataAddress(),bytes)==0);
		orig->UnlockHeap();
		bmp.UnlockHeap();
		}
		
	// Load multi bitmap file
	const TBufC<32> mbm[] =
		{
		(const TDesC&)KRamFile4, //keep ram files at the top to make it easier to skip rom bitmaps
		(const TDesC&)KRomFile4
		};
	maxIndex = (iSkipRomBitmapTests ? 0 : 1);
	for (i=0; i <= maxIndex; ++i)
		{
		RFile f;
		TInt mode = EFileShareReadersOnly;
		TInt ret = f.Open(iFs,mbm[i],mode);
		TEST(ret==KErrNone);
		TInt id;
		for (id=0; id<KNumBitmap; ++id)
			{
			CFbsBitmap bmp;
			TEST(bmp.Load(f,id)==KErrNone);
			
			CFbsBitmap* orig = iSource[id];
			TSize size = orig->SizeInPixels();
			TInt bytes = orig->ScanLineLength(size.iWidth,KDisplayMode)*size.iHeight;
			orig->LockHeap();
			bmp.LockHeap();
			TEST(Mem::Compare((TUint8*)orig->DataAddress(),bytes,(TUint8*)bmp.DataAddress(),bytes)==0);
			orig->UnlockHeap();
			bmp.UnlockHeap();
			}
		f.Close();
		}
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0592

	@SYMTestCaseDesc
	Load and compress bitmap from file using an opened file handle.
	
	@SYMTestActions
	Compress original bitmap.
	Load and compress bitmap using file handle.
	Blit loaded+compressed bitmaps and compressed original to screen.
	Compare screen area.
	
	@SYMTestExpectedResults
	LoadAndCompress ROM file return KErrAccessDenied.
	Drawn bitmap on screen match.
*/
void CTFile::LoadAndCompressL()
	{
	INFO_PRINTF1(_L("Loading and compressing bitmaps"));

	RFile f;
	TInt ret = KErrNone;
	if(!iSkipRomBitmapTests)
		{
		// load and compress ROM file
		ret = f.Open(iFs,KRomFile1,EFileShareReadersOnly);
		TEST(ret==KErrNone);
		CFbsBitmap bmp;
		TEST(bmp.LoadAndCompress(f)==KErrAccessDenied);
		f.Close();
		}

	// load single bitmap file
	const TBufC<32> names[KNumBitmap] =
		{
		(const TDesC&)KRamFile1,
		(const TDesC&)KRamFile2,
		(const TDesC&)KRamFile3
		};
	TInt i;
	for (i=0; i<KNumBitmap; ++i)
		{
		ret = f.Open(iFs,names[i],EFileShareReadersOnly);
		TEST(ret==KErrNone);
		CFbsBitmap bmp;
		TEST(bmp.LoadAndCompress(f)==KErrNone);
		f.Close();
		TEST(bmp.IsCompressedInRAM());
		
		CFbsBitmap* orig = iSource[i];
		TEST(orig->Compress()==KErrNone);
		TEST(orig->IsCompressedInRAM());

		TRAP(ret,BlitAndCompareL(orig,&bmp,orig->SizeInPixels()));
		TEST(ret==KErrNone);
		}
	// Load multi bitmap KRamFile4
	ret = f.Open(iFs,KRamFile4,EFileShareReadersOnly);
	TEST(ret==KErrNone);
	TInt id;
	for (id=0; id<KNumBitmap; ++id)
		{
		CFbsBitmap bmp;
		TEST(bmp.LoadAndCompress(f,id)==KErrNone);
		TEST(bmp.IsCompressedInRAM());
		
		CFbsBitmap* orig = iSource[id];
		TEST(orig->Compress()==KErrNone);
		TEST(orig->IsCompressedInRAM());

		TRAP(ret,BlitAndCompareL(orig,&bmp,orig->SizeInPixels()));
		TEST(ret==KErrNone);
		}
	f.Close();
	}

/**
	Blit two bitmap to screen device and compare if both match
*/
void CTFile::BlitAndCompareL(CFbsBitmap* aBmpOrig,CFbsBitmap* aBmpTest,const TSize& aBmpSize)
	{
	CFbsScreenDevice* scd=NULL;
	TRAPD(err,scd=CFbsScreenDevice::NewL(KDefaultScreenNo,KDisplayMode));
	if (err!=KErrNone)
		{
		_LIT(KLog,"Failed to create screen device for mode %S  err=%d");
		INFO_PRINTF3(KLog,&ColorModeName(KDisplayMode),err);
		}
	if (err==KErrNotSupported)
		{
		TRAPD(err,scd=CFbsScreenDevice::NewL(KDefaultScreenNo,EColor256));
		if (err!=KErrNone)
			{
			_LIT(KLog,"Failed to create Color256 screen device  err=%d");
			INFO_PRINTF2(KLog,err);
			}
		}
	if (err==KErrNotSupported)
		{
		TRAPD(err,scd=CFbsScreenDevice::NewL(KDefaultScreenNo,EColor16MA));
		if (err!=KErrNone)
			{
			_LIT(KLog,"Failed to create Color16MA screen device  err=%d");
			INFO_PRINTF2(KLog,err);
			}
		}
	if (err==KErrNotSupported)
		{
		TRAPD(err,scd=CFbsScreenDevice::NewL(KDefaultScreenNo,EColor16MAP));
		if (err!=KErrNone)
			{
			_LIT(KLog,"Failed to create Color16MA screen device  err=%d");
			INFO_PRINTF2(KLog,err);
			}
		}
	_LIT(KLog,"Create screen device with mode %S");
	INFO_PRINTF2(KLog,&ColorModeName(scd->DisplayMode()));
	CleanupStack::PushL(scd);
	scd->ChangeScreenDevice(NULL);
	CFbsBitGc* sgc;
	User::LeaveIfError(scd->CreateContext((CGraphicsContext*&)sgc)); 
	CleanupStack::PushL(sgc);

	TSize scrSize = scd->SizeInPixels();
	TPoint left(0,0);
	TPoint right(scrSize.iWidth/2,0);
	TRect bmpRect(TPoint(0,0),aBmpSize);

	// if bitmap width is greater than half screen width,
	// try positioning right bitmap below original.
	if (scrSize.iWidth < aBmpSize.iWidth*2)
		{
		if (scrSize.iHeight < aBmpSize.iHeight/2)
			{
			//That still doesn't work out, so restrict size of rect
			// being blitted to half screen size.
			INFO_PRINTF1(_L("Warning: the whole of the test images may not be compared"));
			bmpRect = TRect(TPoint(0,0),TSize(scrSize.iWidth/2,aBmpSize.iHeight));
			}
		else
			{
			right = TPoint(0, scrSize.iHeight/2);
			}
		}
	
	sgc->BitBlt(left, aBmpOrig, bmpRect);
	sgc->BitBlt(right, aBmpTest, bmpRect);
	scd->Update();
	
#ifdef FBSTEST_SCREENSHOT
	SaveScreenShotL(scd);
#endif //FBSTEST_SCREENSHOT
	
	TBool match=scd->RectCompare(TRect(left,bmpRect.Size()),*scd,TRect(right,bmpRect.Size()));
	if (!match)
		{
		_LIT(KLog,"Two areas of the screen don't match");
		INFO_PRINTF1(KLog);
		}
	TEST(match);

	CleanupStack::PopAndDestroy(2,scd);
	}

//--------------
__CONSTRUCT_STEP__(File)