diff -r b9ad20498fb4 -r 8b9155204a54 fontservices/fontstore/tfs/t_linkedfontscomparison.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/tfs/t_linkedfontscomparison.cpp Fri Jun 04 10:37:54 2010 +0100 @@ -0,0 +1,1288 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "FNTSTD.H" +#include "t_linkedfontscomparison.h" +#include +#include +#include + +/** +@file + +@SYMPurpose structures used to define linked typefaces used in this test, create and +use linked typefaces, and check against a hash value +*/ + +/** this is for the group entries + */ +struct TTGroup + { + CLinkedTypefaceGroup::TBaselineShift iBaselineShift; + CLinkedTypefaceGroup::TScalingOption iScalingOption; + TInt iAntiAliasThreshold; //KMinTInt for do not set; + TInt iBoldnessPercentage; //KMinTInt for do not set; + TInt iItalicAngle; //KMinTInt for do not set; + }; + +/** this is for linked font elements + */ +struct TTLinkedFontElement + { + const TPtrC iTypefaceName; + TInt iGroup; + TBool iIsCanonical; + }; + +/** this is for the linked typeface table + */ +struct TTLinkedTypeface + { + const TPtrC iTypefaceName; + const TTLinkedFontElement* iElements; + }; + +/** this is a plain group + */ +const TTGroup KPlainGroup = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; + +const TTGroup KGroup1 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set - antialiased + KMinTInt, //this value means do not set - boldness percentage + KMinTInt, //this value means do not set - italic angle + }; + +const TTGroup KGroup2 = + { + CLinkedTypefaceGroup::EBaselineShift, + CLinkedTypefaceGroup::EScalingUp, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; +const TTGroup KGroup3 = + { + CLinkedTypefaceGroup::EBaselineShift, + CLinkedTypefaceGroup::EScalingUpOrDown, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; +const TTGroup KGroup4 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + 14, //antialiased + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; +const TTGroup KGroup5 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + 10, //antialiased + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; +const TTGroup KGroup6 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + 100, //boldness percentage + KMinTInt, //this value means do not set + }; +const TTGroup KGroup7 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + 10, //boldness percentage + KMinTInt, //this value means do not set + }; +const TTGroup KGroup8 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + 10, //italic angle + }; +const TTGroup KGroup9 = + { + CLinkedTypefaceGroup::EBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + }; +const TTGroup KGroup10 = + { + CLinkedTypefaceGroup::ENoBaselineShift, + CLinkedTypefaceGroup::EScalingNone, + KMinTInt, //this value means do not set + KMinTInt, //this value means do not set + 40, //large italic angle + }; + +/** all the groups are added to every linked typeface +if there are too many groups then there may be a need for a group list +per linked typeface. Can have a maximum of 12 groups +*/ +const TTGroup* KGroupList[]= + { + &KPlainGroup, /* index 0 */ + &KGroup1, + &KGroup2, + &KGroup3, + &KGroup4, + &KGroup5, + &KGroup6, + &KGroup7, + &KGroup8, + &KGroup9, + &KGroup10, + }; + +/** typeface element definitions + */ + +/** Latin font + */ +const TTLinkedFontElement KLatinFontCanonical = + { + _L("DejaVu Sans Condensed"),0, ETrue //name, group zero, is canonical + }; + +/** + */ +const TTLinkedFontElement KJapaneseNotCanonical = + { + _L("TBKomachiG-R"), 0, EFalse //name, group zero, not canonical + }; + +/** Japanese - to be updated + */ +const TTLinkedFontElement KJapaneseNotCanonicalGroup1 = + { + _L("TBKomachiG-R"), 1, EFalse //name, group , not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup3 = + { + _L("TBKomachiG-R"), 3, EFalse //name, group, not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup4 = + { + _L("TBKomachiG-R"), 4, EFalse //name, group, not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup6 = + { + _L("TBKomachiG-R"), 6, EFalse //name, group, not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup8 = + { + _L("TBKomachiG-R"), 8, EFalse //name, group, not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup9 = + { + _L("TBKomachiG-R"), 9, EFalse //name, group, not canonical + }; +const TTLinkedFontElement KJapaneseNotCanonicalGroup10 = + { + _L("TBKomachiG-R"), 10, EFalse //name, group, not canonical + }; + +const TTLinkedFontElement KLatinFontTTNotCanonicalGroup0 = + { + _L("LinkedFontTestFont"), 0, EFalse + }; + +const TTLinkedFontElement KLatinFontTTCanonicalGroup0 = + { + _L("LinkedFontTestFont"), 0, ETrue + }; + +/* for use case testing */ +const TTLinkedFontElement KLatinFontTTCanonicalGroup2 = + { + _L("LinkedFontTestFont"), 2, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup3 = + { + _L("LinkedFontTestFont"), 3, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup5 = + { + _L("LinkedFontTestFont"), 5, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup7 = + { + _L("LinkedFontTestFont"), 7, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup8 = + { + _L("LinkedFontTestFont"), 8, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup9 = + { + _L("LinkedFontTestFont"), 9, ETrue + }; +const TTLinkedFontElement KLatinFontTTCanonicalGroup10 = + { + _L("LinkedFontTestFont"), 10, ETrue + }; + +/** Chandas + */ +const TTLinkedFontElement KHindiCanonical = + { + _L("Chandas"), 0, ETrue + }; + +/** Chandas + */ +const TTLinkedFontElement KHindiNotCanonical = + { + _L("Chandas"), 0, EFalse + }; + +/** Information about linked fonts +TLinkedFont1.ttf +Typeface name: LinkedFont1 +This will be the dominant font. It contains 178 characters. +Some of the characters (13) are deleted from this file and separated in to other three files. +Characters missing are F, D, J, M, P, S, V, X, Z, a, n, l, y. + +TLinkedFont2.ttf +Typeface name: LinkedFont2 +Characters available (7): F, J, M, S, Z, a, y. + +TLinkedFont3.ttf +Typeface name: LinkedFont3 +Characters available (4): D, P, x, l + +TLinkedFont4.ttf +Typeface name: LinkedFont4 +Characters available (2): V, n + +TWithoutLinkedFont.ttf +Typeface name: WithoutLinkedFont +Characters available: It contains 191 characters U+0020-U+007E and U+00A0-U+00FF +*/ + +/** LinkedFont1TT + */ +const TTLinkedFontElement KLinkedFont1TT = + { + _L("LinkedFont1TT"), 0, EFalse + }; + +/** LinkedFont2TT + */ +const TTLinkedFontElement KLinkedFont2TTCanonical = + { + _L("LinkedFont2TT"), 0, ETrue + }; + +/** LinkedFont3TT + */ +const TTLinkedFontElement KLinkedFont3TT = + { + _L("LinkedFont3TT"), 0, EFalse + }; + +/** LinkedFont4TT + */ +const TTLinkedFontElement KLinkedFont4TT = + { + _L("LinkedFont4TT"), 0, EFalse + }; + +/** KNullDesC + */ +const TTLinkedFontElement KNullElement = + { + _L(""), 0, EFalse + }; + +/** linked typeface, this list is terminated by KNullElement + */ +const TTLinkedFontElement KLatinFontHindi[]= + { + KLatinFontTTNotCanonicalGroup0, + KHindiCanonical, + KNullElement, + }; +/** linked typeface, this list is terminated by KNullElement + */ +const TTLinkedFontElement KLatinFontJapanese[]= + { + KLatinFontCanonical, + KJapaneseNotCanonical, + KNullElement + }; +/** linked typeface, this list is terminated by KNullElement + */ +const TTLinkedFontElement KLinkedFontTestFonts[]= + { + KLinkedFont1TT, + KLinkedFont2TTCanonical, + KLinkedFont3TT, + KLinkedFont4TT, + KNullElement + }; + +const TTLinkedFontElement KJapaneseLatinFontTypeface1[]= + { + KLatinFontTTCanonicalGroup2, + KJapaneseNotCanonicalGroup1, + KNullElement + }; +const TTLinkedFontElement KJapaneseLatinFontTypeface2[]= + { + KLatinFontTTCanonicalGroup3, + KJapaneseNotCanonicalGroup3, + KNullElement + }; +const TTLinkedFontElement KJapaneseLatinFontTypeface3[]= + { + KLatinFontTTCanonicalGroup5, + KJapaneseNotCanonicalGroup4, + KNullElement + }; +const TTLinkedFontElement KJapaneseLatinFontTypeface4[]= + { + KLatinFontTTCanonicalGroup7, + KJapaneseNotCanonicalGroup6, + KNullElement + }; +const TTLinkedFontElement KJapaneseLatinFontTypeface5[]= + { + KLatinFontTTCanonicalGroup8, + KJapaneseNotCanonicalGroup8, + KNullElement + }; +const TTLinkedFontElement KJapaneseLatinFontTypeface6[]= + { + KLatinFontTTCanonicalGroup9, + KJapaneseNotCanonicalGroup9, + KNullElement + }; + +const TTLinkedFontElement KJapaneseLatinFontTypeface7[]= + { + KLatinFontTTCanonicalGroup10, + KJapaneseNotCanonicalGroup10, + KNullElement + }; + +const TTLinkedFontElement KEnglishJapanseHindiFont[]= + { + KLatinFontTTCanonicalGroup0, + KJapaneseNotCanonical, + KHindiNotCanonical, + KNullElement + }; + +/** the linked typeface set, no need to null terminate, sizeof is used for this array + */ +const TTLinkedTypeface KLinkedTypefaces[] = + { + //name, list of linked font elements + {_L("LinkedFontTestFont"), KLinkedFontTestFonts}, + {_L("LatinFontHindi"), KLatinFontHindi}, + {_L("LatinFontJapanese"), KLatinFontJapanese}, + {_L("EnglishJapaneseHindi"), KEnglishJapanseHindiFont}, + {_L("UseCaseFont1"), KJapaneseLatinFontTypeface1}, + {_L("UseCaseFont2"), KJapaneseLatinFontTypeface2}, + {_L("UseCaseFont3"), KJapaneseLatinFontTypeface3}, + {_L("UseCaseFont4"), KJapaneseLatinFontTypeface4}, + {_L("UseCaseFont5"), KJapaneseLatinFontTypeface5}, + {_L("UseCaseFont6"), KJapaneseLatinFontTypeface6}, + {_L("UseCaseFont7"), KJapaneseLatinFontTypeface7}, + }; + +/** Enum which constains bitwise flags for attrbutes which can be set for each font + */ +enum TFontEffectsFlags + { + ENoEffect = 0x0, + EDropShadowOn = 0x1, + EOutlineOn = 0x2, + ESetMonochromeGlyphBitmap = 0x4, + ESetAntiAliasedGlyphBitmap = 0x8, + ESetFourColourBlendGlyphBitmap = 0x10, + EVerticalDraw = 0x20, + ERotate90Degrees = 0x40, + EIsStrikethroughOn = 0x80, + EIsUnderlineOn = 0x100, + ESoftEdgeOn = 0x200, + EAlgorithmicBoldOn = 0x400, + EDrawUp = 0x800, + EItalicOn = 0x1000, + ERegularBoldOn = 0x2000, + EEndOfList = 0x80000000 //a meta flag + }; + +const TInt KLengthOfHashValue = 1000; + +/** table used to produce hash string from attributes + */ +const TPtrC KFontEffectsFlagsString[32]= + { + _L("ENoEffect"), + _L("EDropShadowOn"), + _L("EOutlineOn"), + _L("ESetMonochromeGlyphBitmap"), + _L("ESetAntiAliasedGlyphBitmap"), + _L("ESetFourColourBlendGlyphBitmap"), + _L("EVerticalDraw"), + _L("ERotate90Degrees"), + _L("EIsStrikethroughOn"), + _L("EIsUnderlineOn"), + _L("ESoftEdgeOn"), + _L("EAlgorithmicBoldOn"), + _L("EDrawUp"), + _L("EItalicOn"), + _L("ERegularBoldOn"), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L(""), + _L("EEndOfList"), + }; + + +/**this structure is used to define a test case + */ +struct TTestCase + { + const TPtrC iTypeFaceName; //typeface name + const TDesC* iOutputString; //the output string + const TDesC* iTestDecription; //test description + const TPoint iPosition; //the position + const TInt* iSizes; // a list of sizes + const TUint32* iFontAttributes; //a list of font attrbutes (bitwise flags, see above + }; + +/** an array of sizes used during testing, terminated by zero + */ +const TInt KFontSizeNormalTesting[]= + { + 10, + 20, + 35, + 0 + }; + +const TInt KFontSizeUseCaseTesting[]= + { + 8, + 12, + 16, + 35, + 0 + }; + +/** an array of attributes used during font testing, terminated by EEndOfList + */ +const TUint32 KFontAttributesNormalTest[] =// probably need to expand this with position + { + ENoEffect, + EIsUnderlineOn, + EIsStrikethroughOn, + ESetFourColourBlendGlyphBitmap, + EIsUnderlineOn| EIsStrikethroughOn, + EAlgorithmicBoldOn, + EVerticalDraw, + EVerticalDraw | EIsUnderlineOn, + EVerticalDraw | EIsUnderlineOn | ERotate90Degrees, + EEndOfList, + }; + +const TUint32 KFontAttributesUseCaseTest[] =// probably need to expand this with position + { + ENoEffect, + ERegularBoldOn, + ESetAntiAliasedGlyphBitmap, + EItalicOn, + EEndOfList, + }; + +// here are the output strings which are used for testing +_LIT(KHindiText,"\x0915\x094D\x0937\x0924\x094D\x0930\x093F\x092F\x0020"); +_LIT(KEnglishText,"The quick brown fox 123"); +_LIT(KEnglishHindiText,"TEST 123 \x0915\x094D\x0937\x0924\x094D\x0930\x093F\x092F\x0020"); +_LIT(KEnglishJapaneseText,"T\x308a\x3093\x3054 ESghy LINKED FONTS 123"); +_LIT(KEnglishJapaneseHindiText, "T\x308a\x3093\x3054\x306e EST FOnTS LINKED \x0915\x094D\x0937\x0924\x094D\x0930\x093F\x092F\x0020 123"); +_LIT(KLinkedFontTestString,"lInKED FOnTS"); + + +// test descriptions +_LIT(KEnglishTest,"EnglishTest"); +_LIT(KHindiTest,"HindiTest"); +_LIT(KEnglishHindiTest,"EnglishHindiTest"); +_LIT(KEnglishJapaneseTest,"EnglishJapaneseTest"); +_LIT(KLinkedFontTest1,"LinkedFontTest-withLinking"); +_LIT(KLinkedFontTest2,"LinkedFontTest-unlinkedFont"); +_LIT(KEnglishJapaneseHindiTest,"EnglishJapaneseHindiTest"); +_LIT(KUseCaseTest,"UseCaseTest"); + + + +_LIT(KTestName0001,"TestCase001"); +/** this table defines the test cases: + font name, string, position, sizes(array), attributes(array) + */ +const TTestCase KTestCases[]= + { + {_L("LatinFontHindi"), &KHindiText,&KHindiTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("LatinFontHindi"), &KEnglishText, &KEnglishTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("LatinFontHindi"), &KEnglishHindiText, &KEnglishHindiTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("LatinFontJapanese"),&KEnglishText, &KEnglishTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("LatinFontJapanese"),&KEnglishJapaneseText, &KEnglishJapaneseTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("LinkedFontTestFont"),&KLinkedFontTestString, &KLinkedFontTest1, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("WithoutLinkedFontTT"),&KLinkedFontTestString, &KLinkedFontTest2, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + {_L("EnglishJapaneseHindi"),&KEnglishJapaneseHindiText, &KEnglishJapaneseHindiTest, TPoint(50,50),KFontSizeNormalTesting, KFontAttributesNormalTest}, + + //use case testing + {_L("UseCaseFont1"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont2"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont3"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont4"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont5"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont6"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + {_L("UseCaseFont7"),&KEnglishJapaneseText, &KUseCaseTest, TPoint(50,50),KFontSizeUseCaseTesting, KFontAttributesUseCaseTest}, + }; + +/** Class used to register the linked typefaces + */ +class CTLinkedTypefaceCreator : public CBase + { +public: + static CTLinkedTypefaceCreator* NewL(CTestStep* aStep); + void CreateL(); //creates the linked typefaces - will not leave with a registration error, but try the next + ~CTLinkedTypefaceCreator(); +private: + CTLinkedTypefaceCreator(CTestStep* aStep); + void CreateGroupsL(const TTGroup* aElement[],TInt aNumberOfElements); + void CreateElementsL(const TTLinkedFontElement* aElements); + void ConstructL(); + +private: + CTestStep* iStep; //for recording failures, not owned + RPointerArray iGroups; //owned + RPointerArray iElements; //owned + CFbsScreenDevice* iDev; //owned + }; + +/** static NewL +@return CTLinkedTypefaceCreator* + */ +CTLinkedTypefaceCreator* CTLinkedTypefaceCreator::NewL(CTestStep* aStep) + { + CTLinkedTypefaceCreator* ptr = new (ELeave) CTLinkedTypefaceCreator(aStep); + CleanupStack::PushL(ptr); + ptr->ConstructL(); + CleanupStack::Pop(); + return ptr; + } + +CTLinkedTypefaceCreator::CTLinkedTypefaceCreator(CTestStep* aStep):iStep(aStep) + { + + } + +void CTLinkedTypefaceCreator::ConstructL() + { + TDisplayMode mode[4]= {EColor16MAP, EColor16MA, EColor16MU, EColor64K}; + + TInt err=KErrNone; + for (TInt count=0;count<(sizeof(mode)/sizeof(mode[0]));count++) + { + TRAP(err, iDev = CFbsScreenDevice::NewL(KNullDesC, mode[count])); + if (err!=KErrNotSupported) + { + return; + } + } + + User::LeaveIfError(err); + } + +CTLinkedTypefaceCreator::~CTLinkedTypefaceCreator() + { + delete iDev; + iGroups.ResetAndDestroy(); + iElements.ResetAndDestroy(); + } + +/** function used to create the linked typefaces + */ +void CTLinkedTypefaceCreator::CreateL() + { + CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iDev); + CleanupStack::PushL(store); + + for (TInt counter=0; counter< sizeof(KLinkedTypefaces)/sizeof(TTLinkedTypeface);counter++) + { + //creating the groups needs to be done for every typeface since ownwership is taken + //after adding the group to one linked typeface specification + //leave on any failure e.g. out of memory, which is not expected + CreateGroupsL(KGroupList, sizeof(KGroupList)/sizeof(TTGroup*)); + + //create the linked typeface elements for this linked typeface + CreateElementsL(KLinkedTypefaces[counter].iElements); + + //add the groups and elements, but first create the spec + CLinkedTypefaceSpecification* spec = CLinkedTypefaceSpecification::NewLC(KLinkedTypefaces[counter].iTypefaceName); + + //add the groups + for (TInt groupCounter=0; groupCounterAddLinkedTypefaceGroupL(*iGroups[groupCounter]);//ownership is taken + iGroups[groupCounter]=NULL; + } + + //add the elements + for (TInt elementCounter=0; elementCounterAddTypefaceAtBackL(*iElements[elementCounter]);//ownership is taken + iElements[elementCounter]=NULL; + } + iElements.ResetAndDestroy(); + iGroups.ResetAndDestroy(); + + //register + TInt err=KErrNone; + TRAP(err,spec->RegisterLinkedTypefaceL(*store)); //may fail if something is wrong with the tables, want to try to continue + + //do not report test failure if already registered + iStep->testBooleanTrue(err==KErrNone || err==KErrAlreadyExists, (TText8*)__FILE__, __LINE__); + + //delete spec + CleanupStack::PopAndDestroy(); + } + CleanupStack::PopAndDestroy();//store + } + +/** function used to create the groups, note all groups are created at once, and +added to all linked typefaces + +@param aElement array of pointers to groups +@param aNumberOfElements the number of elements in the group +*/ +void CTLinkedTypefaceCreator::CreateGroupsL(const TTGroup* aElement[],TInt aNumberOfElements) + { + for (TInt counter =0; counterSetScalingOption(aElement[counter]->iScalingOption); + groupPtr->SetBaselineShift(aElement[counter]->iBaselineShift); + + if (aElement[counter]->iBoldnessPercentage!=KMinTInt) + { + groupPtr->SetBoldnessPercentage(aElement[counter]->iBoldnessPercentage); + } + if (aElement[counter]->iItalicAngle!=KMinTInt) + { + groupPtr->SetItalicAngle(aElement[counter]->iItalicAngle); + } + iGroups.AppendL(groupPtr); + CleanupStack::Pop();//ptr is now on the RArray + } + } + +/** creates all the elements for one typeface +iElements is updated + +@param aElements pointer to a list of elements, terminated by a typeface with null name +*/ + +void CTLinkedTypefaceCreator::CreateElementsL(const TTLinkedFontElement* aElements) + { + const TTLinkedFontElement* ptrElementSpec = aElements; + + //need a loop to go through all the typefaces + for (;ptrElementSpec->iTypefaceName!=KNullDesC;ptrElementSpec++) + { + CLinkedTypefaceElementSpec* elementSpec = CLinkedTypefaceElementSpec::NewLC(ptrElementSpec->iTypefaceName,ptrElementSpec->iGroup); + elementSpec->SetCanonical(ptrElementSpec->iIsCanonical); + iElements.AppendL(elementSpec); + CleanupStack::Pop(); + } + } + +// Code for creating fonts, drawing text, and comparing hash value + +//Considering the intersection of the screen size for both hw and emulator so that same +//baselined hash can be used to test for both +#define KScreenWidth 320 +#define KScreenHeight 240 + +const TInt KNumOfDisplayModes = 12; + +/** table of strings of display modes + */ +const TPtrC KDisplayModeNames[KNumOfDisplayModes] = + { + _L("EGray2"), + _L("EGray4"), + _L("EGray16"), + _L("EGray256"), + _L("EColor16"), + _L("EColor256"), + _L("EColor64K"), + _L("EColor16M"), + _L("EColor4K"), + _L("EColor16MU"), + _L("EColor16MA"), + _L("EColor16MAP"), + }; + +/** a mapping table index from DisplayMode into the table of strings +for supported colour modes. +The tables of strings do not include ERgb, or ENone. The value in the table is also +needed for compatibility with CTHashReferenceImages +*/ +const TInt KSupportDisplayStringIndex[14] = + { + 0, //ENone - use EGray2 output string + 0, //EGray2, + 1, //EGray4, + 2, //EGray16, + 3, //EGray256, + 4, //EColor16, + 5, //EColor256, + 6, //EColor64K, + 7, //EColor16M, + 7, //ERgb + 8, //EColor4K, + 9, //EColor16MU, + 10,//EColor16MA, + 11,//EColor16MAP, + }; + +/** a helper cleanup class + */ +typedef struct + { + CBitmapDevice* device; + CFont* font; + } SCleanFont; + +/** path where the output file are to be stored (if this is configured in chashreferenceimages.cpp +*/ +_LIT(KPath,"c:\\fntstoretest\\%S.mbm"); + +/** constructor +@param aStep the test step + */ +CTLinkedFontsComparison::CTLinkedFontsComparison(CTestStep *aStep):CTGraphicsBase(aStep),iStep(aStep) + { + } + +/** ConstructL + */ +void CTLinkedFontsComparison::ConstructL() + { + iFbs = RFbsSession::GetSession(); + User::LeaveIfNull(iFbs); + iHashUtil = CTHashReferenceImages::NewL(iStep,iFbs,&KPath); + } + +/** Destructor + */ +CTLinkedFontsComparison::~CTLinkedFontsComparison() + { + FreeScreenDevice(); + delete iHashUtil; + if (iFbs) + iFbs->Disconnect(); + } + +/** +Auxilary function will be called in case of a leave to release the font +@param aCleanFont font to be released +*/ +void CleanUpFont(TAny* aCleanFont) + { + SCleanFont* cleanFont= static_cast(aCleanFont); + (cleanFont->device)->ReleaseFont(cleanFont->font); + } + + +class CFbsFontEx : public CFbsFont + { +public: + static CBitmapFont* FontAddress(CFbsFont* aFont); + }; + +CBitmapFont* CFbsFontEx::FontAddress(CFbsFont* aFont) + { + return(((CFbsFontEx*)aFont)->Address()); + } + +/** + @SYMTestCaseID GRAPHICS-FNTSTORE-LINKEDFONTS-0107 + + @SYMPREQ PREQ2146 + + @SYMREQ REQ10924, REQ10925, REQ10926, REQ10927, REQ10942, REQ10943, REQ10947, REQ10949 + + @SYMTestCaseDesc This test registers linked typefaces with defintions coming from tables. + + @SYMTestActions Register a number of linked typefaces which are defined in a set of tables. + + Groups can have the following attributes: + CLinkedTypefaceGroup::TBaselineShift + CLinkedTypefaceGroup::TScalingOption + AntiAliasingThreshold (integer value) + BoldnessPercentage (integer value) + ItalicAngle (integer value) + + Typeface elements can have the following attributes: + Name + Group + Is canonical + + Linked typefaces can have the following attributes: + Name + Linked typeface elements + Groups + + For each linked typeface to be created + create linked typeface specification + create groups + add groups to linked typeface specification + create linked typeface elements + add linked typeface elements to linked typeface specification + register the specification + + To produce new linked typefaces it should be possible to do this by updating + the table entries. + + The linked typefaces should be valid. This test requires that the internal test + fonts be present. + + @SYMTestPriority Critical + + @SYMTestStatus Implemented + + @SYMTestActions (1)For each linked typeface, create the groups, create the linked typeface elements, + create a linked typeface, add the groups and elements, and + register the linked typeface with the font and bitmap server. + + @SYMTestExpectedResults (1) - linked font registration succeeds with no panics or leaves. If the test is run a + second time then KErrAlreadyExists is returned, which is not a failure. +*/ +void CTLinkedFontsComparison::RegisterLinkedTypefacesL() + { + CTLinkedTypefaceCreator* creator = CTLinkedTypefaceCreator::NewL(iStep); + CleanupStack::PushL(creator); + creator->CreateL(); + CleanupStack::PopAndDestroy(); + } + +/** Create the screen device. +@param aMode display mode for which device has to be created +*/ +void CTLinkedFontsComparison::CreateBitmapDeviceL(TDisplayMode aMode) + { + iBitmap = new(ELeave) CFbsBitmap; + //Considering the intersection of the screen size for both hw and emulator so that same + //baselined hash can be used to test for both + iBitmap->Create(TSize(KScreenWidth, KScreenHeight), aMode); + iBitmapDevice = CFbsBitmapDevice::NewL(iBitmap); + User::LeaveIfError(iBitmapDevice->CreateContext((CGraphicsContext*&)iGc)); + iHashUtil->SetScreenDeviceAndBitmap(iBitmapDevice,iBitmap,iGc); + } + +/** +Delete the devices created and gc. +*/ +void CTLinkedFontsComparison::FreeScreenDevice() + { + delete iBitmapDevice; + delete iBitmap; + delete iGc; + iBitmapDevice = NULL; + iBitmap = NULL; + iGc = NULL; + } + +/** Function to generate a meaningful hash string from the test attributes + +@param aSize the size of the font +@param aAttributes the attributes of the font +@see TFontEffectsFlags +@param aTypefaceName the typeface name + +@return the buffer with a text description, used for inclusion in the hash string +*/ +HBufC* CTLinkedFontsComparison::GenerateTestDescriptionLC(TInt aSize,TUint32 aAttributes, const TPtrC &aTypefaceName, const TDesC &aTestDescription) + { + TBuf tempBuffer; + + //append the name + tempBuffer.Append(_L("_")); + tempBuffer.Append(aTypefaceName); + tempBuffer.Append(_L("_")); + tempBuffer.Append(aTestDescription); + tempBuffer.Append(_L("_")); + + //append the size + tempBuffer.AppendFormat(_L("_size-%d"),aSize); + if (aAttributes == 0) + { + //output no attributes + tempBuffer.Append(_L("_")); + tempBuffer.Append(KFontEffectsFlagsString[0]); //no attributes string + } + else + { + for (TInt counter=0;counter<31;counter++) + { + TInt bit = 1<Des()); + + //construct a desriptor string, function in hashutility KTestName0001 + HBufC* hashIdString = iHashUtil->GenerateHashIdStringLC( + KTestName0001,//general name for test + numberOfTestsRun, //number of sub test + &ptr, + 0, //fontFaceIndex, index into the name array above, must be zero + KSupportDisplayStringIndex[static_cast(displayMode)],//display mode, converted to text + //in the hash code this is an index to a string table, which is missing ENone and ERgb + attributes //was orientation, but just integer at end, no use attributes + ); + + DoTestDrawingOutputL(*hashIdString, KTestCases[testCounter].iTypeFaceName, *(KTestCases[testCounter].iOutputString), + KTestCases[testCounter].iPosition,size,attributes); + + numberOfTestsRun++; + CleanupStack::PopAndDestroy(2,testDescription); + } + }//sizes + }//test array + } + +/** +Function to create a font, draw the text, and compare the hash value + +@param aHashId a string with the hash ID. +@param aFont the font name +@param aOutputString the output string +@param aPosition the position where to draw the text +@param aSize the height of the font in pixels +@param aAttributes the attributes for the font +@see TFontEffectsFlags +*/ +void CTLinkedFontsComparison::DoTestDrawingOutputL(const TDesC& aHashId, const TPtrC& aFont, const TDesC& aOutputString, + TPoint aPosition, TInt aSize, TUint32 aAttributes) + { + TFontSpec fontSpec; + PrepareTestEnvironment(fontSpec, aFont, aSize, aAttributes, ETrue, ETrue); + CFont* font; + TEST(iBitmapDevice->GetNearestFontToDesignHeightInPixels((CFont*&)font, fontSpec) == KErrNone); + SCleanFont cleanupFont = {iBitmapDevice, font}; + CleanupStack::PushL(TCleanupItem(CleanUpFont, &cleanupFont)); + + //may need to add attributes for the font + CBitmapFont* bitmapFont=CFbsFontEx::FontAddress(static_cast(font)); + if (aAttributes& EItalicOn) + { + bitmapFont->iAlgStyle.SetIsItalic(ETrue); + } + if (aAttributes& ERegularBoldOn) + { + bitmapFont->iAlgStyle.SetIsBold(ETrue); + } + + iGc->SetBrushColor(KRgbWhite); + iGc->Clear(); + iGc->SetBrushColor(KRgbYellow); + iGc->UseFont(font); + if(EVerticalDraw & aAttributes) + { + iGc->DrawTextVertical(aOutputString, aPosition, ERotate90Degrees & aAttributes); + } + else + { + iGc->DrawText(aOutputString, aPosition); + } + iHashUtil->CompareHashValuesL(aHashId); + CleanupStack::Pop();//font + iBitmapDevice->ReleaseFont(font); + iGc->DiscardFont(); + } + +/** +Sets the fontspec and gc attributes according to the flags set in STestFontParameters for the test. +Before setting gc attributes it is cleared and reset. +@param aFontSpec holds all effective font settings +@param aSettings holds the flags for setting the fontspec and gc +@param aFontIndex the fonts index of KFontFace to be set as typeface +@param aSetEffects ETrue will set the effects on in fontspec if their flags are enabled. By default it is ETrue. +@param aSetColors ETrue will set the colours in gc from STestFontParameters. By default it is EFalse. +*/ +void CTLinkedFontsComparison::PrepareTestEnvironment(TFontSpec &aFontSpec, const TPtrC& aFont, TInt aSize, TUint32 aAttributes, + TBool aSetEffects, TBool aSetColors) + { + //Set the typeface from the font face array + aFontSpec.iTypeface.iName = aFont; + aFontSpec.iHeight = aSize; + + //Set the effects on if any of flags for the effects are set in aSettings and aSetEffects is ETrue + if(aSetEffects) + { + aFontSpec.iFontStyle.SetEffects(FontEffect::EDropShadow, EDropShadowOn & aAttributes); + aFontSpec.iFontStyle.SetEffects(FontEffect::EOutline, EOutlineOn & aAttributes); + aFontSpec.iFontStyle.SetEffects(FontEffect::ESoftEdge, ESoftEdgeOn & aAttributes); + aFontSpec.iFontStyle.SetEffects(FontEffect::EAlgorithmicBold, EAlgorithmicBoldOn & aAttributes); + } + + iGc->Reset(); + iGc->Clear(); + iGc->SetPenColor(KRgbBlack); + iGc->SetStrikethroughStyle((EIsStrikethroughOn & aAttributes) ? EStrikethroughOn : EStrikethroughOff); + iGc->SetUnderlineStyle((EIsUnderlineOn & aAttributes) ? EUnderlineOn : EUnderlineOff); + + //Set the glyph bitmap type + if(ESetMonochromeGlyphBitmap & aAttributes) + { + aFontSpec.iFontStyle.SetBitmapType(EMonochromeGlyphBitmap); + } + else if(ESetAntiAliasedGlyphBitmap & aAttributes) + { + aFontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap); + } + + //Set the colours in gc if asked for + if(aSetColors) + { + iGc->SetBrushColor(KRgbYellow); + iGc->SetPenColor(KRgbBlack); + iGc->SetShadowColor(KRgbGray); + } + } + +/** Function to determine if the rasterizer has the linked typeface extended interface. + +@return ETrue if the linked fonts rasterizer is present. EFalse otherwise +*/ +TBool CTLinkedFontsComparison::CheckMonoTypeInstalledL() + { + CreateBitmapDeviceL(EColor16MU); //this is just for the bitmap device to get the font + + CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iBitmapDevice); + CleanupStack::PushL(store); + + // Create typeface to be linked + _LIT(KLinkedTypefaceTT, "LinkedFont1TT"); + + CLinkedTypefaceSpecification *typefaceSpec; + _LIT(KLinkedFont1TTLinkingTest, "LinkedFont1TTLinkingTest"); + + typefaceSpec = CLinkedTypefaceSpecification::NewLC(KLinkedFont1TTLinkingTest); + + CLinkedTypefaceGroup* group1 = CLinkedTypefaceGroup::NewLC(1); + typefaceSpec->AddLinkedTypefaceGroupL(*group1); + CleanupStack::Pop(); + + // Add first typeface + CLinkedTypefaceElementSpec *elementSpec1; + elementSpec1 = CLinkedTypefaceElementSpec::NewLC(KLinkedTypefaceTT, 1); + elementSpec1->SetCanonical(ETrue); + + typefaceSpec->AddTypefaceAtBackL(*elementSpec1); + CleanupStack::Pop(1, elementSpec1); + + // Now try regstering the linked typeface + TRAPD(ret, typefaceSpec->RegisterLinkedTypefaceL(*store)); + CleanupStack::PopAndDestroy(2, store); + + if (ret == KErrNone|| ret== KErrAlreadyExists) + { + return ETrue; + } + else + { + INFO_PRINTF1(_L("Linked fonts comparison: no linked fonts rasterizer found")); + return EFalse; + } + } + +/** regular RunTestCaseL, a virtual function called by the test framework + */ +void CTLinkedFontsComparison::RunTestCaseL(TInt aCurTestCase) + { + ((CTLinkedFontsComparisonStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); + switch (aCurTestCase) + { + case 1: + { + ((CTLinkedFontsComparisonStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); + if (!CheckMonoTypeInstalledL()) + { + TestComplete(); + }; + break; + } + case 2: + { + ((CTLinkedFontsComparisonStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0107")); + RegisterLinkedTypefacesL(); + break; + } + case 3: + { + ((CTLinkedFontsComparisonStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0108")); + TestDrawTextUsingLinkedFontsL(); + break; + } + default: + { + ((CTLinkedFontsComparisonStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); + ((CTLinkedFontsComparisonStep*)iStep)->CloseTMSGraphicsStep(); + TestComplete(); + break; + } + } + ((CTLinkedFontsComparisonStep*)iStep)->RecordTestResultL(); + } + +__CONSTRUCT_STEP__(LinkedFontsComparison)