diff -r 000000000000 -r 05e9090e2422 fontsupport/fontutils/FontUtils/src/AknFontSpecification.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontsupport/fontutils/FontUtils/src/AknFontSpecification.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2004-2008 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: Object representing a Series 60 font request +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include +#include + +#include "AknFontIdOffsets.hrh" +#include "AknFontSpecification.h" +#include "AknFontUtilsPanic.h" +#include "AknFontId.h" + +// CONSTANTS + +// ============================ MEMBER FUNCTIONS =============================== + +enum TAknFontSpecifiationBitIndex + { + EScalesInTwips = 0, + ERequiresExactMatch, + ETextPaneIsDesignHeight + }; + +EXPORT_C TAknFontSpecification::TAknFontSpecification( TInt aFontId ) + { + + if( TAknFontId::IsEncodedFont(aFontId) ) + { + iBaseFontCategory = TAknFontId::ExtractCategoryFromFontId(aFontId); + iRequiredStyle.SetStrokeWeight(TAknFontId::ExtractWeightFromFontId(aFontId) == 0 ? EStrokeWeightNormal : EStrokeWeightBold); + iRequiredStyle.SetPosture(TAknFontId::ExtractPostureFromFontId(aFontId) == 0 ? EPostureUpright : EPostureItalic); + iRequiredStyle.SetEffects(FontEffect::EOutline, TAknFontId::ExtractOutlineFromFontId(aFontId) == 0 ? EFalse : ETrue); + iTextPaneHeight = (TInt16)TAknFontId::ExtractHeightFromFontId(aFontId); + } + else + { + if (!CDL_Font::IsCustomisationStarted()) + { + TRAPD( error, LoadAnyCDLFontInstanceL() ); + __ASSERT_ALWAYS( error == KErrNone, Panic(EAknPanicLayoutMissing) ); + } + + // process legacy and logical font ids + if ( KHighestFixedLayoutFont < aFontId && aFontId <= KAknHighestLogicalFont ) + { + TCdlArray const& logicalidmaparray = CDL_Font::logicalIdMapArray(); + TInt nLogicals= logicalidmaparray.Count(); + for ( TInt index = 0; index < nLogicals; index++) + { + if ( aFontId == logicalidmaparray[index].iLogicalId ) + { + aFontId = logicalidmaparray[index].iFontMetricsId; + break; + } + } + } + + TCdlArray const& metricsarray = CDL_Font::metricsArray(); + + TInt nMetrics= metricsarray.Count(); + TInt foundIndex = KErrNotFound; + for ( TInt index = 0; index < nMetrics; index++) + { + if ( aFontId == metricsarray[index].iFontId ) + { + foundIndex = index; + break; + } + } + + if ( foundIndex == KErrNotFound ) + { + foundIndex = 0; + } + + // Set the member data of the font specification + iTextPaneHeight = metricsarray[foundIndex].iBodyHeight; + iBaseFontCategory = (TAknFontCategory)metricsarray[foundIndex].iFontCategory; + iRequiredStyle.SetStrokeWeight( metricsarray[foundIndex].iBold == 0 + ? EStrokeWeightNormal : EStrokeWeightBold); + iRequiredStyle.SetPosture( metricsarray[foundIndex].iItalic == 0 + ? EPostureUpright : EPostureItalic ); + } + } + +EXPORT_C TAknFontSpecification::TAknFontSpecification( TAknFontCategory aCategory, + const TFontSpec& aFontSpec, + const MGraphicsDeviceMap* aDeviceMap ) + :iBaseFontCategory( aCategory ) + { + const MGraphicsDeviceMap* map; + if ( aDeviceMap ) + map = aDeviceMap; + else + map = CCoeEnv::Static()->ScreenDevice(); + + // Use the map to get font height in pixels + TPoint point(aFontSpec.iHeight, aFontSpec.iHeight); + TPoint newPoint = map->TwipsToPixels(point); + iTextPaneHeight = newPoint.iY; + iRequiredStyle = aFontSpec.iFontStyle; + } + +EXPORT_C TAknFontCategory TAknFontSpecification::FontCategory() const + { + return (TAknFontCategory)iBaseFontCategory; + } + +EXPORT_C TInt TAknFontSpecification::TextPaneHeight() const + { + return iTextPaneHeight; + } + +EXPORT_C TFontStrokeWeight TAknFontSpecification::Weight() const + { + return iRequiredStyle.StrokeWeight(); + } + +EXPORT_C TFontPosture TAknFontSpecification::Posture() const + { + return iRequiredStyle.Posture(); + } + +EXPORT_C TBool TAknFontSpecification::IsOutlineEffectOn() const + { + return iRequiredStyle.IsEffectOn(FontEffect::EOutline); + } + +void TAknFontSpecification::LoadAnyCDLFontInstanceL() + { + // find any instances that implement CDL_Font, and load the first one! + // This stuff may leave so we should attempt to ensure CDL engine is started up already, avoiding + // the requirement for this code + CCdlRefCollection* refs = CdlEngine::FileContentsLC(KAknLayoutDllName); + TInt count = refs->CountRefs(); + for (TInt ii=0; iiRef(ii).iUid == CDL_Font::KCdlInterfaceUid) + { + CDL_Font::LoadCustomisationL(refs->Ref(ii)); + break; + } + } + CleanupStack::PopAndDestroy(refs); + } + +EXPORT_C void TAknFontSpecification::SetTextPaneHeight( TInt aNewHeight ) + { + iTextPaneHeight = aNewHeight; + } + +EXPORT_C void TAknFontSpecification::SetFontCategory( TAknFontCategory aCategory) + { + iBaseFontCategory = aCategory; + } + +EXPORT_C void TAknFontSpecification::SetWeight( TFontStrokeWeight aWeight ) + { + iRequiredStyle.SetStrokeWeight(aWeight); + } + +EXPORT_C void TAknFontSpecification::SetPosture( TFontPosture aPosture ) + { + iRequiredStyle.SetPosture(aPosture); + } + +EXPORT_C void TAknFontSpecification::SetTextPaneHeightIsDesignHeight( TBool aTextPaneHeightIsDesignHeight ) + { + iFlags.Assign(ETextPaneIsDesignHeight, aTextPaneHeightIsDesignHeight); + } + +EXPORT_C void TAknFontSpecification::SetExactMatchRequired ( TBool aRequiresExactMatch ) + { + iFlags.Assign(ERequiresExactMatch, aRequiresExactMatch); + } + +EXPORT_C void TAknFontSpecification::SetUnits ( TAknFontSpecificationUnits aUnits ) + { + iFlags.Assign(EScalesInTwips, aUnits == TAknFontSpecification::ETwips ); + } + +EXPORT_C TBool TAknFontSpecification::ExactMatchRequired() const + { + return iFlags[ERequiresExactMatch]; + } + +EXPORT_C TBool TAknFontSpecification::TextPaneIsDesignHeight() const + { + return iFlags[ETextPaneIsDesignHeight]; + } + +EXPORT_C TAknFontSpecification::TAknFontSpecificationUnits TAknFontSpecification::Units() const + { + TAknFontSpecification::TAknFontSpecificationUnits units(EPixels); + if ( iFlags[EScalesInTwips] ) + { + units = TAknFontSpecification::ETwips; + } + return units; + } + + +// End of File