fbs/fontandbitmapserver/tfbs/trfile.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/trfile.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,584 @@
+// 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)