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