fontservices/fontstore/tfs/T_FontMetrics.cpp
changeset 0 1fb32624e06b
child 53 11e2bb0d14ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontservices/fontstore/tfs/T_FontMetrics.cpp	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,704 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent Internal Symbian test code
+*/
+
+#include <ecom/ecom.h>
+#include <gdi.h>
+#include "T_FontMetrics.h"
+#include <graphics/openfontrasterizer.h>
+#include <graphics/openfontconstants.h>
+#include <graphics/gdi/glyphsample.h>
+
+const TInt CTFontMetrics::KRequiredHeight = 24;
+_LIT(KTypefaceName, "DejaVu Sans Condensed");
+_LIT(KFontFilePath, "z:\\resource\\fonts\\DejaVuSansCondensed.ttf");
+
+LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
+	{
+	RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
+	array->ResetAndDestroy();
+	}
+
+CTFontMetrics::CTFontMetrics(CTestStep* aStep) :
+	CTGraphicsBase(aStep)
+	{
+	}
+
+void CTFontMetrics::ConstructL()
+	{
+    iHeap = UserHeap::ChunkHeap(NULL, 0x10000, 0x10000);
+	if (NULL == iHeap)
+		User::Leave(KErrNoMemory);
+	iHeap->__DbgMarkStart();
+	iFontStore = CFontStore::NewL(iHeap);
+	InstallRasterizerL();
+	AddFileL();
+	}
+
+CTFontMetrics::~CTFontMetrics()
+	{
+	delete iFontStore;
+	iHeap->__DbgMarkEnd(0);
+	iHeap->Close();
+	User::Heap().Check();
+	REComSession::FinalClose();
+	}
+
+/**
+Create a rasterizer and install it in the font store.
+*/
+void CTFontMetrics::InstallRasterizerL()
+	{
+	RImplInfoPtrArray implementationArray;
+	TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
+	CleanupStack::PushL(cleanup);
+	const TUid uid = {KUidOpenFontRasterizerPlunginInterface};
+
+	TRAPD(error, REComSession::ListImplementationsL(uid, implementationArray));
+	TEST(error == KErrNone);
+	TEST(0 < implementationArray.Count());
+
+	COpenFontRasterizer* rasterizer =
+		COpenFontRasterizer::NewL(implementationArray[0]->ImplementationUid());
+	TRAP(error, iFontStore->InstallRasterizerL(rasterizer));
+	if (error)
+		{
+		delete rasterizer;
+		TEST(error == KErrNone);
+		}
+	CleanupStack::PopAndDestroy(&implementationArray); 	
+	}
+
+void CTFontMetrics::AddFileL()
+	{
+	iFontStore->AddFileL(KFontFilePath);
+	}
+
+TOpenFontSpec CTFontMetrics::GetTOpenFontSpec()
+	{
+	TOpenFontSpec openFontSpec;
+	openFontSpec.SetName(KTypefaceName);
+	openFontSpec.SetHeight(KRequiredHeight);
+	openFontSpec.SetItalic(EFalse);
+	openFontSpec.SetBold(EFalse);
+	return openFontSpec;
+	}
+
+void CTFontMetrics::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTFontMetricsStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch ( aCurTestCase )
+		{
+	case 1:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0029"));
+		FontAccessInCTypefaceStore();
+		break;
+	case 2:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0002"));
+		TLanguage2GlyphSample();
+		break;
+	case 3:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0003"));
+		GetNearestFontToDesignHeightInPixels();
+		break;
+	case 4:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0004"));
+		GetNearestFontToMaxHeightInPixels();
+		break;
+	case 5:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0030"));
+		TestINC086513();
+		break;
+	case 6:
+		((CTFontMetricsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-0020"));
+		TestGetNearestFontToMaxHeightInPixels();
+		break;
+	case 7:
+        	((CTFontMetricsStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTFontMetricsStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+		}
+	((CTFontMetricsStep*)iStep)->RecordTestResultL();
+	}
+
+/**
+   @SYMTestCaseID          GRAPHICS-FNTSTORE-0002
+
+   @SYMPREQ                PREQ533
+
+   @SYMREQ                 REQ3800
+
+   @SYMTestCaseDesc        Verifying GlyphSample::TLanguage2TScript and GlyphSample::TScript2GlyphSample
+							with different TLanguage values.
+
+   @SYMTestPriority        Critical
+
+   @SYMTestStatus          Implemented
+
+   @SYMTestActions         (1) Call TLanguage2TScript and then TScript2GlyphSample
+								with boundary cases ELangTest, ELangNone, ELangMaximum.
+                           (2) Call TLanguage2TScript and then TScript2GlyphSample
+								with languages belonging to unsupported scripts.
+                           (3) Call TLanguage2TScript and then TScript2GlyphSample
+								with languages belonging to Latin script.
+                           (4) Repeat (3) for all other supported scripts.
+
+   @SYMTestExpectedResults (1) and (2) - NULL
+                           (3) and (4) - Languages belonging to the same script should return
+						   the same address value pointing to the same set of glyph samples.
+*/
+void CTFontMetrics::TLanguage2GlyphSample()
+	{
+	// boundary cases
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTest)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangNone)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMaximum)).Ptr());
+	// Not yet supported
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAmharic)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTigrinya)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangArmenian)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTagalog)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBengali)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBurmese)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangGeorgian)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangGujarati)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangKannada)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangKhmer)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangLao)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMalayalam)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMongolian)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangPunjabi)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSinhalese)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTamil)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTelugu)).Ptr());
+	TEST(NULL == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTibetan)).Ptr());
+	// Latin
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangFrench)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangGerman)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSpanish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangItalian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSwedish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangDanish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangNorwegian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangFinnish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAmerican)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSwissFrench)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSwissGerman)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangPortuguese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTurkish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangIcelandic)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangHungarian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangDutch)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBelgianFlemish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAustralian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBelgianFrench)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAustrian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangNewZealand)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangInternationalFrench)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCzech)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSlovak)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangPolish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSlovenian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAfrikaans)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangAlbanian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCatalan)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCroatian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCanadianEnglish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangInternationalEnglish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSouthAfricanEnglish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEstonian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCanadianFrench)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangScotsGaelic)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangIndonesian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangIrish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSwissItalian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangLatvian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangLithuanian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMalay)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMoldavian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangNorwegianNynorsk)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBrazilianPortuguese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRomanian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSomali)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangInternationalSpanish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangLatinAmericanSpanish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSwahili)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangFinlandSwedish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCyprusTurkish)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangVietnamese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangWelsh)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangEnglish)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangZulu)));
+	// Greek
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangGreek)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangCyprusGreek)));
+	// Cyrillic
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBelarussian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangBulgarian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangKazakh)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMacedonian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangSerbian)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTurkmen)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangRussian)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangUkrainian)));
+	// Hebrew
+	TEST(NULL != GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangHebrew)).Ptr());
+	// Arabic
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangArabic)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangFarsi)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangArabic)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangUrdu)));
+	// Devanagari
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangHindi)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangMarathi)));
+	// Thai
+	TEST(NULL != GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangThai)).Ptr());
+	// HanIdeographs
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTaiwanChinese)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangHongKongChinese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTaiwanChinese)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangPrcChinese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTaiwanChinese)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangJapanese)));
+	TEST(GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangTaiwanChinese)) == GlyphSample::TScript2GlyphSample(GlyphSample::TLanguage2TScript(ELangKorean)));
+	}
+
+/**
+   @SYMTestCaseID          GRAPHICS-FNTSTORE-0003
+
+   @SYMPREQ                PREQ533
+
+   @SYMREQ                 REQ3800
+
+   @SYMTestCaseDesc        Verifying font's metrics created by CFontStore::GetNearestFontToDesignHeightInPixels
+							with different TLanguage values.
+
+   @SYMTestPriority        Critical
+
+   @SYMTestStatus          Implemented
+
+   @SYMTestActions         (1) Call GetNearestFontToDesignHeightInPixels with ELangNone.
+                           (2) Call CFont's HeightInPixels, AscentInPixels, DescentInPixels, FontCapitalAscent,
+								FontStandardDescent, FontMaxAscent, FontMaxDescent, FontMaxHeight, and FontLineGap
+								to verify the font metrics of the returned font object.
+                           (3) Repeat (1) and (2) with a Latin-based language, a Greek-based language, and a
+								Cyrillic-based language for the TLanguage parameter.
+
+   @SYMTestExpectedResults See returned values in Verify_GetNearestFontToDesignHeightInPixels.
+*/
+void CTFontMetrics::GetNearestFontToDesignHeightInPixels()
+	{
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+
+	CFont* font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangNone);
+	iFontStore->GetNearestFontToDesignHeightInPixels(font, openFontSpec);
+	Verify_GetNearestFontToDesignHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangFinnish);
+	iFontStore->GetNearestFontToDesignHeightInPixels(font, openFontSpec);
+	Verify_GetNearestFontToDesignHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangGreek);
+	iFontStore->GetNearestFontToDesignHeightInPixels(font, openFontSpec);
+	Verify_GetNearestFontToDesignHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangRussian);
+	iFontStore->GetNearestFontToDesignHeightInPixels(font, openFontSpec);
+	Verify_GetNearestFontToDesignHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+	}
+
+void CTFontMetrics::Verify_GetNearestFontToDesignHeightInPixels(const CFont& aFont, TInt aScript)
+	{
+	VerifyTypefaceNameAndID(aFont);
+	// Old metrics
+	TEST(KRequiredHeight == aFont.HeightInPixels());
+	TEST(19 == aFont.AscentInPixels());
+	TEST(KRequiredHeight - aFont.AscentInPixels() == aFont.DescentInPixels());
+	// New metrics
+	TEST(18 == aFont.FontCapitalAscent());
+	TEST(5  == aFont.FontStandardDescent());
+	if (GlyphSample::EScriptNone == aScript)
+		{
+		TEST(28 == aFont.FontMaxAscent());
+		TEST(8 	== aFont.FontMaxDescent());
+		TEST(42 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptLatin == aScript)
+		{
+		TEST(24 == aFont.FontMaxAscent());
+		TEST(5 	== aFont.FontMaxDescent());
+		TEST(35 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptGreek == aScript)
+		{
+		TEST(22 == aFont.FontMaxAscent());
+		TEST(5 	== aFont.FontMaxDescent());
+		TEST(33 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptCyrillic == aScript)
+		{
+		TEST(23 == aFont.FontMaxAscent());
+		TEST(5 	== aFont.FontMaxDescent());
+		TEST(34 == aFont.FontLineGap());
+		}
+	else TEST(1 == 0);
+	TEST(aFont.FontMaxAscent() + aFont.FontMaxDescent() == aFont.FontMaxHeight());
+	INFO_PRINTF2(_L("MaxCharWidthInPixels() returns %d"), aFont.MaxCharWidthInPixels());
+	}
+
+/**
+   @SYMTestCaseID          GRAPHICS-FNTSTORE-0004
+
+   @SYMPREQ                PREQ533
+
+   @SYMREQ                 REQ3800
+
+   @SYMTestCaseDesc        Verifying font's metrics created by CFontStore::GetNearestFontToMaxHeightInPixels
+							with different TLanguage values.
+
+   @SYMTestPriority        Critical
+
+   @SYMTestStatus          Implemented
+
+   @SYMTestActions         (1) Call GetNearestFontToMaxHeightInPixels with ELangNone.
+                           (2) Call CFont's HeightInPixels, AscentInPixels, DescentInPixels, FontCapitalAscent,
+								FontStandardDescent, FontMaxAscent, FontMaxDescent, FontMaxHeight, and FontLineGap
+								to verify the font metrics of the returned font object.
+                           (3) Repeat (1) and (2) with a Latin-based language, a Greek-based language, and a
+								Cyrillic-based language for the TLanguage parameter.
+
+   @SYMTestExpectedResults See returned values in Verify_GetNearestFontToMaxHeightInPixels.
+*/
+void CTFontMetrics::GetNearestFontToMaxHeightInPixels()
+	{
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+
+	CFont* font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangNone);
+	iFontStore->GetNearestFontToMaxHeightInPixels(font, openFontSpec, KRequiredHeight);
+	Verify_GetNearestFontToMaxHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangFinnish);
+	iFontStore->GetNearestFontToMaxHeightInPixels(font, openFontSpec, KRequiredHeight);
+	Verify_GetNearestFontToMaxHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangGreek);
+	iFontStore->GetNearestFontToMaxHeightInPixels(font, openFontSpec, KRequiredHeight);
+	Verify_GetNearestFontToMaxHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+
+	font = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangRussian);
+	iFontStore->GetNearestFontToMaxHeightInPixels(font, openFontSpec, KRequiredHeight);
+	Verify_GetNearestFontToMaxHeightInPixels(*font, openFontSpec.ScriptTypeForMetrics());
+	iFontStore->ReleaseFont(font);
+	}
+
+void CTFontMetrics::Verify_GetNearestFontToMaxHeightInPixels(const CFont& aFont, TInt aScript)
+	{
+	VerifyTypefaceNameAndID(aFont);
+	if (GlyphSample::EScriptNone == aScript)
+		{
+		// Old metrics
+		TEST(15 == aFont.HeightInPixels());
+		TEST(12 == aFont.AscentInPixels());
+		TEST(15 - 12 == aFont.DescentInPixels());
+		// New metrics
+		TEST(11 == aFont.FontCapitalAscent());
+		TEST(3  == aFont.FontStandardDescent());
+		TEST(18 == aFont.FontMaxAscent());
+		TEST(5 	== aFont.FontMaxDescent());
+		TEST(KRequiredHeight - 1 == aFont.FontMaxHeight());
+		TEST(29 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptLatin == aScript)
+		{
+		// Old metrics
+		TEST(20 == aFont.HeightInPixels());
+		TEST(16 == aFont.AscentInPixels());
+		TEST(20 - 16 == aFont.DescentInPixels());
+		// New metrics
+		TEST(15 == aFont.FontCapitalAscent());
+		TEST(4  == aFont.FontStandardDescent());
+		TEST(20 == aFont.FontMaxAscent());
+		TEST(4 	== aFont.FontMaxDescent());
+		TEST(KRequiredHeight == aFont.FontMaxHeight());
+		TEST(30 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptGreek == aScript)
+		{
+		// Old metrics
+		TEST(20 == aFont.HeightInPixels());
+		TEST(16 == aFont.AscentInPixels());
+		TEST(20 - 16 == aFont.DescentInPixels());
+		// New metrics
+		TEST(15 == aFont.FontCapitalAscent());
+		TEST(4  == aFont.FontStandardDescent());
+		TEST(18 == aFont.FontMaxAscent());
+		TEST(5 	== aFont.FontMaxDescent());
+		TEST(KRequiredHeight - 1 == aFont.FontMaxHeight());
+		TEST(29 == aFont.FontLineGap());
+		}
+	else if (GlyphSample::EScriptCyrillic == aScript)
+		{
+		// Old metrics
+		TEST(21 == aFont.HeightInPixels());
+		TEST(16 == aFont.AscentInPixels());
+		TEST(21 - 16 == aFont.DescentInPixels());
+		// New metrics
+		TEST(16 == aFont.FontCapitalAscent());
+		TEST(4  == aFont.FontStandardDescent());
+		TEST(20 == aFont.FontMaxAscent());
+		TEST(4 	== aFont.FontMaxDescent());
+		TEST(KRequiredHeight == aFont.FontMaxHeight());
+		TEST(30 == aFont.FontLineGap());
+		}
+	else TEST(1 == 0);
+	INFO_PRINTF2(_L("MaxCharWidthInPixels() returns %d"), aFont.MaxCharWidthInPixels());
+	}
+
+void CTFontMetrics::VerifyTypefaceNameAndID(const CFont& aFont)
+	{
+	const TUid uid = {268435523};
+	TEST(uid == aFont.TypeUid());
+	TEST(!aFont.FontSpecInTwips().iTypeface.iName.CompareC(KTypefaceName));
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FNTSTORE-0029
+
+	@SYMTestCaseDesc
+	Tests if CTypefaceStore::iFontAccess generates false positives and
+	thus prevents GetNearestFontToDesignHeightInPixels from returning the correct fonts.
+	
+	@SYMTestActions
+	1. Creates a TOpenFontSpec object.
+	2. Sets name, height, italic and bold
+	3. Setting design height to some arbitrary value.
+	4. Gets the font which is the nearest to the given font specification.
+	5. Checks for errors.	
+	6. Verifies that existing font object created with the GetNearestFontToDesignHeightInPixels
+	   (having the wrong font metrics) should not prevent us from getting a new font object 
+	   with the GetNearestFontToMaxHeightInPixels.
+	7. Calling the GetNearestFontToMaxHeightInPixels function with
+	   different languages should still refer to the same font object,
+	   unless the language has an impact on metrics.
+	 
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTFontMetrics::FontAccessInCTypefaceStore()
+	{
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+	const TInt KMaxHeight = 24;
+
+	TInt rc = KErrGeneral;
+
+	CFont* font01 = NULL;
+	rc = iFontStore->GetNearestFontToDesignHeightInPixels(font01, openFontSpec);
+	TEST(KErrNone == rc);
+	TEST(NULL != font01);
+
+	CFont* font02 = NULL;
+	rc = iFontStore->GetNearestFontToDesignHeightInPixels(font02, openFontSpec);
+	TEST(KErrNone == rc);
+	TEST(NULL != font02);
+
+	CFont* font03 = NULL;
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font03, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font03);
+
+	// Setting design height to some arbitrary value
+	CFont* font04 = NULL;
+	openFontSpec.SetHeight(0);
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font04, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font04);
+
+	// Setting design height to some arbitrary value
+	CFont* font05 = NULL;
+	openFontSpec.SetHeight(font03->HeightInPixels());
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font05, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font05);
+
+	// Setting design height to that of an old-API generated font object
+	CFont* font06 = NULL;
+	openFontSpec.SetHeight(font01->HeightInPixels());
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font06, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font06);
+
+	CFont* font07 = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangEnglish);
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font07, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font07);
+
+	CFont* font08 = NULL;
+	openFontSpec.SetScriptTypeForMetrics(ELangSwedish);
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(font08, openFontSpec, KMaxHeight);
+	TEST(KErrNone == rc);
+	TEST(NULL != font08);
+
+	// Using the same font specifications should return font objects from cache.
+	TEST(font01 == font02);
+	TEST(font03 == font04);
+	TEST(font03 == font05);
+	// Design height should be ignored when calling the GetNearestFontToMaxHeight... API.
+	TEST(font01 != font03);
+	// The existing font object created with the GetNearestFontToDesignHeight... API
+	// (thus having the wrong font metrics) should NOT prevent us from getting a new font
+	// object with the GetNearestFontToMaxHeight... API (with improved metrics.)
+	TEST(font01 != font06);
+	// Languages belonging to the same script should return the same font object.
+	TEST(font07 == font08);
+	// Calling the GetNearestFontToMaxHeight... API with
+	// languages belonging to different scripts may refer to different font objects.
+	// (Actually different with DejaVu fonts between no script specified and latin script.)
+	TEST(font06 != font07);
+
+	iFontStore->ReleaseFont(font01);
+	iFontStore->ReleaseFont(font02);
+	iFontStore->ReleaseFont(font03);
+	iFontStore->ReleaseFont(font04);
+	iFontStore->ReleaseFont(font05);
+	iFontStore->ReleaseFont(font06);
+	iFontStore->ReleaseFont(font07);
+	iFontStore->ReleaseFont(font08);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FNTSTORE-0030
+
+	@SYMTestCaseDesc
+	Tests if two loaded fonts are the same if their glyphs are the same. 
+	Second request for the font with different flags should give reference to the 
+	same font.
+
+	@SYMTestActions
+	1. Creates a TOpenFontSpec object and sets name, height, italic and bold.
+	2. Gets the font which is the nearest to the given font specification.
+	3. Checks for errors.
+	4. Gets the font specification in twips.
+	5. Gets the font which is the nearest to the given font specification.
+	6. Checks for errors.
+	7. Verifies the fonts are the same.
+	8. Releases the fonts.
+	
+	@SYMTestExpectedResults
+	The fonts should be the same.
+*/
+void CTFontMetrics::TestINC086513()
+	{
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+	CFont* theFont = NULL;
+	TInt rc = iFontStore->GetNearestFontToDesignHeightInPixels(theFont, openFontSpec);
+	TEST(KErrNone == rc);
+	TFontSpec fontSpec = theFont->FontSpecInTwips();
+	TTypeface typeface;
+	typeface.iName=fontSpec.iTypeface.iName;
+	typeface.SetIsProportional(!fontSpec.iTypeface.IsProportional());
+	CFont* theFont1 = NULL;
+	rc = iFontStore->GetNearestFontToDesignHeightInPixels(theFont1, openFontSpec);
+	TEST(rc==KErrNone);
+
+	TEST(theFont1==theFont);//fonts should be the same
+
+	iFontStore->ReleaseFont(theFont1);
+	iFontStore->ReleaseFont(theFont);
+	}
+	
+/*
+This test first marks a font as 'in use' and later tries to 
+delete all the fonts in the font store by sending the special
+code KNullUid. Before this would crash the server because 
+there are still fonts in use, but now it would just return safely.
+*/
+void CTFontMetrics::TestPDEF099034()
+	{
+	INFO_PRINTF1(_L("Trying to remove all fonts in the font store\r\n"));
+	
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+	CFont* font = NULL;
+	TInt ret = iFontStore->GetNearestFontToDesignHeightInPixels(font, openFontSpec);
+	TEST(ret == KErrNone);
+	
+	TUid uid;
+	uid.iUid=0;
+	iFontStore->RemoveFile(uid);
+	
+	iFontStore->ReleaseFont(font);
+	}
+
+/**
+	@SYMTestCaseID GRAPHICS-FNTSTORE-0020
+	
+	@SYMDEF DEF101441
+
+	@SYMTestCaseDesc Tests GetNearestFontToMaxHeightInPixels with boundary max height and above.
+					 Tests GetNearestFontToMaxHeightInPixels with boundary min height i,e 1.
+
+	@SYMTestPriority High
+	
+	@SYMTestStatus Implemented
+
+	@SYMTestActions 1. Call GetNearestFontToMaxHeightInPixels with max height as 1025
+					2  Call GetNearestFontToMaxHeightInPixels with max height as 1
+					3. Call GetNearestFontToMaxHeightInPixels with max height as 1024
+	API Calls:
+	CFontStore::GetNearestFontToMaxHeightInPixels()
+
+	@SYMTestExpectedResults 1. For first call it should return KErrTooBig
+							2. For second call it should return KErrArgument
+							3. For Third call it should create the font with out any problem
+							return KErrNone.
+*/
+void CTFontMetrics::TestGetNearestFontToMaxHeightInPixels()
+	{
+	TOpenFontSpec openFontSpec = GetTOpenFontSpec();
+	CFont* theFont = NULL;
+	
+	TInt rc = iFontStore->GetNearestFontToMaxHeightInPixels(theFont, openFontSpec, 1025);
+	TEST(KErrTooBig == rc);
+	TEST(NULL == theFont);
+
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(theFont, openFontSpec, 1);
+	TEST(KErrArgument == rc);
+	TEST(NULL == theFont);
+
+	rc = iFontStore->GetNearestFontToMaxHeightInPixels(theFont, openFontSpec, 1024);
+	TEST(NULL != theFont);
+
+	iFontStore->ReleaseFont(theFont);
+	}
+
+//--------------
+__CONSTRUCT_STEP__(FontMetrics)