fontservices/textbase/sgdi/TFSTORE.CPP
author hgs
Mon, 12 Jul 2010 14:38:26 +0800
changeset 45 662fa7de7023
permissions -rw-r--r--
201024_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
662fa7de7023 201024_05
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
662fa7de7023 201024_05
hgs
parents:
diff changeset
     2
// All rights reserved.
662fa7de7023 201024_05
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
662fa7de7023 201024_05
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
662fa7de7023 201024_05
hgs
parents:
diff changeset
     7
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
     8
// Initial Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    10
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    11
// Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    12
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    13
// Description:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    14
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    15
662fa7de7023 201024_05
hgs
parents:
diff changeset
    16
#include <textbase.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
#include "TextBasePanic.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
_LIT(KCTypefaceStore, "CTypefaceStore");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
static const TInt KDefaultNumOfFontAccess = 4;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
// CTypefaceStore
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
EXPORT_C CTypefaceStore::CTypefaceStore()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
EXPORT_C CTypefaceStore::~CTypefaceStore()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
/** Destroys the typeface store and reclaims the memory allocated to it. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
	if (iFontAccess)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
		const TInt count = iFontAccess->Count();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
		for (TInt i = 0; i < count; i++)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
			TEXTBASE_ASSERT_DEBUG_GENERAL((*iFontAccess)[0].iAccessCount > 0, User::Panic(KCTypefaceStore, KErrCorrupt));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
			TEXTBASE_ASSERT_DEBUG_GENERAL((*iFontAccess)[0].iAccessCount == 1, User::Panic(KCTypefaceStore, KErrInUse));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
			delete (*iFontAccess)[0].iFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
			iFontAccess->Delete(0);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
		delete iFontAccess;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
EXPORT_C void CTypefaceStore::ConstructL()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
/** Second phase constructor. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
	iFontAccess = new(ELeave) CArrayFixFlat<TFontAccess>(KDefaultNumOfFontAccess);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
EXPORT_C void CTypefaceStore::AddFontL(CFont* aFont)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
/** Adds a hold, by a client of the typeface store, on the specified font.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
If the specified font is not currently accessed by any clients of the typeface store
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
then the font is added to the font list and the access count set to 1.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
If it is currently accessed then the access count for the font is incremented by 1.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
@param aFont Pointer to the device specific font accessed. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
	TEXTBASE_ASSERT_DEBUG_GENERAL(NULL != iFontAccess, User::Panic(KCTypefaceStore, KErrNoMemory));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
	if (IncrementFontCount(aFont))
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
		return;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
	TFontAccess fontAccess;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
	fontAccess.iAccessCount = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
	fontAccess.iFont = aFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
	iFontAccess->AppendL(fontAccess);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
EXPORT_C void CTypefaceStore::ReleaseFont(CFont* aFont)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
/** Releases the hold of a typeface store client on a specified font.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
Decrements the access-count for the specified font by one. If this reduces the access-count 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
to zero then the font is no longer needed by any client, and is deleted from 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
the typeface store list.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
@param aFont The font to be released by the client. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
	TEXTBASE_ASSERT_DEBUG_GENERAL(NULL != iFontAccess, User::Panic(KCTypefaceStore, KErrNoMemory));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
	if (!aFont)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
		return;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
	TInt idx = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
	TEXTBASE_ASSERT_ALWAYS_GENERAL(FindFont(aFont, idx), User::Panic(KCTypefaceStore, KErrNotFound));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
	TEXTBASE_ASSERT_DEBUG_GENERAL(0 < iFontAccess->At(idx).iAccessCount, User::Panic(KCTypefaceStore, KErrCorrupt));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
	iFontAccess->At(idx).iAccessCount--;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
	if (0 == iFontAccess->At(idx).iAccessCount)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
		CFont *font=iFontAccess->At(idx).iFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
		iFontAccess->Delete(idx);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
		delete font;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
EXPORT_C TBool CTypefaceStore::IncrementFontCount(const CFont* aFont)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
Search for the font in iFontAccess and increment its count.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
@param aFont Font to search for.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
@return ETrue if the specified font is found, EFalse otherwise.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
	TInt idx = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
	if (FindFont(aFont, idx))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
		iFontAccess->At(idx).iAccessCount++;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
		return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
	return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
TBool CTypefaceStore::FindFont(const CFont* aFont, TInt& aIdx) const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
Search for the font in iFontAccess.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
@param aFont Font to search for.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
@param aIdx Index of the font found.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
@return ETrue if the specified font is found, EFalse with aIdx = -1 otherwise.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
	aIdx = -1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
	if (!iFontAccess)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
	const TInt count = iFontAccess->Count();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
	for (TInt i = 0; i < count; i++)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
		if ((*iFontAccess)[i].iFont == aFont)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
			aIdx = i;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
			return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
	return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
EXPORT_C TInt CTypefaceStore::BaselineOffset(TInt aHeight,TFontPrintPosition aPos)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
/** Gets the baseline offset, in twips, for any font in subscript or superscript 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
form.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
If the print position is normal then zero is returned. If it is superscript 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
then the baseline offset returned is a percentage, KSuperscriptOffsetPercentage, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
of aHeight. If it is subscript then the baseline offset returned is a percentage, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
KSubscriptOffsetPercentage, of aHeight.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
@param aHeight The height of a font. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
@param aPos The print position of the required font: superscript, subscript 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
or normal. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
@return The baseline offset for the font. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
	TInt offset=0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
	if (aPos==EPrintPosSuperscript)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
		offset=KSuperscriptOffsetPercentage*aHeight/100;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
	else if (aPos==EPrintPosSubscript)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
		offset=KSubscriptOffsetPercentage*aHeight/100;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
	return offset;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
	 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
EXPORT_C TInt CTypefaceStore::SuperSubHeight(TInt aHeight,TFontPrintPosition aPos)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
/** Gets the height for a font in subscript or superscript form. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
If the print position is normal then aHeight is returned unchanged. If it 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
is superscript or subscript then the height returned is a percentage, KSuperSubScalingPercentage, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
of aHeight.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166
@param aHeight The height of a font. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   167
@param aPos The print position of the font: superscript, subscript or normal.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   168
@return The required height of the font. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   169
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   170
	if(aPos!=EPrintPosNormal)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   171
		aHeight=(KSuperSubScalingPercentage*aHeight)/100;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   172
	return aHeight;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   173
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   174
662fa7de7023 201024_05
hgs
parents:
diff changeset
   175
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
   176
// CFontCache
662fa7de7023 201024_05
hgs
parents:
diff changeset
   177
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
   178
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   179
EXPORT_C CFontCache::CFontCache():
662fa7de7023 201024_05
hgs
parents:
diff changeset
   180
	CBase(),
662fa7de7023 201024_05
hgs
parents:
diff changeset
   181
	iMaxEntries(KMaxFontCacheEntries)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   182
/** Default constructor.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   183
662fa7de7023 201024_05
hgs
parents:
diff changeset
   184
This constructs a CFontCache of size KMaxFontCacheEntries. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   185
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   186
	__DECLARE_NAME(_S("CFontCache"));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   187
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   188
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   189
EXPORT_C CFontCache::CFontCache(TInt aMaxEntries):
662fa7de7023 201024_05
hgs
parents:
diff changeset
   190
	CBase(),
662fa7de7023 201024_05
hgs
parents:
diff changeset
   191
	iMaxEntries(aMaxEntries)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   192
/** Constructor specifying the number of cache entries.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   193
662fa7de7023 201024_05
hgs
parents:
diff changeset
   194
@param aMaxEntries Number of entries for this cache. You must ensure this 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   195
is less than or equal to KMaxFontCacheEntries. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   196
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   197
	__DECLARE_NAME(_S("CFontCache"));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   198
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   199
662fa7de7023 201024_05
hgs
parents:
diff changeset
   200
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   201
EXPORT_C CFontCache::~CFontCache()
662fa7de7023 201024_05
hgs
parents:
diff changeset
   202
/** Destructor. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   203
662fa7de7023 201024_05
hgs
parents:
diff changeset
   204
This destroys the cashe and releases its allocated memory. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   205
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   206
	CFontCacheEntry* entry=iFirst;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   207
	while(entry)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   208
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   209
		iFirst=entry->iNext;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   210
		delete entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   211
		entry=iFirst;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   212
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   213
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   214
662fa7de7023 201024_05
hgs
parents:
diff changeset
   215
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   216
EXPORT_C CFont* CFontCache::Search(const TFontSpec& aFontSpec)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   217
/** Searches the cache for a specified font. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   218
662fa7de7023 201024_05
hgs
parents:
diff changeset
   219
The CFont returned is that which corresponds to the font specification aFontSpec.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   220
662fa7de7023 201024_05
hgs
parents:
diff changeset
   221
@param aFontSpec The specification of the font to be searched for. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   222
@return If an entry for the font specification is found in the cache, the pointer 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   223
to the font corresponding to the font specification is returned. Otherwise 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   224
NULL is returned. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   225
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   226
	CFontCacheEntry* entry=iFirst;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   227
	CFontCacheEntry* previous=NULL;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   228
	while(entry)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   229
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   230
		if(entry->iSpec==aFontSpec)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   231
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   232
			iNumHits++;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   233
			if(previous)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   234
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   235
				previous->iNext=entry->iNext;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   236
				entry->iNext=iFirst;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   237
				iFirst=entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   238
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   239
			return(entry->iFont);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   240
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   241
		previous=entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   242
		entry=entry->iNext;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   243
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   244
	iNumMisses++;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   245
	return(NULL);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   246
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   247
662fa7de7023 201024_05
hgs
parents:
diff changeset
   248
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   249
EXPORT_C CFont* CFontCache::AddEntryL(CFont* aFont,const TFontSpec& aFontSpec)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   250
/** Adds a font entry to the cache. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   251
662fa7de7023 201024_05
hgs
parents:
diff changeset
   252
The font, and the font specification required to extract it from the cache, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   253
are both specified. If the cache is already full, the font replaces the oldest 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   254
entry already in the cache, which is returned.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   255
662fa7de7023 201024_05
hgs
parents:
diff changeset
   256
@param aFont The font to be stored in the cache. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   257
@param aFontSpec The font's corresponding font specification. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   258
@return If the cache isn't full, NULL is returned. If the cache is full, the 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   259
displaced cache entry is returned. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   260
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   261
	CFontCacheEntry* entry=new(ELeave) CFontCacheEntry(aFont,aFontSpec,iFirst);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   262
	iFirst=entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   263
	iNumEntries++;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   264
	if(iNumEntries<=iMaxEntries)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   265
		return(NULL);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   266
	CFontCacheEntry* previous=NULL;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   267
	while(entry->iNext)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   268
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   269
		previous=entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   270
		entry=entry->iNext;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   271
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   272
	CFont* discardfont=entry->iFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   273
	delete entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   274
	iNumEntries--;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   275
	if(previous)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   276
		previous->iNext=NULL;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   277
	else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   278
		iFirst=NULL;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   279
	return(discardfont);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   280
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   281
662fa7de7023 201024_05
hgs
parents:
diff changeset
   282
 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   283
EXPORT_C CFont* CFontCache::RemoveFirstEntry()
662fa7de7023 201024_05
hgs
parents:
diff changeset
   284
/** Removes the first entry from the font cache and returns it.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   285
662fa7de7023 201024_05
hgs
parents:
diff changeset
   286
@return The entry removed from the font cache. If the cache is empty, NULL 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   287
is returned. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   288
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   289
	if(iFirst==NULL) return(NULL);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   290
	CFontCacheEntry* entry=iFirst;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   291
	iFirst=entry->iNext;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   292
	CFont* font=entry->iFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   293
	delete entry;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   294
	iNumEntries--;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   295
	return(font);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   296
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   297
662fa7de7023 201024_05
hgs
parents:
diff changeset
   298
// CFontCacheEntry
662fa7de7023 201024_05
hgs
parents:
diff changeset
   299
662fa7de7023 201024_05
hgs
parents:
diff changeset
   300
CFontCache::CFontCacheEntry::CFontCacheEntry(CFont* aFont,const TFontSpec& aFontSpec,CFontCacheEntry* aNext):
662fa7de7023 201024_05
hgs
parents:
diff changeset
   301
	CBase(),
662fa7de7023 201024_05
hgs
parents:
diff changeset
   302
	iFont(aFont),
662fa7de7023 201024_05
hgs
parents:
diff changeset
   303
	iSpec(aFontSpec),
662fa7de7023 201024_05
hgs
parents:
diff changeset
   304
	iNext(aNext)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   305
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   306
	__DECLARE_NAME(_S("CFontCacheEntry"));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   307
	}