diff -r e8c1ea2c6496 -r 8758140453c0 graphics/fntstore/src/T_DataFontStore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphics/fntstore/src/T_DataFontStore.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,763 @@ +/* + * 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 the License "Symbian Foundation License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ +/** + @test + @internalComponent + + This contains CT_DataFontStore + */ +#include "T_DataFontStore.h" +#include "T_GraphicsUtil.h" +#include "T_TestOpenFont.h" + +/*@{*/ +/// Parameters +_LIT(KFldTypefaceName, "typefacename"); +_LIT(KFldHeapSize, "heapsize"); +_LIT(KFldFontFile, "fontfile"); +_LIT(KFldId, "id"); +_LIT(KFldExpectedGlyphBitmapType, "expected_bmptype"); +_LIT(KFldGlyphBitmapType, "bmptype"); +_LIT(KFldSessionHandle, "sessionhandle"); +_LIT(KFldTypefaceIndex, "typeface_index"); +_LIT(KFldHeightIndex, "height_index"); +_LIT(KFldExpectedHeight, "expected_height"); +_LIT(KFldFontUid, "fontuid"); +_LIT(KFldAlgStyle, "alg_style"); +_LIT(KFldFont, "font"); +_LIT(KFldOpenFont, "openfont"); +_LIT(KFldMaxHeight, "maxheight"); +_LIT(KFldUseTestClass, "usetestclass"); +_LIT(KFldRasterizer, "rasterizer"); +_LIT(KFldShaperFactory, "shaperfactory"); + +/// Commands +_LIT(KCmdNewL, "NewL"); +_LIT(KCmdDestructor, "~"); +_LIT(KCmdAddFileL, "AddFileL"); +_LIT(KCmdRemoveFile, "RemoveFile"); +_LIT(KCmdDefaultBitmapType, "DefaultBitmapType"); +_LIT(KCmdDeleteSessionCache, "DeleteSessionCache"); +_LIT(KCmdFontHeightInPixels, "FontHeightInPixels"); +_LIT(KCmdGetFontById, "GetFontById"); +_LIT(KCmdGetNearestFontToDesignHeightInPixels, "GetNearestFontToDesignHeightInPixels"); +_LIT(KCmdGetNearestFontToDesignHeightInTwips, "GetNearestFontToDesignHeightInTwips"); +_LIT(KCmdGetNearestFontToMaxHeightInPixels, "GetNearestFontToMaxHeightInPixels"); +_LIT(KCmdGetNearestFontToMaxHeightInTwips, "GetNearestFontToMaxHeightInTwips"); +_LIT(KCmdInstallRasterizerL, "InstallRasterizerL"); +_LIT(KCmdInstallShaperFactoryL, "InstallShaperFactoryL"); +_LIT(KCmdSetDefaultBitmapType, "SetDefaultBitmapType"); + +/// Logs +_LIT(KLogMissingParameter, "Missing parameter '%S'"); +_LIT(KLogError, "Error=%d"); +_LIT(KLogMissingFilename, "File '%S' not found in array"); +_LIT(KLogFontSpec, "font_spec or openfont_spec"); +/*@}*/ + +/** + * Two phase constructor + */ +CT_DataFontStore* CT_DataFontStore::NewL() + { + CT_DataFontStore* ret = new (ELeave) CT_DataFontStore(); + CleanupStack::PushL(ret); + ret->ConstructL(); + CleanupStack::Pop(ret); + return ret; + } +/** + * Protected second phase construction + */ +void CT_DataFontStore::ConstructL() + { + } + +/** + * Protected constructor. First phase construction + */ +CT_DataFontStore::CT_DataFontStore() : + CT_DataTypefaceStore(), iFntStore(NULL) + { + } + +/** + * Destructor. + */ +CT_DataFontStore::~CT_DataFontStore() + { + DestroyData(); + iFile.Reset(); + iFile.Close(); + iId.Reset(); + iId.Close(); + } + +/** + * cleanup implementation. + */ +void CT_DataFontStore::DestroyData() + { + delete iFntStore; + iFntStore = NULL; + } + +TAny* CT_DataFontStore::GetObject() + { + return iFntStore; + } + +void CT_DataFontStore::SetObjectL(TAny* aObject) + { + DestroyData(); + iFntStore = static_cast (aObject); + } + +void CT_DataFontStore::DisownObjectL() + { + iFntStore = NULL; + } + +CTypefaceStore* CT_DataFontStore::GetTypefaceStore() const + { + return iFntStore; + } + +/** + * Process a command read from the ini file + * + * @param aDataWrapper test step requiring command to be processed + * @param aCommand the command to process + * @param aSection the entry in the ini file requiring the command to be processed + * + * @return ETrue if the command is processed + */ +TBool CT_DataFontStore::DoCommandL(const TTEFFunction& aCommand, + const TTEFSectionName& aSection, const TInt aAsyncErrorIndex) + { + TBool retVal = ETrue; + + if (aCommand == KCmdNewL) + { + DoCmdNewL(aSection); + } + else if (aCommand == KCmdDestructor) + { + DoCmdDestructor(); + } + else if (aCommand == KCmdAddFileL) + { + DoCmdAddFileL(aSection); + } + else if (aCommand == KCmdRemoveFile) + { + DoCmdRemoveFile(aSection); + } + else if (aCommand == KCmdDefaultBitmapType) + { + DoCmdDefaultBitmapType(aSection); + } + else if (aCommand == KCmdDeleteSessionCache) + { + DoCmdDeleteSessionCache(aSection); + } + else if (aCommand == KCmdFontHeightInPixels) + { + DoCmdFontHeightInPixels(aSection); + } + else if (aCommand == KCmdGetFontById) + { + DoCmdGetFontByIdL(aSection); + } + else if (aCommand == KCmdGetNearestFontToDesignHeightInPixels) + { + DoCmdGetNearestFontToDesignHeightInPixelsL(aSection); + } + else if (aCommand == KCmdGetNearestFontToDesignHeightInTwips) + { + if (!DoCmdGetNearestFontToDesignHeightInTwipsL(aSection)) + { + retVal = CT_DataTypefaceStore::DoCommandL(aCommand, aSection, aAsyncErrorIndex); + } + } + else if (aCommand == KCmdGetNearestFontToMaxHeightInPixels) + { + DoCmdGetNearestFontToMaxHeightInPixelsL(aSection); + } + else if (aCommand == KCmdGetNearestFontToMaxHeightInTwips) + { + if (!DoCmdGetNearestFontToMaxHeightInTwipsL(aSection)) + { + retVal = CT_DataTypefaceStore::DoCommandL(aCommand, aSection, aAsyncErrorIndex); + } + } + else if (aCommand == KCmdInstallRasterizerL) + { + DoCmdInstallRasterizerL(aSection); + } + else if (aCommand == KCmdInstallShaperFactoryL) + { + DoCmdInstallShaperFactoryL(aSection); + } + else if (aCommand == KCmdSetDefaultBitmapType) + { + DoCmdSetDefaultBitmapType(aSection); + } + else + { + retVal = CT_DataTypefaceStore::DoCommandL(aCommand, aSection, aAsyncErrorIndex); + } + + return retVal; + } + +////////////////// COMMANDS IMPLEMENTATION //////////////////////// + +/** Creates an instance of CT_DataFontStore class */ +void CT_DataFontStore::DoCmdNewL(const TDesC& aSection) + { + // cleanup if any + DestroyData(); + + TInt heapsize; + TInt err; + + INFO_PRINTF1(_L("execute CFontStore::NewL(RHeap*)")); + if (GetIntFromConfig(aSection, KFldHeapSize, heapsize)) + { + RHeap* heap = NULL; + if (heapsize != 0) + { + heap = UserHeap::ChunkHeap(NULL, heapsize, heapsize); + } + TRAP(err, iFntStore = CFontStore::NewL(heap)); + } + else + { + // Use heap of the thread. + TRAP(err, iFntStore = CFontStore::NewL(&User::Heap())); + } + + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + } + +void CT_DataFontStore::DoCmdDestructor() + { + // cleanup if any + DestroyData(); + } + +void CT_DataFontStore::DoCmdAddFileL(const TDesC& aSection) + { + TPtrC name; + + if (!GetStringFromConfig(aSection, KFldFontFile, name)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldFontFile()); + SetBlockResult(EFail); + } + else + { + TUid id; + + INFO_PRINTF1(_L("execute CFontStore::AddFileL(const TDesC&)")); + TRAPD(err, id = iFntStore->AddFileL(name)); + + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + iFile.AppendL(name); + iId.AppendL(id.iUid); + } + } + } + +TBool CT_DataFontStore::FindIdByName(const TDesC& aName, TInt& aId) + { + TBool found = EFalse; + for (TInt index = 0; index < iFile.Count(); ++index) + { + if (iFile[index] == aName) + { + aId = iId[index]; + iFile.Remove(index); + iId.Remove(index); + found = ETrue; + break; + } + } + return found; + } + +void CT_DataFontStore::DoCmdRemoveFile(const TDesC& aSection) + { + TBool dataOk = ETrue; + TInt id; + + // Get the uid + if (!GetIntFromConfig(aSection, KFldId(), id)) + { + TPtrC file; + + // No uid provided. Get file name instead. + if (!GetStringFromConfig(aSection, KFldFontFile(), file)) + { + dataOk = EFalse; + } + else + { + // Get uid by file name. + if (!FindIdByName(file, id)) + { + dataOk = EFalse; + } + } + } + + if (dataOk) + { + INFO_PRINTF1(_L("execute CFontStore::RemoveFile(TUid)")); + iFntStore->RemoveFile(TUid::Uid(id)); + } + else + { + INFO_PRINTF1(_L("execute CFontStore::RemoveFile(TUid::Null())")); + iFntStore->RemoveFile(TUid::Null()); + } + } + +void CT_DataFontStore::DoCmdDefaultBitmapType(const TDesC& aSection) + { + TGlyphBitmapType actual = iFntStore->DefaultBitmapType(); + INFO_PRINTF2(_L("execute CFontStore::DefaultBitmapType() = %d"), actual); + + TGlyphBitmapType expected; + if(CT_GraphicsUtil::ReadGlyphBitmapType(*this, aSection, KFldExpectedGlyphBitmapType(), expected)) + { + if (actual != expected) + { + ERR_PRINTF3(_L("The expected result %d is not equal to the actual result %d!"), expected, actual); + SetBlockResult(EFail); + } + } + } + +void CT_DataFontStore::DoCmdDeleteSessionCache(const TDesC& aSection) + { + TInt handle; + + if (!GetIntFromConfig(aSection, KFldSessionHandle, handle)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldSessionHandle()); + SetBlockResult(EFail); + } + else + { + INFO_PRINTF1(_L("execute CFontStore::DeleteSessionCache(TInt)")); + iFntStore->DeleteSessionCache(handle); + } + } + +void CT_DataFontStore::DoCmdFontHeightInPixels(const TDesC& aSection) + { + TInt tfindex; + TInt heightindex; + TBool dataOk = ETrue; + + if (!GetIntFromConfig(aSection, KFldTypefaceIndex, tfindex)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldTypefaceIndex()); + SetBlockResult(EFail); + } + + if (!GetIntFromConfig(aSection, KFldHeightIndex, heightindex)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldHeightIndex()); + SetBlockResult(EFail); + } + + if (dataOk) + { + TInt actual = iFntStore->FontHeightInPixels(tfindex, heightindex); + INFO_PRINTF2(_L("execute CFontStore::FontHeightInPixels(TInt, TInt) = %d"), actual); + + TInt expected; + if (GetIntFromConfig(aSection, KFldExpectedHeight, expected)) + { + if (expected != actual) + { + ERR_PRINTF3(_L("The expected result %d is not equal to the actual result %d!"), expected, actual); + SetBlockResult(EFail); + } + } + } + } + +void CT_DataFontStore::DoCmdGetFontByIdL(const TDesC& aSection) + { + TBool dataOk = ETrue; + TAlgStyle* algStyle = NULL; + TPtrC wrapperName; + TInt fontUid; + + // get font uid + if (!GetIntFromConfig(aSection, KFldFontUid(), fontUid)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFontUid()); + SetBlockResult(EFail); + } + // get algorithmic style + if (!CT_GraphicsUtil::GetAlgStyleL(*this, aSection, KFldAlgStyle(), algStyle) && NULL == algStyle) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldAlgStyle()); + SetBlockResult(EFail); + } + if (!GetStringFromConfig(aSection, KFldFont, wrapperName)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + if (dataOk) + { + CFont* font = NULL; + INFO_PRINTF1(_L("execute CFontStore::GetFontById(CFont *&, TUid, const TAlgStyle&)")); + TInt err = iFntStore->GetFontById(font, TUid::Uid(fontUid), *algStyle); + + if (KErrNone != err) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + SetDataObjectL(wrapperName, font); + } + } + } + +void CT_DataFontStore::DoCmdGetNearestFontToDesignHeightInPixelsL( + const TDesC& aSection) + { + TPtrC wrapperName; + + if (!GetStringFromConfig(aSection, KFldFont, wrapperName)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + else + { + TFontSpec fontSpec; + TInt err; + CFont* font; + TBool fxnCalled = EFalse; + + if (GetFontSpecFromConfig(aSection, KFldFont, fontSpec)) + { + fxnCalled = ETrue; + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToDesignHeightInPixels(CFont*&, const TFontSpec&)")); + err = iFntStore->GetNearestFontToDesignHeightInPixels(font, fontSpec); + } + else if (GetFontSpecFromConfig(aSection, KFldOpenFont, fontSpec)) + { + fxnCalled = ETrue; + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToDesignHeightInPixels(CFont*&, const TOpenFontSpec&)")); + err = iFntStore->GetNearestFontToDesignHeightInPixels(font, TOpenFontSpec(fontSpec)); + } + else + { + ERR_PRINTF2(KLogMissingParameter, &KLogFontSpec()); + SetBlockResult(EFail); + } + + if (fxnCalled) + { + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + SetDataObjectL(wrapperName, font); + } + } + } + } + +TBool CT_DataFontStore::DoCmdGetNearestFontToDesignHeightInTwipsL( + const TDesC& aSection) + { + TPtrC wrapperName; + + if (!GetStringFromConfig(aSection, KFldFont, wrapperName)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + else + { + TFontSpec fontSpec; + TInt err; + CFont* font; + + if (!GetFontSpecFromConfig(aSection, KFldOpenFont, fontSpec)) + { + return EFalse; + } + else + { + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToDesignHeightInTwips(CFont*&, const TOpenFontSpec&)")); + err = iFntStore->GetNearestFontToDesignHeightInTwips(font, TOpenFontSpec(fontSpec)); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + SetDataObjectL(wrapperName, font); + } + } + } + return ETrue; + } + +void CT_DataFontStore::DoCmdGetNearestFontToMaxHeightInPixelsL(const TDesC& aSection) + { + TBool dataOk = ETrue; + + TPtrC wrapperName; + if (!GetStringFromConfig(aSection, KFldFont, wrapperName)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + TInt maxHeight; + if (!GetIntFromConfig(aSection, KFldMaxHeight, maxHeight)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldMaxHeight()); + SetBlockResult(EFail); + } + + if (dataOk) + { + TFontSpec fontSpec; + TInt err; + CFont* font; + TBool fxnCalled = EFalse; + + if (GetFontSpecFromConfig(aSection, KFldFont, fontSpec)) + { + fxnCalled = ETrue; + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToMaxHeightInPixels(CFont*&, const TFontSpec&, TInt)")); + err = iFntStore->GetNearestFontToMaxHeightInPixels(font, fontSpec, maxHeight); + } + else if (GetFontSpecFromConfig(aSection, KFldOpenFont, fontSpec)) + { + fxnCalled = ETrue; + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToMaxHeightInPixels(CFont*&, const TOpenFontSpec&, TInt)")); + err = iFntStore->GetNearestFontToMaxHeightInPixels(font, TOpenFontSpec(fontSpec), maxHeight); + } + else + { + ERR_PRINTF2(KLogMissingParameter, &KLogFontSpec()); + SetBlockResult(EFail); + } + + if (fxnCalled) + { + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + SetDataObjectL(wrapperName, font); + } + } + } + } + +TBool CT_DataFontStore::DoCmdGetNearestFontToMaxHeightInTwipsL(const TDesC& aSection) + { + TBool dataOk = ETrue; + TPtrC wrapperName; + if (!GetStringFromConfig(aSection, KFldFont, wrapperName)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + TInt maxHeight; + if (!GetIntFromConfig(aSection, KFldMaxHeight, maxHeight)) + { + dataOk = EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldMaxHeight()); + SetBlockResult(EFail); + } + + TFontSpec fontSpec; + if (!GetFontSpecFromConfig(aSection, KFldOpenFont, fontSpec)) + { + return EFalse; + } + + if (dataOk) + { + TInt err; + CFont* font; + + INFO_PRINTF1(_L("execute CFontStore::GetNearestFontToMaxHeightInTwips(CFont*&, const TOpenFontSpec&, TInt)")); + err = iFntStore->GetNearestFontToMaxHeightInTwips(font, TOpenFontSpec(fontSpec), maxHeight); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + SetDataObjectL(wrapperName, font); + } + } + return ETrue; + } + +void CT_DataFontStore::DoCmdInstallRasterizerL(const TDesC& aSection) + { + COpenFontRasterizer* rasterizer = NULL; + TInt err; + TBool useDummy; + + if (!GetBoolFromConfig(aSection, KFldUseTestClass, useDummy)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldUseTestClass()); + SetBlockResult(EFail); + } + else + { + if (useDummy) + { + TRAP(err, rasterizer = CTestRasterizer::NewL()); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + return; + } + } + else + { + CT_GraphicsUtil::GetRasterizerL(*this, aSection, KFldRasterizer, rasterizer); + } + + if (rasterizer == NULL) + { + INFO_PRINTF1(_L("execute CFontStore::InstallRasterizerL(NULL)")); + } + else + { + INFO_PRINTF1(_L("execute CFontStore::InstallRasterizerL(COpenFontRasterizer*)")); + } + TRAP(err, iFntStore->InstallRasterizerL(rasterizer)); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + } + } + +void CT_DataFontStore::DoCmdInstallShaperFactoryL(const TDesC& aSection) + { + CShaperFactory* shaper = NULL; + TInt err; + TBool useDummy; + + if (!GetBoolFromConfig(aSection, KFldUseTestClass, useDummy)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldUseTestClass()); + SetBlockResult(EFail); + } + else + { + if (useDummy) + { + TRAP(err, shaper = CTestShaperFactory::NewL()); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + return; + } + } + else + { + CT_GraphicsUtil::GetShaperFactoryL(*this, aSection, KFldShaperFactory, shaper); + } + + if (shaper == NULL) + { + INFO_PRINTF1(_L("execute CFontStore::InstallShaperFactoryL(NULL)")); + } + else + { + INFO_PRINTF1(_L("execute CFontStore::InstallShaperFactoryL(CShaperFactory*)")); + } + TRAP(err, iFntStore->InstallShaperFactoryL(shaper)); + if (err != KErrNone) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + } + } + +void CT_DataFontStore::DoCmdSetDefaultBitmapType(const TDesC& aSection) + { + TGlyphBitmapType bmptype; + + if (!CT_GraphicsUtil::ReadGlyphBitmapType(*this, aSection, KFldGlyphBitmapType(), bmptype)) + { + ERR_PRINTF2(KLogMissingParameter, &KFldGlyphBitmapType()); + SetBlockResult(EFail); + } + else + { + INFO_PRINTF1(_L("execute CFontStore::SetDefaultBitmapType(TGlyphBitmapType)")); + iFntStore->SetDefaultBitmapType(bmptype); + } + }