--- /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 <coemain.h>
+#include <AknLayout2DataDef.h>
+#include <cdlfont.cdl.h>
+#include <CdlRefs.h>
+
+#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<SLogicalIdMetricsIdPair> 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<SIdMetricsPair> 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; ii<count; ii++)
+ {
+ if (refs->Ref(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