williamr@2: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef FNTSTORE_H__ williamr@2: #define FNTSTORE_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: class CLinkedTypefaceSpecification; williamr@2: class CLinkedFontSpecification; williamr@2: class TLinkedTypefaceSpecArgs; williamr@2: class CFbClient; williamr@2: class CFontStoreFile; williamr@2: class CFontBitmap; williamr@2: class RReadStream; williamr@2: class TTypefaceFontBitmap; williamr@2: class TShapeHeader; williamr@2: class TShapeMessageParameters; williamr@2: class CTypefaceSupportInfo; williamr@2: williamr@2: williamr@2: /** williamr@2: @internalTechnology williamr@2: */ williamr@2: class TCharacterMetrics williamr@2: { williamr@2: public: williamr@2: IMPORT_C TCharacterMetrics(); williamr@2: williamr@2: TInt16 iAscentInPixels; williamr@2: TInt16 iHeightInPixels; williamr@2: TInt16 iLeftAdjustInPixels; williamr@2: TInt16 iMoveInPixels; williamr@2: TInt16 iRightAdjustInPixels; williamr@2: }; williamr@2: williamr@2: class TAlgStyle williamr@2: /** williamr@2: An algorithmic style for how a font is drawn. williamr@2: williamr@2: Holds attributes such as whether the font is bold or italic, and the width williamr@2: and height factors. This is used as an input parameter for the GetFontById() method williamr@2: of some font management classes. See CWsScreenDevice::GetFontById() for more information. williamr@2: @publishedAll williamr@2: @released williamr@2: @see CWsScreenDevice::GetFontById() williamr@2: @see CFbsTypefaceStore::GetFontById() williamr@2: @see CFbsDevice::GetFontById() williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C TAlgStyle(); williamr@2: IMPORT_C void SetIsBold(TBool aIsBold); williamr@2: IMPORT_C void SetIsItalic(TBool aIsItalic); williamr@2: IMPORT_C void SetIsMono(TBool aIsMono); williamr@2: IMPORT_C void SetWidthFactor(TInt aWidthFactor); williamr@2: IMPORT_C void SetHeightFactor(TInt aHeightFactor); williamr@2: IMPORT_C TBool IsBold() const; williamr@2: IMPORT_C TBool IsItalic() const; williamr@2: IMPORT_C TBool IsMono() const; williamr@2: IMPORT_C TInt WidthFactor() const; williamr@2: IMPORT_C TInt HeightFactor() const; williamr@2: IMPORT_C TBool operator==(const TAlgStyle& aAlgStyle) const; williamr@2: TBool operator!=(const TAlgStyle& aAlgStyle) const; williamr@2: public: williamr@2: /** Baseline offset in pixels. */ williamr@2: TInt iBaselineOffsetInPixels; williamr@2: private: williamr@2: enum williamr@2: { williamr@2: EBold=1, williamr@2: EItalic=2, williamr@2: EMono=4, williamr@2: }; williamr@2: /** This member is private and not intended for use. */ williamr@2: TInt8 iFlags; williamr@2: /** This member is private and not intended for use. */ williamr@2: TInt8 iWidthFactor; williamr@2: /** This member is private and not intended for use. */ williamr@2: TInt8 iHeightFactor; williamr@2: }; williamr@2: williamr@2: class CLinkedFontInformation; williamr@2: williamr@2: /** williamr@2: Bitmap font class. williamr@2: An object of this class may either access and use a bitmap font (a CFontBitmap) williamr@2: or an open font (a COpenFont). williamr@2: Stored in a CFontStore. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CBitmapFont : public CFont williamr@2: { williamr@2: friend class CFontStore; williamr@2: friend class CLinkedFontSpecification; williamr@2: friend class CLinkedFontInformation; williamr@2: public: williamr@2: // New functions williamr@2: TUid Uid() const; williamr@2: IMPORT_C TCharacterMetrics CharacterMetrics(TInt aCode,const TUint8*& aBytes) const; williamr@2: IMPORT_C TBool GetCharacterData(TInt aSessionHandle, TInt aCode, TOpenFontCharMetrics& aMetrics, const TUint8*& aBitmap) const; williamr@2: IMPORT_C TBool Rasterize(TInt aSessionHandle,TInt aCode,TOpenFontGlyphData* aGlyphData) const; williamr@2: IMPORT_C void GetFontMetrics(TOpenFontMetrics& aMetrics) const; williamr@2: IMPORT_C TBool GetFaceAttrib(TOpenFontFaceAttrib& aAttrib) const; williamr@2: IMPORT_C TInt BitmapEncoding() const; williamr@2: IMPORT_C TBool HasCharacterL(TInt aCode) const; williamr@2: IMPORT_C TBool CharacterNeedsToBeRasterized(TInt aSessionHandle,TInt aCode) const; williamr@2: IMPORT_C TShapeHeader* ShapeTextL(const TDesC16& aText, williamr@2: TInt aSessionHandle, const TShapeMessageParameters& aParams); williamr@2: IMPORT_C void DeleteShape(TInt aSessionHandle,TShapeHeader* aHeader); williamr@2: IMPORT_C void operator delete(TAny*); williamr@2: inline TBool IsOpenFont() const; williamr@2: inline COpenFont* OpenFont() const; williamr@2: inline TGlyphBitmapType GlyphBitmapType() const; williamr@2: IMPORT_C CLinkedFontInformation* LinkedFontInformation() const; williamr@2: IMPORT_C CBitmapFont* NextFontClientSpace() const; williamr@2: IMPORT_C TBool IsLinkedFont()const; williamr@2: IMPORT_C CBitmapFont* FontWithCharacter(TInt aCode, CLinkedFontInformation *&aInfo, TBool aSearchAllFonts, TBool aGetCanonicalDefault) const; williamr@2: williamr@2: private: williamr@2: // From CFont williamr@2: IMPORT_C virtual TUid DoTypeUid() const; williamr@2: IMPORT_C virtual TInt DoHeightInPixels() const; williamr@2: IMPORT_C virtual TInt DoAscentInPixels() const; williamr@2: IMPORT_C virtual TInt DoCharWidthInPixels(TChar aChar) const; williamr@2: IMPORT_C virtual TInt DoTextWidthInPixels(const TDesC &aText) const; williamr@2: IMPORT_C virtual TInt DoBaselineOffsetInPixels() const; williamr@2: IMPORT_C virtual TInt DoTextCount(const TDesC &aText, TInt aWidthInPixels) const; williamr@2: IMPORT_C virtual TInt DoTextCount(const TDesC &aText, TInt aWidthInPixels, TInt &aExcessWidthInPixels) const; williamr@2: IMPORT_C virtual TInt DoMaxCharWidthInPixels() const; williamr@2: IMPORT_C virtual TInt DoMaxNormalCharWidthInPixels() const; williamr@2: IMPORT_C virtual TFontSpec DoFontSpecInTwips() const; williamr@2: IMPORT_C virtual TInt DoExtendedFunction(TUid aFunctionId, TAny* aParam = NULL) const; williamr@2: williamr@2: private: williamr@2: CBitmapFont(RHeap* aHeap,const TFontSpec& aFontSpecInTwips, const TAlgStyle& aAlgStyle, CFontBitmap* aFontBitmap); williamr@2: CBitmapFont(RHeap* aHeap,const TFontSpec& aFontSpecInTwips, const TAlgStyle& aAlgStyle, COpenFont* aOpenFont); williamr@2: void ConstructL(); williamr@2: ~CBitmapFont(); williamr@2: static CBitmapFont* NewL(RHeap* aHeap, const TFontSpec& aFontSpecInTwips, const TAlgStyle& aAlgStyle, CFontBitmap* aFontBitmap); williamr@2: static CBitmapFont* NewL(RHeap* aHeap, const TFontSpec& aFontSpecInTwips, const TAlgStyle& aAlgStyle, COpenFont* aOpenFont); williamr@2: inline void operator delete(TAny*, TAny*) {} williamr@2: TInt Width(TInt aNum) const; williamr@2: TInt Height(TInt aNum) const; williamr@2: CFontBitmap* FontBitmap() const; williamr@2: void InstallOpenFontShaper(COpenFont* aOpenFont, CShaper::TInput& aShaperInput); williamr@2: williamr@2: private: williamr@2: TFontSpec iFontSpecInTwips; williamr@2: williamr@2: public: williamr@2: /** The algorithmic font style. */ williamr@2: TAlgStyle iAlgStyle; // must not move this member williamr@2: williamr@2: private: williamr@2: // Binary Compatibility warning - data member iOpenFont is referenced by inline methods williamr@2: RHeap* iHeap; williamr@2: TInt iFontBitmapOffset; williamr@2: COpenFont* iOpenFont; // if iOpenFont is non-null this is an open font and many functions are forwarded to it williamr@2: williamr@2: #ifdef SYMBIAN_SUPPORT_LINKED_FONTS williamr@2: CLinkedFontInformation *iFontLinkage; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: class CFontStore : public CTypefaceStore williamr@2: /** williamr@2: A store for fonts. williamr@2: williamr@2: Stores and handles both open and fixed-size fonts. Open fonts are made from williamr@2: open (scalable) typefaces by Open Font plug-in rasterizers. Fonts of other williamr@2: typefaces are stored in a limited number of fixed sizes. However, which is williamr@2: being used is transparent to the user of this class. For example the GetNearestFont...() williamr@2: functions get a bitmap font which may be retrieved from memory or generated williamr@2: via a rasterizer. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: #ifdef SYMBIAN_SUPPORT_LINKED_FONTS williamr@2: friend class CLinkedFonts; williamr@2: friend class CLinkedFontSpecification; williamr@2: friend class CLinkedTypefaceSpecification; williamr@2: #endif williamr@2: williamr@2: public: williamr@2: IMPORT_C static CFontStore* NewL(RHeap* aHeap); williamr@2: IMPORT_C ~CFontStore(); williamr@2: IMPORT_C TUid AddFileL(const TDesC& aName); williamr@2: IMPORT_C void RemoveFile(TUid aFileUid); williamr@2: IMPORT_C TInt GetNearestFontInTwips(CFont *&aFont, const TFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontInPixels(CFont *&aFont, const TFontSpec &aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToDesignHeightInTwips(CFont *&aFont, const TFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToDesignHeightInPixels(CFont *&aFont, const TFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToMaxHeightInTwips(CFont*& aFont, const TFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: IMPORT_C TInt GetNearestFontToMaxHeightInPixels(CFont*& aFont, const TFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: IMPORT_C TInt GetNearestFontInTwips(CFont *&aFont, const TOpenFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontInPixels(CFont *&aFont, const TOpenFontSpec &aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToDesignHeightInTwips(CFont *&aFont, const TOpenFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToDesignHeightInPixels(CFont *&aFont, const TOpenFontSpec& aFontSpec); williamr@2: IMPORT_C TInt GetNearestFontToMaxHeightInTwips(CFont*& aFont, const TOpenFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: IMPORT_C TInt GetNearestFontToMaxHeightInPixels(CFont*& aFont, const TOpenFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: IMPORT_C TInt GetFontById(CFont *&aFont,TUid aUid,const TAlgStyle& aAlgStyle); williamr@2: IMPORT_C TInt NumTypefaces() const; williamr@2: IMPORT_C void TypefaceSupport(TTypefaceSupport &aTypefaceSupport,TInt aTypefaceIndex) const; williamr@2: IMPORT_C TInt FontHeightInTwips(TInt aTypefaceIndex,TInt aHeightIndex) const; williamr@2: IMPORT_C TInt FontHeightInPixels(TInt aTypefaceIndex,TInt aHeightIndex) const; williamr@2: IMPORT_C void InstallRasterizerL(COpenFontRasterizer* aRasterizer); williamr@2: IMPORT_C void DeleteSessionCache(TInt aSessionHandle); williamr@2: inline TGlyphBitmapType DefaultBitmapType() const; williamr@2: inline void SetDefaultBitmapType(TGlyphBitmapType aType); williamr@2: IMPORT_C void InstallShaperFactoryL(CShaperFactory* aShaperFactory); williamr@2: const CArrayPtrFlat* ShaperFactoryList() const; williamr@2: COpenFontSessionCacheList* GetSessionCacheList(); williamr@2: TInt GetShaperCacheMemUsage(); williamr@2: void SetShaperCacheMemUsage(TInt aUsage); williamr@2: CArrayPtrFlat* GetOpenFontFileList(); williamr@2: void IncNumShaperCaches(); williamr@2: void DecNumShaperCaches(); williamr@2: TInt GetNumShaperCaches(); williamr@2: IMPORT_C TInt CreateLinkedTypeface(const TLinkedTypefaceSpecArgs &aLinkedTypefaceSpec, TInt aSession, TInt& aId); williamr@2: IMPORT_C void RemoveLinkedFont(CBitmapFont *aFont); williamr@2: IMPORT_C TBool IsValidLinkedFontSpecification(TInt aHandle); williamr@2: IMPORT_C TBool HaveTypefaceFamilyName(const TDesC& aName); williamr@2: private: williamr@2: CFontStore(RHeap* aHeap); williamr@2: void ConstructL(); williamr@2: void InternalizeFontStoreFileL(CFontStoreFile* aFontStoreFile, TInt aFontVersion); williamr@2: TTypeface* GetNearestTypeface(const TTypeface& aTypeface) const; williamr@2: TTypefaceFontBitmap GetNearestTypefaceFontBitmap(const TFontSpec& aFontSpecInPixels, TInt aMaxHeight); williamr@2: CFontBitmap* GetFontBitmapById(TUid aUid); williamr@2: TBool IsFontLoaded(CFont*& aFont, const TAlgStyle& aAlgStyle, const TFontSpec& aFontSpecInPixels, TUid aUid, TInt aMaxHeight = 0) const; williamr@2: TBool IsFontLoaded(CFont*& aFont, const TAlgStyle& aAlgStyle, const TOpenFontSpec& aFontSpecInPixels, TInt aMaxHeight) const; williamr@2: CBitmapFont* NewFontL(const TFontSpec& aFontSpecInTwips,const TAlgStyle& aAlgStyle,CFontBitmap* aFontBitmap); williamr@2: CBitmapFont* NewFontL(const TOpenFontSpec& aFontSpecInTwips,const TAlgStyle& aAlgStyle,COpenFont* aOpenFont); williamr@2: TInt VerticalPixelsToTwips(TInt aPixelHeight) const; williamr@2: TInt VerticalTwipsToPixels(TInt aTwipsHeight) const; williamr@2: void GetNearestBitmapFontInPixelsL(CFont*& aFont, TFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: void GetNearestOpenFontInPixelsL( williamr@2: CFont*& aFont, TOpenFontSpec& aActualFontSpec, const TOpenFontSpec& aDesiredFontSpec, TInt aMaxHeight); williamr@2: #ifdef SYMBIAN_SUPPORT_LINKED_FONTS williamr@2: TInt GetNearestRealFontInPixels(CFont*& aFont, const TOpenFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: TInt GetNearestFontInPixelsL(CFont*& aFont, const TOpenFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: TInt CreateLinkedTypefaceL(const TLinkedTypefaceSpecArgs &aLinkedTypefaceSpec, TInt aSession, TInt& aId); williamr@2: TInt GetCanonicalIndex(TInt aTypefaceIndex) const; williamr@2: void TypefaceSupportLinked(TTypefaceSupport &aTypefaceSupport, TInt aTypefaceIndex) const; williamr@2: #endif williamr@2: TInt GetNearestFontInPixels(CFont*& aFont, const TOpenFontSpec& aFontSpec, TInt aMaxHeight); williamr@2: void SanityCheckForTtfL(RFile& aFile, TUint aFontFileSize, TBool aStrictChecking); williamr@2: void SanityCheckFontFileL(TParse& aParse); williamr@2: TInt GetNearestOpenFontInPixelsByFontName(COpenFont*& aNearestOpenFont, TOpenFontSpec& aActualFontSpec, const TOpenFontSpec& aDesiredFontSpec, TInt aMaxHeight); williamr@2: TInt GetNearestOpenFontInPixelsBySimilarity(COpenFont*& aNearestOpenFont, TOpenFontSpec& aActualFontSpec, const TOpenFontSpec& aDesiredFontSpec, TInt aMaxHeight); williamr@2: TInt AddTypefacesToSupportList(COpenFontFile* aOpenFontFile); williamr@2: void RemoveTypefacesFromSupportList(COpenFontFile* aOpenFontFile); williamr@2: TInt FindBitmapFontFileIndexByUid(TUid aUid); williamr@2: TBool IncRefCountOfLoadedFont(const TDesC& aFullName, TUid& aFontUid); williamr@2: TBool LoadFileAsOpenFontL(const TDesC& aFullName, TUid& aFontUid); williamr@2: TUid LoadFileAsBitmapFontL(TParse& aParse); williamr@2: static void CleanupRemoveFontFile(TAny* aCleanupInfo); williamr@2: williamr@2: public: williamr@2: /** The width of 1000 pixels in twips. williamr@2: williamr@2: This is set in the constructor. If the appropriate HALData attributes are williamr@2: set (EDisplayXPixels and EDisplayXTwips) then the value is calculated using williamr@2: these; otherwise the value is set to 11860. */ williamr@2: TInt iKPixelWidthInTwips; williamr@2: williamr@2: /** The height of 1000 pixels in twips. williamr@2: williamr@2: This is set in the constructor. If the appropriate HALData attributes are williamr@2: set (EDisplayYPixels and EDisplayYTwips) then the value is calculated using williamr@2: these; otherwise the value is set to 11860. */ williamr@2: TInt iKPixelHeightInTwips; williamr@2: williamr@2: private: williamr@2: // Binary Compatibility warning - data member iDefaultBitmapType is referenced by inline methods williamr@2: RFs iFs; williamr@2: RHeap* iHeap; williamr@2: CArrayPtrFlat iFontStoreFileList; williamr@2: CArrayPtrFlat iTypefaceList; williamr@2: CArrayPtrFlat iFontBitmapList; williamr@2: CArrayFixFlat iTypefaceFontBitmapList; williamr@2: CArrayPtrFlat iOpenFontFileList; williamr@2: TInt iReserved[6]; // keep iDefaultBitmapType at the correct offset williamr@2: CArrayPtrFlat iOpenFontRasterizerList; williamr@2: COpenFontSessionCacheList* iOpenFontSessionCacheList; williamr@2: TInt iOpenFontUid; williamr@2: TGlyphBitmapType iDefaultBitmapType; williamr@2: CArrayPtrFlat iShaperFactoryList; williamr@2: TInt iOpenFontShaperCacheMemUsage; williamr@2: TInt iNumberOfShaperCaches; williamr@2: RPointerArray iOpenFontTypefaceSupportList; williamr@2: #ifdef SYMBIAN_SUPPORT_LINKED_FONTS williamr@2: RPointerArray *iLinkedTypefaceSpecificationList; williamr@2: RPointerArray *iLinkedFontSpecificationList; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: // inline functions start here williamr@2: williamr@2: /** Returns whether the bitmap font object is an open font (a COpenFont) rather williamr@2: than a bitmap font (a CFontBitmap). williamr@2: williamr@2: @return ETrue if the bitmap font object is using an open font (a COpenFont); williamr@2: EFalse if it is using a bitmap font (a CFontBitmap). williamr@2: @see OpenFont() williamr@2: */ williamr@2: inline TBool CBitmapFont::IsOpenFont() const williamr@2: { williamr@2: return iOpenFont != NULL; williamr@2: } williamr@2: williamr@2: /** Returns a pointer to the open font being used by the bitmap font object. williamr@2: williamr@2: @return A pointer to an open font. williamr@2: @see IsOpenFont() williamr@2: */ williamr@2: inline COpenFont* CBitmapFont::OpenFont() const williamr@2: { williamr@2: return iOpenFont; williamr@2: } williamr@2: williamr@2: /** Gets the anti-aliasing setting for the font, see TGlyphBitmapType for williamr@2: the range of values. williamr@2: williamr@2: This is only applicable to open fonts (COpenFonts) not bitmap fonts (CBitmapFonts). williamr@2: williamr@2: Note that this setting is stored in the device-independent font specification williamr@2: which is set when the bitmap font object is constructed. williamr@2: williamr@2: @return The anti-aliasing setting for the font. williamr@2: @see IsOpenFont() williamr@2: @see TGlyphBitmapType williamr@2: @see COpenFont williamr@2: @see CBitmapFont williamr@2: */ williamr@2: inline TGlyphBitmapType CBitmapFont::GlyphBitmapType() const williamr@2: { williamr@2: return iFontSpecInTwips.iFontStyle.BitmapType(); williamr@2: } williamr@2: williamr@2: /** Returns a default bitmap type. williamr@2: williamr@2: @return A default bitmap type. williamr@2: @see TGlyphBitmapType williamr@2: */ williamr@2: inline TGlyphBitmapType CFontStore::DefaultBitmapType() const williamr@2: { williamr@2: return iDefaultBitmapType; williamr@2: } williamr@2: williamr@2: /** Sets a default bitmap type. williamr@2: williamr@2: @param aType A default bitmap type. williamr@2: @see TGlyphBitmapType williamr@2: */ williamr@2: inline void CFontStore::SetDefaultBitmapType(TGlyphBitmapType aType) williamr@2: { williamr@2: iDefaultBitmapType = aType; williamr@2: } williamr@2: williamr@2: #endif