os/textandloc/fontservices/fontstore/inc/openfontsprivate.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#ifndef __OPENFONTS_PRIVATE_H__
sl@0
    20
#define __OPENFONTS_PRIVATE_H__
sl@0
    21
sl@0
    22
#include <hextree.h>
sl@0
    23
#include <e32hashtab.h>
sl@0
    24
sl@0
    25
class COpenFontShaperCacheEntry;
sl@0
    26
sl@0
    27
/* MSB is set to indicate a glyph code rather than a unicode value
sl@0
    28
   This is used for extracting the code value */
sl@0
    29
#define GLYPH_CODE(code) (code & 0x7fffffff)
sl@0
    30
sl@0
    31
/** COpenFontFile owned container for extra data. May be extended without affecting Binary Compatibility.
sl@0
    32
sl@0
    33
 @internalComponent
sl@0
    34
 */
sl@0
    35
sl@0
    36
class TOpenFontFileData
sl@0
    37
	{
sl@0
    38
public:
sl@0
    39
	CFontStore* iFontStore;			// pointer to the CFontStore instance that loaded the COpenFontFile
sl@0
    40
	};
sl@0
    41
sl@0
    42
/**
sl@0
    43
 Note: this class must be self-contained, since instances are added to an RHexTree,
sl@0
    44
 that is, it must be possible to destroy instances simply with RHeap::Free().
sl@0
    45
 @internalComponent
sl@0
    46
 */
sl@0
    47
class COpenFontGlyph
sl@0
    48
	{
sl@0
    49
public:
sl@0
    50
    static COpenFontGlyph* New(RHeap* aHeap, TInt aCode, TInt aGlyphIndex,
sl@0
    51
                               const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
sl@0
    52
	inline static void Delete(RHeap* aHeap, COpenFontGlyph* aGlyph);
sl@0
    53
	inline const TUint8* Bitmap() const;
sl@0
    54
sl@0
    55
protected:
sl@0
    56
	COpenFontGlyph(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics)
sl@0
    57
		: iCode(aCode), iGlyphIndex(aGlyphIndex), iMetrics(aMetrics), iBitmapOffset(0) {}
sl@0
    58
	~COpenFontGlyph() {}
sl@0
    59
	void SetBitmap(const TAny* aBitmap);
sl@0
    60
sl@0
    61
public:
sl@0
    62
	const TInt iCode;						// the Unicode value of the character
sl@0
    63
	const TInt iGlyphIndex;					// the glyph index
sl@0
    64
	const TOpenFontCharMetrics iMetrics;	// the metrics
sl@0
    65
sl@0
    66
private:
sl@0
    67
	// an offset from this COpenFontGlyph object to a pointer to the run-length-encoded bitmap, 
sl@0
    68
	// calculated as (bitmapPointer)-(this)
sl@0
    69
	TInt iBitmapOffset;
sl@0
    70
	};
sl@0
    71
sl@0
    72
/**
sl@0
    73
 * Template for offset implementation of pointer array
sl@0
    74
 @internalComponent
sl@0
    75
 */
sl@0
    76
template<class T>
sl@0
    77
class ROffsetArray
sl@0
    78
    {
sl@0
    79
public:
sl@0
    80
    ROffsetArray();
sl@0
    81
    TInt Create(RHeap* aHeap, TInt aCount);
sl@0
    82
    void Close(RHeap* aHeap);
sl@0
    83
    TInt Count() const;
sl@0
    84
    T* operator[](TInt aIndex) const;
sl@0
    85
    void SetAt(TInt aIndex, T* aEntry);
sl@0
    86
private:
sl@0
    87
    TInt iOffset;
sl@0
    88
    TInt iCount;
sl@0
    89
    };
sl@0
    90
sl@0
    91
sl@0
    92
/**
sl@0
    93
 The per-font glyph cache. For now, just the members that used to be directly in
sl@0
    94
 COpenFont. Now it is a private class it can be elaborated to do character-to-glyph-index
sl@0
    95
 mapping when that is needed.
sl@0
    96
sl@0
    97
 @internalComponent
sl@0
    98
 */
sl@0
    99
class COpenFontGlyphCache
sl@0
   100
	{
sl@0
   101
public:
sl@0
   102
	COpenFontGlyphCache(RHeap* aHeap)
sl@0
   103
	  : iGlyphTreeById(aHeap),
sl@0
   104
		iGlyphTreeByUnicode(aHeap),
sl@0
   105
		iGlyphCacheMemory(0),
sl@0
   106
		iShaperCacheSentinel(NULL),
sl@0
   107
		iShapingInfoCacheMemory(0),
sl@0
   108
		iNumberOfShaperCacheEntries(0)
sl@0
   109
		{}
sl@0
   110
	TShapeHeader* SearchShaperCache(TInt aSessionHandle, TFontShapeFunctionParameters*& aParams);
sl@0
   111
	TShapeHeader* Insert(TInt aSessionHandle, RHeap* aHeap, CShaper::TInput aInput, TShapeHeader* aShapeHeader, TInt& aAddedBytes);
sl@0
   112
	TInt DeleteLeastRecentlyUsedEntry(RHeap* aHeap);
sl@0
   113
	TBool ShaperCacheIsEmpty();
sl@0
   114
	
sl@0
   115
public:
sl@0
   116
	RHexTree<COpenFontGlyph> iGlyphTreeById;				// a hex tree of glyphs indexed by glyph ID
sl@0
   117
	RHexTree<COpenFontGlyph> iGlyphTreeByUnicode;			// a hex tree of glyphs indexed by Unicode code point
sl@0
   118
	TInt iGlyphCacheMemory;									// memory used by the glyph tree in bytes
sl@0
   119
	COpenFontShaperCacheEntry* iShaperCacheSentinel;
sl@0
   120
	TInt iShapingInfoCacheMemory;
sl@0
   121
	TInt iNumberOfShaperCacheEntries;	
sl@0
   122
	};
sl@0
   123
sl@0
   124
/**
sl@0
   125
 @internalComponent
sl@0
   126
 */
sl@0
   127
class COpenFontSessionCacheEntry: public COpenFontGlyph
sl@0
   128
	{
sl@0
   129
public:
sl@0
   130
	static COpenFontSessionCacheEntry* New(RHeap* aHeap, const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,
sl@0
   131
										   const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap);
sl@0
   132
	inline static void Delete(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry);
sl@0
   133
	inline const COpenFont* Font()const;
sl@0
   134
sl@0
   135
private:
sl@0
   136
	inline COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics);
sl@0
   137
	~COpenFontSessionCacheEntry();
sl@0
   138
sl@0
   139
private: 
sl@0
   140
    TInt iFontOffset;          // offset of the font that contains this glyph, (not owned by this class!)    
sl@0
   141
	};
sl@0
   142
sl@0
   143
/**
sl@0
   144
 A glyph cache for a particular session.
sl@0
   145
 Because session caches are not shared they can shrink as well as grow.
sl@0
   146
sl@0
   147
 @internalComponent
sl@0
   148
 */
sl@0
   149
class COpenFontSessionCache
sl@0
   150
    {
sl@0
   151
	friend class COpenFontSessionCacheList;
sl@0
   152
public:
sl@0
   153
    static COpenFontSessionCache* NewL(RHeap* aHeap, TInt aSessionHandle, TInt aEntries);
sl@0
   154
    void Delete(RHeap* aHeap);
sl@0
   155
    
sl@0
   156
    TInt SessionHandle() { return iSessionHandle; }
sl@0
   157
    const COpenFontGlyph* Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex) const;
sl@0
   158
    void Insert(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry, TInt aIndex);
sl@0
   159
    
sl@0
   160
private:
sl@0
   161
    COpenFontSessionCache(TInt aSessionHandle);
sl@0
   162
    ~COpenFontSessionCache();
sl@0
   163
private:
sl@0
   164
    TInt iSessionHandle;
sl@0
   165
    TInt64 iRandomSeed;
sl@0
   166
    ROffsetArray<COpenFontSessionCacheEntry> iEntryArray;
sl@0
   167
    };
sl@0
   168
sl@0
   169
sl@0
   170
class TFontTableGlyphOutlineCacheMemMonitor
sl@0
   171
    {
sl@0
   172
public:
sl@0
   173
    TFontTableGlyphOutlineCacheMemMonitor();
sl@0
   174
    void Inc(TInt aBytes);
sl@0
   175
    void Dec(TInt aBytes);
sl@0
   176
    TInt GetMemUsage();
sl@0
   177
private:
sl@0
   178
    TInt iBytes;
sl@0
   179
    };
sl@0
   180
sl@0
   181
struct TCacheUserInfo {
sl@0
   182
    TInt iSessionHandle;
sl@0
   183
    TInt iRefCount;
sl@0
   184
    TCacheUserInfo(TInt aSessionHandle, TInt aRefCount = 0): 
sl@0
   185
            iSessionHandle(aSessionHandle), iRefCount(aRefCount) { } 
sl@0
   186
};
sl@0
   187
sl@0
   188
class CFontTableCache;
sl@0
   189
sl@0
   190
class CFontTableCacheItem
sl@0
   191
    {
sl@0
   192
friend class CFontTableCache ;
sl@0
   193
sl@0
   194
public:
sl@0
   195
    CFontTableCacheItem(TUid &aFileUid, const TUint32 aTag, 
sl@0
   196
            TInt aOffset, TInt aLength);
sl@0
   197
    ~CFontTableCacheItem(); 
sl@0
   198
sl@0
   199
    TInt DecRefCount(TInt aSessionHandle);
sl@0
   200
    TInt IncRefCount(TInt aSessionHandle);
sl@0
   201
sl@0
   202
    TBool HasOutstandingRefCount();
sl@0
   203
    TInt FindUser(TInt aSessionHandle, TInt *id);
sl@0
   204
    
sl@0
   205
#ifdef _DEBUG
sl@0
   206
    void SetUser(RPointerArray<TCacheUserInfo> users)
sl@0
   207
        {
sl@0
   208
        TInt len = users.Count();
sl@0
   209
        for( TInt i = 0; i < len ; i++ )
sl@0
   210
            {
sl@0
   211
            iUsers.Append(users[i]);
sl@0
   212
            }
sl@0
   213
        }    
sl@0
   214
#endif
sl@0
   215
    
sl@0
   216
private:
sl@0
   217
    CFontTableCacheItem(const CFontTableCacheItem &); // disallow copy construction.
sl@0
   218
    CFontTableCacheItem& operator =(const CFontTableCacheItem &); // disallow assignment.
sl@0
   219
    
sl@0
   220
    TUid iFileUid; 
sl@0
   221
    TUint32 iTag; 
sl@0
   222
 
sl@0
   223
sl@0
   224
    TInt iOffset;
sl@0
   225
    TInt iLength; 
sl@0
   226
    RPointerArray<TCacheUserInfo> iUsers;
sl@0
   227
    }; 
sl@0
   228
sl@0
   229
sl@0
   230
class CFontTableCache 
sl@0
   231
    {
sl@0
   232
public:
sl@0
   233
    CFontTableCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
sl@0
   234
    ~CFontTableCache();
sl@0
   235
    TInt Append(TUid aFileUid, TUint32 aTag, 
sl@0
   236
            TAny*& aContent, TInt aLength);
sl@0
   237
    TInt Find(TUid aFileUid, TUint32 aTag, TAny*& aContent, TInt& aLength, TInt* id);
sl@0
   238
    TInt IncRefCount(TUid FileUid, TUint32 aTag, TInt aSessionHandle);
sl@0
   239
    TInt DecRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
sl@0
   240
    TBool HasOutstandingRefCount();
sl@0
   241
    TBool HasOutstandingRefCountWithUid(TUid aFileUid);  
sl@0
   242
    void CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
sl@0
   243
    void CleanupCacheOnOpenFontFileRemoval(COpenFontFile*);
sl@0
   244
#ifdef _DEBUG    
sl@0
   245
    void SetFontItem(RPointerArray<CFontTableCacheItem> cacheItems)
sl@0
   246
        {
sl@0
   247
        TInt len = cacheItems.Count();
sl@0
   248
        for(TInt i = 0; i < len; i++)
sl@0
   249
            {
sl@0
   250
            iCacheItems.Append(cacheItems[i]);
sl@0
   251
            }
sl@0
   252
        }
sl@0
   253
#endif   
sl@0
   254
    
sl@0
   255
private:
sl@0
   256
    CFontTableCache(const CFontTableCache &); // no copy construction.
sl@0
   257
    CFontTableCache& operator =(const CFontTableCache &); // no assignment.
sl@0
   258
#ifdef _DEBUG
sl@0
   259
    TInt GetCacheState(const char *func);
sl@0
   260
#endif
sl@0
   261
    
sl@0
   262
    TFontTableGlyphOutlineCacheMemMonitor &iCacheMemMon;
sl@0
   263
    RHeap *iHeap;
sl@0
   264
    RPointerArray<CFontTableCacheItem> iCacheItems;
sl@0
   265
    };
sl@0
   266
sl@0
   267
sl@0
   268
class TUnhintedOutlineCache;
sl@0
   269
sl@0
   270
class TUnhintedOutlineId 
sl@0
   271
    {
sl@0
   272
public:
sl@0
   273
    TUnhintedOutlineId(TUid aFileUid, TInt aFaceIndex, TUint aId);
sl@0
   274
    TUid iFileUid;
sl@0
   275
    TInt iFaceIndex;
sl@0
   276
    TUint iId;
sl@0
   277
    };
sl@0
   278
sl@0
   279
class COutlineCacheItem {
sl@0
   280
friend class CUnhintedOutlineCache;
sl@0
   281
friend class CHintedOutlineCache;
sl@0
   282
    
sl@0
   283
public:
sl@0
   284
    COutlineCacheItem(TInt aOffset, TInt aLength);
sl@0
   285
    ~COutlineCacheItem() ;
sl@0
   286
sl@0
   287
    TInt DecRefCount(TInt aSessionHandle);
sl@0
   288
    TInt IncRefCount(TInt aSessionHandle);
sl@0
   289
#ifdef _DEBUG
sl@0
   290
    void SetUser(RPointerArray<TCacheUserInfo> users)
sl@0
   291
        {
sl@0
   292
        TInt len = users.Count();
sl@0
   293
        for( TInt i = 0; i < len ; i++ )
sl@0
   294
            {
sl@0
   295
            iUsers.Append(users[i]);
sl@0
   296
            }
sl@0
   297
        }    
sl@0
   298
#endif
sl@0
   299
 
sl@0
   300
private:
sl@0
   301
    TInt FindUser(TInt aSessionHandle, TInt *id);
sl@0
   302
        
sl@0
   303
sl@0
   304
    TInt iOffset;
sl@0
   305
    TInt iLength;
sl@0
   306
    RPointerArray<TCacheUserInfo> iUsers;
sl@0
   307
};    
sl@0
   308
sl@0
   309
class CUnhintedOutlineCache {
sl@0
   310
public:
sl@0
   311
    CUnhintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
sl@0
   312
    TInt Find(const TUnhintedOutlineId &aOutlineId, TAny*& aData, TInt& aLength);
sl@0
   313
    TInt IncRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
sl@0
   314
    TInt DecRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
sl@0
   315
    TInt CacheUnhintedOutline(const TUnhintedOutlineId& aOutlineId, 
sl@0
   316
            TAny * const aData, const TInt aLength, TAny*& aOutline, TInt &aLen);
sl@0
   317
    TInt CleanupCacheOnOpenFontFileRemoval(COpenFontFile* aFontFile);
sl@0
   318
    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
sl@0
   319
#ifdef _DEBUG
sl@0
   320
    TInt GetCacheState(const char *func);
sl@0
   321
#endif
sl@0
   322
    ~CUnhintedOutlineCache();
sl@0
   323
    
sl@0
   324
#ifdef _DEBUG
sl@0
   325
    void SetUnHintedItem(TUnhintedOutlineId id, COutlineCacheItem* item)
sl@0
   326
        {
sl@0
   327
        iItemIdMap.Insert(id, item);
sl@0
   328
        }
sl@0
   329
#endif
sl@0
   330
    
sl@0
   331
private:
sl@0
   332
    // disallow assignment and copy-construction
sl@0
   333
    CUnhintedOutlineCache(const CUnhintedOutlineCache &); 
sl@0
   334
    CUnhintedOutlineCache& operator =(const CUnhintedOutlineCache &);
sl@0
   335
    
sl@0
   336
    static TUint32 IdHash(const TUnhintedOutlineId& aOutlineId);
sl@0
   337
    static TBool IdIdentity(const TUnhintedOutlineId& id1, const TUnhintedOutlineId& id2);
sl@0
   338
    
sl@0
   339
    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
sl@0
   340
    RHeap* iHeap; 
sl@0
   341
    RHashMap<TUnhintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
sl@0
   342
};
sl@0
   343
sl@0
   344
class CHintedOutlineCache;
sl@0
   345
sl@0
   346
class THintedOutlineId 
sl@0
   347
    {
sl@0
   348
public:
sl@0
   349
    THintedOutlineId(COpenFont* aFont, TUint aId);
sl@0
   350
    COpenFont *iFont;
sl@0
   351
    TUint iId;
sl@0
   352
    };
sl@0
   353
sl@0
   354
sl@0
   355
class CHintedOutlineCache {
sl@0
   356
public:
sl@0
   357
    CHintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
sl@0
   358
    TInt Find(const THintedOutlineId& aOutlineId, TAny*& aData, TInt& aLength);
sl@0
   359
    TInt IncRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
sl@0
   360
    TInt DecRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
sl@0
   361
    TInt CacheHintedOutline(const THintedOutlineId& aOutlineId, 
sl@0
   362
            TAny* aData, TInt aLength, TAny*& aOutline, TInt& aLen);
sl@0
   363
    TInt CleanupCacheOnOpenFontRemoval(COpenFont* aFont);
sl@0
   364
    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
sl@0
   365
#ifdef _DEBUG
sl@0
   366
    TInt GetCacheState(const char *func);
sl@0
   367
    void SetHintedItem(THintedOutlineId id, COutlineCacheItem* item)
sl@0
   368
        {
sl@0
   369
        iItemIdMap.Insert(id, item);
sl@0
   370
        }
sl@0
   371
    RHashMap<THintedOutlineId, COutlineCacheItem*> GetHintedMap()
sl@0
   372
    {
sl@0
   373
    return iItemIdMap;
sl@0
   374
    }
sl@0
   375
#endif
sl@0
   376
    
sl@0
   377
private:
sl@0
   378
    // disallow assignment and copy-construction
sl@0
   379
    CHintedOutlineCache(const CHintedOutlineCache &); 
sl@0
   380
    CHintedOutlineCache& operator =(const CHintedOutlineCache &);
sl@0
   381
    static TUint32 IdHash(const THintedOutlineId& aOutlineId);
sl@0
   382
    static TBool IdIdentity(const THintedOutlineId& id1, const THintedOutlineId& id2);
sl@0
   383
        
sl@0
   384
    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
sl@0
   385
    RHeap* iHeap; 
sl@0
   386
    RHashMap<THintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
sl@0
   387
    };
sl@0
   388
sl@0
   389
sl@0
   390
// inline functions
sl@0
   391
sl@0
   392
inline void COpenFontGlyph::Delete(RHeap* aHeap, COpenFontGlyph* aGlyph)
sl@0
   393
	{
sl@0
   394
	aHeap->Free(aGlyph);
sl@0
   395
	}
sl@0
   396
sl@0
   397
/**
sl@0
   398
@return A pointer to the bitmap data stored with this glyph, or NULL
sl@0
   399
if no bitmap has been stored with this glyph.
sl@0
   400
 */
sl@0
   401
inline const TUint8* COpenFontGlyph::Bitmap() const
sl@0
   402
	{
sl@0
   403
	if (iBitmapOffset)
sl@0
   404
		{
sl@0
   405
		return reinterpret_cast<const TUint8*>(PtrAdd(this, iBitmapOffset));
sl@0
   406
		}
sl@0
   407
	return NULL;
sl@0
   408
	}
sl@0
   409
sl@0
   410
inline COpenFontSessionCacheEntry::COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,const TOpenFontCharMetrics& aMetrics) :
sl@0
   411
    COpenFontGlyph(aCode, aGlyphIndex, aMetrics)
sl@0
   412
    {
sl@0
   413
    iFontOffset = aFont ? reinterpret_cast<TInt>(aFont) - reinterpret_cast<TInt>(this) : 0;
sl@0
   414
    }
sl@0
   415
sl@0
   416
inline void COpenFontSessionCacheEntry::Delete(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry)
sl@0
   417
	{
sl@0
   418
	COpenFontGlyph::Delete(aHeap, aEntry);
sl@0
   419
	}
sl@0
   420
sl@0
   421
inline const COpenFont* COpenFontSessionCacheEntry::Font() const
sl@0
   422
    {
sl@0
   423
    if (iFontOffset)
sl@0
   424
        {
sl@0
   425
        return reinterpret_cast<const COpenFont*> (PtrAdd(this, iFontOffset));
sl@0
   426
        }
sl@0
   427
    return NULL;
sl@0
   428
    }
sl@0
   429
sl@0
   430
#endif	// __OPENFONTSPRIVATE_H__