diff -r 000000000000 -r 1fb32624e06b fontservices/fontstore/tfs/T_FontMetrics.cpp --- /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 +#include +#include "T_FontMetrics.h" +#include +#include +#include + +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 (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)