diff -r f902e87c146f -r 748ec5531811 fontservices/fontstore/src/OPENFONT.CPP --- a/fontservices/fontstore/src/OPENFONT.CPP Wed Jun 09 11:40:52 2010 +0300 +++ b/fontservices/fontstore/src/OPENFONT.CPP Tue Aug 31 17:01:26 2010 +0300 @@ -26,6 +26,13 @@ #include "linkedfontsprivate.h" #include #include +#include + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "OPENFONTTraces.h" +#endif + const TInt KSessionCacheEntries = 512; const TInt KDefaultSlantFactor = 20480; @@ -520,6 +527,8 @@ { //Delete the shaper delete iShaper; + + File()->GetFontStore()->CleanupCacheOnOpenFontRemoval(this); COpenFontGlyphCache* glyphCache = GetGlyphCache(); if (glyphCache != NULL) @@ -786,6 +795,54 @@ delete iShaper; } +TInt COpenFont::GetFontTable(TUint32 aTag, TAny*& aTableContent, TInt& aLength) + { + // get the extension API for GetTrueTypeTable() if available + TAny* ext = NULL; + ExtendedInterface(KUidOpenFontTrueTypeExtension, ext); + MOpenFontTrueTypeExtension* extensionInterface = + reinterpret_cast(ext); + + TInt ret = KErrNone; + if (extensionInterface == NULL) + { + ret = KErrNotSupported; + } + else + { + TUint32 tag = aTag; + TInt len = 0; + aTableContent = extensionInterface->GetTrueTypeTable(ret, tag, &len); + if (KErrNone == ret) + { + aLength = len; + } + } + return ret; + } + +TInt COpenFont::GetGlyphOutline(TUint aCode, + TBool aHinted, TAny*& aOutline, TInt &aLength) + { + // get the extension API for GetTrueTypeTable() if available + TAny* ext = NULL; + ExtendedInterface(KUidOpenFontGlyphOutlineExtension, ext); + MOpenFontGlyphOutlineExtension *extensionInterface = + reinterpret_cast(ext); + + TInt ret = KErrNone; + if (extensionInterface == NULL) + { + ret = KErrNotSupported; + } + else + { + ret = extensionInterface->GetGlyphOutline(aCode, ETrue, + aHinted, aOutline, aLength); + } + return ret; + } + /** A constructor initialised with a TCharacterMetrics object. @@ -848,13 +905,13 @@ iFileOffset = 0; } -COpenFontGlyphCache* COpenFont::GetGlyphCache() +COpenFontGlyphCache* COpenFont::GetGlyphCache() const { if (iGlyphCacheOffset == 0) { return NULL; } - return reinterpret_cast(PtrAdd(this, iGlyphCacheOffset)); + return reinterpret_cast(PtrAdd(const_cast(this), iGlyphCacheOffset)); } const COpenFontGlyph* COpenFont::Glyph(TInt aSessionHandle, TInt aCode) const @@ -893,7 +950,7 @@ @param aCode The code for the glpyh to look for in the cache @return A pointer to the requested glyph if it was found in the glyph cache, NULL if it was not found. */ -const COpenFontGlyph* COpenFont::FontCacheGlyph(TInt aCode) +const COpenFontGlyph* COpenFont::FontCacheGlyph(TInt aCode) const { if (COpenFontGlyphCache* glyphCache = GetGlyphCache()) { @@ -1056,58 +1113,52 @@ iEntryArray.Close(aHeap); } -const COpenFontGlyph* COpenFontSessionCache::Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex) +const COpenFontGlyph* COpenFontSessionCache::Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex) const { aIndex = -1; - TInt oldest = KMaxTInt; - TInt oldest_index = 0; TInt numEntries = iEntryArray.Count(); TInt index = GLYPH_CODE(aCode) % numEntries; // simple hash function to shorten searches for (TInt i = 0; i < numEntries; ++i, ++index) { if (index >= numEntries) + { index = 0; - COpenFontSessionCacheEntry* entry = iEntryArray[index]; + } + const COpenFontSessionCacheEntry* entry = iEntryArray[index]; if (entry == NULL) { - if (aIndex == -1) - aIndex = index; - } - else - { - if (entry->Font() == aFont && entry->iCode == aCode) + if (aIndex < 0) { - entry->iLastAccess = iLastAccess++; - return entry; - } - if (entry->iLastAccess < oldest) - { - oldest = entry->iLastAccess; - oldest_index = index; + aIndex = index; } } + else if (entry->Font() == aFont && entry->iCode == aCode) + { + return entry; + } } - if (aIndex == -1) - aIndex = oldest_index; return NULL; } void COpenFontSessionCache::Insert(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry, TInt aIndex) { - if (aIndex < 0 || aIndex >= iEntryArray.Count()) + if (aIndex >= iEntryArray.Count()) { Panic(EFntSessionCacheIndexOutOfRange); } + if (aIndex < 0) + { + aIndex = Math::Rand(iRandomSeed) % iEntryArray.Count(); + } COpenFontSessionCacheEntry::Delete(aHeap, iEntryArray[aIndex]); iEntryArray.SetAt(aIndex, aEntry); - aEntry->iLastAccess = iLastAccess++; } COpenFontSessionCache::COpenFontSessionCache(TInt aSessionHandle): iSessionHandle(aSessionHandle), - iLastAccess(0) - { + iRandomSeed(0) + { } TInt COpenFontSessionCacheList::AddCache(COpenFontSessionCache* aCache) @@ -1243,8 +1294,16 @@ EXPORT_C void TOpenFontMetrics::SetBaselineCorrection(TInt aBaselineCorrection) { - __ASSERT_DEBUG(aBaselineCorrection<(1<<(KBitsForUnderline-1)), Panic(EFntOverFlow)); - __ASSERT_DEBUG(aBaselineCorrection>(0-(1<<(KBitsForUnderline-1))), Panic(EFntOverFlow)); + if (aBaselineCorrection >= (1<<(KBitsForUnderline-1))) + { + OstTrace1( TRACE_FATAL, TOPENFONTMETRICS_SETBASELINECORRECTION, "aBaselineCorrection=%d, Panic(EFntOverFlow)", aBaselineCorrection ); + __ASSERT_DEBUG(0, Panic(EFntOverFlow)); + } + if (aBaselineCorrection <= (0-(1<<(KBitsForUnderline-1)))) + { + OstTrace1( TRACE_FATAL, DUP1_TOPENFONTMETRICS_SETBASELINECORRECTION, "aBaselineCorrection=%d, Panic(EFntOverFlow)", aBaselineCorrection ); + __ASSERT_DEBUG(0, Panic(EFntOverFlow)); + } TUint16 value = iBaselineCorrection; value &=~KMaskUnderline; //zero all the underline position bits @@ -1316,6 +1375,11 @@ */ EXPORT_C COpenFontFile::~COpenFontFile() { + CFontStore *fs = GetFontStore(); + if (fs != NULL) + { + fs->CleanupCacheOnOpenFontFileRemoval(this); + } delete iData; } @@ -1883,7 +1947,11 @@ TInt64 value(aValue); value = (value * aNumerator) / aDenominator; aValue = I64LOW(value); - __ASSERT_DEBUG(I64HIGH(value) == 0, Panic(EFntOverFlow)); + if (I64HIGH(value) != 0) + { + OstTrace1( TRACE_FATAL, TOPENFONTSPEC_APPLYRATIO, "value=%ld, Panic(EFntOverFlow)", value ); + __ASSERT_DEBUG(0, Panic(EFntOverFlow)); + } return I64HIGH(value) != 0; }