diff -r 57c618273d5c -r bbf46f59e123 fbs/fontandbitmapserver/sfbs/FBSTOP.CPP --- a/fbs/fontandbitmapserver/sfbs/FBSTOP.CPP Thu Aug 19 11:11:18 2010 +0300 +++ b/fbs/fontandbitmapserver/sfbs/FBSTOP.CPP Tue Aug 31 16:31:06 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 1995-2010 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" @@ -18,7 +18,6 @@ #include #include #include -#include "fbsmessage.h" #include #include "SERVER.H" #include "BackGroundCompression.h" @@ -27,6 +26,8 @@ #include #include #include +#include "glyphatlas.h" +#include "FbsMessage.H" // Local utility functions void ListImplementationsWithRetry(TUid& aInterfaceUid, RImplInfoPtrArray &aImplementationArray, TBool aRomOnly); @@ -61,6 +62,7 @@ #endif iFontNameAlias.ResetAndDestroy(); iBitmapObjectIndex.Reset(); + delete iGlyphAtlas; REComSession::FinalClose(); } @@ -140,9 +142,15 @@ iMBMCache=new (ELeave) CFbTopStreamIdCache(30,30,5); LoadOpenFontLibraries(); - iFontStore->LoadFontsAtStartupL(); LoadShaperFactories(); + TRAP_IGNORE(iGlyphAtlas = CGlyphAtlas::NewL(KFbServGlyphAtlasCacheLimit);) +#ifdef _DEBUG + if (!iGlyphAtlas) + { + RDebug::Printf("FBSERV failed to initialize Glyph Atlas"); + } +#endif // start a new thread for background compression after all the other objects have been created iBackgroundCompression = CFbsBackgroundCompression::NewL(*this); @@ -307,8 +315,8 @@ { return ret; } - - return CreateFontObjectFromFont(aFontObjPtr, font); + + return GetFontObjectFromFont(aFontObjPtr, font); } /** @@ -349,9 +357,27 @@ return ret; } -TInt CFbTop::CreateFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont) +TInt CFbTop::GetFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont) { - CFontObject* fontObjPtr = new CFontObject(iFontStore); + // First, check if a CFontObject exists for this CFont. + // If so, increment its reference count and return it. + for (TInt ii = iFontCon->Count() - 1; ii >= 0; --ii) + { + CFontObject* fontObjPtr = reinterpret_cast((*iFontCon)[ii]); + if (fontObjPtr->iAddressPointer == reinterpret_cast(aFont)) + { + aFontObjPtr = fontObjPtr; + // The CFontObject instance keeps the reference count of the CBitmapFont, + // not the font store. There is only one CFontObject instance + // per CBitmapFont, so to keep the reference count at 1 in the fontstore + // call ReleaseFont(). + iFontStore->ReleaseFont(aFont); + return fontObjPtr->Open(); + } + } + + // Existing FontObject not found, so create new one. + CFontObject* fontObjPtr = new CFontObject(iFontStore, iGlyphAtlas); if (!fontObjPtr) { iFontStore->ReleaseFont(aFont); @@ -389,7 +415,7 @@ { return ret; } - return CreateFontObjectFromFont(aFontObjPtr, font); + return GetFontObjectFromFont(aFontObjPtr, font); } @@ -561,18 +587,6 @@ return(EFalse); } -TBool CFbTop::ValidBitmapFont(TInt aHandle) - { - TInt limit=iFontCon->Count(); - for(TInt count=0;count((*iFontCon)[count]); - if(aHandle==(TInt)(fontObjPtr->iAddressPointer)) - return(ETrue); - } - return(EFalse); - } - CFontStore* CFbTop::FontStore() const { return(iFontStore); @@ -724,3 +738,8 @@ { return iFontCon->UniqueID(); } + +CGlyphAtlas* CFbTop::GlyphAtlas() const + { + return iGlyphAtlas; + }