fontservices/fontstore/inc/openfontsprivate.h
changeset 0 1fb32624e06b
child 5 e96e8a131979
child 16 56cd22a7a1cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontservices/fontstore/inc/openfontsprivate.h	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,574 @@
+/*
+* Copyright (c) 2006-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: 
+*
+*/
+
+
+#ifndef __OPENFONTS_PRIVATE_H__
+#define __OPENFONTS_PRIVATE_H__
+
+#include <e32hashtab.h>
+
+class COpenFontShaperCacheEntry;
+
+/* MSB is set to indicate a glyph code rather than a unicode value
+   This is used for extracting the code value */
+#define GLYPH_CODE(code) (code & 0x7fffffff)
+
+/** COpenFontFile owned container for extra data. May be extended without affecting Binary Compatibility.
+
+ @internalComponent
+ */
+
+class TOpenFontFileData
+	{
+public:
+	CFontStore* iFontStore;			// pointer to the CFontStore instance that loaded the COpenFontFile
+	};
+
+#ifdef FNTSTORE_SUPPORT_FMM
+/**
+ @internalComponent
+ */
+class COpenFontGlyph
+	{
+public:
+	COpenFontGlyph(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics):
+		iCode(aCode), iGlyphIndex(aGlyphIndex), iMetrics(aMetrics), iBitmapOffset(0) { }
+	
+	static COpenFontGlyph* NewL(RHeap* aHeap, TInt aCode, TInt aGlyphIndex,
+								const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+
+	static void Delete(RHeap* aHeap, COpenFontGlyph* aGlyph);	
+	TUint8* Bitmap() const;	
+
+	TInt iCode;						// the Unicode value of the character
+	TInt iGlyphIndex;				// the glyph index
+	TOpenFontCharMetrics iMetrics;	// the metrics	
+
+protected:
+	TBool SetBitmap(RHeap* aHeap, const TDesC8& aBitmap);
+	~COpenFontGlyph();
+	
+private:
+	// an offset from this COpenFontGlyph object to a pointer to the run-length-encoded bitmap, 
+	// calculated as (bitmapPointer)-(this)
+	TInt iBitmapOffset;				
+	};
+#else
+/**
+ @internalComponent
+ */
+class COpenFontGlyph
+	{
+public:
+	COpenFontGlyph(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics):
+		iCode(aCode), iGlyphIndex(aGlyphIndex), iMetrics(aMetrics), iBitmap(NULL) { }
+	
+	static COpenFontGlyph* NewL(RHeap* aHeap, TInt aCode, TInt aGlyphIndex,
+								const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+
+	static void Delete(RHeap* aHeap, COpenFontGlyph* aGlyph);
+
+	TInt iCode;						// the Unicode value of the character
+	TInt iGlyphIndex;				// the glyph index
+	TOpenFontCharMetrics iMetrics;	// the metrics
+	TUint8* iBitmap;				// the run-length-encoded bitmap
+
+protected:
+	TBool SetBitmap(RHeap* aHeap, const TDesC8& aBitmap);
+	~COpenFontGlyph();
+	};
+#endif // FNTSTORE_SUPPORT_FMM
+
+#ifdef FNTSTORE_SUPPORT_FMM
+/**
+ Binary tree of glyphs. Each glyph can have left and right child nodes which are added
+ depending on the value of their glyph code relative to the parent's glyph code.
+
+ @internalComponent
+ */
+class COpenFontGlyphTreeEntry: public COpenFontGlyph
+	{
+	friend class COpenFont;
+	
+public:
+	static COpenFontGlyphTreeEntry* New(RHeap* aHeap, TInt aCode, TInt aGlyphIndex,
+										const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+
+private:
+	/** The left COpenFontGlyphTreeEntry from this entry. Represented by an offset from the
+	current heap base. Use COpenFont::ThisOffsetToPointer() to convert to a valid 
+	COpenFontGlyphTreeEntry pointer. */
+	TInt iLeftOffset; 
+	/** The right COpenFontGlyphTreeEntry from this entry. Represented by an offset from the
+	current heap base. Use COpenFont::ThisOffsetToPointer() to convert to a valid 
+	COpenFontGlyphTreeEntry pointer. */
+	TInt iRightOffset;
+
+private:
+	COpenFontGlyphTreeEntry(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics)
+	 :	COpenFontGlyph(aCode, aGlyphIndex, aMetrics), iLeftOffset(0), iRightOffset(0) {}
+
+	~COpenFontGlyphTreeEntry();
+	};
+#else
+/**
+ binary tree of glyphs
+
+ @internalComponent
+ */
+class COpenFontGlyphTreeEntry: public COpenFontGlyph
+	{
+public:
+	static COpenFontGlyphTreeEntry* New(RHeap* aHeap, TInt aCode, TInt aGlyphIndex,
+										const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+
+	COpenFontGlyphTreeEntry* iLeft;		// pointer to left node in tree
+	COpenFontGlyphTreeEntry* iRight;	// pointer to right node in tree
+	COpenFontGlyphTreeEntry* iNext;		// pointer to next glyph in the list; so that the cache can be deleted non-recursively
+
+private:
+	COpenFontGlyphTreeEntry(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics)
+	 :	COpenFontGlyph(aCode, aGlyphIndex, aMetrics), iLeft(NULL), iRight(NULL), iNext(NULL) { }
+	
+	~COpenFontGlyphTreeEntry();
+	};
+#endif // FNTSTORE_SUPPORT_FMM
+
+#ifdef FNTSTORE_SUPPORT_FMM
+/**
+ RArray for storing offsets to COpenFontGlyphTreeEntry objects. Stores each
+ COpenFontGlyphTreeEntry as an offset from the "this" pointer of this object.
+ Allows glyph entries to be added, accessed and deleted from the glyph array
+ from different processes.  
+ 
+ @internalComponent
+ */
+class RArrayGlyphEntries : public RArray<TInt>
+	{
+public:
+	inline const COpenFontGlyphTreeEntry& operator[](TInt anIndex) const;
+	inline COpenFontGlyphTreeEntry& operator[](TInt anIndex);
+	TInt Append(COpenFontGlyphTreeEntry& anEntry);
+private:
+	inline const COpenFontGlyphTreeEntry* Entry(TInt anIndex) const;
+	inline COpenFontGlyphTreeEntry** EntryMemberOffSet() const;
+	inline TAny** EntryMember() const;
+private:
+	TInt iEntriesOffset;
+	};
+#endif // FNTSTORE_SUPPORT_FMM
+
+#ifdef FNTSTORE_SUPPORT_FMM
+/**
+ The per-font glyph cache. For now, just the members that used to be directly in
+ COpenFont. Now it is a private class it can be elaborated to do character-to-glyph-index
+ mapping when that is needed.
+
+ @internalComponent
+ */
+class COpenFontGlyphCache
+	{
+public:
+	COpenFontGlyphCache(): iGlyphTreeOffset(0), iGlyphCacheMemory(0), iShaperCacheSentinel(NULL), iShapingInfoCacheMemory(0), iNumberOfShaperCacheEntries(0) { }
+	TShapeHeader* SearchShaperCache(TInt aSessionHandle, TFontShapeFunctionParameters*& aParams);
+	TShapeHeader* Insert(TInt aSessionHandle, RHeap* aHeap, CShaper::TInput aInput, TShapeHeader* aShapeHeader, TInt& aAddedBytes);
+	TInt DeleteLeastRecentlyUsedEntry(RHeap* aHeap);
+	TBool ShaperCacheIsEmpty();
+	
+public:
+	TInt iGlyphTreeOffset;									// an offset to root of the glyph cache; a binary tree
+	TInt iGlyphCacheMemory;									// memory used by the glyph tree in bytes
+	COpenFontShaperCacheEntry* iShaperCacheSentinel;
+	TInt iShapingInfoCacheMemory;
+	TInt iNumberOfShaperCacheEntries;
+	RArrayGlyphEntries iGlyphArray;
+	};
+#else
+/**
+ The per-font glyph cache. For now, just the members that used to be directly in
+ COpenFont. Now it is a private class it can be elaborated to do character-to-glyph-index
+ mapping when that is needed.
+
+ @internalComponent
+ */
+class COpenFontGlyphCache
+	{
+public:
+	COpenFontGlyphCache(): iGlyphTree(NULL), iGlyphCacheMemory(0), iGlyphList(NULL), iShaperCacheSentinel(NULL), iShapingInfoCacheMemory(0), iNumberOfShaperCacheEntries(0) { }
+	TShapeHeader* SearchShaperCache(TInt aSessionHandle, TFontShapeFunctionParameters*& aParams);
+	TShapeHeader* Insert(TInt aSessionHandle, RHeap* aHeap, CShaper::TInput aInput, TShapeHeader* aShapeHeader, TInt& aAddedBytes);
+	TInt DeleteLeastRecentlyUsedEntry(RHeap* aHeap);
+	TBool ShaperCacheIsEmpty();
+	
+public:
+	COpenFontGlyphTreeEntry* iGlyphTree;					// the root of the glyph cache; a binary tree
+	TInt iGlyphCacheMemory;									// memory used by the glyph tree in bytes
+	COpenFontGlyphTreeEntry* iGlyphList;					// the glyphs, organized as a list
+	COpenFontShaperCacheEntry* iShaperCacheSentinel;
+	TInt iShapingInfoCacheMemory;
+	TInt iNumberOfShaperCacheEntries;
+	};
+#endif // FNTSTORE_SUPPORT_FMM
+
+/**
+ @internalComponent
+ */
+#ifdef FNTSTORE_SUPPORT_FMM
+class COpenFontSessionCacheEntry: public COpenFontGlyph
+	{
+public:
+	static COpenFontSessionCacheEntry* New(RHeap* aHeap, const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,
+										   const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+	inline COpenFont* Font()const;
+
+private:
+	COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics):
+		COpenFontGlyph(aCode, aGlyphIndex, aMetrics)
+		, iFontOffset(reinterpret_cast<TInt>(aFont) - reinterpret_cast<TInt>(this))	
+		    { }
+	~COpenFontSessionCacheEntry();
+public:
+    TInt iLastAccess;               // serial number of the last access to the glyph
+
+private: 
+    const TInt iFontOffset;          // offset of the font that contains this glyph, (not owned by this class!)    
+	};
+
+#else
+class COpenFontSessionCacheEntry: public COpenFontGlyph
+    {
+public:
+    static COpenFontSessionCacheEntry* New(RHeap* aHeap, const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,
+                                           const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
+
+private:
+    COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics):
+        COpenFontGlyph(aCode, aGlyphIndex, aMetrics), iFont(aFont) { }
+    ~COpenFontSessionCacheEntry();
+public:
+    const COpenFont* iFont;         // the font that contains this glyph, (not owned by this class!)
+    TInt iLastAccess;               // serial number of the last access to the glyph
+    };
+   
+#endif    //FNTSTORE_SUPPORT_FMM
+
+/**
+ A glyph cache for a particular session.
+ Because session caches are not shared they can shrink as well as grow.
+
+ @internalComponent
+ */
+#ifdef FNTSTORE_SUPPORT_FMM
+class COpenFontSessionCache
+    {
+public:
+    static COpenFontSessionCache* NewL(RHeap* aHeap, TInt aSessionHandle, TInt aEntries);
+    void Delete(RHeap* aHeap);
+    
+    TInt SessionHandle() { return iSessionHandle; }
+    const COpenFontGlyph* Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex);
+    void Insert(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry, TInt aIndex);
+    inline TInt* Entry()const;
+    inline COpenFontSessionCacheEntry* ToCOpenFontSessionCacheEntryPointer(TInt aOffset)const;
+    
+private:
+    COpenFontSessionCache(TInt aSessionHandle, TInt aEntries);
+    ~COpenFontSessionCache();
+public:
+    TInt iSessionHandle;    
+    TInt iEntries;
+    TInt iLastAccess;
+private:    
+    TInt iEntryOffset;    // Offset of the pointer to an offset array which is of COpenFontSessionCacheEntry*    
+    };
+#else
+class COpenFontSessionCache
+	{
+public:
+	static COpenFontSessionCache* NewL(RHeap* aHeap, TInt aSessionHandle, TInt aEntries);
+	void Delete(RHeap* aHeap);
+	
+	TInt SessionHandle() { return iSessionHandle; }
+	const COpenFontGlyph* Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex);
+	void Insert(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry, TInt aIndex);
+
+private:
+	COpenFontSessionCache(TInt aSessionHandle, TInt aEntries);
+	~COpenFontSessionCache();
+public:
+	TInt iSessionHandle;
+	TInt iEntries;
+	TInt iLastAccess;
+	COpenFontSessionCacheEntry** iEntry;
+	};
+#endif //FNTSTORE_SUPPORT_FMM
+/**
+ @internalComponent
+ */
+#ifdef FNTSTORE_SUPPORT_FMM
+class COpenFontSessionCacheListItem
+	{
+public:
+	COpenFontSessionCacheListItem(COpenFontSessionCache* aCache);
+
+	COpenFontSessionCacheListItem* Next();
+	void SetNext(COpenFontSessionCacheListItem* aNext);
+	COpenFontSessionCache* Cache(); 
+
+	void Delete(RHeap* aHeap);
+private:
+	~COpenFontSessionCacheListItem();
+private:
+	TInt iNextOffset;
+	TInt iCacheOffset;
+	};
+#else
+class COpenFontSessionCacheListItem
+	{
+public:
+	COpenFontSessionCacheListItem(COpenFontSessionCache* aCache): iNext(NULL), iCache(aCache) { }
+	void Delete(RHeap* aHeap);
+private:
+	~COpenFontSessionCacheListItem();
+public:
+	COpenFontSessionCacheListItem* iNext;	// the next cache in the list
+	COpenFontSessionCache* iCache;			// the cache if non-null;
+	};	
+#endif // FNTSTORE_SUPPORT_FMM
+
+
+class TFontTableGlyphOutlineCacheMemMonitor
+    {
+public:
+    TFontTableGlyphOutlineCacheMemMonitor();
+    void Inc(TInt aBytes);
+    void Dec(TInt aBytes);
+    TInt GetMemUsage();
+private:
+    TInt iBytes;
+    };
+
+struct TCacheUserInfo {
+    TInt iSessionHandle;
+    TInt iRefCount;
+    TCacheUserInfo(TInt aSessionHandle, TInt aRefCount = 0): 
+            iSessionHandle(aSessionHandle), iRefCount(aRefCount) { } 
+};
+
+class CFontTableCache;
+
+class CFontTableCacheItem
+    {
+friend class CFontTableCache ;
+
+public:
+    CFontTableCacheItem(TUid &aFileUid, const TUint32 aTag, 
+            TInt aOffset, TInt aLength);
+    ~CFontTableCacheItem(); 
+
+    TInt DecRefCount(TInt aSessionHandle);
+    TInt IncRefCount(TInt aSessionHandle);
+
+    TBool HasOutstandingRefCount();
+    TInt FindUser(TInt aSessionHandle, TInt *id);
+    
+#ifdef _DEBUG
+    void SetUser(RPointerArray<TCacheUserInfo> users)
+        {
+        TInt len = users.Count();
+        for( TInt i = 0; i < len ; i++ )
+            {
+            iUsers.Append(users[i]);
+            }
+        }    
+#endif
+    
+private:
+    CFontTableCacheItem(const CFontTableCacheItem &); // disallow copy construction.
+    CFontTableCacheItem& operator =(const CFontTableCacheItem &); // disallow assignment.
+    
+    TUid iFileUid; 
+    TUint32 iTag; 
+ 
+
+    TInt iOffset;
+    TInt iLength; 
+    RPointerArray<TCacheUserInfo> iUsers;
+    }; 
+
+
+class CFontTableCache 
+    {
+public:
+    CFontTableCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
+    ~CFontTableCache();
+    TInt Append(TUid aFileUid, TUint32 aTag, 
+            TAny*& aContent, TInt aLength);
+    TInt Find(TUid aFileUid, TUint32 aTag, TAny*& aContent, TInt& aLength, TInt* id);
+    TInt IncRefCount(TUid FileUid, TUint32 aTag, TInt aSessionHandle);
+    TInt DecRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
+    TBool HasOutstandingRefCount();
+    TBool HasOutstandingRefCountWithUid(TUid aFileUid);  
+    void CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
+    void CleanupCacheOnOpenFontFileRemoval(COpenFontFile*);
+#ifdef _DEBUG    
+    void SetFontItem(RPointerArray<CFontTableCacheItem> cacheItems)
+        {
+        TInt len = cacheItems.Count();
+        for(TInt i = 0; i < len; i++)
+            {
+            iCacheItems.Append(cacheItems[i]);
+            }
+        }
+#endif   
+    
+private:
+    CFontTableCache(const CFontTableCache &); // no copy construction.
+    CFontTableCache& operator =(const CFontTableCache &); // no assignment.
+#ifdef _DEBUG
+    TInt GetCacheState(const char *func);
+#endif
+    
+    TFontTableGlyphOutlineCacheMemMonitor &iCacheMemMon;
+    RHeap *iHeap;
+    RPointerArray<CFontTableCacheItem> iCacheItems;
+    };
+
+
+class TUnhintedOutlineCache;
+
+class TUnhintedOutlineId 
+    {
+public:
+    TUnhintedOutlineId(TUid aFileUid, TInt aFaceIndex, TUint aId);
+    TUid iFileUid;
+    TInt iFaceIndex;
+    TUint iId;
+    };
+
+class COutlineCacheItem {
+friend class CUnhintedOutlineCache;
+friend class CHintedOutlineCache;
+    
+public:
+    COutlineCacheItem(TInt aOffset, TInt aLength);
+    ~COutlineCacheItem() ;
+
+    TInt DecRefCount(TInt aSessionHandle);
+    TInt IncRefCount(TInt aSessionHandle);
+#ifdef _DEBUG
+    void SetUser(RPointerArray<TCacheUserInfo> users)
+        {
+        TInt len = users.Count();
+        for( TInt i = 0; i < len ; i++ )
+            {
+            iUsers.Append(users[i]);
+            }
+        }    
+#endif
+ 
+private:
+    TInt FindUser(TInt aSessionHandle, TInt *id);
+        
+
+    TInt iOffset;
+    TInt iLength;
+    RPointerArray<TCacheUserInfo> iUsers;
+};    
+
+class CUnhintedOutlineCache {
+public:
+    CUnhintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
+    TInt Find(const TUnhintedOutlineId &aOutlineId, TAny*& aData, TInt& aLength);
+    TInt IncRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
+    TInt DecRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
+    TInt CacheUnhintedOutline(const TUnhintedOutlineId& aOutlineId, 
+            TAny * const aData, const TInt aLength, TAny*& aOutline, TInt &aLen);
+    TInt CleanupCacheOnOpenFontFileRemoval(COpenFontFile* aFontFile);
+    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
+#ifdef _DEBUG
+    TInt GetCacheState(const char *func);
+#endif
+    ~CUnhintedOutlineCache();
+    
+#ifdef _DEBUG
+    void SetUnHintedItem(TUnhintedOutlineId id, COutlineCacheItem* item)
+        {
+        iItemIdMap.Insert(id, item);
+        }
+#endif
+    
+private:
+    // disallow assignment and copy-construction
+    CUnhintedOutlineCache(const CUnhintedOutlineCache &); 
+    CUnhintedOutlineCache& operator =(const CUnhintedOutlineCache &);
+    
+    static TUint32 IdHash(const TUnhintedOutlineId& aOutlineId);
+    static TBool IdIdentity(const TUnhintedOutlineId& id1, const TUnhintedOutlineId& id2);
+    
+    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
+    RHeap* iHeap; 
+    RHashMap<TUnhintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
+};
+
+class CHintedOutlineCache;
+
+class THintedOutlineId 
+    {
+public:
+    THintedOutlineId(COpenFont* aFont, TUint aId);
+    COpenFont *iFont;
+    TUint iId;
+    };
+
+
+class CHintedOutlineCache {
+public:
+    CHintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
+    TInt Find(const THintedOutlineId& aOutlineId, TAny*& aData, TInt& aLength);
+    TInt IncRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
+    TInt DecRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
+    TInt CacheHintedOutline(const THintedOutlineId& aOutlineId, 
+            TAny* aData, TInt aLength, TAny*& aOutline, TInt& aLen);
+    TInt CleanupCacheOnOpenFontRemoval(COpenFont* aFont);
+    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
+#ifdef _DEBUG
+    TInt GetCacheState(const char *func);
+    void SetHintedItem(THintedOutlineId id, COutlineCacheItem* item)
+        {
+        iItemIdMap.Insert(id, item);
+        }
+    RHashMap<THintedOutlineId, COutlineCacheItem*> GetHintedMap()
+    {
+    return iItemIdMap;
+    }
+#endif
+    
+private:
+    // disallow assignment and copy-construction
+    CHintedOutlineCache(const CHintedOutlineCache &); 
+    CHintedOutlineCache& operator =(const CHintedOutlineCache &);
+    static TUint32 IdHash(const THintedOutlineId& aOutlineId);
+    static TBool IdIdentity(const THintedOutlineId& id1, const THintedOutlineId& id2);
+        
+    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
+    RHeap* iHeap; 
+    RHashMap<THintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
+    };
+
+
+#endif	// __OPENFONTSPRIVATE_H__