fbs/fontandbitmapserver/tfbs/TBITMAP.CPP
changeset 0 5d03bc08d59c
child 11 fed1595b188e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/TBITMAP.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,5672 @@
+// Copyright (c) 1996-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 <e32math.h>
+#include <s32file.h>
+#include <bautils.h>
+#include <hal.h>
+#include <test/tefunit.h>
+#include <graphics/bitmapuid.h>
+#include "../sfbs/UTILS.H"
+#include "TBitmap.h"
+#include "../sfbs/fbsbitmapasyncstreamer.h"
+#include "fbsmessage.h"
+
+// Symbian modification to help reduce unnecessary warnings 
+#if (__ARMCC_VERSION >= 310000)
+//turn off Warning:  #546-D: transfer of control bypasses initialization of variable, which is unnecessary.
+#pragma diag_suppress 546
+#endif
+// End of Symbian modification
+
+
+
+//
+//
+//Globals
+//LOCAL_D RTest	TheTest(_L("Test Bitmap"));
+LOCAL_D RFs		TheFs;
+const TUint8	KCheckValue = 0x69;//pixel value used in the tests
+
+_LIT(KBmpCompr12, "z:\\system\\data\\compr12.mbm");
+_LIT(KBmpCompr16, "z:\\system\\data\\compr16.mbm");
+_LIT(KBmpCompr24, "z:\\system\\data\\compr24.mbm");
+_LIT(KBmpZCompr12, "z:\\system\\data\\racompr12.mbm");
+_LIT(KBmpZCompr16, "z:\\system\\data\\racompr16.mbm");
+_LIT(KBmpZCompr24, "z:\\system\\data\\racompr24.mbm");
+_LIT(KBmpCCompr12, "c:\\racompr12.mbm");
+_LIT(KBmpCCompr16, "c:\\racompr16.mbm");
+_LIT(KBmpCCompr24, "c:\\racompr24.mbm");
+
+_LIT(KRc_RamInRom8, "z:\\system\\data\\rc_ram8.mbm");
+_LIT(KRc_RamInRom12, "z:\\system\\data\\rc_ram12.mbm");
+_LIT(KRc_RamInRom16, "z:\\system\\data\\rc_ram16.mbm");
+_LIT(KRc_RamInRom24, "z:\\system\\data\\rc_ram24.mbm");
+
+_LIT(KRc_Ram8, "c:\\rc_ram8.mbm");
+_LIT(KRc_Ram12, "c:\\rc_ram12.mbm");
+_LIT(KRc_Ram16, "c:\\rc_ram16.mbm");
+_LIT(KRc_Ram24, "c:\\rc_ram24.mbm");
+
+_LIT(KRamBitmapOnZ, "z:\\system\\data\\16RAM2.mbm");
+_LIT(KRamBitmap, "c:\\16RAM2.mbm");
+_LIT(KRamBitmap2, "c:\\16RAM3.mbm");
+
+_LIT(KMono_RamInRom_M1, "z:\\system\\data\\mono_m1.mbm");
+_LIT(KMono_RamInRom_M2, "z:\\system\\data\\mono_m2.mbm");
+_LIT(KMono_RamInRom_M4, "z:\\system\\data\\mono_m4.mbm");
+_LIT(KMono_RamInRom_M8, "z:\\system\\data\\mono_m8.mbm");
+_LIT(KMono_RamInRom_C4, "z:\\system\\data\\mono_c4.mbm");
+_LIT(KMono_RamInRom_C8, "z:\\system\\data\\mono_c8.mbm");
+_LIT(KMono_RamInRom_C12, "z:\\system\\data\\mono_c12.mbm");
+_LIT(KMono_RamInRom_C16, "z:\\system\\data\\mono_c16.mbm");
+_LIT(KMono_RamInRom_C24, "z:\\system\\data\\mono_c24.mbm");
+_LIT(KMono_RamInRom_C32, "z:\\system\\data\\mono_c32.mbm");
+
+_LIT(KMono_M1, "c:\\mono_m1.mbm");
+_LIT(KMono_M2, "c:\\mono_m2.mbm");
+_LIT(KMono_M4, "c:\\mono_m4.mbm");
+_LIT(KMono_M8, "c:\\mono_m8.mbm");
+_LIT(KMono_C4, "c:\\mono_c4.mbm");
+_LIT(KMono_C8, "c:\\mono_c8.mbm");
+_LIT(KMono_C12, "c:\\mono_c12.mbm");
+_LIT(KMono_C16, "c:\\mono_c16.mbm");
+_LIT(KMono_C24, "c:\\mono_c24.mbm");
+_LIT(KMono_C32, "c:\\mono_c32.mbm");
+
+_LIT(KRomBitmap,"z:\\system\\data\\tfbs.rbm");
+
+//
+//
+//Create/Destroy test environment global functions
+
+//Delete "aFullName" file.
+LOCAL_C void DeleteDataFile(const TDesC& aFullName)
+	{
+	RFs fsSession;
+	TInt err = fsSession.Connect();
+	if(err == KErrNone)
+		{
+		TEntry entry;
+		if(fsSession.Entry(aFullName, entry) == KErrNone)
+			{
+			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
+			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
+			if(err != KErrNone) 
+				{
+				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
+				}
+			err = fsSession.Delete(aFullName);
+			if(err != KErrNone) 
+				{
+				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
+				}
+			}
+		fsSession.Close();
+		}
+	else
+		{
+		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
+		}
+	}
+
+//Copy test bitmaps from Z: to C: drive. RFs::Connect() had to be called already 
+//on "TheFs" object.
+LOCAL_C void CopyFilesOnC()
+	{
+	BaflUtils::CopyFile(TheFs, KTestBitmapOnZ, KTestBitmapOnC);
+	BaflUtils::CopyFile(TheFs, KBmpZCompr12, KBmpCCompr12);
+	BaflUtils::CopyFile(TheFs, KBmpZCompr16, KBmpCCompr16);
+	BaflUtils::CopyFile(TheFs, KBmpZCompr24, KBmpCCompr24);
+	BaflUtils::CopyFile(TheFs, KRc_RamInRom8, KRc_Ram8);
+	BaflUtils::CopyFile(TheFs, KRc_RamInRom12, KRc_Ram12);
+	BaflUtils::CopyFile(TheFs, KRc_RamInRom16, KRc_Ram16);
+	BaflUtils::CopyFile(TheFs, KRc_RamInRom24, KRc_Ram24);
+	BaflUtils::CopyFile(TheFs, KRamBitmapOnZ, KRamBitmap);
+	BaflUtils::CopyFile(TheFs, KRamBitmapOnZ, KRamBitmap2);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_M1, KMono_M1);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_M2, KMono_M2);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_M4, KMono_M4);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_M8, KMono_M8);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C4, KMono_C4);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C8, KMono_C8);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C12, KMono_C12);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C16, KMono_C16);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C24, KMono_C24);
+	BaflUtils::CopyFile(TheFs, KMono_RamInRom_C32, KMono_C32);
+	}
+
+//Delete data files used by the test
+LOCAL_C void DeleteFilesFromC()
+	{
+	DeleteDataFile(KTestBitmapOnC);
+	DeleteDataFile(KBmpCCompr12);
+	DeleteDataFile(KBmpCCompr16);
+	DeleteDataFile(KBmpCCompr24);
+	DeleteDataFile(KRc_Ram8);
+	DeleteDataFile(KRc_Ram12);
+	DeleteDataFile(KRc_Ram16);
+	DeleteDataFile(KRc_Ram24);
+	DeleteDataFile(KRamBitmap);
+	DeleteDataFile(KRamBitmap2);
+	DeleteDataFile(KMono_M1);
+	DeleteDataFile(KMono_M2);
+	DeleteDataFile(KMono_M4);
+	DeleteDataFile(KMono_M8);
+	DeleteDataFile(KMono_C4);
+	DeleteDataFile(KMono_C8);
+	DeleteDataFile(KMono_C12);
+	DeleteDataFile(KMono_C16);
+	DeleteDataFile(KMono_C24);
+	DeleteDataFile(KMono_C32);
+	}
+
+//
+//
+
+void CTBitmap::DeleteScanLineBuffer()
+	{
+	RFbsSession* fbs = RFbsSession::GetSession();
+	delete fbs->iScanLineBuffer;
+	fbs->iScanLineBuffer = NULL;
+	}
+
+CTBitmap::CTBitmap(CTestStep* aStep):
+	CTGraphicsBase(aStep),
+	iBmpHandler(NULL),
+	iBitmap(NULL),
+	iAs(NULL)
+	{
+	__ASSERT_DEBUG(CActiveScheduler::Current(), User::Invariant());
+	CFbsBitmap bmp;
+	iTestBitmapName = KTestBitmapOnZ;
+	TInt ret=bmp.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+	bmp.Reset();
+
+	ret = iFs.Connect();
+	TEST2(ret, KErrNone);
+
+	// Expand session scanline buffer cache to avoid spurious alloc heavens later on
+	const TInt bufferSize = 1024;
+
+	ret = bmp.Create(TSize(bufferSize,1),EColor256);
+	TEST2(ret, KErrNone);
+
+	ret = bmp.Compress();
+	TEST2(ret, KErrNone);
+
+	TUint8* buffer = new TUint8[bufferSize];
+	TEST(buffer != NULL);
+
+	TPtr8 scanline(buffer,bufferSize,bufferSize);
+	bmp.GetScanLine(scanline,TPoint(0,0),bufferSize,EColor256);
+	delete [] buffer;
+	bmp.Reset();
+	
+	TUint32* romAddress = NULL;
+	if(!CFbsBitmap::IsFileInRom(KRomBitmap, romAddress)) //any ROM bitmap
+		{
+		INFO_PRINTF2(_L("Skipping ROM bitmap tests since file \"%S\" is reported to not be a ROM bitmap."),
+				&KRomBitmap);
+		INFO_PRINTF1(_L("This should only occur on non-XIP ROMs, e.g. NAND ROMs, where ROM bitmaps aren't supported."));
+		iSkipRomBitmapTests = ETrue;
+		}
+	}
+
+CTBitmap::~CTBitmap()
+	{
+	iFs.Close();
+	}
+
+void CTBitmap::RunTestCaseL(TInt aCurTestCase)
+    {
+    ((CTBitmapStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	case 1:		
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0550"));
+		TwoComprLines();
+		break;
+	case 2:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0517"));
+	// they are fast hence at the beginning
+		CheckScanlineL();
+		break;
+	case 3:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0534"));
+		Compress();
+		break;
+	case 4:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0518"));
+		StreamBitmap();
+		break;
+	case 5:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0519"));
+		StreamRectangle();
+		break;
+	case 6:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0523"));
+		LoadInSegments();
+		break;
+	case 7:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0524"));
+		SaveInSegments();
+		break;
+	case 8:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0525"));
+		MonoDetect();
+		break;
+	case 9:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0526"));
+		ChunkPileL();
+		break;
+	case 10:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0527"));
+		LargeBitmaps();
+		break;
+	case 12:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0528"));
+		HugeBitmaps();
+		break;
+	case 13:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0529"));
+		Resize();
+		break;
+	case 14:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0520"));
+		GetScanline();
+		break;
+	case 15:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0521"));
+		SetScanline();
+		break;
+	case 16:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0522"));
+		StretchScanline();
+		break;
+	case 17:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0530"));
+		BitmapUtil();
+		break;
+	case 18:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0531"));
+		InvalidBitmap();
+		break;
+	case 19:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L(" GRAPHICS-FBSERV-0533"));
+		SaveAndLoadFast();
+		break;
+	case 20:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0532"));
+		SaveAndLoad();
+		break;
+	case 21:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0535"));
+		Color256BitmapUtil();
+		break;
+	case 22:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0536"));
+		HardwareBitmaps();
+		break;
+	case 23:
+		((CTBitmapStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+	//	BitmapTiming(); 
+		break;
+	case 24:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0537"));
+		INC036062L();
+		break;
+	case 25:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0538"));
+		PerformanceTest_INC036062L();
+		break;
+	case 26:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0539"));
+		INC037474L();
+		break;
+	case 27:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0540"));
+		DEF038286L();
+		break;
+	case 28:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0541"));
+		DEF038286_2L();
+		break;
+	case 29:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0542"));
+		MonohromeL();
+		break;
+	case 30:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0543"));
+		GetVerticalScanLineL();
+		break;
+	case 31:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0544"));
+		GetVerticalScanLinePerformanceL();
+		break;
+	case 32:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0545"));
+		DEF071843_16MAL();
+		((CTBitmapStep*)iStep)->RecordTestResultL();
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0546"));	
+		DEF071843_16MUL();
+		((CTBitmapStep*)iStep)->RecordTestResultL();
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0547"));
+		DEF071843_16ML();
+#ifdef _DEBUG
+		((CTBitmapStep*)iStep)->RecordTestResultL();
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0549"));
+		//It uses Heap Allocation failure macro 
+		//which is supported only for debug mode	
+		DEF095361_16MAL();
+#endif		
+		break;
+	case 33:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0548"));
+		DEF074623_16MAL();
+		break;
+	case 34:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0551"));
+		TestPaletteCompressionL();
+		break;
+	case 35:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0552"));
+		TestSynchronousBackgroundPaletteCompressionL();
+		break;
+	case 36:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0553"));
+		TestAsynchronousBackgroundPaletteCompressionL();
+		break;
+	case 37:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0501"));
+		GetAllBitmapsIdsL();
+		break;
+	case 38:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0554"));
+		CheckBadBmp();
+		break; 
+	case 39:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0516"));
+		CheckSetDisplayModeL();
+		break; 	
+	case 40:
+/**
+	@SYMTestCaseID GRAPHICS-FBSERV-0619
+*/
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0619"));
+		MultiThreadedTestsL();
+		break;
+	case 41:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0612"));
+		TestBgCompressL();
+		break;
+	case 42:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0613"));
+		TestBgCompressInUseL();
+		break;
+	case 43:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0614"));
+		TestDisconnectWithBitmapL();
+		break;
+	case 44:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0617"));
+		TestTouchedAndVolatileL();
+		break;
+	case 45:
+		((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0618"));
+		TestBitmapWhiteFillL();
+		break;
+	case 46:
+		((CTBitmapStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTBitmapStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+	default:
+		((CTBitmapStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		break;
+		}
+		
+	((CTBitmapStep*)iStep)->RecordTestResultL();
+    }
+   
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0516
+
+	@SYMTestCaseDesc
+	Checks that the display mode can be set 
+	to various modes, including EColor16MAP
+	
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/  
+void CTBitmap::CheckSetDisplayModeL()
+	{
+	INFO_PRINTF1(_L("Check SetDisplayMode EColor16MAP"));
+
+	CFbsBitmap bmp;
+	User::LeaveIfError(bmp.Create(TSize(4,4),EColor16MA));
+	TInt ret=bmp.SetDisplayMode(EColor16MAP);
+	TEST(ret==KErrNone);
+	bmp.Reset();
+
+	User::LeaveIfError(bmp.Create(TSize(4,4),EColor16MU));
+	ret=bmp.SetDisplayMode(EColor16MAP);
+	TEST(ret==KErrNone);
+	bmp.Reset();
+
+	User::LeaveIfError(bmp.Create(TSize(4,4),EColor64K));
+	ret=bmp.SetDisplayMode(EColor16MAP);
+	TEST(ret==KErrArgument);
+	bmp.Reset();
+
+	User::LeaveIfError(bmp.Create(TSize(4,4),EColor16MAP));
+	ret=bmp.SetDisplayMode(EColor16MAP);
+	TEST(ret==KErrNone);
+
+	ret=bmp.SetDisplayMode(EColor16MU);
+	TEST(ret==KErrNone);
+	bmp.Reset();
+	
+	}    
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0517
+
+	@SYMTestCaseDesc
+	Compares a pixel retrieved with GetPixel and GetScanLine
+
+	@SYMTestActions
+	Zero fills a buffer which has an uneven length of bytes and
+	gets a pixel from a point which should coincide with
+	that of a point retrieved with scan line
+		
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::CheckScanlineL()
+	{
+	INFO_PRINTF1(_L("Scanline sanity check"));
+
+	CFbsBitmap bmp;
+	User::LeaveIfError(bmp.Create(TSize(32,1),EGray2));
+
+	// try using a buffer that isn't a whole number of words long. 
+	TUint8 buffer[3];
+	Mem::FillZ(buffer,3);
+	TPtr8 scanline(buffer,3,3);
+	bmp.GetScanLine(scanline,TPoint(0,0),24,EGray2);
+
+	TRgb pixel(KRgbRed);
+	bmp.GetPixel(pixel,TPoint(0,0));
+
+	// getscanline and getpixel should agree
+	TEST(TRgb::Gray2(buffer[0] & 0x01) == pixel);
+
+	bmp.Reset();
+
+	
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0518
+
+	@SYMTestCaseDesc
+	Streams different bitmap size of different colour depth.
+
+	@SYMTestActions
+
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::StreamBitmap()
+	{
+	INFO_PRINTF1(_L("Test Bitmap Streaming"));
+
+	DoStreamBitmapSizes(EGray2);
+	DoStreamBitmapSizes(EGray4);
+	DoStreamBitmapSizes(EGray16);
+	DoStreamBitmapSizes(EGray256);
+	DoStreamBitmapSizes(EColor16);
+	DoStreamBitmapSizes(EColor256);
+	DoStreamBitmapSizes(EColor4K);
+	DoStreamBitmapSizes(EColor64K);
+	DoStreamBitmapSizes(EColor16M);
+	DoStreamBitmapSizes(EColor16MU);
+	DoStreamBitmapSizes(EColor16MAP);
+	}
+
+void CTBitmap::DoStreamBitmapSizes(TDisplayMode aDispMode)
+	{
+	const TSize smallStreamBitmapSize(32,10);
+	const TSize largeStreamBitmapSize(256,256);
+	const TSize oddStreamBitmapSize(31,2);
+
+	DoStreamBitmap(smallStreamBitmapSize,aDispMode,ETrue);
+	DoStreamBitmap(smallStreamBitmapSize,aDispMode,EFalse);
+	DoStreamBitmap(largeStreamBitmapSize,aDispMode,ETrue);
+	DoStreamBitmap(largeStreamBitmapSize,aDispMode,EFalse);
+	DoStreamBitmap(oddStreamBitmapSize,aDispMode,ETrue);
+	DoStreamBitmap(oddStreamBitmapSize,aDispMode,EFalse);
+	}
+
+void CTBitmap::DoStreamBitmap(const TSize& aSize,TDisplayMode aDispMode,TBool aBlank)
+	{
+	__UHEAP_MARK;
+
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+
+	if (aBlank)
+		BlankBitmap(bmp);
+	else
+		FillBitmap(bmp);
+
+	CDirectFileStore* writestore=NULL;
+
+	TRAP(ret,writestore=CDirectFileStore::ReplaceL(iFs,KTempFilename,EFileStream|EFileWrite));
+	TEST2(ret, KErrNone);
+
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+
+	TRAP(ret,writestore->SetTypeL(uidtype));
+	TEST2(ret, KErrNone);
+
+	RStoreWriteStream writestrm;
+	TStreamId headerid(0);
+
+	TRAP(ret,headerid=writestrm.CreateL(*writestore));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,writestore->SetRootL(headerid));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,bmp.ExternalizeL(writestrm));
+	TEST2(ret, KErrNone);
+
+	writestrm.Close();
+	delete writestore;
+
+	CFbsBitmapEx bmpst;
+	CDirectFileStore* readstore=NULL;
+
+	TRAP(ret,readstore=CDirectFileStore::OpenL(iFs,KTempFilename,EFileStream|EFileRead));
+	TEST2(ret, KErrNone);
+
+	RStoreReadStream readstrm;
+	headerid=readstore->Root();
+
+	TRAP(ret,readstrm.OpenL(*readstore,headerid));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,bmpst.InternalizeL(readstrm));
+	TEST2(ret, KErrNone);
+
+	readstrm.Close();
+	delete readstore;
+
+	CompareBitmaps(bmp,bmpst,EColor16M);
+
+	iFs.Delete(KTempFilename);
+	bmp.Reset();
+	bmpst.Reset();
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0519
+
+	@SYMTestCaseDesc
+	Streams bitmap rectangles of different colour depth
+	to file store and reads them back again.
+
+	@SYMTestActions
+	Bitmap rectangles are externalized to file store and
+	read back again. ScanLine is used and compared to GetPixel
+	from the bitmap read back from file store.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::StreamRectangle()
+	{
+	INFO_PRINTF1(_L("Test Rectangle Streaming"));
+
+	DoStreamRectangle(EGray2,ETrue);
+	DoStreamRectangle(EGray2,EFalse);
+	DoStreamRectangle(EGray4,ETrue);
+	DoStreamRectangle(EGray4,EFalse);
+	DoStreamRectangle(EGray16,ETrue);
+	DoStreamRectangle(EGray16,EFalse);
+	DoStreamRectangle(EGray256,ETrue);
+	DoStreamRectangle(EGray256,EFalse);
+	DoStreamRectangle(EColor16,ETrue);
+	DoStreamRectangle(EColor16,EFalse);
+	DoStreamRectangle(EColor256,ETrue);
+	DoStreamRectangle(EColor256,EFalse);
+	DoStreamRectangle(EColor4K,ETrue);
+	DoStreamRectangle(EColor4K,EFalse);
+	DoStreamRectangle(EColor64K,ETrue);
+	DoStreamRectangle(EColor64K,EFalse);
+	DoStreamRectangle(EColor16M,ETrue);
+	DoStreamRectangle(EColor16M,EFalse);
+	DoStreamRectangle(EColor16MU,ETrue);
+	DoStreamRectangle(EColor16MU,EFalse);
+	DoStreamRectangle(EColor16MAP,ETrue);
+	DoStreamRectangle(EColor16MAP,EFalse);
+	}
+
+void CTBitmap::DoStreamRectangle(TDisplayMode aDispMode,TBool aBlank)
+	{
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(TSize(160,80),aDispMode);
+	TEST2(ret, KErrNone);
+
+	if (aBlank)
+		BlankBitmap(bmp);
+	else
+		FillBitmap(bmp);
+
+	CDirectFileStore* writestore=NULL;
+	TRAP(ret,writestore=CDirectFileStore::ReplaceL(iFs,KTempFilename,EFileStream|EFileWrite));
+	TEST2(ret, KErrNone);
+
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+	TRAP(ret,writestore->SetTypeL(uidtype));
+	TEST2(ret, KErrNone);
+
+	RStoreWriteStream writestrm;
+	TStreamId headerid(0);
+	TRAP(ret,headerid=writestrm.CreateL(*writestore));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,writestore->SetRootL(headerid));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,bmp.ExternalizeRectangleL(writestrm,TRect(40,20,120,60)));
+	TEST2(ret, KErrNone);
+
+	writestrm.Close();
+	delete writestore;
+
+	CFbsBitmapEx bmpst;
+	CDirectFileStore* readstore=NULL;
+	TRAP(ret,readstore=CDirectFileStore::OpenL(iFs,KTempFilename,EFileStream|EFileRead));
+	TEST2(ret, KErrNone);
+
+	RStoreReadStream readstrm;
+	headerid=readstore->Root();
+	TRAP(ret,readstrm.OpenL(*readstore,headerid));
+	TEST2(ret, KErrNone);
+
+	TRAP(ret,bmpst.InternalizeL(readstrm));
+	TEST2(ret, KErrNone);
+
+	readstrm.Close();
+	delete readstore;
+
+	TInt scanLineLength = CFbsBitmap::ScanLineLength(80,aDispMode);
+	TUint8* buffer = new TUint8[scanLineLength];
+	TUint8* bufferst = new TUint8[scanLineLength];
+	Mem::FillZ(buffer,scanLineLength);
+	Mem::FillZ(bufferst,scanLineLength);
+	TPtr8 scanline(buffer,scanLineLength,scanLineLength);
+	TPtr8 scanlinest(bufferst,scanLineLength,scanLineLength);
+
+	for(TInt yy=0;yy<40;yy++)
+		{
+		bmp.GetScanLine(scanline,TPoint(40,yy+20),80,aDispMode);
+		bmpst.GetScanLine(scanlinest,TPoint(0,yy),80,aDispMode);
+		
+		if(aDispMode != EColor16MU)
+			{
+			TInt memRet = Mem::Compare(buffer,scanLineLength,bufferst,scanLineLength);
+			TEST(memRet == 0);
+			}
+		else
+			{
+			TInt pixelsToCompare = scanLineLength / 4;
+			TUint8* bufferCur = buffer;
+			TUint8* bufferstCur = bufferst;
+			
+			//top byte is unused, and would be more accurate to ignore it
+			for(TInt ii = 0; ii < pixelsToCompare; ii++)
+				{
+				TInt memRet = Mem::Compare(bufferCur,3,bufferstCur,3);
+				TEST(memRet == 0);
+				bufferCur += 4;
+				bufferstCur += 4;
+				}
+			}	
+		}
+	delete [] bufferst;
+	delete [] buffer;
+
+	iFs.Delete(KTempFilename);
+	bmp.Reset();
+	bmpst.Reset();
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0520
+
+	@SYMTestCaseDesc
+	Calls GetScanLine for different screen modes with
+	the bitmap compressed and uncompressed and checks
+	if the pixels are correct.
+
+	@SYMTestActions
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::GetScanline()
+	{
+	INFO_PRINTF1(_L("Test GetScanline"));
+
+	const TSize size1(257,5);
+	const TSize size2(33,17);
+
+	INFO_PRINTF1(_L("EGray2"));
+	DoGetScanline(size1,EGray2);
+	DoGetScanline(size2,EGray2);
+	DoGetScanlineAlt(EGray2);
+
+	INFO_PRINTF1(_L(" EGray4"));
+	DoGetScanline(size1,EGray4);
+	DoGetScanline(size2,EGray4);
+	DoGetScanlineAlt(EGray4);
+
+	INFO_PRINTF1(_L(" EGray16"));
+	DoGetScanline(size1,EGray16);
+	DoGetScanline(size2,EGray16);
+	DoGetScanlineAlt(EGray16);
+
+	INFO_PRINTF1(_L(" EGray256"));
+	DoGetScanline(size1,EGray256);
+	DoGetScanline(size2,EGray256);
+	DoGetScanlineAlt(EGray256);
+
+	INFO_PRINTF1(_L(" EColor16"));
+	DoGetScanline(size1,EColor16);
+	DoGetScanline(size2,EColor16);
+	DoGetScanlineAlt(EColor16);
+
+	INFO_PRINTF1(_L(" EColor256"));
+	DoGetScanline(size1,EColor256);
+	DoGetScanline(size2,EColor256);
+	DoGetScanlineAlt(EColor256);
+
+	INFO_PRINTF1(_L(" EColor4K"));
+	DoGetScanline(size1,EColor4K);
+	DoGetScanline(size2,EColor4K);
+	DoGetScanlineAlt(EColor4K);
+
+	INFO_PRINTF1(_L(" EColor64K"));
+	DoGetScanline(size1,EColor64K);
+	DoGetScanline(size2,EColor64K);
+	DoGetScanlineAlt(EColor64K);
+
+	INFO_PRINTF1(_L(" EColor16M"));
+	DoGetScanline(size1,EColor16M);
+	DoGetScanline(size2,EColor16M);
+	DoGetScanlineAlt(EColor16M);
+
+	INFO_PRINTF1(_L(" EColor16MA"));
+	DoGetScanline(size1,EColor16MA);
+	DoGetScanline(size2,EColor16MA);
+	DoGetScanlineAlt(EColor16MA);
+
+	INFO_PRINTF1(_L(" EColor16MU"));
+	DoGetScanline(size1,EColor16MU);
+	DoGetScanline(size2,EColor16MU);
+	DoGetScanlineAlt(EColor16MU);
+
+	INFO_PRINTF1(_L(" EColor16MAP"));
+	DoGetScanline(size1,EColor16MAP);
+	DoGetScanline(size2,EColor16MAP);
+	DoGetScanlineAlt(EColor16MAP);
+
+	INFO_PRINTF1(_L("\n"));
+	}
+
+void CTBitmap::DoGetScanline(const TSize& aSize,TDisplayMode aDispMode)
+	{
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	FillBitmap(bmp);
+
+	DoGetScanlineCheck1(bmp, bmp, aSize, aDispMode);
+	DoGetScanlineCheck2(bmp, bmp, aSize, aDispMode);
+	DoGetScanlineCheck3(bmp, aDispMode);
+
+	ret = bmp.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+
+	StripeBitmap(bmp);
+	CFbsBitmapEx ref;
+	ret = ref.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+
+	CopyBitmap(ref, bmp);
+	ret = bmp.Compress();
+	TEST2(ret, KErrNone);
+
+	DoGetScanlineCheck1(bmp, ref, aSize, aDispMode);
+
+	ref.Reset();
+	bmp.Reset();
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+	}
+
+void CTBitmap::DoGetScanlineCheck1(CFbsBitmap& aBitmap,CFbsBitmap& aReference,const TSize& aSize,TDisplayMode aDispMode)
+	{
+	TInt byteWidth = CFbsBitmap::ScanLineLength(aSize.iWidth,aDispMode);
+	TUint8* buffer = new TUint8[byteWidth + 1];
+	buffer[byteWidth] = KCheckValue;
+	TPtr8 scanline(buffer,byteWidth,byteWidth);
+
+	for(TInt xStart = 0; xStart <= 33; xStart++)
+		{
+		for (TInt xLength = 1; xLength <= 33; xLength++)
+			{
+			TInt xEnd = xStart + xLength;
+			if (xEnd <= aSize.iWidth)
+				{
+				aBitmap.GetScanLine(scanline,TPoint(xStart,0),xLength,aDispMode);
+				for(TInt xx = xStart; xx < xEnd; xx++)
+					{
+					TRgb color;
+					aReference.GetPixel(color,TPoint(xx,0));
+					TRgb bufferColor = ExtractRgb(buffer,xx - xStart,aDispMode);
+					TEST(bufferColor == color);
+					}
+				}
+			}
+		}
+
+	for(TInt yy = 0; yy < aSize.iHeight; yy++)
+		{
+		aBitmap.GetScanLine(scanline,TPoint(0,yy),aSize.iWidth,aDispMode);
+		for(TInt xx = 0; xx < aSize.iWidth; xx++)
+			{
+			TRgb color;
+			aReference.GetPixel(color,TPoint(xx,yy));
+			TRgb bufferColor = ExtractRgb(buffer,xx,aDispMode);
+			TEST(bufferColor == color);
+			}
+		}
+
+	TEST(buffer[byteWidth] == KCheckValue);
+	delete [] buffer;
+	}
+
+void CTBitmap::DoGetScanlineCheck2(CFbsBitmap& aBitmap,CFbsBitmap& aReference,const TSize& aSize,TDisplayMode aDispMode)
+	{
+	TInt byteHeight = CFbsBitmap::ScanLineLength(aSize.iHeight,ERgb);
+	TUint8* buffer = new TUint8[byteHeight];
+	TPtr8 scanline(buffer,byteHeight,byteHeight);
+
+	TInt xx;
+	for(xx = 0; xx < aSize.iWidth; xx++)
+		{
+		aBitmap.GetVerticalScanLine(scanline,xx,aDispMode);
+		for(TInt yy = 0; yy < aSize.iHeight; yy++)
+			{
+			TRgb color;
+			aReference.GetPixel(color,TPoint(xx,yy));
+			TRgb bufferColor = ExtractRgb(buffer,yy,aDispMode);
+			TEST(bufferColor == color);
+			}
+		}
+
+	for(xx = 0; xx < aSize.iWidth; xx++)
+		{
+		aBitmap.GetVerticalScanLine(scanline,xx,ERgb);
+		for(TInt yy = 0; yy < aSize.iHeight; yy++)
+			{
+			TRgb color;
+			aReference.GetPixel(color,TPoint(xx,yy));
+			TRgb bufferColor = ExtractRgb(buffer,yy,ERgb);
+			TEST(bufferColor == color);
+			}
+		}
+
+	delete [] buffer;
+	}
+
+void CTBitmap::DoGetScanlineCheck3(CFbsBitmap& aBitmap,TDisplayMode aDispMode)
+	{
+	TUint32 wordline=0xffffffff;
+	TPtr8 scanline((TUint8*)&wordline,4,4);
+	aBitmap.Create(TSize(31,1),aDispMode);
+	aBitmap.LockHeap();
+	Mem::Fill(aBitmap.DataAddress(),CFbsBitmap::ScanLineLength(31,aDispMode),0xff);
+	aBitmap.UnlockHeap();
+	aBitmap.SetScanLine(scanline,0);
+	TUint32 expected=0;
+
+	for(TInt zz=1;zz<31;zz++)
+		{
+		expected|=1<<(zz-1);
+		wordline=0;
+		aBitmap.GetScanLine(scanline,TPoint(0,0),zz,EGray2);
+		TUint32 actual=wordline&expected;
+		TEST(actual==expected);
+		}
+	}
+
+/* this function calls CheckScanLine with various screen modes, and with the bitmap
+   compressed, and not compressed
+ */
+void CTBitmap::DoGetScanlineAlt(TDisplayMode aDispMode)
+	{
+	__UHEAP_MARK;
+
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(TSize(256,3),aDispMode);
+	TEST2(ret, KErrNone);
+
+	FillBitmap(bmp);
+
+	CheckScanLine(bmp,bmp,EGray2);
+	CheckScanLine(bmp,bmp,EGray4);
+	CheckScanLine(bmp,bmp,EGray16);
+	CheckScanLine(bmp,bmp,EGray256);
+	CheckScanLine(bmp,bmp,EColor16);
+	CheckScanLine(bmp,bmp,EColor256);
+	CheckScanLine(bmp,bmp,EColor4K);
+	CheckScanLine(bmp,bmp,EColor64K);
+	CheckScanLine(bmp,bmp,EColor16M);
+	CheckScanLine(bmp,bmp,ERgb);
+	CheckScanLine(bmp,bmp,EColor16MU);
+	CheckScanLine(bmp,bmp,EColor16MAP);
+
+	CFbsBitmapEx ref;
+	ret = ref.Create(bmp.SizeInPixels(),aDispMode);
+	TEST2(ret, KErrNone);
+	CopyBitmap(ref,bmp);
+	bmp.Compress();
+
+	CheckScanLine(bmp,ref,EGray2);
+	CheckScanLine(bmp,ref,EGray4);
+	CheckScanLine(bmp,ref,EGray16);
+	CheckScanLine(bmp,ref,EGray256);
+	CheckScanLine(bmp,ref,EColor16);
+	CheckScanLine(bmp,ref,EColor256);
+	CheckScanLine(bmp,ref,EColor4K);
+	CheckScanLine(bmp,ref,EColor64K);
+	CheckScanLine(bmp,ref,EColor16M);
+	CheckScanLine(bmp,ref,ERgb);
+	CheckScanLine(bmp,ref,EColor16MU);
+	CheckScanLine(bmp,ref,EColor16MAP);
+
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+	}
+
+void CTBitmap::CheckScanLine(CFbsBitmapEx& aBitmap,CFbsBitmapEx& aReference,TDisplayMode aDispMode)
+	{
+	const TSize bmpSize(aBitmap.SizeInPixels());
+	TInt byteWidth = CFbsBitmap::ScanLineLength(bmpSize.iWidth,aDispMode);
+	TUint8* buffer = new TUint8[byteWidth + 1];
+	buffer[byteWidth] = KCheckValue;
+	TPtr8 scanLine(buffer,byteWidth,byteWidth);
+
+	aBitmap.GetScanLine(scanLine,TPoint(0,1),bmpSize.iWidth,aDispMode);
+
+	for(TInt xx = 0; xx < bmpSize.iWidth; xx++)
+		{
+		TRgb color;
+		aReference.GetPixel(color,TPoint(xx,1));
+		TRgb bufferColor = ExtractRgb(buffer,xx,aDispMode);
+		switch (aDispMode)
+			{
+		case EGray2:
+			if (color.Gray4() == 0 || color.Gray4() == 3) // doesn't check in great detail because dithering occurs
+				TEST(bufferColor.Gray2() == color.Gray2());
+			break;
+		case EGray4:
+			if (aBitmap.DisplayMode() != EGray16) // doesn't check EGray16 because dithering occurs
+				TEST(bufferColor.Gray4() == color.Gray4());
+			break;
+		case EGray16:
+			TEST(bufferColor.Gray16() == color.Gray16());
+			break;
+		case EGray256:
+			TEST(bufferColor.Gray256() == color.Gray256());
+			break;
+		case EColor16:
+			TEST(bufferColor.Color16() == color.Color16());
+			break;
+		case EColor256:
+			TEST(bufferColor.Color256() == color.Color256());
+			break;
+		case EColor4K:
+			TEST(bufferColor.Color4K() == color.Color4K());
+			break;
+		case EColor64K:
+			TEST(bufferColor.Color64K() == color.Color64K());
+			break;
+		case EColor16M:
+			TEST(bufferColor.Color16M() == color.Color16M());
+			break;
+		case ERgb:
+			TEST(bufferColor == color);
+			break;
+		case EColor16MU:
+			if (aReference.DisplayMode()==EColor16MAP || aReference.DisplayMode()==EColor16MA)
+				color.SetAlpha(0xff);
+			CompareColourLikeness(bufferColor, color);			
+			break;
+		case EColor16MAP:
+			//Compare the TRgb values.  For an exact match to work the comparison would
+			//need to be done in PMA space.
+			color.SetInternal(color.Color16MAP());
+			bufferColor.SetInternal(bufferColor.Color16MAP());
+			CompareColourLikeness(bufferColor, color);			
+			break;	
+		default:
+			break;
+			};
+		}
+
+	TEST(buffer[byteWidth] == KCheckValue);
+	delete [] buffer;
+	}
+
+/**
+Compares two TRgbs and tests if they are similar colour.
+This is required because there may be some rounding errors when converting bitmaps from one display mode to another
+or due to alpha blending calculations.
+
+@param aSrc is the source colour
+@param aDest is the destination colour
+@param aDifference use this value for colour difference.  Value of 0 use KColourDifference;
+*/
+void CTBitmap::CompareColourLikeness(const TRgb& aSrc, const TRgb& aDest, TInt aDifference)
+	{
+	const TInt KColourDifference = 2;	// Acceptable difference to check for
+	TInt diff;
+	
+	if (aDifference==0)
+		diff=KColourDifference;
+	else
+		diff=aDifference;
+	
+	TInt redDiff = Abs(aSrc.Red() - aDest.Red());
+	TInt greenDiff = Abs(aSrc.Green() - aDest.Green());	
+	TInt blueDiff = Abs(aSrc.Blue() - aDest.Blue());	
+	TInt alphaDiff = Abs(aSrc.Alpha() - aDest.Alpha());	
+	
+	// Test each channel
+	TEST(redDiff <= diff);
+	TEST(greenDiff <= diff);
+	TEST(blueDiff <= diff);
+	TEST(alphaDiff <= diff);
+	
+	// the code below is useful for a breakpoint, to inspect the differences, in case of failure
+/**	
+	if ((redDiff > diff)||(greenDiff > diff)||(blueDiff > diff)||(alphaDiff > diff))
+		TInt temp=1;
+*/
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0521
+
+	@SYMTestCaseDesc
+	Sets a scanline of random values into
+	bitmaps of different color depths
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::SetScanline()
+	{
+	INFO_PRINTF1(_L("Test SetScanline"));
+
+	DoSetScanline(EGray2);
+	DoSetScanline(EGray4);
+	DoSetScanline(EGray16);
+	DoSetScanline(EGray256);
+	DoSetScanline(EColor16);
+	DoSetScanline(EColor256);
+	DoSetScanline(EColor4K);
+	DoSetScanline(EColor64K);
+	DoSetScanline(EColor16M);
+	DoSetScanline(EColor16MU);
+	DoSetScanline(EColor16MAP);
+	}
+
+void CTBitmap::DoSetScanline(TDisplayMode aDispMode)
+	{
+	__UHEAP_MARK;
+	CFbsBitmap bmp;
+
+	TInt ret = bmp.Create(TSize(256,2),aDispMode);
+	TEST2(ret, KErrNone);
+
+	TInt scanLineLength = CFbsBitmap::ScanLineLength(256,aDispMode);
+	TUint8* buffer = new TUint8[scanLineLength];
+	TEST(buffer != NULL);
+	TPtr8 scanline(buffer,scanLineLength,scanLineLength);
+
+	TUint8* bufptr = buffer;
+	TInt64 seed = bmp.Handle();
+	for(TInt count = 0; count < scanLineLength; count++)
+		*bufptr++ = (TUint8)Math::Rand(seed);
+
+	bmp.SetScanLine(scanline,0);
+	bmp.SetScanLine(scanline,1);
+
+	bmp.LockHeap();
+	TUint8* data = (TUint8*)bmp.DataAddress();
+	bmp.UnlockHeap();
+	ret = Mem::Compare(buffer,scanLineLength,data,scanLineLength);
+	TEST(ret == 0);
+
+	data += scanLineLength;
+	ret = Mem::Compare(buffer,scanLineLength,data,scanLineLength);
+	TEST(ret == 0);
+
+	delete [] buffer;
+	bmp.Reset();
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0522
+
+	@SYMTestCaseDesc
+	Stretches a scan line to make it
+	double as long for different colour depths
+	tested on both small and large bitmaps.
+
+	@SYMTestActions
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::StretchScanline()
+	{
+	INFO_PRINTF1(_L("Test StretchScanline"));
+
+	const TSize smallBitmapSize(226,2);
+	const TSize largeBitmapSize(1026,40);
+
+	INFO_PRINTF1(_L("EGray2"));
+	DoStretchScanline(smallBitmapSize,EGray2);
+	DoStretchScanline(largeBitmapSize,EGray2);
+
+	INFO_PRINTF1(_L(" EGray4"));
+	DoStretchScanline(smallBitmapSize,EGray4);
+	DoStretchScanline(largeBitmapSize,EGray4);
+
+	INFO_PRINTF1(_L(" EGray16"));
+	DoStretchScanline(smallBitmapSize,EGray16);
+	DoStretchScanline(largeBitmapSize,EGray16);
+
+	INFO_PRINTF1(_L(" EGray256"));
+	DoStretchScanline(smallBitmapSize,EGray256);
+	DoStretchScanline(largeBitmapSize,EGray256);
+
+	INFO_PRINTF1(_L(" EColor16"));
+	DoStretchScanline(smallBitmapSize,EColor16);
+	DoStretchScanline(largeBitmapSize,EColor16);
+
+	INFO_PRINTF1(_L(" EColor256"));
+	DoStretchScanline(smallBitmapSize,EColor256);
+	DoStretchScanline(largeBitmapSize,EColor256);
+
+	INFO_PRINTF1(_L(" EColor4K"));
+	DoStretchScanline(smallBitmapSize,EColor4K);
+	DoStretchScanline(largeBitmapSize,EColor4K);
+
+	INFO_PRINTF1(_L(" EColor64K"));
+	DoStretchScanline(smallBitmapSize,EColor64K);
+	DoStretchScanline(largeBitmapSize,EColor64K);
+
+	INFO_PRINTF1(_L(" EColor16M"));
+	DoStretchScanline(smallBitmapSize,EColor16M);
+	DoStretchScanline(largeBitmapSize,EColor16M);
+
+	INFO_PRINTF1(_L(" EColor16MU"));
+	DoStretchScanline(smallBitmapSize,EColor16MU);
+	DoStretchScanline(largeBitmapSize,EColor16MU);
+	
+	INFO_PRINTF1(_L(" EColor16MA"));
+	DoStretchScanline(smallBitmapSize,EColor16MA);
+	DoStretchScanline(largeBitmapSize,EColor16MA);
+
+	INFO_PRINTF1(_L(" EColor16MAP"));
+	DoStretchScanline(smallBitmapSize,EColor16MAP);
+	DoStretchScanline(largeBitmapSize,EColor16MAP);
+	
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor16M, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor16M, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor16MU, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor16MU, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor16MA, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor16MA, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor64K, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor64K, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor4K, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor4K, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MAP,EColor256, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MAP,EColor256, ETrue);
+	
+	DoStretchScanline(smallBitmapSize,EColor16M,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16M,EColor16MAP, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MU,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MU,EColor16MAP, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor16MA,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MA,EColor16MAP, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor64K,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor64K,EColor16MAP, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor4K,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor4K,EColor16MAP, ETrue);
+	DoStretchScanline(smallBitmapSize,EColor256,EColor16MAP, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor256,EColor16MAP, ETrue);
+	
+	DoStretchScanline(smallBitmapSize,EColor16MU,EColor16M, ETrue);
+	DoStretchScanline(largeBitmapSize,EColor16MU,EColor16M, ETrue);
+	
+	INFO_PRINTF1(_L("\n"));
+	}
+
+void CTBitmap::DoStretchScanline(const TSize& aSize,TDisplayMode aDispMode)
+	{
+	DoStretchScanline(aSize,aDispMode,aDispMode, EFalse);
+	}
+
+/* this function is used to determine an acceptable colour difference based on the screen mode 
+   and the alpha value.  This is because when converting from PMA to non pre-multiplied, there
+   can be large errors, especially if alpha is small.
+ */	
+TInt CTBitmap::ColorDifference(TDisplayMode aMode, TInt aAlpha)
+	{
+	switch (aMode)
+		{
+	case EGray2:// Monochrome display mode (1 bpp)
+		return 0xff>>1;
+	case EGray4:// Four grayscales display mode (2 bpp)
+		return 0xff>>2;
+	case EGray16:// 16 grayscales display mode (4 bpp)
+		return 0xff>>2;
+	case EGray256:// 256 grayscales display mode (8 bpp)
+		return 0xff>>2;
+	case EColor16:// Low colour EGA 16 colour display mode (4 bpp)
+		return 0xff>>2;
+	case EColor256: // 256 colour display mode (8 bpp)
+		return 0xff>>2;
+	case EColor64K: // 64,000 colour display mode (16 bpp) 
+		return 0xff>>5;
+	case EColor16M: // True colour display mode (24 bpp)
+		return 0xff>>5;
+	case EColor4K: // 4096 colour display (12 bpp).
+		return 0xff>>4;
+	case EColor16MU:// True colour display mode (32 bpp, but top byte is unused and unspecified)
+		return 0xff>>5;
+	case EColor16MA:// Display mode with alpha (24bpp colour plus 8bpp alpha)
+		return 0xff>>6;
+	case EColor16MAP:// Pre-multiplied Alpha display mode (24bpp color multiplied with the alpha channel value, plus 8bpp alpha)
+		if (aAlpha==0xff)
+			return 0xff>>4;
+		else
+			//make inaccuracy a function of alpha since the colour will the premultiplied, and then
+			//unpremultiplied.  For small alpha this can be quite large.
+			if (aAlpha==0)
+				return 0xff;
+			else
+				return Max(0xff>>4,Min(0xff,(0xff/aAlpha)+0xf));//value corrected by trial and error, with minimum of 15.
+		}
+	return 0xff>>7;	
+	}
+
+void CTBitmap::DoStretchScanline(const TSize& aSize,TDisplayMode aSrcMode,TDisplayMode aDstMode, TBool aUseCompareLikeness)
+	{
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	CBitwiseBitmap* bmpadd=NULL;
+
+	TInt ret = bmp.Create(aSize,aSrcMode);
+	TEST2(ret, KErrNone);
+
+	FillBitmap(bmp);
+	bmpadd = bmp.BitmapAddress();
+	bmp.LockHeap();
+	TUint32* base = bmp.DataAddress();
+	bmp.UnlockHeap();
+
+	TInt scanLineLength = CFbsBitmap::ScanLineLength(aSize.iWidth,aSrcMode);
+	TInt scanLineDestLength = CFbsBitmap::ScanLineLength(aSize.iWidth,aDstMode)*2;
+	TUint8* buffer = new TUint8[scanLineLength];
+	TUint8* doubleBuffer = new TUint8[scanLineDestLength];
+	TPtr8 scanline(buffer,scanLineLength,scanLineLength);
+	TPtr8 doubleScanline(doubleBuffer,scanLineDestLength,scanLineDestLength);
+
+	TInt yy;
+	for(yy = 0; yy < aSize.iHeight; yy++)
+		{
+		bmp.GetScanLine(scanline,TPoint(0,yy),aSize.iWidth,aSrcMode);
+		bmpadd->StretchScanLine(doubleScanline,TPoint(0,yy),0,aSize.iWidth * 2,aSize.iWidth * 2,0,aSize.iWidth,TPoint(0,0),aDstMode,base);
+		for(TInt xx = 0; xx < aSize.iWidth; xx++)
+			{
+			TRgb scanlineColor = ExtractRgb(buffer,xx,aSrcMode);
+			TRgb firstStretchColor = ExtractRgb(doubleBuffer,xx * 2,aDstMode);
+			TRgb secondStretchColor = ExtractRgb(doubleBuffer,(xx * 2) + 1,aDstMode);
+			TRgb reportedColor;
+			bmpadd->GetPixel(reportedColor,TPoint(xx,yy),base,NULL);
+			if (!aUseCompareLikeness)
+				{
+				TEST(scanlineColor == firstStretchColor);
+				TEST(firstStretchColor == secondStretchColor);
+				TEST(secondStretchColor == reportedColor);
+				}
+			else
+				{
+				if (aDstMode==EColor16M||aDstMode==EColor16MU||aDstMode==EColor64K||aDstMode==EColor4K||aDstMode==EColor256)
+					{
+					//there is no alpha in the destination
+					scanlineColor.SetAlpha(0xff);
+					reportedColor.SetAlpha(0xff);	
+					}	
+				CompareColourLikeness(scanlineColor, firstStretchColor, ColorDifference(aDstMode,scanlineColor.Alpha()));
+				CompareColourLikeness(firstStretchColor, secondStretchColor,ColorDifference(aDstMode,scanlineColor.Alpha()));
+				CompareColourLikeness(secondStretchColor, reportedColor,ColorDifference(aDstMode,scanlineColor.Alpha()));
+				}
+			}
+		}
+
+	for(yy = 0; yy < aSize.iHeight; yy++)
+		{
+		bmp.GetScanLine(scanline,TPoint(0,yy),aSize.iWidth,aSrcMode);
+		bmpadd->StretchScanLine(doubleScanline,TPoint(0,yy),0,aSize.iWidth / 2,aSize.iWidth / 2,0,aSize.iWidth,TPoint(0,0),aDstMode,base);
+		for(TInt xx = 0; xx < aSize.iWidth; xx += 2)
+			{
+			TRgb scanlineColor = ExtractRgb(buffer,xx,aSrcMode);
+			TRgb compressColor = ExtractRgb(doubleBuffer,xx / 2,aDstMode);
+			TRgb reportedColor;
+			bmpadd->GetPixel(reportedColor,TPoint(xx,yy),base,NULL);
+			if (!aUseCompareLikeness)
+				{
+				TEST(scanlineColor == compressColor);
+				TEST(compressColor == reportedColor);
+				}
+			else
+				{
+				if (aDstMode==EColor16M||aDstMode==EColor16MU||aDstMode==EColor64K||aDstMode==EColor4K||aDstMode==EColor256)
+					{
+					//there is no alpha in the destination
+					scanlineColor.SetAlpha(0xff);
+					reportedColor.SetAlpha(0xff);	
+					}
+				CompareColourLikeness(scanlineColor, compressColor,ColorDifference(aDstMode,scanlineColor.Alpha()));
+				CompareColourLikeness(compressColor, reportedColor,ColorDifference(aDstMode,scanlineColor.Alpha()));
+				}
+			}
+		}
+
+	delete [] buffer;
+	delete [] doubleBuffer;
+	buffer = NULL;
+	doubleBuffer = NULL;
+
+	TInt rgbScanLineLength = aSize.iWidth * sizeof(TRgb) * 2;
+	TUint8* rgbBuffer = new TUint8[rgbScanLineLength];
+	TPtr8 rgbScanline(rgbBuffer,rgbScanLineLength,rgbScanLineLength);
+
+	for(yy = 0; yy < aSize.iHeight; yy++)
+		{
+		bmpadd->StretchScanLine(rgbScanline,TPoint(0,yy),0,aSize.iWidth * 2,aSize.iWidth * 2,0,aSize.iWidth,TPoint(0,0),ERgb,base);
+		for(TInt xx = 0; xx < aSize.iWidth; xx++)
+			{
+			TRgb firstStretchColor = ExtractRgb(rgbBuffer,xx * 2,ERgb);
+			TRgb secondStretchColor = ExtractRgb(rgbBuffer,(xx * 2) + 1,ERgb);
+			TRgb reportedColor;
+			bmpadd->GetPixel(reportedColor,TPoint(xx,yy),base,NULL);
+			if (!aUseCompareLikeness)
+				{
+				TEST(firstStretchColor == secondStretchColor);
+				TEST(secondStretchColor == reportedColor);
+				}
+			else
+				{
+				CompareColourLikeness(firstStretchColor, secondStretchColor);
+				CompareColourLikeness(secondStretchColor, reportedColor);
+				}
+			}
+		}
+
+	for(yy = 0; yy < aSize.iHeight; yy++)
+		{
+		bmpadd->StretchScanLine(rgbScanline,TPoint(0,yy),0,aSize.iWidth / 2,aSize.iWidth / 2,0,aSize.iWidth,TPoint(0,0),ERgb,base);
+		for(TInt xx = 0; xx < aSize.iWidth; xx += 2)
+			{
+			TRgb compressColor = ExtractRgb(rgbBuffer,xx / 2,ERgb);
+			TRgb reportedColor;
+			bmpadd->GetPixel(reportedColor,TPoint(xx,yy),base,NULL);
+			if (!aUseCompareLikeness)
+				{
+				TEST(compressColor == reportedColor);
+				}
+			else
+				{
+				CompareColourLikeness(compressColor, reportedColor);
+				}
+			}
+		}
+
+	delete [] rgbBuffer;
+	rgbBuffer = NULL;
+
+	bmp.Reset();
+	User::Heap().Check();
+	DeleteScanLineBuffer();
+	__UHEAP_MARKEND;
+	}
+
+TRgb CTBitmap::ExtractRgb(TUint8* aBuffer,TInt aPixelOffset,TDisplayMode aDispMode)
+	{
+	switch (aDispMode)
+		{
+	case EGray2:
+		{
+		TUint8 byte = *(aBuffer + (aPixelOffset >> 3));
+		if (byte & (1 << (aPixelOffset & 7)))
+			return KRgbWhite;
+		return KRgbBlack;
+		}
+	case EGray4:
+		{
+		TUint8 byte = *(aBuffer + (aPixelOffset >> 2));
+		byte >>= ((aPixelOffset & 3) << 1);
+		return TRgb::Gray4(byte & 3);
+		}
+	case EGray16:
+		{
+		TUint8 byte = *(aBuffer + (aPixelOffset >> 1));
+		if (aPixelOffset & 1)
+			byte >>= 4;
+		return TRgb::Gray16(byte & 0xf);
+		}
+	case EGray256:
+		return TRgb::Gray256(*(aBuffer + aPixelOffset));
+	case EColor16:
+		{
+		TUint8 byte = *(aBuffer + (aPixelOffset >> 1));
+		if (aPixelOffset & 1)
+			byte >>= 4;
+		return TRgb::Color16(byte & 0xf);
+		}
+	case EColor256:
+		return TRgb::Color256(*(aBuffer + aPixelOffset));
+	case EColor4K:
+		{
+		TUint16 doubleByte = *(((TUint16*)aBuffer) + aPixelOffset);
+		return TRgb::Color4K(doubleByte & 0xfff);
+		}
+	case EColor64K:
+		{
+		TUint16 doubleByte = *(((TUint16*)aBuffer) + aPixelOffset);
+		return TRgb::Color64K(doubleByte);
+		}
+	case EColor16M:
+		{
+		aBuffer += aPixelOffset * 3;
+		TInt value = *aBuffer++;
+		value |= *aBuffer++ << 8;
+		value |= *aBuffer << 16;
+		return TRgb::Color16M(value);
+		}
+	case ERgb:
+		return *(((TRgb*)aBuffer) + aPixelOffset);
+	case EColor16MU:
+		{
+		return TRgb::Color16MU(*(((TUint32*)aBuffer) + aPixelOffset));
+		}
+	case EColor16MA:
+		{
+		return TRgb::Color16MA(*(((TUint32*)aBuffer) + aPixelOffset));
+		}	
+	case EColor16MAP:
+		{
+		return TRgb::_Color16MAP(*(((TUint32*)aBuffer) + aPixelOffset));
+		}	
+	default:
+		break;
+		};
+	return KRgbBlack;
+	}
+	
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0523
+
+	@SYMTestCaseDesc
+	Streams a bitmap in segments and compares it
+	to an expected bitmap
+	
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::LoadInSegments()
+	{
+	INFO_PRINTF1(_L("Test Segmented Loading"));
+
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	TInt ret=bmp.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+	CFbsBitmapAsyncStreamer* bmploader=NULL;
+	TRAP(ret,bmploader=CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ELoad));
+	TEST2(ret, KErrNone);
+	TInt slines=0;
+	ret=bmploader->Load(iTestBitmapName,ETfbs,slines);
+	TEST2(ret, KErrNone);
+	TEST(slines>0);
+	CFbsBitmap* newbmp=NULL;
+	TBool done=EFalse;
+	do	{
+		TEST(newbmp==NULL);
+		TRAP(ret,done=bmploader->LoadScanLinesL(slines/10,newbmp));
+		TEST2(ret, KErrNone);
+		}
+	while(!done);
+
+	TEST(newbmp!=NULL);
+	CompareBitmaps(bmp,(CFbsBitmapEx&)*newbmp,EColor16M);
+	delete bmploader;
+	delete newbmp;
+
+	TRAP(ret,iBmpHandler=CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ELoad));
+	TEST2(ret, KErrNone);
+	ret=iBmpHandler->Load(iTestBitmapName,ETfbs,slines);
+	TEST2(ret, KErrNone);
+	TEST(slines>0);
+	CIdle* idleobj=CIdle::New(-20);
+	TEST(idleobj!=NULL);
+	TCallBack callback(BmpLoadCallBack,this);
+	idleobj->Start(callback);
+	
+	CActiveScheduler* as = CActiveScheduler::Current();
+	__ASSERT_DEBUG(as, User::Invariant());
+	
+	TRAP(ret,as->Start());
+	TEST2(ret, KErrNone);
+	
+	CompareBitmaps(bmp,(CFbsBitmapEx&)*iBitmap,EColor16M);
+
+	delete iBmpHandler;
+	delete iBitmap;
+	bmp.Reset();
+	delete idleobj;
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+
+	
+	}
+
+TInt CTBitmap::BmpLoadCallBack(TAny* aPtr)
+	{
+	CTBitmap* tbmp=(CTBitmap*)aPtr;
+	tbmp->INFO_PRINTF1(_L("*"));
+	TBool done=EFalse;
+	TRAPD(ret,done=tbmp->iBmpHandler->LoadScanLinesL(10,tbmp->iBitmap));
+	tbmp->TEST2(ret, KErrNone);
+	if(done)
+		{
+		tbmp->TEST(tbmp->iBitmap!=NULL);
+		CActiveScheduler::Stop();
+		}
+	else 
+		{
+		tbmp->TEST(tbmp->iBitmap==NULL);
+		}
+	return(ETrue);
+	}
+	
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0524
+
+	@SYMTestCaseDesc
+	A bitmap is saved in segments and then read back from file store
+	and compared to an expected bitmap
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/	
+void CTBitmap::SaveInSegments()
+	{
+	INFO_PRINTF1(_L("Test Segmented Saving"));
+
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	TInt ret=bmp.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+	CFbsBitmapAsyncStreamer* bmpsaver=NULL;
+	TRAP(ret,bmpsaver=CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ESave));
+	TEST2(ret, KErrNone);
+	TInt slines=0;
+	TInt32 id;
+	ret=bmpsaver->Save(KTempFilename,&bmp,id,slines);
+	TEST2(ret, KErrNone);
+	TEST(id==0);
+	TEST(slines>0);
+	TBool done=EFalse;
+	do	{
+		TRAP(ret,done=bmpsaver->SaveScanLinesL(slines/10));
+		TEST2(ret, KErrNone);
+		}
+	while(!done);
+	delete bmpsaver;
+	CFbsBitmapEx bmp2;
+	ret=bmp2.Load(KTempFilename,id,NULL);
+	TEST2(ret, KErrNone);
+	TUint8 buffer[40];
+	TUint8 bufferst[40];
+	TPtr8 scanline(&buffer[0],40,40);
+	TPtr8 scanlinest(&bufferst[0],40,40);
+	TInt yy=0;
+	for(;yy<80;yy++)
+		{
+		bmp.GetScanLine(scanline,TPoint(0,yy),160,EGray4);
+		bmp2.GetScanLine(scanlinest,TPoint(0,yy),160,EGray4);
+		for(TInt count=0;count<40;count++)
+			TEST(buffer[count]==bufferst[count]);
+		}
+	bmp2.Reset();
+	iFs.Delete(KTempFilename);
+
+	CActiveScheduler* as = CActiveScheduler::Current();
+	__ASSERT_DEBUG(as, User::Invariant());
+
+	TRAP(ret,iBmpHandler=CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ESave));
+	TEST2(ret, KErrNone);
+	ret=iBmpHandler->Save(KTempFilename,&bmp,id,slines);
+	TEST2(ret, KErrNone);
+	TEST(id==0);
+	TEST(slines>0);
+	CIdle* idleobj=CIdle::New(-20);
+	TEST(idleobj!=NULL);
+	TCallBack callback(BmpSaveCallBack,this);
+	idleobj->Start(callback);
+	TRAP(ret,as->Start());
+	TEST2(ret, KErrNone);
+	delete iBmpHandler;
+	ret=bmp2.Load(KTempFilename,id,NULL);
+	TEST2(ret, KErrNone);
+	for(yy=0;yy<80;yy++)
+		{
+		bmp.GetScanLine(scanline,TPoint(0,yy),160,EGray4);
+		bmp2.GetScanLine(scanlinest,TPoint(0,yy),160,EGray4);
+		for(TInt count=0;count<40;count++)
+			TEST(buffer[count]==bufferst[count]);
+		}
+	bmp.Reset();
+	delete idleobj;
+	iFs.Delete(KTempFilename);
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+
+	INFO_PRINTF1(_L("\r\n"));
+	
+	}
+
+TInt CTBitmap::BmpSaveCallBack(TAny* aPtr)
+	{
+	CTBitmap* tbmp=(CTBitmap*)aPtr;
+	tbmp->INFO_PRINTF1(_L("*"));
+	TBool done=EFalse;
+	TRAPD(ret,done=tbmp->iBmpHandler->SaveScanLinesL(10));
+	tbmp->TEST2(ret, KErrNone);
+	if(done) 
+		{
+		CActiveScheduler::Stop();
+		}
+	return(ETrue);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0525
+
+	@SYMTestCaseDesc
+	Tests if a bitmap is monochrone for different
+	color depths
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::MonoDetect()
+	{
+	INFO_PRINTF1(_L("Test Mono Detection"));
+
+	DoMonoDetect(EGray2);
+	DoMonoDetect(EGray4);
+	DoMonoDetect(EGray16);
+	DoMonoDetect(EGray256);
+	DoMonoDetect(EColor16);
+	DoMonoDetect(EColor256);
+	DoMonoDetect(EColor4K);
+	DoMonoDetect(EColor64K);
+	DoMonoDetect(EColor16M);
+	DoMonoDetect(EColor16MU);
+	DoMonoDetect(EColor16MAP);
+	}
+
+void CTBitmap::DoMonoDetect(TDisplayMode aDisplayMode)
+	{
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(TSize(100,3),aDisplayMode);
+	TEST2(ret, KErrNone);
+
+	CBitwiseBitmap* bmpadd = bmp.BitmapAddress();
+	bmp.LockHeap();
+	TUint32* base = bmp.DataAddress();
+	bmp.UnlockHeap();
+	TUint32* data = bmpadd->ScanLineAddress(base,1);
+
+	if(aDisplayMode == EColor16M)
+		{
+		*(data+1) = 0x0000FFFF;
+		*(data+2) = 0xFFFFFF00;
+		//Pixel at (data + 1). Bytes (3) and (2) are part of the pixel at (data) addr.
+		//LSB                        MSB
+		//3        2        1        0
+		//FF       FF       00       00  
+		//Pixel at (data + 2). Byte (3) is part of the pixel at (data + 1) addr.
+		//LSB                        MSB
+		//3        2        1        0
+		//00       FF       FF       FF
+		}
+	else
+		{
+		*(data+1) = 0;
+		}
+	TBool mono = bmp.IsMonochrome();
+	TEST(mono);
+
+	*(data+1) = 0x1234abcd;
+	mono = bmp.IsMonochrome();
+	if (aDisplayMode == EGray2)
+		TEST(mono);
+	else
+		TEST(!mono);
+
+	if(aDisplayMode == EColor16M)
+		{
+		*(data+1) = 0xffffffff;
+		*(data+2) = 0xffffffff;
+		}
+	else
+		{
+		*(data+1) = 0xffffffff;
+		}
+	mono=bmp.IsMonochrome();
+	TEST(mono);
+
+	bmp.Reset();
+	}
+
+
+#if defined(__WINS__)
+// these are patchable constants defined in fbscli.dll but on the emulator
+// it's not possible to import them so they are re-defined here
+const TInt KFbServLargeChunkGrowByShifter = 1;
+const TInt KFbServLargeChunkSizeShifter = 2;
+const TInt KFbServLargeChunkMinPhysicalSize = 0x4000;
+#elif defined(__X86GCC__)
+IMPORT_D extern const TInt KFbServLargeChunkGrowByShifter;
+IMPORT_D extern const TInt KFbServLargeChunkSizeShifter;
+IMPORT_D extern const TInt KFbServLargeChunkMinPhysicalSize;
+#endif
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0526
+
+	@SYMTestCaseDesc
+	Allocates different sized chunks of memory
+	in a loop and frees them
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::ChunkPileL()
+	{
+	INFO_PRINTF1(_L("Test Chunk Pile"));
+
+	TInt virtualSize = 0x4000000;
+	RChunk chunk;
+	TInt ret = chunk.CreateDisconnectedGlobal(_L("TFbsLargeChunk"), 0, 0, virtualSize);
+	TEST2(ret, KErrNone);
+	CleanupClosePushL(chunk);
+	TInt pageSize = 0;
+	HAL::Get(HAL::EMemoryPageSize, pageSize);
+	TEST(pageSize == 4096);
+	TUint8* chunkSmallBase = chunk.Base() + pageSize;
+	TUint8* chunkLargeBase = chunk.Base() + (virtualSize >> KFbServLargeChunkSizeShifter);
+
+	CChunkPile* cp=NULL;
+	TRAP(ret, cp = CChunkPile::NewL(chunk));
+	TEST2(ret, KErrNone);
+	TEST(cp!=NULL);
+	CleanupStack::PushL(cp);
+	TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+
+	TUint8* chunkalloc[16];
+	TInt size[16];
+	for (TInt i = 0; i < 64; ++i)
+		{
+		chunkalloc[0] = cp->Alloc(size[0] = 512);
+		TEST(chunkalloc[0] == chunkSmallBase);
+		chunkalloc[1] = cp->Alloc(size[1] = 8);
+		TEST(chunkalloc[1] == chunkalloc[0] + size[0]);
+		chunkalloc[2] = cp->Alloc(size[2] = 128);
+		TEST(chunkalloc[2] == chunkalloc[1] + size[1]);
+		chunkalloc[3] = cp->Alloc(size[3] = 372);
+		TEST(chunkalloc[3] == chunkalloc[2] + size[2]);
+		chunkalloc[4] = cp->Alloc(size[4] = 256);
+		TEST(chunkalloc[4] == chunkalloc[3] + size[3]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		// now we should have [0], [1], [2], [3], [4]
+
+		cp->Free(chunkalloc[2]);
+		cp->Free(chunkalloc[3]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		chunkalloc[5] = cp->Alloc(size[5] = size[2] + size[3]);
+		TEST(chunkalloc[5] == chunkalloc[2]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		// now we should have [0], [1], [5], [4]
+
+		chunkalloc[6] = cp->Alloc(size[6] = 4);
+		TEST(chunkalloc[6] == chunkalloc[4] + size[4]);
+		chunkalloc[7] = cp->Alloc(size[7] = 1024);
+		TEST(chunkalloc[7] == chunkalloc[6] + size[6]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		cp->Free(chunkalloc[7]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		// now we should have [0], [1], [5], [4], [6]
+
+		cp->Free(chunkalloc[1]);
+		cp->Free(chunkalloc[0]);
+		cp->Free(chunkalloc[4]);
+		cp->Free(chunkalloc[5]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		chunkalloc[8] = cp->Alloc(size[8] = size[0] + size[1] + size[4] + size[5] - 32);
+		TEST(chunkalloc[8] == chunkalloc[0]);
+		chunkalloc[9] = cp->Alloc(size[9] = 32);
+		TEST(chunkalloc[9] == chunkalloc[8] + size[8]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		// now we should have [8], [9], [6]
+
+		chunkalloc[10] = cp->Alloc(size[10] = KFbServLargeChunkMinPhysicalSize - size[6] - size[8] - size[9]);
+		TEST(chunkalloc[10] == chunkalloc[6] + size[6]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		chunkalloc[11] = cp->Alloc(size[11] = 16);
+		TEST(chunkalloc[11] == chunkalloc[10] + size[10]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + (pageSize << KFbServLargeChunkGrowByShifter));
+		chunkalloc[12] = cp->Alloc(size[12] = ((pageSize << KFbServLargeChunkGrowByShifter) - 16) / 2);
+		TEST(chunkalloc[12] == chunkalloc[11] + size[11]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + (pageSize << KFbServLargeChunkGrowByShifter));
+		chunkalloc[13] = cp->Alloc(size[13] = size[12]);
+		TEST(chunkalloc[13] == chunkalloc[12] + size[12]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + (pageSize << KFbServLargeChunkGrowByShifter));
+		chunkalloc[14] = cp->Alloc(size[14] = pageSize << KFbServLargeChunkGrowByShifter);
+		TEST(chunkalloc[14] == chunkalloc[13] + size[13]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + 2 * (pageSize << KFbServLargeChunkGrowByShifter));
+		chunkalloc[15] = cp->Alloc(size[15] = (pageSize << KFbServLargeChunkGrowByShifter) + 4);
+		TEST(chunkalloc[15] == chunkalloc[14] + size[14]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + 4 * (pageSize << KFbServLargeChunkGrowByShifter));
+		// now we should have [8], [9], [6], [10], [11], [12], [13], [14], [15]
+
+		cp->Free(chunkalloc[15]);
+		cp->Free(chunkalloc[14]);
+		cp->Free(chunkalloc[13]);
+		cp->Free(chunkalloc[12]);
+		cp->Free(chunkalloc[11]);
+		cp->Free(chunkalloc[10]);
+		cp->Free(chunkalloc[9]);
+		cp->Free(chunkalloc[8]);
+		cp->Free(chunkalloc[6]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+
+		TEST(cp->Alloc(virtualSize) == NULL);
+
+		TInt largeSize = 4 * pageSize;
+		chunkalloc[0] = cp->Alloc(size[0] = 2 * largeSize);
+		TEST(chunkalloc[0] == chunkLargeBase);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0]);
+		chunkalloc[1] = cp->Alloc(2 * largeSize + 1);
+		size[1] = 2 * largeSize + pageSize;
+		TEST(chunkalloc[1] == chunkalloc[0] + size[0]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[1]);
+		chunkalloc[2] = cp->Alloc(size[2] = 3 * largeSize + pageSize);
+		TEST(chunkalloc[2] == chunkalloc[1] + size[1]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[1] + size[2]);
+		// now we should have [0], [1], [2]
+
+		cp->Free(chunkalloc[1]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[2]);
+		chunkalloc[3] = cp->Alloc(largeSize + 1);
+		size[3] = largeSize + pageSize;
+		TEST(chunkalloc[3] == chunkalloc[1]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[2] + size[3]);
+		chunkalloc[4] = cp->Alloc(size[4] = largeSize);
+		TEST(chunkalloc[4] == chunkalloc[3] + size[3]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[2] + size[3] + size[4]);
+		chunkalloc[5] = cp->Alloc(size[5] = 64 * largeSize);
+		TEST(chunkalloc[5] == chunkalloc[2] + size[2]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[0] + size[2] + size[3] + size[4] + size[5]);
+		// now we should have [0], [3], [4], [2], [5]
+
+		cp->Free(chunkalloc[0]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[2] + size[3] + size[4] + size[5]);
+		cp->Free(chunkalloc[2]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[3] + size[4] + size[5]);
+		cp->Free(chunkalloc[3]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[4] + size[5]);
+		cp->Free(chunkalloc[4]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize + size[5]);
+		cp->Free(chunkalloc[5]);
+		TEST(chunk.Size() == KFbServLargeChunkMinPhysicalSize);
+		}
+
+	CleanupStack::PopAndDestroy(2, &chunk); // cp, chunk
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0527
+
+	@SYMTestCaseDesc
+	Creates large bitmaps of different colour depth. 
+
+	@SYMTestActions
+	The bitmaps allocated are too big so
+	the allocation should fail.
+	
+	@SYMTestExpectedResults
+	KErrNoMemory when allocating the bitmaps. 
+*/
+void CTBitmap::LargeBitmaps()
+	{
+	INFO_PRINTF1(_L("Test Large Bitmaps"));
+
+	TMemoryInfoV1Buf membuf;
+	UserHal::MemoryInfo(membuf);
+	const TReal maxmem = membuf().iTotalRamInBytes;
+
+	TReal realSize = 0;
+	TInt ret = Math::Sqrt(realSize,maxmem);
+	TEST2(ret, KErrNone);
+	TInt32 size = 0;
+	ret = Math::Int(size,realSize);
+	TEST2(ret, KErrNone);
+
+	DoLargeBitmaps(TSize(size * 8,size),EGray2);
+	DoLargeBitmaps(TSize(size * 4,size),EGray4);
+	DoLargeBitmaps(TSize(size * 2,size),EGray16);
+	DoLargeBitmaps(TSize(size,size),EGray256);
+	DoLargeBitmaps(TSize(size * 2,size),EColor16);
+	DoLargeBitmaps(TSize(size,size),EColor256);
+	DoLargeBitmaps(TSize(size / 2,size),EColor4K);
+	DoLargeBitmaps(TSize(size / 2,size),EColor64K);
+	DoLargeBitmaps(TSize(size / 3,size),EColor16M);
+	DoLargeBitmaps(TSize(size / 4,size),EColor16MU);
+	DoLargeBitmaps(TSize(size / 4,size),EColor16MAP);
+	}
+
+void CTBitmap::DoLargeBitmaps(const TSize& aSize,TDisplayMode aDisplayMode)
+	{
+	CFbsBitmapEx bmp1;
+	TInt ret = bmp1.Create(aSize,aDisplayMode);
+	TEST2(ret, KErrNoMemory);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0528
+
+	@SYMTestCaseDesc
+	Check error handling for bitmaps above pixel and byte size limits
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::HugeBitmaps()
+	{
+	// Check error handling for bitmaps above pixel and byte size limits
+	INFO_PRINTF1(_L("Test Huge Bitmaps"));
+
+	const TInt KLargePixelSize = 50000;
+
+	DoHugeBitmaps(TSize(KLargePixelSize * 8,KLargePixelSize),EGray2);
+	DoHugeBitmaps(TSize(KLargePixelSize * 4,KLargePixelSize),EGray4);
+	DoHugeBitmaps(TSize(KLargePixelSize * 2,KLargePixelSize),EGray16);
+	DoHugeBitmaps(TSize(KLargePixelSize,KLargePixelSize),EGray256);
+	DoHugeBitmaps(TSize(KLargePixelSize * 2,KLargePixelSize),EColor16);
+	DoHugeBitmaps(TSize(KLargePixelSize,KLargePixelSize),EColor256);
+	DoHugeBitmaps(TSize(KLargePixelSize / 2,KLargePixelSize),EColor4K);
+	DoHugeBitmaps(TSize(KLargePixelSize / 2,KLargePixelSize),EColor64K);
+	DoHugeBitmaps(TSize(KLargePixelSize / 3,KLargePixelSize),EColor16M);
+	DoHugeBitmaps(TSize(KLargePixelSize / 4,KLargePixelSize),EColor16MU);
+	DoHugeBitmaps(TSize(KLargePixelSize / 4,KLargePixelSize),EColor16MAP);
+	}
+
+void CTBitmap::DoHugeBitmaps(const TSize& aSize,TDisplayMode aDisplayMode)
+	{
+	const TInt KMaxPixelSize = KMaxTInt / 4 + 1;
+
+	CFbsBitmap bmp;
+
+	TInt ret = bmp.Create(TSize(aSize.iWidth / 2,aSize.iHeight / 2),aDisplayMode);
+	TEST2(ret, KErrNoMemory);
+
+	ret = bmp.Create(aSize,aDisplayMode);
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Create(TSize(1,KMaxPixelSize),aDisplayMode);
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Create(TSize(KMaxPixelSize,1),aDisplayMode);
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Create(TSize(KMaxPixelSize,KMaxPixelSize),aDisplayMode);
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Create(TSize(KMaxTInt,KMaxTInt),aDisplayMode);
+	TEST2(ret, KErrTooBig);
+
+
+	ret = bmp.Create(TSize(1,1),aDisplayMode);
+	TEST2(ret, KErrNone);
+
+	ret = bmp.Resize(TSize(aSize.iWidth / 2,aSize.iHeight / 2));
+	TEST2(ret, KErrNoMemory);
+
+	ret = bmp.Resize(aSize);
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Resize(TSize(1,KMaxPixelSize));
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Resize(TSize(KMaxPixelSize,1));
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Resize(TSize(KMaxPixelSize,KMaxPixelSize));
+	TEST2(ret, KErrTooBig);
+
+	ret = bmp.Resize(TSize(KMaxTInt,KMaxTInt));
+	TEST2(ret, KErrTooBig);
+
+	bmp.Reset();
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0529
+
+	@SYMTestCaseDesc
+	Resizes a bitmap to a larger size and
+	checks if the new bitmap is as expected
+	
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::Resize()
+	{
+	INFO_PRINTF1(_L("Test Resizing"));
+
+	DoResize(EGray2);
+	DoResize(EGray4);
+	DoResize(EGray16);
+	DoResize(EGray256);
+	DoResize(EColor16);
+	DoResize(EColor256);
+	DoResize(EColor4K);
+	DoResize(EColor64K);
+	DoResize(EColor16M);
+	DoResize(EColor16MU);
+	DoResize(EColor16MAP);
+	}
+
+void CTBitmap::DoResize(TDisplayMode aDispMode)
+	{
+	const TSize KBitmapOriginalSize(256,24);
+	const TSize KBitmapLargeSize(288,32);
+	const TSize KBitmapSmallSize(1,1);
+
+	CFbsBitmapEx bmp;
+	TInt ret = bmp.Create(KBitmapOriginalSize,aDispMode);
+	TEST2(ret, KErrNone);
+	bmp.SetSizeInTwips(KBitmapOriginalSize);
+	TEST(bmp.SizeInPixels() == KBitmapOriginalSize);
+	TEST(bmp.SizeInTwips() == KBitmapOriginalSize);
+
+	CBitwiseBitmap* bb = bmp.BitmapAddress();
+	bmp.LockHeap();
+	TUint32* base = bmp.DataAddress();
+	bmp.UnlockHeap();
+
+	TInt scanLineLength = CFbsBitmap::ScanLineLength(256,aDispMode);
+	TInt blockStart = scanLineLength / 4;
+	TInt blockLength = scanLineLength / 2;
+
+	TInt row;
+	for(row = 8; row < 16; row++)
+		{
+		TUint8* bmpadd = (TUint8*)bb->ScanLineAddress(base,row);
+		Mem::FillZ(bmpadd + blockStart,blockLength);
+		}
+
+	ret = bmp.Resize(KBitmapLargeSize);
+	TEST2(ret, KErrNone);
+	TEST(bmp.SizeInPixels() == KBitmapLargeSize);
+	TEST(bmp.SizeInTwips() == KBitmapLargeSize);
+	bb = bmp.BitmapAddress();
+	bmp.LockHeap();
+	base = bmp.DataAddress();
+	bmp.UnlockHeap();
+	scanLineLength = CFbsBitmap::ScanLineLength(288,aDispMode);
+
+	for(row = 0; row < 8; row++)
+		{
+		TUint8* bmpadd=(TUint8*)bb->ScanLineAddress(base,row);
+		CheckWhite(bmpadd,scanLineLength,aDispMode);
+		}
+
+	for(row = 16; row < 32; row++)
+		{
+		TUint8* bmpadd=(TUint8*)bb->ScanLineAddress(base,row);
+		CheckWhite(bmpadd,scanLineLength,aDispMode);
+		}
+
+	for(row = 8; row < 16; row++)
+		{
+		TUint8* bmpadd=(TUint8*)bb->ScanLineAddress(base,row);
+		CheckWhite(bmpadd,blockStart,aDispMode);
+
+		TUint8* ptr = bmpadd + blockStart;
+		TUint8* ptrLimit = ptr + blockLength;
+		while (ptr < ptrLimit)
+			TEST(*ptr++ == 0);
+
+		CheckWhite(ptr,scanLineLength - blockStart - blockLength,aDispMode);
+		}
+
+	ret = bmp.Resize(KBitmapSmallSize);
+	TEST2(ret, KErrNone);
+	TEST(bmp.SizeInPixels() == KBitmapSmallSize);
+	TEST(bmp.SizeInTwips() == KBitmapSmallSize);
+
+	ret = bmp.Resize(KBitmapOriginalSize);
+	TEST2(ret, KErrNone);
+	TEST(bmp.SizeInPixels() == KBitmapOriginalSize);
+	TEST(bmp.SizeInTwips() == KBitmapOriginalSize);
+
+	bmp.Reset();
+	}
+
+void CTBitmap::CheckWhite(TUint8* aData,TInt aDataLength,TDisplayMode aDispMode)
+	{
+	TUint8* dataLimit = aData + aDataLength;
+
+	if (aDispMode != EColor4K)
+		{
+		while (aData < dataLimit)
+			TEST(*aData++ == 0xff);
+		}
+	else
+		{
+		while (aData < dataLimit)
+			{
+			TEST(*aData == 0xff || *aData == 0x0f);
+			aData++;
+			}
+		}
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0530
+
+	@SYMTestCaseDesc
+	Creates BitmapUtil objects and sets the
+	current position to different positions
+	and retrieves and sets the pixels in these
+	and compares it to another Bitmap Util object
+	
+	@SYMTestActions
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::BitmapUtil()
+	{
+	INFO_PRINTF1(_L("Test Bitmap Util"));
+
+	TSize bmpUtilSize1(256,4);
+	TSize bmpUtilSize2(256,1);
+	TSize bmpUtilSize3(256,256);
+	TSize bmpUtilSize4(1024,1024);
+
+	INFO_PRINTF1(_L("256x4.. "));
+	DoBitmapUtil(bmpUtilSize1,EGray2);
+	DoBitmapUtil(bmpUtilSize1,EGray4);
+	DoBitmapUtil(bmpUtilSize1,EGray16);
+	DoBitmapUtil(bmpUtilSize1,EGray256);
+	DoBitmapUtil(bmpUtilSize1,EColor16);
+	DoBitmapUtil(bmpUtilSize1,EColor256);
+	DoBitmapUtil(bmpUtilSize1,EColor4K);
+	DoBitmapUtil(bmpUtilSize1,EColor64K);
+	DoBitmapUtil(bmpUtilSize1,EColor16M);
+	DoBitmapUtil(bmpUtilSize1,EColor16MU);
+	DoBitmapUtil(bmpUtilSize1,EColor16MAP);
+
+	INFO_PRINTF1(_L("256x1.. "));
+	DoBitmapUtil(bmpUtilSize2,EGray2);
+	DoBitmapUtil(bmpUtilSize2,EGray4);
+	DoBitmapUtil(bmpUtilSize2,EGray16);
+	DoBitmapUtil(bmpUtilSize2,EGray256);
+	DoBitmapUtil(bmpUtilSize2,EColor16);
+	DoBitmapUtil(bmpUtilSize2,EColor256);
+	DoBitmapUtil(bmpUtilSize2,EColor4K);
+	DoBitmapUtil(bmpUtilSize2,EColor64K);
+	DoBitmapUtil(bmpUtilSize2,EColor16M);
+	DoBitmapUtil(bmpUtilSize2,EColor16MU);
+	DoBitmapUtil(bmpUtilSize2,EColor16MAP);
+
+	INFO_PRINTF1(_L("256x256..\n"));
+	DoBitmapUtil(bmpUtilSize3,EGray2);
+	DoBitmapUtil(bmpUtilSize3,EGray4);
+	DoBitmapUtil(bmpUtilSize3,EGray16);
+	DoBitmapUtil(bmpUtilSize3,EGray256);
+	DoBitmapUtil(bmpUtilSize3,EColor16);
+	DoBitmapUtil(bmpUtilSize3,EColor256);
+	DoBitmapUtil(bmpUtilSize3,EColor4K);
+	DoBitmapUtil(bmpUtilSize3,EColor64K);
+	DoBitmapUtil(bmpUtilSize3,EColor16M);
+	DoBitmapUtil(bmpUtilSize3,EColor16MU);
+	DoBitmapUtil(bmpUtilSize3,EColor16MAP);
+		
+    INFO_PRINTF1(_L("Testing wastage bytes in 16M scanlines...\n"));
+	bmpUtilSize1.SetSize(5,13);
+	bmpUtilSize2.SetSize(6,14);
+	bmpUtilSize3.SetSize(7,15);
+	bmpUtilSize4.SetSize(8,16);
+	DoBitmapUtil(bmpUtilSize1,EColor16M);
+	DoBitmapUtil(bmpUtilSize2,EColor16M);
+	DoBitmapUtil(bmpUtilSize3,EColor16M);
+	DoBitmapUtil(bmpUtilSize4,EColor16M);
+
+    /*
+	 * Test code commented out as it results in test case failure. 
+	 * Problem recorded in defect DEF001233.
+	 *
+	INFO_PRINTF1(_L("Testing wastage bits in Gray16 scanlines...\n\n"));
+	bmpUtilSize1.SetSize(4,13);
+	bmpUtilSize2.SetSize(5,14);
+	bmpUtilSize3.SetSize(6,15);
+	bmpUtilSize4.SetSize(7,16);
+	DoBitmapUtil(bmpUtilSize1,EGray16);
+	DoBitmapUtil(bmpUtilSize2,EGray16);
+	DoBitmapUtil(bmpUtilSize3,EGray16);
+	DoBitmapUtil(bmpUtilSize4,EGray16);
+	 */
+	}
+
+void CTBitmap::DoBitmapUtil(const TSize& aSize,TDisplayMode aDispMode)
+	{
+	const TPoint startPoint(aSize.iWidth / 3,aSize.iHeight / 3);
+	const TPoint zeroPoint(0,0);
+
+	CFbsBitmapEx bmp1;
+	TInt ret=bmp1.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	FillBitmap(bmp1);
+
+
+	const TInt numPixels = ((aSize.iWidth + 31) & ~0x1f) * aSize.iHeight;
+	TInt count1;
+	CFbsBitmapEx bmp2;
+
+	ret=bmp2.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+
+	TBitmapUtil util1(&bmp1);
+	util1.Begin(zeroPoint);
+	TBitmapUtil util2(&bmp2);
+	util2.Begin(zeroPoint,util1);
+
+	TPoint currentPosition;
+	for (currentPosition.iY = 0; currentPosition.iY < aSize.iHeight; currentPosition.iY++)
+		for (currentPosition.iX = 0; currentPosition.iX < aSize.iWidth; currentPosition.iX++)
+			{
+			util1.SetPos(currentPosition);
+			util2.SetPos(currentPosition);
+			TUint32 pixelData = util1.GetPixel();
+			util2.SetPixel(pixelData);
+			}
+	util1.End();
+	util2.End();
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+	bmp2.Reset();
+
+	ret=bmp2.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	util1.Begin(startPoint);
+	util2.Begin(startPoint,util1);
+	for (count1 = 0; count1 < numPixels; count1++)
+		{
+		util2.SetPixel(util1);
+		util1.IncXPos();
+		util2.IncXPos();
+		}
+	util1.End();
+	util2.End();
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+	bmp2.Reset();
+
+	ret=bmp2.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	util1.Begin(zeroPoint);
+	util2.Begin(zeroPoint,util1);
+	for (currentPosition.iX = 0; currentPosition.iX < aSize.iWidth; currentPosition.iX++)
+		{
+		for (currentPosition.iY = 0; currentPosition.iY < aSize.iHeight; currentPosition.iY++)
+			{
+			util2.SetPixel(util1);
+			util1.IncYPos();
+			util2.IncYPos();
+			}
+		util1.IncXPos();
+		util2.IncXPos();
+		}
+	util1.End();
+	util2.End();
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+	bmp2.Reset();
+
+	ret=bmp2.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	util1.Begin(startPoint);
+	util2.Begin(startPoint,util1);
+	for (count1 = 0; count1 < numPixels; count1++)
+		{
+		util2.SetPixel(util1);
+		util1.DecXPos();
+		util2.DecXPos();
+		}
+	util1.End();
+	util2.End();
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+	bmp2.Reset();
+
+	ret=bmp2.Create(aSize,aDispMode);
+	TEST2(ret, KErrNone);
+	util1.Begin(zeroPoint);
+	util2.Begin(zeroPoint,util1);
+	for (currentPosition.iX = 0; currentPosition.iX < aSize.iWidth; currentPosition.iX++)
+		{
+		for (currentPosition.iY = 0; currentPosition.iY < aSize.iHeight; currentPosition.iY++)
+			{
+			util2.SetPixel(util1);
+			util1.DecYPos();
+			util2.DecYPos();
+			}
+		util1.DecXPos();
+		util2.DecXPos();
+		}
+	util1.End();
+	util2.End();
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+	bmp2.Reset();
+
+	bmp1.Reset();
+	}
+
+void CTBitmap::BitmapTiming()
+	{
+	INFO_PRINTF1(_L("Test Timing"));
+
+	CFbsBitmap bmp;
+	TInt ret=bmp.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+
+	CDirectFileStore* writestore=NULL;
+	TRAP(ret,writestore=CDirectFileStore::ReplaceL(iFs,KTempFilename,EFileStream|EFileWrite));
+	TEST2(ret, KErrNone);
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+	TRAP(ret,writestore->SetTypeL(uidtype));
+	TEST2(ret, KErrNone);
+	RStoreWriteStream writestrm;
+	TStreamId headerid(0);
+	TRAP(ret,headerid=writestrm.CreateL(*writestore));
+	TEST2(ret, KErrNone);
+	TRAP(ret,writestore->SetRootL(headerid));
+	TEST2(ret, KErrNone);
+	INFO_PRINTF1(_L("Save time: "));
+	TUint startTime=User::TickCount();
+	for(TInt count=0;count<5000;count++)
+		{
+		TRAP(ret,bmp.ExternalizeL(writestrm));
+		if(ret) break;
+		}
+	TUint stopTime=User::TickCount();
+	TEST2(ret, KErrNone);
+	writestrm.Close();
+	delete writestore;
+	INFO_PRINTF2(_L("%d ticks\r\n"),stopTime-startTime);
+
+	CDirectFileStore* readstore=NULL;
+	TRAP(ret,readstore=CDirectFileStore::OpenL(iFs,KTempFilename,EFileStream|EFileRead));
+	TEST2(ret, KErrNone);
+	RStoreReadStream readstrm;
+	headerid=readstore->Root();
+	INFO_PRINTF1(_L("Load time: "));
+	startTime=User::TickCount();
+	for(TInt count2=0;count2<5000;count2++)
+		{
+		TRAP(ret,readstrm.OpenL(*readstore,headerid));
+		if(ret) break;
+		TRAP(ret,bmp.InternalizeL(readstrm));
+		if(ret) break;
+		readstrm.Close();
+		}
+	stopTime=User::TickCount();
+	TEST2(ret, KErrNone);
+	delete readstore;
+	INFO_PRINTF2(_L("%d ticks\r\n"),stopTime-startTime);
+
+	bmp.Reset();
+	iFs.Delete(KTempFilename);
+
+	
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0531
+
+	@SYMTestCaseDesc
+	Tries to load non existing bitmaps from the
+	Z-drive.
+
+	@SYMTestActions
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::InvalidBitmap()
+	{
+	INFO_PRINTF1(_L("Test Invalid Bitmap"));
+
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+
+	TInt ret=bmp.Load(_L("z:\\tfbsx.mbm"),ETfbs,NULL);
+	TEST2(ret, KErrNotFound);
+	ret=bmp.Load(_L("z:\\tfbs.xbm"),ETfbs,NULL);
+	TEST2(ret, KErrNotFound);
+	ret=bmp.Load(iTestBitmapName,999,NULL);
+	TEST2(ret, KErrEof);
+	ret=bmp.Load(iTestBitmapName,-1,NULL);
+	TEST2(ret, KErrEof);
+
+	bmp.Reset();
+	User::Heap().Check();
+	__UHEAP_MARKEND;
+
+	
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0532
+
+	@SYMTestCaseDesc
+	Creates bitmaps and saves them to the C-drive
+	and loads them back again and compares them to
+	the original bitmaps. 
+
+	@SYMTestActions
+	The test uses different colour depths and sizes
+	of the bitmaps. The sizes of the bitmaps are
+	large.
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::SaveAndLoad()
+	{
+	INFO_PRINTF1(_L("Test Save/Load Bitmap"));
+
+	const TInt sizes[] = { 1,2,3,4,5,7,8,9,15,16,17,31,32,33,100 };
+	const TInt numSizes = sizeof(sizes) / sizeof(TInt);
+	TSize size;
+
+	for (TInt widthIndex = 0; widthIndex < numSizes; widthIndex++)
+		{
+		INFO_PRINTF3(_L("Index %d/%d\r"), widthIndex + 1, numSizes);
+		size.iWidth = sizes[widthIndex];
+
+		for (TInt heightIndex = 0; heightIndex < numSizes; heightIndex++)
+			{
+			size.iHeight = sizes[heightIndex];
+
+			DoSaveAndLoad(size,EGray2,EFalse);
+			DoSaveAndLoad(size,EGray2,ETrue);
+			DoSaveAndLoad(size,EGray4,EFalse);
+			DoSaveAndLoad(size,EGray4,ETrue);
+			DoSaveAndLoad(size,EGray16,EFalse);
+			DoSaveAndLoad(size,EGray16,ETrue);
+			DoSaveAndLoad(size,EGray256,EFalse);
+			DoSaveAndLoad(size,EGray256,ETrue);
+			DoSaveAndLoad(size,EColor16,EFalse);
+			DoSaveAndLoad(size,EColor16,ETrue);
+			DoSaveAndLoad(size,EColor256,EFalse);
+			DoSaveAndLoad(size,EColor256,ETrue);
+			DoSaveAndLoad(size,EColor4K,EFalse);
+			DoSaveAndLoad(size,EColor4K,ETrue);
+			DoSaveAndLoad(size,EColor64K,EFalse);
+			DoSaveAndLoad(size,EColor64K,ETrue);
+			DoSaveAndLoad(size,EColor16M,EFalse);
+			DoSaveAndLoad(size,EColor16M,ETrue);
+			DoSaveAndLoad(size,EColor16MU,EFalse);
+			DoSaveAndLoad(size,EColor16MU,ETrue);
+			DoSaveAndLoad(size,EColor16MAP,EFalse);
+			DoSaveAndLoad(size,EColor16MAP,ETrue);
+			}
+		}
+
+	INFO_PRINTF1(_L("\r\n"));
+	
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0533
+
+	@SYMTestCaseDesc
+	Creates bitmaps and saves them to the C-drive
+	and loads them back again and compares them to
+	the original bitmaps. 
+
+	@SYMTestActions
+	The test uses different colour depths and sizes
+	of the bitmaps. The sizes of the bitmaps are
+	small.
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::SaveAndLoadFast()
+	{
+	INFO_PRINTF1(_L("Test Save/Load Fast Bitmap"));
+
+	// Keep this array small as the test time increases with n^2
+	// This way we can put in bigger sizes...
+	const TInt sizes[] = { 501, 107, 213 };
+	const TInt numSizes = sizeof(sizes) / sizeof(TInt);
+	TSize size;
+
+	for (TInt widthIndex = 0; widthIndex < numSizes; widthIndex++)
+		{
+		INFO_PRINTF3(_L("Index %d/%d\r"), widthIndex + 1, numSizes);
+		size.iWidth = sizes[widthIndex];
+
+		for (TInt heightIndex = 0; heightIndex < numSizes; heightIndex++)
+			{
+			size.iHeight = sizes[heightIndex];
+
+			DoSaveAndLoad(size,EGray2,EFalse);
+			DoSaveAndLoad(size,EGray2,ETrue);
+			DoSaveAndLoad(size,EGray4,EFalse);
+			DoSaveAndLoad(size,EGray4,ETrue);
+			DoSaveAndLoad(size,EGray16,EFalse);
+			DoSaveAndLoad(size,EGray16,ETrue);
+			DoSaveAndLoad(size,EGray256,EFalse);
+			DoSaveAndLoad(size,EGray256,ETrue);
+			DoSaveAndLoad(size,EColor16,EFalse);
+			DoSaveAndLoad(size,EColor16,ETrue);
+			DoSaveAndLoad(size,EColor256,EFalse);
+			DoSaveAndLoad(size,EColor256,ETrue);
+			DoSaveAndLoad(size,EColor4K,EFalse);
+			DoSaveAndLoad(size,EColor4K,ETrue);
+			DoSaveAndLoad(size,EColor64K,EFalse);
+			DoSaveAndLoad(size,EColor64K,ETrue);
+			DoSaveAndLoad(size,EColor16M,EFalse);
+			DoSaveAndLoad(size,EColor16M,ETrue);
+			DoSaveAndLoad(size,EColor16MU,EFalse);
+			DoSaveAndLoad(size,EColor16MU,ETrue);
+			DoSaveAndLoad(size,EColor16MAP,EFalse);
+			DoSaveAndLoad(size,EColor16MAP,ETrue);
+			}
+		}
+
+	INFO_PRINTF1(_L("\r\n"));
+	
+	}
+
+
+void CTBitmap::DoSaveAndLoad(const TSize& aSize,TDisplayMode aDispMode,TBool aBlank)
+	{
+	CFbsBitmapEx bmp1;
+	bmp1.Create(aSize,aDispMode);
+
+	if (aBlank)
+		BlankBitmap(bmp1);
+	else
+		FillBitmap(bmp1);
+
+	TInt ret = bmp1.Save(KTempFilename);
+	TEST2(ret, KErrNone);
+
+	CFbsBitmapEx bmp2;
+	ret = bmp2.Load(KTempFilename);
+	TEST2(ret, KErrNone);
+
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+
+	ret = bmp2.Compress();
+	TEST2(ret, KErrNone);
+
+	CompareBitmaps(bmp1,bmp2,EColor16M);
+
+	iFs.Delete(KTempFilename);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0534
+
+	@SYMTestCaseDesc
+	Compresses bitmaps to ROM and RAM
+
+	@SYMTestActions
+	Tries to compress a bitmap in ROM and expects it to fail. 
+	Compresses a bitmap in RAM and expect it to succeed. 
+	Compression tested when executed in the background.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::Compress()
+	{
+	INFO_PRINTF1(_L("Test Compression"));
+
+	CFbsBitmap bmp;
+	RFbsSession* fbs = RFbsSession::GetSession();
+	TRequestStatus rs;
+
+	if(!iSkipRomBitmapTests)
+		{
+		INFO_PRINTF1(_L("check compressing of ROM files causes error"));
+
+		TInt ret=bmp.Load(KRomBitmap,ETfbs,NULL);
+		TEST2(ret, KErrNone);
+
+		ret = bmp.Compress();
+		TEST2(ret, KErrAccessDenied); //cannot compress bitmaps in ROM
+
+		ret = bmp.CompressInBackground();
+		TEST2(ret, KErrAccessDenied); //cannot compress bitmaps in ROM
+
+		bmp.CompressInBackground(rs);
+		User::WaitForRequest(rs);
+		TEST2(rs.Int(), KErrAccessDenied); //cannot compress bitmaps in ROM
+
+		ret = bmp.Save(KTempFilename);
+		TEST2(ret, KErrNone);
+		bmp.Reset();
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		ret = bmp.Compress();
+		TEST2(ret, KErrNone);
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		ret = bmp.CompressInBackground();
+		TEST2(ret, KErrNone);
+
+		fbs->SendCommand(EFbsCompress, 0); // force background compression to execute
+
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		bmp.CompressInBackground(rs);
+		User::WaitForRequest(rs); // wait until background compression is finished
+		TEST2(rs.Int(), KErrNone);
+
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+
+		iFs.Delete(KTempFilename);
+
+		}
+
+	INFO_PRINTF1(_L("check compressing of RAM files is OK"));
+	
+		{
+		TInt ret=bmp.Load(KTestBitmapOnC,ETfbs,NULL);
+		if(ret != KErrNone)
+			{
+			INFO_PRINTF1(_L("Could not load "));
+			INFO_PRINTF1(KTestBitmapOnC);
+			INFO_PRINTF1(_L(" Ensure is it copied over and rerun test\n"));
+			User::Panic(_L(""), ret);
+			}
+		
+		ret = bmp.Compress();
+		TEST2(ret, KErrNone);
+
+		TEST(bmp.IsCompressedInRAM());
+			
+		ret = bmp.Save(KTempFilename);
+		TEST2(ret, KErrNone);
+		bmp.Reset();
+
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		ret = bmp.Compress();
+		TEST2(ret, KErrNone);
+
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		ret = bmp.CompressInBackground();
+		TEST2(ret, KErrNone);
+
+		fbs->SendCommand(EFbsCompress, 0); // force background compression to execute
+
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+
+		ret = bmp.Load(KTempFilename);
+		TEST2(ret, KErrNone);
+
+		bmp.CompressInBackground(rs);
+		fbs->SendCommand(EFbsCompress, 0); // force background compression to execute
+		User::WaitForRequest(rs);
+		TEST2(rs.Int(), KErrNone);
+
+		TEST(bmp.IsCompressedInRAM());
+		bmp.Reset();
+
+		iFs.Delete(KTempFilename);
+		}
+
+		
+		INFO_PRINTF1(_L("check compressing a created bitmap"));
+		{
+		INFO_PRINTF1(_L("1\r\n"));
+		CFbsBitmapEx bitmap;
+		TInt ret=bitmap.Create(TSize(200,200),EColor256);
+		TEST2(ret, KErrNone);
+		
+		INFO_PRINTF1(_L("2\r\n"));
+		BlankBitmap(bitmap);
+		
+		ret = bitmap.Compress();
+		TEST2(ret, KErrNone);
+		
+		INFO_PRINTF1(_L("3\r\n"));
+		
+		TEST(bitmap.IsCompressedInRAM());
+		}
+	
+	}
+
+void CTBitmap::BlankBitmap(CFbsBitmapEx& aBitmap)
+	{
+	TSize size = aBitmap.SizeInPixels();
+	TInt dataLength = CFbsBitmap::ScanLineLength(size.iWidth,aBitmap.DisplayMode()) * size.iHeight;
+	aBitmap.LockHeap();
+	Mem::FillZ((TUint8*)aBitmap.DataAddress(),dataLength);
+	aBitmap.UnlockHeap();
+	}
+
+void CTBitmap::FillBitmap(CFbsBitmapEx& aBitmap)
+	{
+	TSize size = aBitmap.SizeInPixels();
+	TInt dataLength = CFbsBitmap::ScanLineLength(size.iWidth,aBitmap.DisplayMode()) * size.iHeight;
+
+	aBitmap.LockHeap();
+	TUint8* bmpBits = (TUint8*)aBitmap.DataAddress();
+	aBitmap.UnlockHeap();
+	TUint8* bmpBitsLimit = bmpBits + dataLength;
+	TInt64 seed = aBitmap.Handle();
+
+	switch (aBitmap.DisplayMode())
+		{
+		case EColor4K:
+			Mem::FillZ(bmpBits,dataLength);
+
+			while (bmpBits < bmpBitsLimit)
+				{
+				*bmpBits++ = (TUint8)Math::Rand(seed);
+				*bmpBits++ = (TUint8)(Math::Rand(seed) & 0x0f);
+				}	
+			break;
+		case EColor16MAP:
+			while (bmpBits < bmpBitsLimit)
+				{
+				TUint32 alpha = (TUint8)Math::Rand(seed);
+				TUint32 red = 	(TUint8)Math::Rand(seed);
+				TUint32 green = (TUint8)Math::Rand(seed);
+				TUint32 blue =  (TUint8)Math::Rand(seed);
+				red = ((red * alpha)/255)&0xff;
+				green  = ((green * alpha)/255)&0xff;
+				blue = ((blue * alpha)/255)&0xff;
+				*(TUint32*)bmpBits = (alpha<<24)|(red<<16)|(green<<8)|blue;
+				bmpBits+=4;
+				}
+			break;
+		default:
+			while (bmpBits < bmpBitsLimit)
+				*bmpBits++ = (TUint8)Math::Rand(seed);
+			break;	
+		}	
+	}
+
+void CTBitmap::StripeBitmap(CFbsBitmapEx& aBitmap) // Compression friendly bitmap filling
+	{
+	TSize size = aBitmap.SizeInPixels();
+	TInt dataLength = CFbsBitmap::ScanLineLength(size.iWidth,aBitmap.DisplayMode()) * size.iHeight;
+
+	aBitmap.LockHeap();
+	TUint8* bmpBits = (TUint8*)aBitmap.DataAddress();
+	aBitmap.UnlockHeap();
+	TUint8* bmpBitsLimit = bmpBits + dataLength;
+	TInt64 seed = aBitmap.Handle();
+
+	if (aBitmap.DisplayMode() != EColor4K)
+		{
+		while (bmpBits < bmpBitsLimit)
+			{
+			TUint8* tempBmpBitsLimit = Min(bmpBitsLimit, bmpBits + (TUint8)Math::Rand(seed));
+			while (bmpBits < tempBmpBitsLimit)
+				*bmpBits++ = 0;
+			tempBmpBitsLimit = Min(bmpBitsLimit, bmpBits + (TUint8)Math::Rand(seed));
+			while (bmpBits < tempBmpBitsLimit)
+				*bmpBits++ = 0xff;
+			}
+		}
+	else
+		{
+		Mem::FillZ(bmpBits,dataLength);
+
+		while (bmpBits < bmpBitsLimit)
+			{
+			TUint8* tempBmpBitsLimit = Min(bmpBitsLimit, bmpBits + (TUint8)(Math::Rand(seed) * 2));
+			while (bmpBits < tempBmpBitsLimit)
+				{
+				*bmpBits++ = 0;
+				*bmpBits++ = 0;
+				}
+			tempBmpBitsLimit = Min(bmpBitsLimit, bmpBits + (TUint8)Math::Rand(seed));
+			while (bmpBits < tempBmpBitsLimit)
+				{
+				*bmpBits++ = 0xff;
+				*bmpBits++ = 0x0f;
+				}
+			}		
+		}
+	}
+
+void CTBitmap::CompareBitmaps(CFbsBitmapEx& aBmp1,CFbsBitmapEx& aBmp2,TDisplayMode aDispMode)
+	{
+	// We will compare bitmaps that we draw beginning at four different offsets into the bitmap
+	const TInt KTestBitmapOrigins = 4;
+	const TSize bmpSize = aBmp1.SizeInPixels();
+	TEST(bmpSize == aBmp2.SizeInPixels());
+	TInt originIndex = 0;
+	
+	// Call DoCompareBitmaps() for four different origins
+	for(TInt ii=0;ii<KTestBitmapOrigins;ii++)
+		{
+		TInt xCoord = originIndex*(bmpSize.iWidth/4);
+		TInt yCoord = originIndex*(bmpSize.iHeight/4);
+		DoCompareBitmaps(aBmp1,aBmp2,aDispMode,TPoint(xCoord, yCoord), bmpSize);
+		originIndex++;
+		}
+	}
+	
+void CTBitmap::DoCompareBitmaps(CFbsBitmapEx& aBmp1,CFbsBitmapEx& aBmp2,TDisplayMode aDispMode, TPoint aLineOrigin, TSize aBmpSize)
+	{
+	// Compares two bitmaps line by line
+	const TInt KBitmapWidth = aBmpSize.iWidth;
+	const TInt KStartRow = aLineOrigin.iY;
+	const TInt KBitmapHeight = aBmpSize.iHeight;
+	
+	HBufC8* buf1 = HBufC8::NewMax(KBitmapWidth * 4);
+	HBufC8* buf2 = HBufC8::NewMax(KBitmapWidth * 4);
+	TEST(buf1 && buf2);
+
+	TPtr8 des1(buf1->Des());
+	TPtr8 des2(buf2->Des());
+	
+	for (TInt row = KStartRow; row < KBitmapHeight; row++) 
+		{
+		aBmp1.GetScanLine(des1,aLineOrigin,KBitmapWidth,aDispMode); 
+		aBmp2.GetScanLine(des2,aLineOrigin,KBitmapWidth,aDispMode);
+
+		const TInt ret = des1.Compare(des2);
+		if (ret!=0)
+			{
+			 INFO_PRINTF2(_L("Bitmap comparison failed, row %d differernt!\n"), row);
+			 aBmp1.Save(KFail1Filename);
+			 aBmp2.Save(KFail2Filename);
+			}
+		TEST(ret == 0);
+		}
+
+	delete buf1;
+	delete buf2;
+	}
+
+void CTBitmap::CopyBitmap(CFbsBitmapEx& aBmp1,const CFbsBitmapEx& aBmp2)
+	{
+	TSize bmp1size = aBmp1.SizeInPixels();
+	TSize bmp2size = aBmp2.SizeInPixels();
+	TInt bmp1dataLength = CFbsBitmap::ScanLineLength(bmp1size.iWidth,aBmp1.DisplayMode()) * bmp1size.iHeight;
+	TInt bmp2dataLength = CFbsBitmap::ScanLineLength(bmp2size.iWidth,aBmp2.DisplayMode()) * bmp2size.iHeight;
+	TEST(bmp1dataLength == bmp2dataLength);
+	aBmp1.LockHeap();
+	TUint32* bmp1Bits = aBmp1.DataAddress();
+	aBmp1.UnlockHeap();
+	aBmp2.LockHeap();
+	TUint32* bmp2Bits = aBmp2.DataAddress();
+	aBmp2.UnlockHeap();
+	Mem::Copy((TUint8*)bmp1Bits,(TUint8*)bmp2Bits,bmp1dataLength);
+	}
+
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0535
+
+	@SYMTestCaseDesc
+	Loads and copies bitmaps and does a
+	fuzzy compare on the bitmaps using 
+	scan lines
+
+	@SYMTestActions
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::Color256BitmapUtil()
+	{
+	INFO_PRINTF1(_L("Test CFbsColor256BitmapUtil"));
+
+	CFbsBitmapEx bmpRefDitherFs;
+	TInt ret=bmpRefDitherFs.Load(_L("z:\\system\\data\\8bitDitherFS.mbm"));
+	TEST2(ret, KErrNone);
+
+	CFbsBitmapEx bmpRefNoDither;
+	ret=bmpRefNoDither.Load(_L("z:\\system\\data\\8bitNoDither.mbm"));
+	TEST2(ret, KErrNone);
+
+	TSize size = bmpRefNoDither.SizeInPixels();
+
+	CFbsColor256BitmapUtil* util = NULL;
+	TRAP(ret, util=CFbsColor256BitmapUtil::NewL(NULL));
+	TEST2(ret, KErrNone);
+
+	CFbsBitmapEx bmp2;
+	ret = bmp2.Create(size,EColor256);
+	TEST2(ret, KErrNone);
+
+	CFbsBitmapEx bmp1;
+
+	INFO_PRINTF1(_L("EColor256 "));
+
+	ret = util->CopyBitmap(&bmp2,&bmpRefNoDither,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefNoDither,bmp2,EColor16M);
+	ret = util->CopyBitmap(&bmp2,&bmpRefDitherFs,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefDitherFs,bmp2,EColor16M);
+
+	INFO_PRINTF1(_L("EColor4K "));
+
+	ret=bmp1.Load(_L("z:\\system\\data\\12bit.mbm"));
+	TEST2(ret, KErrNone);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefNoDither,bmp2,EColor16M);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	FuzzyCompareBitmapsColor256(bmpRefNoDither,bmp2,23);
+
+	INFO_PRINTF1(_L("EColor64K "));
+
+	ret=bmp1.Load(_L("z:\\system\\data\\16bit.mbm"));
+	TEST2(ret, KErrNone);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefNoDither,bmp2,EColor16M);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	FuzzyCompareBitmapsColor256(bmpRefNoDither,bmp2,28);
+
+	INFO_PRINTF1(_L("EColor16M\r\n"));
+
+	ret=bmp1.Load(_L("z:\\system\\data\\24bit.mbm"));
+	TEST2(ret, KErrNone);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefNoDither,bmp2,EColor16M);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	FuzzyCompareBitmapsColor256(bmpRefNoDither,bmp2,32);
+
+	INFO_PRINTF1(_L("EColor16MU\r\n"));
+
+	ret=bmp1.Load(_L("z:\\system\\data\\32bit.mbm"));
+	TEST2(ret, KErrNone);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	CompareBitmaps(bmpRefNoDither,bmp2,EColor16M);
+	ret = util->CopyBitmap(&bmp2,&bmp1,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	FuzzyCompareBitmapsColor256(bmpRefNoDither,bmp2,32);
+	
+	CFbsBitmapEx bmp3;
+	ret = bmp3.Create(size,EColor16MAP);
+	TEST2(ret, KErrNone);
+	CopyBitmap(bmp3,bmp1);
+	TEST2(ret, KErrNone);
+	ret = util->CopyBitmap(&bmp2,&bmp3,CFbsColor256BitmapUtil::ENoDither);
+	TEST2(ret, KErrNone);
+	//Do not compare bitmaps since there is no reference EColor16MAP image
+	//CompareBitmaps(bmpRefNoDither,bmp2,EColor16M); - testing ensures that
+	//copying succeeds, not accuracy
+	ret = util->CopyBitmap(&bmp2,&bmp3,CFbsColor256BitmapUtil::EFloydSteinberg);
+	TEST2(ret, KErrNone);
+	//Do not compare bitmaps since there is no reference EColor16MAP image
+	//FuzzyCompareBitmapsColor256(bmpRefNoDither,bmp2,32); - testing ensures that
+	//copying succeeds, not accuracy
+	bmp3.Reset();	
+
+//	bmp2.Save(_L("c:\\8bitSaved.mbm"));
+
+	bmp1.Reset();
+	bmp2.Reset();
+	bmpRefNoDither.Reset();
+	bmpRefDitherFs.Reset();
+	delete util;
+
+	
+	}
+
+void CTBitmap::FuzzyCompareBitmapsColor256(CFbsBitmapEx& aBmp1,CFbsBitmapEx& aBmp2,TUint aDifLimit)
+	{
+	TSize bmp1size = aBmp1.SizeInPixels();
+	TSize bmp2size = aBmp2.SizeInPixels();
+	TInt bmp1dataLength = CFbsBitmap::ScanLineLength(bmp1size.iWidth,aBmp1.DisplayMode()) * bmp1size.iHeight;
+	TInt bmp2dataLength = CFbsBitmap::ScanLineLength(bmp2size.iWidth,aBmp2.DisplayMode()) * bmp2size.iHeight;
+	TEST(bmp1dataLength == bmp2dataLength);
+	aBmp1.LockHeap();
+	TUint8* bmp1Bits = (TUint8*)aBmp1.DataAddress();
+	aBmp1.UnlockHeap();
+	aBmp2.LockHeap();
+	TUint8* bmp2Bits = (TUint8*)aBmp2.DataAddress();
+	aBmp2.UnlockHeap();
+
+	TUint totalDifference = 0;
+	TUint difference = 0;
+	while(bmp1dataLength--)
+		{
+		difference = TRgb::Color256((TUint)*(bmp1Bits++)).Difference(TRgb::Color256((TUint)*(bmp2Bits++)));
+		totalDifference+=difference;
+		}
+	TUint avDif = totalDifference/bmp2dataLength;
+	TEST(avDif<=aDifLimit);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0536
+
+	@SYMTestCaseDesc
+	Creates a hardware bitmap with a size and 
+	display mode for different display modes. 
+
+	@SYMTestActions
+	It checks some bitmap attributes, bitmapHandle,
+	if it is a large bitmap and if the bitmap is in ROM.
+	Creates a 'normal' bitmap with the same size as the 
+	hardware one. Checks it can write to the hardware 
+	bitmap. Checks reuse of a CFbsBitmap for mixture of 
+	hardware and normal bitmaps works.
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::HardwareBitmaps()
+	{
+	static const TDisplayMode modes[] =
+		{
+		EGray2,
+		EGray4,
+		EGray16,
+		EGray256,
+		EColor16,
+		EColor256,
+		EColor64K,
+		EColor16M,
+		EColor16MU,
+		EColor4K,
+		EColor16MAP,
+		ENone
+		};
+
+	INFO_PRINTF1(_L("Test Hardware Bitmaps"));
+
+	CFbsBitmapEx bitmap1;
+	// Large bitmap threshold increased from 4K to 64K
+	TSize size(300,300);
+	TDisplayMode displayMode;
+
+	// Try and find a display mode that hardware bitmaps support
+	TInt ret = KErrNotSupported;
+	TInt i=0;
+	while((displayMode=modes[i])!=ENone)
+		{
+		ret = bitmap1.CreateHardwareBitmap(size,displayMode,TUid::Uid(0));
+		if(ret!=KErrNotSupported)
+			{
+			TEST2(ret, KErrNone);
+			break;
+			}
+		i++;
+		}
+
+	if(ret==KErrNotSupported)
+		{
+		// Hardware bitmaps not supported on this device
+		WARN_PRINTF1(_L("...Not Supported"));
+		return;
+		}
+
+	// Check some bitmap attributes
+	TEST(bitmap1.HardwareBitmapHandle()!=NULL);
+	TEST(!bitmap1.IsLargeBitmap());
+	TEST(!bitmap1.IsRomBitmap());
+
+	// Create a 'normal' bitmap the same size as the hardware one
+	CFbsBitmapEx bitmap2;
+	ret = bitmap2.Create(size,displayMode);
+	TEST2(ret, KErrNone);
+	TEST(bitmap2.HardwareBitmapHandle()==NULL);
+	TEST(bitmap2.IsLargeBitmap());
+
+	// Check we can write to the hardware bitmap OK
+	FillBitmap(bitmap1);
+	CopyBitmap(bitmap1,bitmap2);
+	CompareBitmaps(bitmap1,bitmap2,EColor16M);
+
+	// Discard hardware bitmap
+	bitmap1.Reset();
+
+	// Check reuse of a CFbsBitmap for mixture of hardware and normal bitmaps works
+	ret = bitmap2.CreateHardwareBitmap(size,displayMode,TUid::Uid(0));
+	TEST2(ret, KErrNone);
+	ret = bitmap2.Create(TSize(10,10),displayMode);
+	TEST2(ret, KErrNone);
+	ret = bitmap2.CreateHardwareBitmap(size,displayMode,TUid::Uid(0));
+	TEST2(ret, KErrNone);
+	ret = bitmap2.Create(size,displayMode);
+	TEST2(ret, KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0537
+
+	@SYMTestCaseDesc
+	GetScanLine test
+	
+	@SYMDEF INC036062
+
+	@SYMTestActions
+	For each possible display mode it creates a test bitmap
+	and initialize it with the data from the gray bitmap.
+	Then for each possible display mode it calls GetScanLine 
+	on the gray and	test bitmaps and compares the lines.
+		
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::INC036062L()
+//INC036062  -  Optimise masked bitblit for 1 bit greyscale mask case 
+	{
+	INFO_PRINTF1(_L("INC036062"));
+	TDisplayMode displayMode[] = 
+		{
+		EGray2, EGray4, EGray16, EGray256, EColor16, EColor256, 
+		EColor64K, EColor16M, EColor4K, EColor16MU, EColor16MAP
+		};
+	//Two EGray2 test bitmaps with sizes (11, 11) and (121, 121).
+	TSize size[] = 
+		{
+		TSize(11, 11), TSize(121, 121)
+		};
+	//Masks for for the last scanline byte (probably partially initialized)
+	TUint8 mask[sizeof(size)/sizeof(size[0])][sizeof(displayMode)/sizeof(displayMode[0])] = 
+		{
+		//EGray2 EGray4 EGray16 EGray256 EColor16 EColor256 EColor64K EColor16M EColor4K EColor16MU
+		{0x07,   0x3F,  0x0F,   0xFF,    0x0F,    0xFF,     0xFF,     0xFF,     0x0F,    0xFF},
+		{0x01,   0x03,  0x0F,   0xFF,    0x0F,    0xFF,     0xFF,     0xFF,     0x0F,    0xFF}
+		};
+	for(TInt i=0;i<TInt(sizeof(size)/sizeof(size[0]));i++)
+		{
+		//Create EGray2 bitmap
+		CFbsBitmap* bmp = CreateBitmapLC(size[i], EGray2);
+		//GetScanLine test - for each possible display mode: create a test bitmap
+		//and initialize it with the data from the gray bitmap.
+		//After that: for each possible display mode - call GetScanLine on the gray and
+		//test bitmaps and compare the lines.
+		for(TInt m=0;m<TInt(sizeof(displayMode)/sizeof(displayMode[0]));m++)
+			{
+			HBufC8* row1 = HBufC8::NewLC(1000);
+			TPtr8 prow1 = row1->Des();
+			HBufC8* row2 = HBufC8::NewLC(1000);
+			TPtr8 prow2 = row2->Des();
+			//Create test bitmap
+			CFbsBitmap* tbmp = CreateBitmapLC(size[i], displayMode[m], bmp);
+			//Check test bitmap
+			for(TInt m2=0;m2<TInt(sizeof(displayMode)/sizeof(displayMode[0]));m2++)
+				{
+				for(TInt y=0;y<size[i].iHeight;y++)
+					{
+					bmp->GetScanLine(prow1, TPoint(0, y), size[i].iWidth, displayMode[m2]);
+					tbmp->GetScanLine(prow2, TPoint(0, y), size[i].iWidth, displayMode[m2]);
+					TInt len = prow1.Length();
+					TEST(len == prow2.Length());
+					TEST(len > 0);
+					TUint8 b1 = prow1[len - 1];
+					TUint8 b2 = prow2[len - 1];
+					if(mask[i][m2] != 0xFF)
+						{//Not all bits from the last byte are used.
+						TEST((b1 & mask[i][m2]) == (b2 & mask[i][m2]));
+						prow1.SetLength(len - 1);
+						prow2.SetLength(len - 1);
+						}
+					TEST(prow1 == prow2);
+					}//end of - for(TInt y=0;y<size[i].iHeight;y++)
+				}//end of - for(TInt m2=0;m2<(sizeof(displayMode)/sizeof(displayMode[0]));m2++)
+			CleanupStack::PopAndDestroy(tbmp);
+			CleanupStack::PopAndDestroy(row2);
+			CleanupStack::PopAndDestroy(row1);
+			}//end of - for(TInt m=0;m<(sizeof(displayMode)/sizeof(displayMode[0]));m++)
+		CleanupStack::PopAndDestroy(bmp);
+		}//end of - for(TInt i=0;i<(sizeof(size)/sizeof(size[0]));i++)
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0538
+
+	@SYMTestCaseDesc
+	Performance test of INC036062 (GetScanLine test)
+
+	@SYMDEF INC036062
+
+	@SYMTestActions
+		
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::PerformanceTest_INC036062L()
+//INC036062  -  Optimise masked bitblit for 1 bit greyscale mask case 
+	{
+	INFO_PRINTF1(_L("INC036062-Performance Test"));
+	TSize size(143, 143);
+	//Create EGray2 bitmap
+	CFbsBitmap* bmpGray2 = CreateBitmapLC(size, EGray2);
+	//Create EColor64 bitmap
+	CFbsBitmap* bmpEColor64 = CreateBitmapLC(size, EColor64K);
+	//Performance test
+	TDisplayMode displayMode[] = 
+		{
+		EGray2, EGray4, EGray16, EGray256, EColor16, EColor256, 
+		EColor64K, EColor16M, EColor4K, EColor16MU, EColor16MAP
+		};
+	TInt i;
+	HBufC8* row = HBufC8::NewLC(1000);
+	TPtr8 prow = row->Des();
+	for(TInt m=0;m<TInt(sizeof(displayMode)/sizeof(displayMode[0]));m++)
+		{
+		TUint time[2] = {0, 0};
+		CFbsBitmap* pbmp[2] = {bmpGray2, bmpEColor64};
+		for(TInt j=0;j<2;j++)
+			{
+			time[j] = User::TickCount();
+			for(i=0;i<200;i++)
+				{
+				for(TInt y=0;y<size.iHeight;y++)
+					{
+					pbmp[j]->GetScanLine(prow, TPoint(0, y), size.iWidth, displayMode[m]);
+					}
+				}
+			time[j] = User::TickCount() - time[j];
+			}
+		//"Time+" - time with optimized GetScanLine for EGray2 bitmaps
+		//"Time-" - time with GetScanLine for all bitmaps which colour is not EGray2.
+		INFO_PRINTF4(_L("GetScanLine. Mode=%d, Time+ =%d, Time- =%d\r\n"), displayMode[m], time[0], time[1]);
+		}
+	CleanupStack::PopAndDestroy(row);
+	CleanupStack::PopAndDestroy(bmpEColor64);
+	CleanupStack::PopAndDestroy(bmpGray2);
+	}
+
+CFbsBitmap* CTBitmap::CreateBitmapLC(const TSize& aSize, TDisplayMode aMode)
+	{
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	User::LeaveIfError(bmp->Create(aSize, aMode));
+	//Initialize the bitmap
+	TBitmapUtil bmpUtil(bmp);
+	bmpUtil.Begin(TPoint(0, 0));
+	for(TInt y=0;y<aSize.iHeight;bmpUtil.IncYPos(),y++)
+		{
+		for(TInt x=0;x<aSize.iWidth;bmpUtil.IncXPos(),x++)
+			{
+			TUint32 color = 0;
+			switch(aMode)
+				{
+				case EGray2:
+					color = Math::Random() % 2;
+					break;
+				case EColor64K:
+					color = Math::Random() % 0x10000;
+					break;
+				case EColor16MA:
+					color = Math::Random();
+					break;
+				default:
+					break;
+				}
+			bmpUtil.SetPixel(color);
+			}
+		}
+	bmpUtil.End();
+	return bmp;
+	}
+
+CFbsBitmap* CTBitmap::CreateBitmapLC(const TSize& aSize, TDisplayMode aMode, const CFbsBitmap* aSrcBmp)
+	{
+	CFbsBitmap* tbmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(tbmp);
+	User::LeaveIfError(tbmp->Create(aSize, aMode));
+	//Initialize test bitmap
+	HBufC8* row = HBufC8::NewLC(1000);
+	TPtr8 prow = row->Des();
+	for(TInt y=0;y<aSize.iHeight;y++)
+		{
+		aSrcBmp->GetScanLine(prow, TPoint(0, y), aSize.iWidth, aMode);
+		tbmp->SetScanLine(prow, y);
+		}
+	CleanupStack::PopAndDestroy(row);
+	return tbmp;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0539
+
+	@SYMTestCaseDesc
+	Loads bitmaps from ROM and RAM
+	and does a GetScanLine on the bitmaps
+	and measures the time it takes to do
+	the GetScanLine.
+	
+	@SYMDEF INC037474
+	
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::INC037474L()
+//INC037474 - SS66 - CBitwiseBitmap::GenerateLineFromCompressedSixteenBitData() is very slow
+	{
+	TPtrC bmpFile[] =
+		{
+		KBmpCompr12(),
+		KBmpCompr16(),
+		KBmpCompr24(),
+		KBmpCCompr12(),
+		KBmpCCompr16(),
+		KBmpCCompr24()
+		};
+	TPtrC tt[] = {_L("rom"), _L("rom"), _L("rom"), _L("ram"), _L("ram"), _L("ram")};
+	TBool inRam[] = {EFalse, EFalse, EFalse, ETrue, ETrue, ETrue};
+	TInt bpp[] = {12, 16, 24, 12, 16, 24};
+	TDisplayMode targetMode[] = {EColor4K, EColor64K, EColor16M, EColor4K, EColor64K, EColor16M};
+	const TInt KMaxScanLineLen = 800;
+	TBuf8<KMaxScanLineLen> scanLineBuf;
+	for(TInt i=0;i<TInt(sizeof(bmpFile)/sizeof(bmpFile[0]));i++)
+		{
+		if(iSkipRomBitmapTests && !inRam[i])
+			continue;
+		
+		CFbsBitmap* bmp = LoadBitmapLC(bmpFile[i]);
+		if(inRam[i])
+			{
+			User::LeaveIfError(bmp->Compress());
+			}
+		//
+		TDesC& des = tt[i];
+		INFO_PRINTF3(_L("%d bpp %S compressed bitmap, GetScanLine test\r\n"), bpp[i], &des);
+		TSize size = bmp->SizeInPixels();
+		TEST(TInt(size.iWidth * sizeof(TInt16)) <= KMaxScanLineLen);
+		TUint timeStart = User::TickCount();
+		enum {KTestTimes = 15};//Greater KTestTimes values make the test is too slow!
+		for(TInt j=0;j<KTestTimes;j++) 
+			{
+			TPoint startPixel(0, 0);
+			for(TInt k=0;k<size.iHeight;k++)
+				{
+				startPixel.iY = k;
+				bmp->GetScanLine(scanLineBuf, startPixel, size.iWidth, targetMode[i]);
+				}
+			}
+		TUint timeEnd = User::TickCount();
+		INFO_PRINTF4(_L("%d bpp %S compressed bitmap, time = %d\r\n"), bpp[i], &des, timeEnd - timeStart);
+		//
+		CleanupStack::PopAndDestroy(bmp);
+		}
+	}
+
+CFbsBitmap* CTBitmap::LoadBitmapLC(const TDesC& aFileName)
+	{
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt err = bmp->Load(aFileName, 0);
+	TEST(err == KErrNone);
+	User::LeaveIfError(err);
+	return bmp;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0540
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF038286.
+	
+	@SYMDEF DEF038286
+
+	@SYMTestActions
+	Initialized a test bitmap, compresses it
+	and performs a GetScanLine on the compressed
+	bitmap. Checks the color value against an
+	expected value.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF038286L()
+//DEF038286 - CBitwiseBitmap::GenerateLineFromCompressedSixteenBitData returns wrong clr value	
+	{
+	INFO_PRINTF1(_L("DEF038286 fix test"));
+	//Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 16;
+	const TSize size(width, 1);
+	User::LeaveIfError(bmp->Create(size, EColor64K));
+	//Test bitmap data
+	TUint8 colorVal[width * 2] = 
+	//	 0          1          2          3          4          5          6          7
+		{0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
+	//	 8          9          10         11         12         13         14         15
+	     0x00,0x00, 0x00,0x00, 0x00,0x00, 0xFF,0xFF, 0xFF,0xFF, 0xFF,0xFF, 0xFF,0xFF, 0xFF,0xFF};
+	//Initialize test bitmap
+	TPtr8 ptr(colorVal, width * 2, width * 2);
+	bmp->SetScanLine(ptr, 0);
+	//Compress test bitmap
+	User::LeaveIfError(bmp->Compress());
+	//Check the test data
+	TUint8 colorVal2[width * 2];
+	TPtr8 ptr2(colorVal2, width * 2, width * 2);
+	//test 1
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(10, 0), 2, EColor64K);
+	TEST(colorVal2[0] == colorVal[10 * 2] && colorVal2[1] == colorVal[10 * 2 + 1] &&
+		  colorVal2[2] == colorVal[11 * 2] && colorVal2[3] == colorVal[11 * 2 + 1]);
+	//test 2
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(10, 0), 1, EColor64K);
+	TEST(colorVal2[0] == colorVal[10 * 2] && colorVal2[1] == colorVal[10 * 2 + 1]);
+	//test 3
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(11, 0), 1, EColor64K);
+	TEST(colorVal2[0] == colorVal[11 * 2] && colorVal2[1] == colorVal[11 * 2 + 1]);
+
+	//Destroy test bitmap and data
+	CleanupStack::PopAndDestroy(bmp);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0541
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF038286.
+	
+	@SYMDEF DEF038286
+
+	@SYMTestActions
+	Initialized a test bitmap, compresses it
+	and performs a GetScanLine on the compressed
+	bitmap. Checks the colour value against an
+	expected value.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF038286_2L()
+//DEF038286 - CBitwiseBitmap::GenerateLineFromCompressedSixteenBitData returns wrong clr value
+//24 bpp bitmap test
+	{
+	INFO_PRINTF1(_L("DEF038286 fix test. 24 bpp bitmap."));
+	//Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 16;
+	const TSize size(width, 1);
+	User::LeaveIfError(bmp->Create(size, EColor16M));
+	//Test bitmap data
+	TUint8 colorVal[width * 3] = 
+	//	 0               1               2               3               4               5               6			     7
+		{0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
+	//	 8               9               10              11              12              13              14              15
+	     0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF};
+	//Initialize test bitmap
+	TPtr8 ptr(colorVal, width * 3, width * 3);
+	bmp->SetScanLine(ptr, 0);
+	//Compress test bitmap
+	User::LeaveIfError(bmp->Compress());
+	//Check the test data
+	TUint8 colorVal2[width * 3];
+	TPtr8 ptr2(colorVal2, width * 3, width * 3);
+	//test 1
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = colorVal2[4] = colorVal2[5] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(10, 0), 2, EColor16M);
+	TEST(colorVal2[0] == colorVal[10 * 3] && colorVal2[1] == colorVal[10 * 3 + 1] && colorVal2[2] == colorVal[10 * 3 + 2] &&
+		  colorVal2[3] == colorVal[11 * 3] && colorVal2[4] == colorVal[11 * 3 + 1] && colorVal2[5] == colorVal[11 * 3 + 2]);
+	//test 2
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = colorVal2[4] = colorVal2[5] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(10, 0), 1, EColor16M);
+	TEST(colorVal2[0] == colorVal[10 * 3] && colorVal2[1] == colorVal[10 * 3 + 1] && colorVal2[2] == colorVal[10 * 3 + 2]);
+	//test 3
+	colorVal2[0] = colorVal2[1] = colorVal2[2] = colorVal2[3] = colorVal2[4] = colorVal2[5] = 0x12;
+	bmp->GetScanLine(ptr2, TPoint(11, 0), 1, EColor16M);
+	TEST(colorVal2[0] == colorVal[11 * 3] && colorVal2[1] == colorVal[11 * 3 + 1] && colorVal2[2] == colorVal[11 * 3 + 2]);
+
+	//Destroy test bitmap and data
+	CleanupStack::PopAndDestroy(bmp);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0542
+
+	@SYMTestCaseDesc
+	Tests the function CFbsBitmap::IsMonochrome()
+
+	@SYMTestActions
+	Loads uncompressed bitmaps and checks
+	them if they are monochrome
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::MonohromeL()
+	{
+	INFO_PRINTF1(_L("Monohrome bitmaps"));
+	TPtrC bitmap_ram[] = 
+		{
+		KMono_M1(),
+		KMono_M2(),
+		KMono_M4(),
+		KMono_M8(),
+		KMono_C4(),
+		KMono_C8(),
+		KMono_C12(),
+		KMono_C16(),
+		KMono_C24(),
+		KMono_C32()
+		};
+	TInt i;
+	//Check monohrome bitmaps
+	//1 bpp bitmap is always monochrome
+	for(i=0;i<TInt(sizeof(bitmap_ram)/sizeof(bitmap_ram[0]));i++)
+		{
+		CFbsBitmap* uncompressedBitmap = NULL;
+		LoadAndNotCompressBitmapLC(uncompressedBitmap, bitmap_ram[i]);
+		TEST(!uncompressedBitmap->IsCompressedInRAM());
+		TBool monochrome = uncompressedBitmap->IsMonochrome();
+		TEST(monochrome);
+		CleanupStack::PopAndDestroy(uncompressedBitmap);
+		}
+	//Modify monohrome bitmaps and check them
+	//1 bpp bitmap is always monochrome
+	for(i=0;i<TInt(sizeof(bitmap_ram)/sizeof(bitmap_ram[0]));i++)
+		{
+		CFbsBitmap* uncompressedBitmap = NULL;
+		LoadAndNotCompressBitmapLC(uncompressedBitmap, bitmap_ram[i]);
+		TEST(!uncompressedBitmap->IsCompressedInRAM());
+		//Change something into the bitmap data
+		uncompressedBitmap->LockHeap(ETrue);
+		TUint32* data = uncompressedBitmap->DataAddress();
+		*data = 0x12345678;
+		uncompressedBitmap->UnlockHeap(ETrue);
+		//Check the bitmap
+		TBool monochrome = uncompressedBitmap->IsMonochrome();
+		TEST(i > 0 ? !monochrome : monochrome);
+		CleanupStack::PopAndDestroy(uncompressedBitmap);
+		}
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0543
+
+	@SYMTestCaseDesc
+	Tests the function CFbsBitmap::GetVerticalScanLine
+
+	@SYMTestActions
+	Gets the bitmap's vertical scanline starting at 
+	a specified x co-ordinate.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::GetVerticalScanLineL()
+	{
+	INFO_PRINTF1(_L("GetVerticalScanLine()"));
+	TDisplayMode displayMode[] = 
+		{
+		EGray2,
+		EGray4,
+		EGray16,
+		EGray256,
+		EColor16,
+		EColor256,
+		EColor64K,
+		EColor16M,
+		ERgb,
+		EColor4K,
+		EColor16MU,
+		EColor16MAP,
+		};
+	CFbsBitmap* uncompressedBitmap = NULL;
+	LoadAndNotCompressBitmapLC(uncompressedBitmap, KRamBitmap2);
+	TEST(!uncompressedBitmap->IsCompressedInRAM());
+	TSize sizeInPixels = uncompressedBitmap->SizeInPixels();
+	HBufC8* vertScanLine = HBufC8::NewLC(sizeInPixels.iHeight * 4);
+	TPtr8 p = vertScanLine->Des();
+	TDes8& des = p;
+	for(TInt i=0;i<TInt(sizeof(displayMode)/sizeof(displayMode[0]));i++)
+		{
+		TBuf<80> buf;
+		buf.Format(_L("--mode=%d\r\n"), displayMode[i]);
+		INFO_PRINTF1(buf);
+		for(TInt j=0;j<sizeInPixels.iWidth;j++)
+			{
+			uncompressedBitmap->GetVerticalScanLine(des, j, displayMode[i]);
+			}
+		}
+	CleanupStack::PopAndDestroy(vertScanLine);
+	CleanupStack::PopAndDestroy(uncompressedBitmap);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0544
+	
+	@SYMTestCaseDesc
+	Tests the performance of the function 
+	CFbsBitmap::GetVerticalScanLine
+
+	@SYMTestActions
+	Gets the bitmap's vertical scanline starting at 
+	a specified x co-ordinate and measures the time
+	it takes.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::GetVerticalScanLinePerformanceL()
+	{
+	INFO_PRINTF1(_L("GetVerticalScanLine() performance"));
+	TDisplayMode displayMode[] = 
+		{
+		EGray2,
+		EGray4,
+		EGray16,
+		EGray256,
+		EColor16,
+		EColor256,
+		EColor64K,
+		EColor16M,
+		ERgb,
+		EColor4K,
+		EColor16MU,
+		EColor16MAP
+		};
+	CFbsBitmap* uncompressedBitmap = NULL;
+	LoadAndNotCompressBitmapLC(uncompressedBitmap, KRamBitmap2);
+	TEST(!uncompressedBitmap->IsCompressedInRAM());
+	TSize sizeInPixels = uncompressedBitmap->SizeInPixels();
+	HBufC8* vertScanLine = HBufC8::NewLC(sizeInPixels.iHeight * 4);
+	TPtr8 p = vertScanLine->Des();
+	TDes8& des = p;
+	TUint time;
+	for(TInt i=0;i<TInt(sizeof(displayMode)/sizeof(displayMode[0]));i++)
+		{
+		time = User::TickCount();
+		for(TInt j=0;j<sizeInPixels.iWidth;j++)
+			{
+			uncompressedBitmap->GetVerticalScanLine(des, j, displayMode[i]);
+			}
+		INFO_PRINTF3(_L("Vert. line. Mode=%d, Time=%d\r\n"), displayMode[i], User::TickCount() - time);
+		}
+	CleanupStack::PopAndDestroy(vertScanLine);
+	CleanupStack::PopAndDestroy(uncompressedBitmap);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0545
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF071843
+	
+	@SYMDEF DEF071843
+	
+	@SYMTestActions
+	Creates a test bitmap. Initializes it 
+	with test data using SetScanLine. Saves 
+	bitmap and then reloads it and compares 
+	it against expected bitmap.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF071843_16MAL()
+	{
+	INFO_PRINTF1(_L("DEF071843 fix test. Saving and loading 16MA 32bpp bitmap."));
+	// Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 12;
+	const TSize size(width, 8);
+	User::LeaveIfError(bmp->Create(size, EColor16MA));
+
+	//Test bitmap data - 8 rows of 12 pixels each containing various run lengths
+	TUint8 colorVal0[width * 4] =  // runs: 12
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0};
+	TUint8 colorVal1[width * 4] =  // runs: 1 1 1 1 1 1 1 1 1 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8,  9,9,9,9,  10,10,10,10,  11,11,11,11};
+	TUint8 colorVal2[width * 4] =  // runs: 1 1 2 1 1 3 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8};
+	TUint8 colorVal3[width * 4] =   // runs: 1 2 1 3 1 4
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  1,1,1,1,  2,2,2,2,  3,3,3,3,  3,3,3,3,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal4[width * 4] =   // runs: 2 1 2 2 2 3
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  3,3,3,3,  3,3,3,3,  4,4,4,4,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal5[width * 4] =   // runs: 3 1 3 2 3
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  2,2,2,2,  3,3,3,3,  3,3,3,3,  4,4,4,4,  4,4,4,4,  4,4,4,4};
+	TUint8 colorVal6[width * 4] =   // runs: 4 1 1 1 1 4
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal7[width * 4] =   // runs: 1 1 1 1 4 1 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  4,4,4,4,  4,4,4,4,  4,4,4,4,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8};
+
+	//Initialize test bitmap
+	TPtr8 line0(colorVal0, width * 4, width * 4);
+	bmp->SetScanLine(line0, 0);
+	TPtr8 line1(colorVal1, width * 4, width * 4);
+	bmp->SetScanLine(line1, 1);
+	TPtr8 line2(colorVal2, width * 4, width * 4);
+	bmp->SetScanLine(line2, 2);
+	TPtr8 line3(colorVal3, width * 4, width * 4);
+	bmp->SetScanLine(line3, 3);
+	TPtr8 line4(colorVal4, width * 4, width * 4);
+	bmp->SetScanLine(line4, 4);
+	TPtr8 line5(colorVal5, width * 4, width * 4);
+	bmp->SetScanLine(line5, 5);
+	TPtr8 line6(colorVal6, width * 4, width * 4);
+	bmp->SetScanLine(line6, 6);
+	TPtr8 line7(colorVal7, width * 4, width * 4);
+	bmp->SetScanLine(line7, 7);
+
+	// Save bitmap then reload and compare
+	_LIT(KTest16MABmpFile, "c:\\test16ma.mbm");
+	bmp->Save(KTest16MABmpFile);	
+	//
+	CFbsBitmap* bmp2 = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp2);
+	TInt err = bmp2->Load(KTest16MABmpFile);
+	TEST2(err, KErrNone);
+	//
+	CompareBitmaps((CFbsBitmapEx&)*bmp, (CFbsBitmapEx&)*bmp2,EColor16MA);
+	
+	// Destroy test bitmaps
+	CleanupStack::PopAndDestroy(2, bmp); // bmp2
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0546
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF071843
+	
+	@SYMDEF DEF071843
+	
+	@SYMTestActions
+	Creates a test bitmap. Initializes it 
+	with test data using SetScanLine. Saves 
+	bitmap and then reloads it and compares 
+	it against expected bitmap.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF071843_16MUL()
+	{
+	INFO_PRINTF1(_L("DEF071843 fix test. Compression improvements for 16MU 32bpp bitmap."));
+	// Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 12;
+	const TSize size(width, 8);
+	User::LeaveIfError(bmp->Create(size, EColor16MU));
+
+	//Test bitmap data - 8 rows of 12 pixels each containing various run lengths
+	//Format is b,g,r,a where a (alpha) is unused, hence 255.
+	TUint8 colorVal0[width * 4] =  // runs: 12
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255};
+	TUint8 colorVal1[width * 4] =  // runs: 1 1 1 1 1 1 1 1 1 1 1 1
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  1,1,1,255,  2,2,2,255,  3,3,3,255,  4,4,4,255,  5,5,5,255,  6,6,6,255,  7,7,7,255,  8,8,8,255,  9,9,9,255,  10,10,10,255,  11,11,11,255};
+	TUint8 colorVal2[width * 4] =  // runs: 1 1 2 1 1 3 1 1 1
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  1,1,1,255,  2,2,2,255,  2,2,2,255,  3,3,3,255,  4,4,4,255,  5,5,5,255,  5,5,5,255,  5,5,5,255,  6,6,6,255,  7,7,7,255,  8,8,8,255};
+	TUint8 colorVal3[width * 4] =   // runs: 1 2 1 3 1 4
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  1,1,1,255,  1,1,1,255,  2,2,2,255,  3,3,3,255,  3,3,3,255,  3,3,3,255,  4,4,4,255,  5,5,5,255,  5,5,5,255,  5,5,5,255,  5,5,5,255};
+	TUint8 colorVal4[width * 4] =   // runs: 2 1 2 2 2 3
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  0,0,0,255,  1,1,1,255,  2,2,2,255,  2,2,2,255,  3,3,3,255,  3,3,3,255,  4,4,4,255,  4,4,4,255,  5,5,5,255,  5,5,5,255,  5,5,5,255};
+	TUint8 colorVal5[width * 4] =   // runs: 3 1 3 2 3
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  0,0,0,255,  0,0,0,255,  1,1,1,255,  2,2,2,255,  2,2,2,255,  2,2,2,255,  3,3,3,255,  3,3,3,255,  4,4,4,255,  4,4,4,255,  4,4,4,255};
+	TUint8 colorVal6[width * 4] =   // runs: 4 1 1 1 1 4
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  0,0,0,255,  0,0,0,255,  0,0,0,255,  1,1,1,255,  2,2,2,255,  3,3,3,255,  4,4,4,255,  5,5,5,255,  5,5,5,255,  5,5,5,255,  5,5,5,255};
+	TUint8 colorVal7[width * 4] =   // runs: 1 1 1 1 4 1 1 1 1
+	//	 0           1           2           3           4           5           6           7           8           9           10          11
+		{0,0,0,255,  1,1,1,255,  2,2,2,255,  3,3,3,255,  4,4,4,255,  4,4,4,255,  4,4,4,255,  4,4,4,255,  5,5,5,255,  6,6,6,255,  7,7,7,255,  8,8,8,255};
+
+	//Initialize test bitmap
+	TPtr8 line0(colorVal0, width * 4, width * 4);
+	bmp->SetScanLine(line0, 0);
+	TPtr8 line1(colorVal1, width * 4, width * 4);
+	bmp->SetScanLine(line1, 1);
+	TPtr8 line2(colorVal2, width * 4, width * 4);
+	bmp->SetScanLine(line2, 2);
+	TPtr8 line3(colorVal3, width * 4, width * 4);
+	bmp->SetScanLine(line3, 3);
+	TPtr8 line4(colorVal4, width * 4, width * 4);
+	bmp->SetScanLine(line4, 4);
+	TPtr8 line5(colorVal5, width * 4, width * 4);
+	bmp->SetScanLine(line5, 5);
+	TPtr8 line6(colorVal6, width * 4, width * 4);
+	bmp->SetScanLine(line6, 6);
+	TPtr8 line7(colorVal7, width * 4, width * 4);
+	bmp->SetScanLine(line7, 7);
+
+	// Save bitmap then reload and compare
+	_LIT(KTest16MUBmpFile, "c:\\test16mu.mbm");
+	bmp->Save(KTest16MUBmpFile);	
+	//
+	CFbsBitmap* bmp2 = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp2);
+	TInt err = bmp2->Load(KTest16MUBmpFile);
+	TEST2(err, KErrNone);
+	//
+	CompareBitmaps((CFbsBitmapEx&)*bmp, (CFbsBitmapEx&)*bmp2, EColor16MU);
+	
+	// Destroy test bitmaps
+	CleanupStack::PopAndDestroy(2, bmp); // bmp2
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0547
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF071843
+	
+	@SYMDEF DEF071843
+	
+	@SYMTestActions
+	Creates a test bitmap. Initializes it 
+	with test data using SetScanLine. Saves 
+	bitmap and then reloads it and compares 
+	it against expected bitmap.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF071843_16ML()
+	{
+	INFO_PRINTF1(_L("DEF071843 fix test. Compression improvements for 16M 24bpp bitmap."));
+	// Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 12;
+	const TSize size(width, 8);
+	User::LeaveIfError(bmp->Create(size, EColor16M));
+
+	//Test bitmap data - 8 rows of 12 pixels each containing various run lengths
+	TUint8 colorVal0[width * 3] =  // runs: 12
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0,  0,0,0};
+	TUint8 colorVal1[width * 3] =  // runs: 1 1 1 1 1 1 1 1 1 1 1 1
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  1,1,1,  2,2,2,  3,3,3,  4,4,4,  5,5,5,  6,6,6,  7,7,7,  8,8,8,  9,9,9,  10,10,10,  11,11,11};
+	TUint8 colorVal2[width * 3] =  // runs: 1 1 2 1 1 3 1 1 1
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  1,1,1,  2,2,2,  2,2,2,  3,3,3,  4,4,4,  5,5,5,  5,5,5,  5,5,5,  6,6,6,  7,7,7,  8,8,8};
+	TUint8 colorVal3[width * 3] =   // runs: 1 2 1 3 1 4
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  1,1,1,  1,1,1,  2,2,2,  3,3,3,  3,3,3,  3,3,3,  4,4,4,  5,5,5,  5,5,5,  5,5,5,  5,5,5};
+	TUint8 colorVal4[width * 3] =   // runs: 2 1 2 2 2 3
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  0,0,0,  1,1,1,  2,2,2,  2,2,2,  3,3,3,  3,3,3,  4,4,4,  4,4,4,  5,5,5,  5,5,5,  5,5,5};
+	TUint8 colorVal5[width * 3] =   // runs: 3 1 3 2 3
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  0,0,0,  0,0,0,  1,1,1,  2,2,2,  2,2,2,  2,2,2,  3,3,3,  3,3,3,  4,4,4,  4,4,4,  4,4,4};
+	TUint8 colorVal6[width * 3] =   // runs: 4 1 1 1 1 4
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  0,0,0,  0,0,0,  0,0,0,  1,1,1,  2,2,2,  3,3,3,  4,4,4,  5,5,5,  5,5,5,  5,5,5,  5,5,5};
+	TUint8 colorVal7[width * 3] =   // runs: 1 1 1 1 4 1 1 1 1
+	//	 0       1       2       3       4       5       6       7       8       9       10      11
+		{0,0,0,  1,1,1,  2,2,2,  3,3,3,  4,4,4,  4,4,4,  4,4,4,  4,4,4,  5,5,5,  6,6,6,  7,7,7,  8,8,8};
+
+	//Initialize test bitmap
+	TPtr8 line0(colorVal0, width * 3, width * 3);
+	bmp->SetScanLine(line0, 0);
+	TPtr8 line1(colorVal1, width * 3, width * 3);
+	bmp->SetScanLine(line1, 1);
+	TPtr8 line2(colorVal2, width * 3, width * 3);
+	bmp->SetScanLine(line2, 2);
+	TPtr8 line3(colorVal3, width * 3, width * 3);
+	bmp->SetScanLine(line3, 3);
+	TPtr8 line4(colorVal4, width * 3, width * 3);
+	bmp->SetScanLine(line4, 4);
+	TPtr8 line5(colorVal5, width * 3, width * 3);
+	bmp->SetScanLine(line5, 5);
+	TPtr8 line6(colorVal6, width * 3, width * 3);
+	bmp->SetScanLine(line6, 6);
+	TPtr8 line7(colorVal7, width * 3, width * 3);
+	bmp->SetScanLine(line7, 7);
+
+	// Save bitmap then reload and compare
+	_LIT(KTest16MBmpFile, "c:\\test16m.mbm");
+	bmp->Save(KTest16MBmpFile);	
+	//
+	CFbsBitmap* bmp2 = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp2);
+	TInt err = bmp2->Load(KTest16MBmpFile);
+	TEST2(err, KErrNone);
+	//
+	CompareBitmaps((CFbsBitmapEx&)*bmp, (CFbsBitmapEx&)*bmp2, EColor16M);
+	
+	// Destroy test bitmaps
+	CleanupStack::PopAndDestroy(2, bmp); // bmp2
+	}
+	
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0548
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF074623 (Alpha bit)
+
+	@SYMDEF DEF074623
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF074623_16MAL()
+	{
+	INFO_PRINTF1(_L("DEF074623 fix test For Alpha Bit."));
+	// Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt iBitmapWidth = 10;
+	const TInt iBitmapHeight = 10;
+
+	
+	TInt rowIndex;
+	TInt colIndex;
+	TSize rectSize(iBitmapWidth,iBitmapHeight);
+	TRect srcRect(0,0,iBitmapWidth,iBitmapHeight);
+	User::LeaveIfError(bmp->Create(rectSize, EColor16MU));
+	srcRect.SetSize(rectSize);
+	TBitmapUtil bmpUtil(bmp);
+	bmpUtil.Begin(TPoint(0,0));
+	for (rowIndex=0;rowIndex<iBitmapHeight;++rowIndex)
+		{
+		TInt red=0;
+		TInt blue=255;
+		TInt green=0;
+		bmpUtil.SetPos(TPoint(0,rowIndex));
+		for (colIndex=0;colIndex<iBitmapWidth;++colIndex)
+			{
+			TRgb rgb(red,green,blue);
+			bmpUtil.SetPixel(rgb.Color16MA());
+			}
+		bmpUtil.IncXPos();
+		red-=10;
+		blue+=10;
+		green-=10;
+		if(red <= 0)
+			{
+			red+=255;
+			}
+		if(blue >= 255)
+			{
+			blue-=255;
+			}
+		if(green <= 0)
+			{
+			green+=255;
+			}
+		}
+	bmpUtil.End();
+	
+	bmp->SetDisplayMode(EColor16MA);
+	
+	for(TInt yy = 0; yy < iBitmapHeight; yy++)
+		{
+		
+		for(TInt xx = 0; xx < iBitmapWidth; xx++)
+			{
+			TRgb bmpcol;
+			bmp->GetPixel(bmpcol,TPoint(xx,yy));
+			TEST(bmpcol.Alpha() == 255);
+			}
+		}
+		
+	CleanupStack::PopAndDestroy(bmp);	
+
+	}
+	
+#ifdef _DEBUG
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0549
+
+	@SYMTestCaseDesc
+	Test to verify defect DEF095361
+	
+	@SYMDEF DEF095361
+	
+	@SYMTestActions
+	Creates a test bitmap. Initializes it 
+	with test data using SetScanLine. Compresses
+	the bitmap. Saves bitmap and then reloads it 
+	and compares it against expected bitmap.
+	Simulates heap allocation failure of memory.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::DEF095361_16MAL()
+	{
+	INFO_PRINTF1(_L("DEF095361 fix test. Compressing, Saving and loading 16MA 32bpp bitmap."));
+	// Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 12;
+	const TSize size(width, 8);
+	User::LeaveIfError(bmp->Create(size, EColor16MA));
+
+	//Test bitmap data - 8 rows of 12 pixels each containing various run lengths
+	TUint8 colorVal0[width * 4] =  // runs: 12
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0};
+	TUint8 colorVal1[width * 4] =  // runs: 1 1 1 1 1 1 1 1 1 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8,  9,9,9,9,  10,10,10,10,  11,11,11,11};
+	TUint8 colorVal2[width * 4] =  // runs: 1 1 2 1 1 3 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8};
+	TUint8 colorVal3[width * 4] =   // runs: 1 2 1 3 1 4
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  1,1,1,1,  2,2,2,2,  3,3,3,3,  3,3,3,3,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal4[width * 4] =   // runs: 2 1 2 2 2 3
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  3,3,3,3,  3,3,3,3,  4,4,4,4,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal5[width * 4] =   // runs: 3 1 3 2 3
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  2,2,2,2,  2,2,2,2,  3,3,3,3,  3,3,3,3,  4,4,4,4,  4,4,4,4,  4,4,4,4};
+	TUint8 colorVal6[width * 4] =   // runs: 4 1 1 1 1 4
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5,  5,5,5,5,  5,5,5,5,  5,5,5,5};
+	TUint8 colorVal7[width * 4] =   // runs: 1 1 1 1 4 1 1 1 1
+	//	 0         1         2         3         4         5         6         7         8         9         10        11
+		{0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  4,4,4,4,  4,4,4,4,  4,4,4,4,  5,5,5,5,  6,6,6,6,  7,7,7,7,  8,8,8,8};
+
+	//Initialize test bitmap
+	TPtr8 line0(colorVal0, width * 4, width * 4);
+	bmp->SetScanLine(line0, 0);
+	TPtr8 line1(colorVal1, width * 4, width * 4);
+	bmp->SetScanLine(line1, 1);
+	TPtr8 line2(colorVal2, width * 4, width * 4);
+	bmp->SetScanLine(line2, 2);
+	TPtr8 line3(colorVal3, width * 4, width * 4);
+	bmp->SetScanLine(line3, 3);
+	TPtr8 line4(colorVal4, width * 4, width * 4);
+	bmp->SetScanLine(line4, 4);
+	TPtr8 line5(colorVal5, width * 4, width * 4);
+	bmp->SetScanLine(line5, 5);
+	TPtr8 line6(colorVal6, width * 4, width * 4);
+	bmp->SetScanLine(line6, 6);
+	TPtr8 line7(colorVal7, width * 4, width * 4);
+	bmp->SetScanLine(line7, 7);
+
+	//Compress bitmap using RLE Compression
+	bmp->Compress(ERLECompression);
+ 
+	// Save bitmap then reload and compare
+	_LIT(KTest16MABmpFile, "c:\\testDEF095361_16ma.mbm");
+	bmp->Save(KTest16MABmpFile);	
+	//
+	CFbsBitmap* bmp2 = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp2);
+	
+	RFbsSession* fbs = RFbsSession::GetSession();
+	
+	TInt count;
+	for (count = 1; ; count++)
+		{
+		fbs->SendCommand(EFbsMessDefaultAllocFail,count);
+
+		TInt ret = bmp2->Load(KTest16MABmpFile, 0, EFalse);
+
+		if (ret == KErrNoMemory)
+			{
+				// Do Nothing
+			}
+		else if (ret == KErrNone)
+			{
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	fbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	
+	//
+	CompareBitmaps((CFbsBitmapEx&)*bmp, (CFbsBitmapEx&)*bmp2,EColor16MA);
+	
+	// Destroy test bitmaps
+	CleanupStack::PopAndDestroy(2, bmp); // bmp2
+	}
+#endif
+void CTBitmap::LoadAndCompressBitmapLC(CFbsBitmap*& aBmp, const TDesC& aBmpFile)
+	{
+	aBmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(aBmp);
+	TInt err = aBmp->Load(aBmpFile);
+	TEST2(err, KErrNone);
+	err = aBmp->Compress();
+	TEST2(err, KErrNone);
+	TEST(aBmp->IsCompressedInRAM());
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0550
+
+	@SYMTestCaseDesc
+	Compresses a bitmap containing two lines
+
+	@SYMTestActions
+	Creates a test bitmap with two lines. Compresses it (16 bpp)
+	and checks if compressed successfully
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+
+void CTBitmap::TwoComprLines()
+	{
+	INFO_PRINTF1(_L("16 bpp compressed bitmap - 2 lines"));
+	//Create test bitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	const TInt width = 3;
+	const TSize size(width, 2);
+	User::LeaveIfError(bmp->Create(size, EColor64K));
+	//Test bitmap data
+	TUint8 colorVal[width * 2] = 
+	//	 0          1          2        
+		{0x13,0x13, 0x13,0x13, 0x13,0x13};
+	//Initialize test bitmap
+	TPtr8 ptr(colorVal, width * 2, width * 2);
+	bmp->SetScanLine(ptr, 0);
+	bmp->SetScanLine(ptr, 1);
+	//Compress test bitmap
+	User::LeaveIfError(bmp->Compress());
+	//Check the test data
+	TUint8 colorVal2[width * 2];
+	TPtr8 ptr2(colorVal2, width * 2, width * 2);
+	//test 1
+	bmp->GetScanLine(ptr2, TPoint(0, 0), 3, EColor64K);
+	TEST(ptr2 == ptr);
+	bmp->GetScanLine(ptr2, TPoint(0, 1), 3, EColor64K);
+	TEST(ptr2 == ptr);
+	//Destroy test bitmap and data
+	CleanupStack::PopAndDestroy(bmp);
+	}
+
+void CTBitmap::LoadAndNotCompressBitmapLC(CFbsBitmap*& aBmp, const TDesC& aBmpFile)
+	{
+	aBmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(aBmp);
+	TInt err = aBmp->Load(aBmpFile);
+	TEST2(err, KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0551
+
+	@SYMTestCaseDesc
+	The test verifies the 
+	CFbsBitmap::Compress((TBitmapfileCompressionScheme aScheme) API.
+	It loads bitmaps from ROM & saves (temporarily) to C-drive. 
+	Then it loads from C-drive into a new bitmap.
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::TestPaletteCompressionL()
+	{
+	INFO_PRINTF1(_L("Test Palette Compression"));
+	_LIT(KmbmFileInRom, "z:\\system\\data\\24bitskin.mbm");
+	RFbsSession* fbs = RFbsSession::GetSession();
+	//create bitmap
+	CFbsBitmap* fbsCompressed = new(ELeave) CFbsBitmap;
+	CFbsBitmap* fbsUnCompressed = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression == EGenericPaletteCompression);
+	//compare with original
+	INFO_PRINTF1(_L("Compare Palette Compressed bmp with original"));
+	CompareBitmaps((CFbsBitmapEx&)*fbsCompressed, (CFbsBitmapEx&)*fbsUnCompressed, EColor16M);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+
+	//Test that the RLE option works.
+	//------------------------------------
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(ERLECompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that RLE compression occurred
+	TEST(fbsCompressed->Header().iCompression == ETwentyFourBitRLECompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+
+	//Test that unsuitable bitmaps are not palette compressed (too many colours).
+	//----------------------------------------------------------------------------------------
+	_LIT(KmbmMultiColourMBMInRom, "z:\\system\\data\\24bit.mbm");
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap;
+	fbsUnCompressed = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	//Test that unsuitable bitmaps are not palette compressed (too few BPP)
+	//---------------------------------------------------------------------------------
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+
+	
+	// Test that 12bitmap cannot pallete compress but will fall back to RLE
+	// --------------------------------------------------------------------
+	_LIT(Kmbm12BitMBMInRom, "z:\\system\\data\\file.mbm");
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(Kmbm12BitMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompressionWithRLEFallback);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	TBitmapfileCompression comp = fbsCompressed->Header().iCompression;
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+
+	// Test that multi colour bitmap cannot pallete compress but will fall back to RLE
+	// -------------------------------------------------------------------------------
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompressionWithRLEFallback);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	comp = fbsCompressed->Header().iCompression;
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	
+	
+	//Test various BPP & bitmap widths
+	//----------------------------------------
+	INFO_PRINTF1(_L("Test assorted BPP & colour counts"));
+	_LIT(Kmbm16NarrowFileInRom, "z:\\system\\data\\16bitskin.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm16NarrowFileInRom, fbs);
+	_LIT(Kmbm24bit6colFileInRom, "z:\\system\\data\\24bit6col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm24bit6colFileInRom, fbs);
+	_LIT(Kmbm24bit2colFileInRom, "z:\\system\\data\\24bit2col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm24bit2colFileInRom, fbs);
+	_LIT(Kmbm24bit3colFileInRom, "z:\\system\\data\\24bit3col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm24bit3colFileInRom, fbs);
+	_LIT(Kmbm24bit20colFileInRom, "z:\\system\\data\\24bit20col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm24bit20colFileInRom, fbs);
+	_LIT(Kmbm16bit6colFileInRom, "z:\\system\\data\\16bit6col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm16bit6colFileInRom, fbs);
+	_LIT(Kmbm16bit2colFileInRom, "z:\\system\\data\\16bit2col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm16bit2colFileInRom, fbs);
+	_LIT(Kmbm16bit3colFileInRom, "z:\\system\\data\\16bit3col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm16bit3colFileInRom, fbs);
+	_LIT(Kmbm16bit20colFileInRom, "z:\\system\\data\\16bit20col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm16bit20colFileInRom, fbs);
+	_LIT(Kmbm32BitSkinFileInRom, "z:\\system\\data\\32bitskin.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm32BitSkinFileInRom, fbs);
+	_LIT(Kmbm32bit6colFileInRom, "z:\\system\\data\\32bit6col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm32bit6colFileInRom, fbs);
+	_LIT(Kmbm32bit2colFileInRom, "z:\\system\\data\\32bit2col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm32bit2colFileInRom, fbs);
+	_LIT(Kmbm32bit3colFileInRom, "z:\\system\\data\\32bit3col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm32bit3colFileInRom, fbs);
+	_LIT(Kmbm32bit20colFileInRom, "z:\\system\\data\\32bit20col.mbm");
+	TestAssortedBPPandColourDepthL(Kmbm32bit20colFileInRom, fbs);
+	INFO_PRINTF1(_L("Test Palette Compression - COMPLETE"));
+	}
+
+void CTBitmap::TestAssortedBPPandColourDepthL(const TDesC& aFilename, RFbsSession* aFbs)
+	{
+	//create bitmap
+	CFbsBitmap* fbsCompressed = new (ELeave) CFbsBitmap ;
+	CFbsBitmap* fbsUnCompressed = new (ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(aFilename, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force foreground compression)
+	fbsCompressed->Compress(EPaletteCompression);
+	aFbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression == EGenericPaletteCompression);
+	//compare with original
+	INFO_PRINTF1(_L("Compare Palette Compressed bmp with original"));
+	CompareBitmaps((CFbsBitmapEx&)*fbsCompressed, (CFbsBitmapEx&)*fbsUnCompressed, EColor16M);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	}
+	
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0552
+
+	@SYMTestCaseDesc
+	The test verifies the 
+	CFbsBitmap::CompressInBackground((TBitmapfileCompressionScheme aScheme)
+	API. It loads bitmaps from ROM & saves (temporarily) to C-drive. 
+	Then it loads from C-drive into a new bitmap.
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::TestSynchronousBackgroundPaletteCompressionL()
+	{
+	INFO_PRINTF1(_L("Test Background Palette Compression"));
+	_LIT(KmbmFileInRom, "z:\\system\\data\\24bitskin.mbm");
+	RFbsSession* fbs = RFbsSession::GetSession();
+	//create bitmap
+	CFbsBitmap* fbsCompressed = new(ELeave) CFbsBitmap ;
+	CFbsBitmap* fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression == EGenericPaletteCompression);
+	//compare with original
+	INFO_PRINTF1(_L("Compare Palette Compressed bmp with original"));
+	CompareBitmaps((CFbsBitmapEx&)*fbsCompressed, (CFbsBitmapEx&)*fbsUnCompressed, EColor16M);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	//Test that the RLE option works.
+	//------------------------------------
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(ERLECompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that RLE compression occurred
+	TEST(fbsCompressed->Header().iCompression == ETwentyFourBitRLECompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+
+	//Test that unsuitable bitmaps are not palette compressed (too many colours).
+	//----------------------------------------------------------------------------------------
+	_LIT(KmbmMultiColourMBMInRom, "z:\\system\\data\\24bit.mbm");
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	//Test that unsuitable bitmaps are not palette compressed (too few BPP)
+	//---------------------------------------------------------------------------------
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	INFO_PRINTF1(_L("Test Background Palette Compression - COMPLETE"));
+	}
+	
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0553
+
+	@SYMTestCaseDesc
+	The test verifies the 
+	CFbsBitmap::CompressInBackground(TRequestStatus& aRequestStatus, TBitmapfileCompressionScheme aScheme)
+	API. It loads bitmaps from ROM & saves (temporarily) to C-drive. 
+	Then it loads from C-drive into a new bitmap.
+
+	@SYMTestActions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/	
+void CTBitmap::TestAsynchronousBackgroundPaletteCompressionL()
+	{
+	INFO_PRINTF1(_L("Test Asynch background Palette Compression"));
+	TRequestStatus status ;
+	_LIT(KmbmFileInRom, "z:\\system\\data\\24bitskin.mbm");
+	RFbsSession* fbs = RFbsSession::GetSession();
+	//create bitmap
+	CFbsBitmap* fbsCompressed = new(ELeave) CFbsBitmap ;
+	CFbsBitmap* fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(status, EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	User::WaitForRequest(status);
+	TEST2(status.Int(), KErrNone);
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression == EGenericPaletteCompression);
+	//compare with original
+	INFO_PRINTF1(_L("Compare Palette Compressed bmp with original"));
+	CompareBitmaps((CFbsBitmapEx&)*fbsCompressed, (CFbsBitmapEx&)*fbsUnCompressed, EColor16M);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	//Test that the RLE option works.
+	//------------------------------------
+	//create bitmap
+	fbsCompressed = new (ELeave) CFbsBitmap ;
+	fbsUnCompressed = new (ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmFileInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(status, ERLECompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	User::WaitForRequest(status);
+	TEST2(status.Int(), KErrNone);
+	//test that RLE compression occurred
+	TEST(fbsCompressed->Header().iCompression == ETwentyFourBitRLECompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+
+	//Test that unsuitable bitmaps are not palette compressed (too many colours).
+	//----------------------------------------------------------------------------------------
+	_LIT(KmbmMultiColourMBMInRom, "z:\\system\\data\\24bit.mbm");
+	//create bitmap
+	fbsCompressed = new (ELeave) CFbsBitmap ;
+	fbsUnCompressed = new (ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(status, EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	User::WaitForRequest(status);
+	TEST2(status.Int(), KErrNotSupported);
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	
+	//Test that unsuitable bitmaps are not palette compressed (too few BPP)
+	//---------------------------------------------------------------------------------
+	//create bitmap
+	fbsCompressed = new(ELeave) CFbsBitmap ;
+	fbsUnCompressed = new(ELeave) CFbsBitmap ;
+	CleanupStack::PushL(fbsCompressed);
+	CleanupStack::PushL(fbsUnCompressed);
+	TEST2(fbsUnCompressed->Load(KmbmMultiColourMBMInRom, 0, EFalse), KErrNone);
+	fbsUnCompressed->Save(KTempFilename);
+	//load bitmap
+	TEST2(fbsCompressed->Load(KTempFilename, 0, EFalse), KErrNone);
+	//compress bitmap (force immediate compression)
+	fbsCompressed->CompressInBackground(status, EPaletteCompression);
+	fbs->SendCommand(EFbsCompress, 0); //force background compression to execute
+	User::WaitForRequest(status);
+	TEST2(status.Int(), KErrNotSupported);
+	//test that palette compression occurred
+	TEST(fbsCompressed->Header().iCompression != EGenericPaletteCompression);
+	CleanupStack::PopAndDestroy(2);
+	iFs.Delete(KTempFilename);
+	INFO_PRINTF1(_L("Test Asynch background Palette Compressio - COMPLETE"));
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-FBSERV-0501
+
+@SYMTestType UT
+
+@SYMTestPriority Medium
+
+@SYMCR DKRN-6QGJPT
+
+@SYMTestCaseDesc Get all bitmap handles before and after loading a bitmap. 
+
+@SYMTestActions
+1) Get all bitmap handles and store number of bitmaps obtained
+2) Load a new bitmap
+3) Get all bitmap handles and store number of bitmaps obtained
+
+@SYMTestExpectedResults
+The number of bitmap handles retrieved after loading the bitmap should be one more than prior to loading the bitmap.
+*/
+void CTBitmap::GetAllBitmapsIdsL()
+	{
+	CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bitmap);
+	
+	RArray <TInt> bitmapHandleArray;
+	CleanupClosePushL(bitmapHandleArray);
+	
+	// Get current number of bitmap handles
+	User::LeaveIfError(bitmap->GetAllBitmapHandles(bitmapHandleArray));
+	const TInt numBitmapHandles = bitmapHandleArray.Count();
+	
+	// Load another bitmap
+	CFbsBitmap* bmp = LoadBitmapLC(KRc_Ram8);
+	
+	// Get current number of bitmap handles
+	User::LeaveIfError(bitmap->GetAllBitmapHandles(bitmapHandleArray));
+	const TInt newNumBitmapHandles = bitmapHandleArray.Count();
+	TEST(numBitmapHandles == newNumBitmapHandles - 1);	// Ensure there is one more bitmap handle from the bitmap we just added
+	
+	const TInt handle = bmp->Handle();
+	
+	TInt foundHandle = 0;
+	for (TInt count = newNumBitmapHandles-1; count>=0; --count)
+		{
+		if (handle == bitmapHandleArray[count])
+			{
+			foundHandle++;
+			}
+		}
+	TEST(foundHandle==1);	// Ensure only one instance of this handle is found in the array
+	CleanupStack::PopAndDestroy(3, bitmap);	// bmp, bitmapHandleArray, bitmap	
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0554
+
+	@SYMTestCaseDesc
+	Test Code For Corrupted MBM File.
+	
+	@SYMTestActions
+	Loads a specific bitmap from a multi-bitmap 
+	file from ROM and tests if it is corrupted.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTBitmap::CheckBadBmp()
+{
+	INFO_PRINTF1(_L("MalformedBmp"));
+	_LIT(KmalmbmFile0, "z:\\system\\data\\00_grbmap.mbm");
+	_LIT(KmalmbmFile1, "z:\\system\\data\\01_totalstramsize!.mbm");
+	_LIT(KmalmbmFile2, "z:\\system\\data\\02_headersize.mbm");
+	_LIT(KmalmbmFile3, "z:\\system\\data\\03_width!.mbm");
+	_LIT(KmalmbmFile4, "z:\\system\\data\\04_height!.mbm");
+	_LIT(KmalmbmFile5, "z:\\system\\data\\05_bitsperpixel.mbm");
+	_LIT(KmalmbmFile6, "z:\\system\\data\\bad_bmpsize.mbm");
+	_LIT(KmalmbmFile7, "z:\\system\\data\\bad_colormode.mbm");
+	_LIT(KmalmbmFile8, "z:\\system\\data\\bad_compression.mbm");
+	_LIT(KmalmbmFile9, "z:\\system\\data\\bad_paletteentries.mbm"); 
+
+	CFbsBitmap* fbsmalBmp = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(fbsmalBmp);
+
+	//load bitmap
+	TEST2(fbsmalBmp->Load(KmalmbmFile0, 0, EFalse), KErrNone);
+	TEST2(fbsmalBmp->Load(KmalmbmFile1, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile2, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile3, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile4, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile5, 0, EFalse), KErrNotSupported);
+	TEST2(fbsmalBmp->Load(KmalmbmFile6, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile7, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile8, 0, EFalse), KErrCorrupt);
+	TEST2(fbsmalBmp->Load(KmalmbmFile9, 0, EFalse), KErrNotSupported);
+
+	CleanupStack::PopAndDestroy(fbsmalBmp);
+}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0613
+
+@SYMDEF					PDEF111181
+
+@SYMTestCaseDesc		Test the return code of operations on bitmaps in the background compression queue
+
+@SYMTestPriority		Critical
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. Creates a bitmap
+						2. Calls CompressInBackground()
+						3. Call Resize
+						4. Waits until compression is finished
+
+@SYMTestExpectedResults The call to resize should return with KErrInUse since the compression is in progress
+*/
+
+void CTBitmap::TestBgCompressInUseL()
+	{
+	INFO_PRINTF1(_L("Test the return code of operations on bitmaps in the background compression queue"));
+	
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+
+	TInt ret = bmp->Create(TSize(256, 256), EGray256); // create a solid grey bitmap
+	TEST2 (ret,KErrNone);
+	TRequestStatus status;
+	bmp->CompressInBackground(status);
+	TInt resizeRet = bmp->Resize(TSize(512,512));
+	
+	TEST2 (resizeRet,KErrInUse);
+	User::WaitForRequest(status);
+	TEST2 (status.Int(), KErrNone);
+	CleanupStack::PopAndDestroy(bmp);
+	}
+
+
+//------------------------------------------------------------------------------
+
+LOCAL_D const TInt KTestBitmapWidth = 256; // this affects BitmapCheckCompressed()
+LOCAL_D const TInt KTestBitmapHeight = 256;
+LOCAL_D const TInt KTestBitmapResizeHeight = 512;
+LOCAL_D const TInt KMaxRLERunLength = 127;
+
+LOCAL_C void SetBitmapDataWithVerticalGradient(TUint8* aDataPtr)
+	{
+	for (TInt y = 0; y < KTestBitmapHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			*aDataPtr++ = y;
+	}
+
+LOCAL_C TBool BitmapDataCheckVerticalGradient(const TUint8* aDataPtr)
+	{
+	for (TInt y = 0; y < KTestBitmapHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			if (*aDataPtr++ != y)
+				return EFalse;
+	return ETrue;
+	}
+
+LOCAL_C void SetBitmapDataWithHorizontalGradient(TUint8* aDataPtr)
+	{
+	for (TInt y = 0; y < KTestBitmapHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			*aDataPtr++ = x;
+	}
+
+LOCAL_C TBool BitmapDataCheckHorizontalGradient(const TUint8* aDataPtr)
+	{
+	for (TInt y = 0; y < KTestBitmapHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			if (*aDataPtr++ != x)
+				return EFalse;
+	return ETrue;
+	}
+
+LOCAL_C TInt ResizeTestBitmap(CFbsBitmap* aBitmap)
+	{
+	return aBitmap->Resize(TSize(KTestBitmapWidth, KTestBitmapResizeHeight));
+	}
+
+LOCAL_C TBool BitmapCheckResized(const CFbsBitmap* aBitmap)
+	{
+	if (aBitmap->SizeInPixels() != TSize(KTestBitmapWidth, KTestBitmapResizeHeight))
+		return EFalse;
+	TUint8* dataPtr = (TUint8*)aBitmap->DataAddress();
+	for (TInt y = 0; y < KTestBitmapHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			if (*dataPtr++ != y)
+				return EFalse;
+	for (TInt y = KTestBitmapHeight; y < KTestBitmapResizeHeight; ++y)
+		for (TInt x = 0; x < KTestBitmapWidth; ++x)
+			if (*dataPtr++ != 0xFF)
+				return EFalse;
+	return ETrue;
+	}
+
+LOCAL_C TInt CompressTestBitmap(CFbsBitmap* aBitmap)
+	{
+	return aBitmap->Compress();
+	}
+
+LOCAL_C TBool BitmapCheckCompressed(const CFbsBitmap* aBitmap)
+	{
+	if (aBitmap->SizeInPixels() != TSize(KTestBitmapWidth, KTestBitmapHeight))
+		return EFalse;
+	// check RLE compression on vertical gradient
+	TUint8* dataPtr = (TUint8*)aBitmap->DataAddress();
+	for (TInt y = 0; y < KTestBitmapHeight - 1; ++y)
+		{
+		// this works when the width of the bitmap is 256, or twice the maximum encodable run length, which is 128
+		if (*dataPtr++ != KMaxRLERunLength)
+			return EFalse;
+		if (*dataPtr++ != y)
+			return EFalse;
+		if (*dataPtr++ != KMaxRLERunLength)
+			return EFalse;
+		if (*dataPtr++ != y)
+			return EFalse;
+		}
+	return ETrue;
+	}
+
+struct TTestThreadParams
+	{
+	TInt iBitmapHandle;
+	TInt (*iBitmapFunction)(CFbsBitmap*); // operation to perform on the bitmap
+	TBool (*iCheckFunction)(const CFbsBitmap*); // check that the operation was successfully performed
+	};
+
+LOCAL_C void AlternateTestThreadL(const TTestThreadParams& aParams)
+	{
+	RFbsSession* fbs = RFbsSession::GetSession();
+	if (fbs->ResourceCount() != 0)
+		User::Leave(KErrGeneral);
+	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	User::LeaveIfError(bmp->Duplicate(aParams.iBitmapHandle));
+	if (fbs->ResourceCount() != 1)
+		User::Leave(KErrGeneral);
+	if (!BitmapDataCheckVerticalGradient((TUint8*)bmp->DataAddress()))
+		User::Leave(KErrGeneral);
+	User::LeaveIfError((*aParams.iBitmapFunction)(bmp));
+	if (fbs->ResourceCount() != 1)
+		User::Leave(KErrGeneral);
+	if (aParams.iCheckFunction != NULL && !(*aParams.iCheckFunction)(bmp))
+		User::Leave(KErrGeneral);
+	CleanupStack::PopAndDestroy(bmp);
+	if (fbs->ResourceCount() != 0)
+		User::Leave(KErrGeneral);
+	}
+
+LOCAL_C TInt AlternateTestThread(TAny* aParams)
+	{
+	__UHEAP_MARK;
+	TInt ret = RFbsSession::Connect();
+	if (ret != KErrNone)
+		return ret;
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	if (cleanupStack == NULL)
+		return KErrNoMemory;
+	TRAP(ret, AlternateTestThreadL(*static_cast<TTestThreadParams*>(aParams)));
+	delete cleanupStack;
+	RFbsSession::Disconnect();
+	__UHEAP_MARKEND;
+	return ret;
+	}
+
+void CTBitmap::MultiThreadedTestsL()
+	{
+	((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0503"));
+	MultiThreadedResizeTestL();
+	((CTBitmapStep*)iStep)->RecordTestResultL();
+	((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0504"));
+	MultiThreadedCompressTestL();
+#ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
+	((CTBitmapStep*)iStep)->RecordTestResultL();
+	((CTBitmapStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0505"));
+	MultiThreadedLockHeapTestL();
+#endif
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0503
+
+@SYMDEF					DEF090812
+
+@SYMTestCaseDesc		Tests behaviour of CFbsBitmap::DataAddress() and CFbsBitmap::Resize() when called concurrently by different threads
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. The 1st thread will create a bitmap, store a pointer to the bitmap data, launch the 2nd thread and then wait for it to terminate
+						2. The 2nd thread will resize the same bitmap and exit
+						3. The 1st thread will manipulate the bitmap data using the stored pointer and then re-fetch the bitmap data
+
+@SYMTestExpectedResults	The 1st thread should be able both to manipulate the old bitmap data and check the resized bitmap data
+*/
+void CTBitmap::MultiThreadedResizeTestL()
+	{
+	INFO_PRINTF1(_L("Test Resize() with Multiple Threads"));
+	DoMultiThreadedTestL(_L("AlternateResizeThread"), ResizeTestBitmap, BitmapCheckResized);
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0504
+
+@SYMDEF					DEF090812
+
+@SYMTestCaseDesc		Tests behaviour of CFbsBitmap::DataAddress() and CFbsBitmap::Compress() when called concurrently by different threads
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. The 1st thread will create a bitmap, store a pointer to the bitmap data, launch the 2nd thread and then wait for it to terminate
+						2. The 2nd thread will compress the same bitmap and exit
+						3. The 1st thread will manipulate the bitmap data using the stored pointer and then re-fetch the bitmap data
+
+@SYMTestExpectedResults	The 1st thread should be able both to manipulate the old bitmap data and check the compressed bitmap data
+*/
+void CTBitmap::MultiThreadedCompressTestL()
+	{
+	INFO_PRINTF1(_L("Test Compress() with Multiple Threads"));
+	DoMultiThreadedTestL(_L("AlternateCompressThread"), CompressTestBitmap, BitmapCheckCompressed);
+	}
+
+void CTBitmap::DoMultiThreadedTestL(const TDesC& aThreadName, TInt (*aBitmapFunction)(CFbsBitmap*), TBool (*aCheckFunction)(const CFbsBitmap*))
+	{
+	CFbsBitmap* bmp = new CFbsBitmap;
+	ASSERT_NOT_NULL(bmp);
+	CleanupStack::PushL(bmp);
+	TInt ret = bmp->Create(TSize(KTestBitmapWidth, KTestBitmapHeight), EGray256);
+	ASSERT_EQUALS(ret, KErrNone);
+	TUint8* dataPtr = (TUint8*)bmp->DataAddress();
+	SetBitmapDataWithVerticalGradient(dataPtr);
+	TTestThreadParams params;
+	params.iBitmapHandle = bmp->Handle();
+	params.iBitmapFunction = aBitmapFunction;
+	params.iCheckFunction = aCheckFunction;
+	RThread thread;
+	ret = thread.Create(aThreadName, AlternateTestThread, KDefaultStackSize, 0x2000, 0x2000, &params);
+	ASSERT_EQUALS(ret, KErrNone);
+	TRequestStatus status;
+	thread.Logon(status);
+	thread.Resume();
+	User::WaitForRequest(status);
+	TExitType exitType = thread.ExitType();
+	TInt exitReason = thread.ExitReason();
+	TEST(exitType == EExitKill);
+	TEST(exitReason == KErrNone);
+	thread.Close();
+	TEST(BitmapDataCheckVerticalGradient(dataPtr));
+	SetBitmapDataWithHorizontalGradient(dataPtr);
+	TEST(BitmapDataCheckHorizontalGradient(dataPtr));
+	TEST((*aCheckFunction)(bmp));
+	CleanupStack::PopAndDestroy(bmp);
+	User::Heap().Check();
+	}
+
+#ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
+_LIT(KFBSERVClientPanicCategory, "FBSCLI");
+
+LOCAL_C TInt LockHeapTestBitmap(CFbsBitmap* aBitmap)
+	{
+	aBitmap->LockHeap();
+	return KErrNone;
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0505
+
+@SYMDEF					DEF090812
+
+@SYMTestCaseDesc		Tests behaviour of CFbsBitmap::LockHeap() when called concurrently by different threads
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. The 1st thread will create a bitmap, call LockHeap() on it, launch the 2nd thread and then wait for it to terminate
+						2. The 2nd thread will also call LockHeap() on the same bitmap
+						3. The 1st thread will check that the 2nd thread has panicked
+
+@SYMTestExpectedResults	Panic FBSCLI 22
+*/
+void CTBitmap::MultiThreadedLockHeapTestL()
+	{
+	INFO_PRINTF1(_L("Test LockHeap() Panic with Multiple Threads"));
+	CFbsBitmap* bmp = new CFbsBitmap;
+	ASSERT_NOT_NULL(bmp);
+	CleanupStack::PushL(bmp);
+	TInt ret = bmp->Create(TSize(KTestBitmapWidth, KTestBitmapHeight), EGray256);
+	ASSERT_EQUALS(ret, KErrNone);
+	SetBitmapDataWithVerticalGradient((TUint8*)bmp->DataAddress());
+	bmp->LockHeap();
+	TTestThreadParams params;
+	params.iBitmapHandle = bmp->Handle();
+	params.iBitmapFunction = LockHeapTestBitmap;
+	params.iCheckFunction = NULL;
+	RThread thread;
+	ret = thread.Create(_L("AlternateLockHeapThread"), AlternateTestThread, KDefaultStackSize, 0x2000, 0x2000, &params);
+	ASSERT_EQUALS(ret, KErrNone);
+	TRequestStatus status;
+	thread.Logon(status);
+	thread.Resume();
+	User::WaitForRequest(status);
+	TExitType exitType = thread.ExitType();
+	TExitCategoryName exitCategory = thread.ExitCategory();
+	TInt exitReason = thread.ExitReason();
+	TEST(exitType == EExitPanic);
+	TEST(exitCategory == KFBSERVClientPanicCategory);
+	TEST(exitReason == EFbsPanicBadHeapLock);
+	thread.Close();
+	CleanupStack::PopAndDestroy(bmp);
+	User::Heap().Check();
+	}
+#endif
+
+//--------------
+
+class CStopTestBgCompress: public CAsyncOneShot
+	{
+public:
+	CStopTestBgCompress(): CAsyncOneShot(CActive::EPriorityIdle - 1) {} // priority must be less than CFbsSessionHelper
+	void RunL() { CActiveScheduler::Stop(); }
+	};
+
+LOCAL_C TInt TestBgCompressThread(TAny* /*aParams*/)
+	{
+	const TInt KBmpSize = 0x100000 + sizeof(SEpocBitmapHeader);
+	// assuming run-length encoding every scan line gets compressed into 8 runs of 128 bytes each
+	// 2 bytes per encoded run results in 16 bytes per scan line so the compressed bitmap is large (>16K)
+	// a few bytes added at the end for the compression bookmark are rounded up to a page
+	const TInt KBmpCompressedSize = 0x5000;
+	TInt ret = KErrNone;
+	__UHEAP_MARK;
+	CTrapCleanup* trap = CTrapCleanup::New();
+	TRequestStatus status;
+	if (trap == NULL)
+		{
+		ret = KErrNoMemory;
+		goto exitNoTrap;
+		}
+	CActiveScheduler* scheduler = new CActiveScheduler;
+	if (scheduler == NULL)
+		{
+		ret = KErrNoMemory;
+		goto exitNoScheduler;
+		}
+	CActiveScheduler::Install(scheduler);
+	CStopTestBgCompress* stop = new CStopTestBgCompress;
+	if (stop == NULL)
+		{
+		ret = KErrNoMemory;
+		goto exitNoStop;
+		}
+	ret = RFbsSession::Connect();
+	if (ret != KErrNone)
+		goto exitNoFbs;
+	CFbsBitmapEx* bmp = new CFbsBitmapEx;
+	if (bmp == NULL)
+		{
+		ret = KErrNoMemory;
+		goto exitNoBmp;
+		}
+	CFbsBitmapEx* bmp2 = new CFbsBitmapEx;
+	if (bmp2 == NULL)
+		{
+		ret = KErrNoMemory;
+		goto exitNoBmp2;
+		}
+	ret = bmp->Create(TSize(1024, 1024), EGray256); // create a solid white bitmap
+	if (ret != KErrNone)
+		goto exitAll;
+	ret = bmp2->Duplicate(bmp->Handle()); // duplicate the bitmap handle
+	if (ret != KErrNone)
+		goto exitAll;
+	bmp->CompressInBackground(status);
+	User::WaitForRequest(status);
+	if (status != KErrNone)
+		{
+		ret = status.Int();
+		goto exitAll;
+		}
+	if (bmp->BitmapAddress()->Header().iBitmapSize != KBmpSize || bmp->BitmapAddress() != bmp2->BitmapAddress())
+		{
+		ret = KErrGeneral;
+		goto exitAll;
+		}
+	stop->Call();
+	CActiveScheduler::Start(); // now CFbsSessionHelper should clean both bmp and bmp2 and free the dirty bitmap data
+	if (!bmp->BitmapAddress()->IsCompressedInRAM() || bmp->BitmapAddress()->Header().iBitmapSize > KBmpCompressedSize || bmp->BitmapAddress() != bmp2->BitmapAddress())
+		ret = KErrGeneral;
+exitAll:
+	delete bmp2;
+exitNoBmp2:
+	delete bmp;
+exitNoBmp:
+	RFbsSession::Disconnect();
+exitNoFbs:
+	delete stop;
+exitNoStop:
+	delete scheduler;
+exitNoScheduler:
+	delete trap;
+exitNoTrap:
+	__UHEAP_MARKEND;
+	return ret;
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0612
+
+@SYMDEF					INC109293
+
+@SYMTestCaseDesc		Tests memory usage with CFbsBitmap::CompressInBackground()
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. Creates a bitmap
+						2. Calls CompressInBackground()
+						3. Waits until compression is finished
+						4. Gives the active scheduler the chance to run the session's helper
+
+@SYMTestExpectedResults	Efficient use of memory
+*/
+void CTBitmap::TestBgCompressL()
+	{
+	INFO_PRINTF1(_L("Test memory usage with CFbsBitmap::CompressInBackground()"));
+	RThread thread;
+	TInt ret = thread.Create(_L("TestBgCompressThread"), TestBgCompressThread, KDefaultStackSize, 0x2000, 0x2000, NULL);
+	ASSERT_EQUALS(ret, KErrNone);
+	TRequestStatus status;
+	thread.Logon(status);
+	thread.Resume();
+	User::WaitForRequest(status);
+	TExitType exitType = thread.ExitType();
+	TInt exitReason = thread.ExitReason();
+	TEST(exitType == EExitKill);
+	TEST(exitReason == KErrNone);
+	if (exitType != EExitKill || exitReason != KErrNone)
+		{
+		INFO_PRINTF3(_L("Exit Type = %d, Exit Reason = %d"), TInt(exitType), exitReason);
+		}
+	thread.Close();
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0618
+
+@SYMDEF					DEF123068
+
+@SYMTestCaseDesc		Tests that small and large bitmaps are white-filled upon creation.
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. Create a small bitmap
+						2. Create a large bitmap
+
+@SYMTestExpectedResults	Both bitmaps are filled with white
+*/
+void CTBitmap::TestBitmapWhiteFillL()
+	{
+	INFO_PRINTF1(_L("Test white fill of CFbsBitmap upon creation."));
+	const TDisplayMode KDispMode = EColor16MAP;
+	RPointerArray<CFbsBitmap> bmpArray;
+	const TSize KBitmapSmallSize(4,4);
+	const TSize KBitmapLargeSize(200,200);
+	
+	// Create small CFbsBitmap
+	CFbsBitmap* bmp = new (ELeave) CFbsBitmap;;
+	TInt ret = bmp->Create(KBitmapSmallSize,KDispMode);
+	TEST2(ret, KErrNone);
+	bmpArray.AppendL(bmp);
+	// Create large CFbsBitmap
+	bmp = new (ELeave) CFbsBitmap;;
+	ret = bmp->Create(KBitmapLargeSize,KDispMode);
+	TEST2(ret, KErrNone);
+	bmpArray.AppendL(bmp);
+	// Create small hardware bitmap
+	bmp = new (ELeave) CFbsBitmap;;
+	ret = bmp->CreateHardwareBitmap(KBitmapSmallSize, KDispMode, KNullUid);
+	if (ret == KErrNotSupported)
+		{
+		INFO_PRINTF1(_L("WhiteFill test skipped for small hardware bitmaps as they are not supported"));
+		delete bmp;
+		}
+	else
+		{
+		TEST2(ret, KErrNone);
+		bmpArray.AppendL(bmp);
+		}
+	// Create large hardware bitmap
+	bmp = new (ELeave) CFbsBitmap;;
+	ret = bmp->CreateHardwareBitmap(KBitmapLargeSize, KDispMode, KNullUid);
+	if (ret == KErrNotSupported)
+		{
+		INFO_PRINTF1(_L("WhiteFill test skipped for large hardware bitmaps as they are not supported"));
+		delete bmp;
+		}
+	else
+		{
+		TEST2(ret, KErrNone);
+		bmpArray.AppendL(bmp);
+		}
+	
+	for (TInt ii = 0; ii < bmpArray.Count(); ++ii)
+		{
+		bmp = bmpArray[ii];
+		bmp->BeginDataAccess();
+		TUint32* base = bmp->DataAddress();
+		TSize size = bmp->SizeInPixels();
+		TInt scanLineLength = CFbsBitmap::ScanLineLength(size.iWidth,KDispMode);
+		TInt dataLength = scanLineLength * size.iHeight;
+		CheckWhite((TUint8*)base,dataLength,KDispMode);
+		bmp->EndDataAccess(ETrue);
+		delete bmp;
+		}
+	bmpArray.Close();
+	}
+
+//--------------
+
+// The code for regression test case GRAPHICS-FBSERV-0614 must be in a separate thread
+// because it has to call RFbsSession::Disconnect() and without the fix it panics.
+LOCAL_C TInt TestDisconnectWithBitmapThread(TAny* /*aParams*/)
+	{
+	CTrapCleanup* trap = CTrapCleanup::New();
+	if (trap == NULL)
+		return KErrNoMemory;
+	CActiveScheduler* scheduler = new CActiveScheduler;
+	if (scheduler == NULL)
+		{
+		delete trap;
+		return KErrNoMemory;
+		}
+	CActiveScheduler::Install(scheduler);
+	TInt ret = RFbsSession::Connect();
+	if (ret != KErrNone)
+		{
+		delete scheduler;
+		delete trap;
+		return ret;
+		}
+	CFbsBitmap* bmp = new CFbsBitmap;
+	if (bmp == NULL)
+		{
+		RFbsSession::Disconnect();
+		delete scheduler;
+		delete trap;
+		return KErrNoMemory;
+		}
+	ret = bmp->Create(TSize(256, 256), EGray256); // create a solid white bitmap
+	if (ret != KErrNone)
+		{
+		RFbsSession::Disconnect();
+		delete scheduler;
+		delete trap;
+		return ret;
+		}
+	RFbsSession::Disconnect();
+	delete scheduler;
+	delete trap;
+	return ret;
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0614
+
+@SYMDEF					INC113118
+
+@SYMTestCaseDesc		Tests behaviour when RFbsSession::Disconnect() is called and there is a CFbsBitmap not yet deleted
+
+@SYMTestPriority		High
+
+@SYMTestType			UT
+
+@SYMTestStatus			Implemented
+
+@SYMTestActions			1. Creates and installs an active scheduler so that CFbsSessionHelper can be activated
+						2. Calls RFbsSession::Connect()
+						3. Creates a bitmap
+						4. Calls RFbsSession::Disconnect()
+
+@SYMTestExpectedResults	The bitmap should be destroyed automatically and no panics should occur
+*/
+void CTBitmap::TestDisconnectWithBitmapL()
+	{
+	INFO_PRINTF1(_L("Test RFbsSession::Disconnect() with a CFbsBitmap not yet deleted"));
+	RThread thread;
+	TInt ret = thread.Create(_L("TestDisconnectWithBitmapThread"), TestDisconnectWithBitmapThread, KDefaultStackSize, 0x2000, 0x2000, NULL);
+	ASSERT_EQUALS(ret, KErrNone);
+	TRequestStatus status;
+	thread.Logon(status);
+	thread.Resume();
+	User::WaitForRequest(status);
+	TExitType exitType = thread.ExitType();
+	TInt exitReason = thread.ExitReason();
+	TEST(exitType == EExitKill);
+	TEST(exitReason == KErrNone);
+	thread.Close();
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS-FBSERV-0617
+
+@SYMPREQ				PREQ39
+
+@SYMTestCaseDesc		Test that bitmaps have been touched when data changes.
+						Test that bitmaps become volatile when DataAddress is called outside of 
+						calls to  BeginDataAccess()	and EndDataAccess().
+
+@SYMTestStatus			Implemented
+
+@SYMTestPriority		High
+
+@SYMTestActions			Create a bitmap.
+						Call each public API.
+						Check that the touch count increases when the bitmap data has been modified.
+						Check whether bitmap is volatile.
+@SYMTestExpectedResults	Touch count only increases for the following functions:
+	 						Resize,
+	 						SetDisplayMode,
+	 						SetScanLine,
+	 						InternalizeL,
+	 						SwapWidthAndHeight,
+	 						DataAddress() called inside a Begin() and End(EFalse) pairing.
+	 					Bitmap is volatile only when DataAddress() called outside
+	 					a Begin() and End(EFalse) pairing.
+*/
+void CTBitmap::TestTouchedAndVolatileL()
+	{
+	INFO_PRINTF1(_L("Test bitmaps become touched or volatile when data changes."));
+	CFbsBitmap* bmp = new CFbsBitmap;
+	TEST(bmp != NULL);
+	TInt touchCount = 0;
+	TInt newTouchCount = 0;
+	CleanupStack::PushL(bmp);
+	
+	// Resize
+	User::LeaveIfError(bmp->Create(TSize(4,4),EColor16MA));
+	touchCount = bmp->TouchCount();
+	TInt ret = bmp->Resize(TSize(5,5));
+	TEST(ret == KErrNone);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	touchCount = bmp->TouchCount();
+	ret = bmp->Resize(TSize(3,3));
+	TEST(ret == KErrNone);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	touchCount = bmp->TouchCount();
+	ret = bmp->Resize(TSize(3,3));
+	TEST(ret == KErrNone);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	bmp->Reset();
+
+	// SetDisplayMode
+	User::LeaveIfError(bmp->Create(TSize(4,4),EColor16MA));
+	touchCount = bmp->TouchCount();
+	ret = bmp->SetDisplayMode(EColor16MAP);
+	TEST(ret == KErrNone);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	bmp->Reset();
+
+	// SetScanLine
+	TInt scanLineLength = CFbsBitmap::ScanLineLength(256,EColor16MA);
+	TUint8* buffer = new TUint8[scanLineLength];
+	TEST(buffer != NULL);
+	TPtr8 scanline(buffer,scanLineLength,scanLineLength);
+	User::LeaveIfError(bmp->Create(TSize(4,4),EColor16MA));
+	touchCount = bmp->TouchCount();
+	bmp->SetScanLine(scanline, 1);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	delete[] buffer;
+	bmp->Reset();
+
+	// SwapWidthAndHeight
+	User::LeaveIfError(bmp->Create(TSize(4,6),EColor16MA));
+	touchCount = bmp->TouchCount();
+	ret = bmp->SwapWidthAndHeight();
+	TEST(ret == KErrNone);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	bmp->Reset();
+
+	// InternalizeL
+	// Requires data to be externalised first
+	User::LeaveIfError(bmp->Create(TSize(4,6),EColor16MA));
+	touchCount = bmp->TouchCount();
+	CDirectFileStore* writestore = CDirectFileStore::ReplaceL(iFs,KTempFilename,EFileStream|EFileWrite);
+	TEST(writestore != NULL);
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+	writestore->SetTypeL(uidtype);
+	RStoreWriteStream writestrm;
+	TStreamId headerid(0);
+	headerid = writestrm.CreateL(*writestore);
+	writestore->SetRootL(headerid);
+	bmp->ExternalizeL(writestrm);
+	writestrm.Close();
+	delete writestore;
+	bmp->Reset();
+	// Now internalise data to reset bitmap.
+	CDirectFileStore* readstore = CDirectFileStore::OpenL(iFs,KTempFilename,EFileStream|EFileRead);
+	RStoreReadStream readstrm;
+	headerid = readstore->Root();
+	readstrm.OpenL(*readstore,headerid);
+	bmp->InternalizeL(readstrm);
+	readstrm.Close();
+	delete readstore;
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	bmp->Reset();
+	
+	
+	// DataAddress
+	// 1. Call as read-only (by passing ETrue into End())
+	// Expect: touch count doesn't increase & bitmap not volatile
+	User::LeaveIfError(bmp->Create(TSize(4,6),EColor16MA));
+	touchCount = bmp->TouchCount();
+	bmp->BeginDataAccess();
+	bmp->DataAddress(); // ignore returned value for this test.
+	bmp->EndDataAccess(ETrue);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount);
+	TEST(!bmp->IsVolatile());
+	// 2. Call as writeable  (by passing EFalse into End())
+	// Expect: touch count increases & bitmap not volatile
+	touchCount = newTouchCount;
+	bmp->BeginDataAccess();
+	bmp->DataAddress(); // ignore returned value for this test.
+	bmp->EndDataAccess(EFalse);
+	newTouchCount = bmp->TouchCount();
+	TEST(newTouchCount == touchCount+1);
+	TEST(!bmp->IsVolatile());
+	// 3. Call without Begin/End pairing
+	// Expect: bitmap is volatile
+	bmp->DataAddress(); // ignore returned value for this test.
+	TEST(bmp->IsVolatile());
+	bmp->Reset();
+
+	CleanupStack::PopAndDestroy(bmp);
+	}
+
+//--------------
+__CONSTRUCT_STEP__(Bitmap)
+
+void CTBitmapStep::TestSetupL()
+	{
+	TheFs.Connect();
+	::CopyFilesOnC();
+	}
+	
+void CTBitmapStep::TestClose()
+	{
+	::DeleteFilesFromC();		//clean up data files used by this test - must be done before call to End() - DEF047652
+	TheFs.Close();
+	}
+