# HG changeset patch # User William Roberts # Date 1268572576 0 # Node ID 1d3cadb74b5672343da16440ad27efc1d7996528 # Parent 3969f087709d15799761a23e88b3bb9b39ad4026# Parent 030b3432fbe0c829be020829b9bc02002dd572c5 Automatic merge from PDK_3.0.h diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/BLD.INF --- a/fontservices/fontstore/group/BLD.INF Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/group/BLD.INF Sun Mar 14 13:16:16 2010 +0000 @@ -44,7 +44,6 @@ PRJ_MMPFILES ../group/FNTSTORE.MMP -../group/fntstore_fmm.mmp PRJ_TESTMMPFILES @@ -52,6 +51,7 @@ ../group/tcachedeletionprocess.mmp ../group/T_WriteInvalidFontFile.mmp ../group/T_RemoveInvalidFontFile.mmp +../group/tfontsessioncacheproc.mmp PRJ_TESTEXPORTS @@ -85,6 +85,7 @@ ../tfs/scripts/fntstoretest_T_LinkedFontUpdateInitial.script z:/fntstoretest/fntstoretest_T_LinkedFontUpdateInitial.script ../tfs/scripts/fntstoretest_T_LinkedFontUpdateStage1.script z:/fntstoretest/fntstoretest_T_LinkedFontUpdateStage1.script ../tfs/scripts/fntstoretest_T_LinkedFontUpdateStage2.script z:/fntstoretest/fntstoretest_T_LinkedFontUpdateStage2.script +../tfs/scripts/fntstoretest_T_FontSessionCache.script z:/fntstoretest/fntstoretest_T_FontSessionCache.script ../tfs/CEUROPE.GDR z:/resource/fonts/ceurope.gdr @@ -147,3 +148,4 @@ ../tfs/scripts/tsetdefaulttypefacename.ini z:/fntstoretest/tsetdefaulttypefacename.ini + diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/FntstoreTest.iby --- a/fontservices/fontstore/group/FntstoreTest.iby Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/group/FntstoreTest.iby Sun Mar 14 13:16:16 2010 +0000 @@ -50,11 +50,13 @@ data=DATAZ_\fntstoretest\fntstoretest_T_LinkedFontUpdateInitial.script \fntstoretest\fntstoretest_T_LinkedFontUpdateInitial.script data=DATAZ_\fntstoretest\fntstoretest_T_LinkedFontUpdateStage1.script \fntstoretest\fntstoretest_T_LinkedFontUpdateStage1.script data=DATAZ_\fntstoretest\fntstoretest_T_LinkedFontUpdateStage2.script \fntstoretest\fntstoretest_T_LinkedFontUpdateStage2.script +data=DATAZ_\fntstoretest\fntstoretest_T_FontSessionCache.script \fntstoretest\fntstoretest_T_FontSessionCache.script // FntStore test code - TFntStoreServer.exe needs to be copied into \sys\bin\ and set as data so it will be copied to the c: drive and we can change the capabilities of the .exe data=ABI_DIR\DEBUG_DIR\TFntStoreServer.exe \sys\bin\TFntStoreServer.exe //file=ABI_DIR\DEBUG_DIR\TFntStoreServer.exe \sys\bin\TFntStoreServer.exe file=ABI_DIR\DEBUG_DIR\tcachedeletionprocess.exe \sys\bin\tcachedeletionprocess.exe +file=ABI_DIR\DEBUG_DIR\tfontsessioncacheproc.exe \sys\bin\tfontsessioncacheproc.exe // 7650 font which should be compatible with new font compression diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/TFntStoreServer.mmp --- a/fontservices/fontstore/group/TFntStoreServer.mmp Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/group/TFntStoreServer.mmp Sun Mar 14 13:16:16 2010 +0000 @@ -41,27 +41,28 @@ SOURCE TFntStoreServer.cpp SOURCE T_FNTMEM.CPP -SOURCE T_FSOPEN.CPP +SOURCE T_FSOPEN.CPP SOURCE T_FontBitmap.CPP SOURCE FNTBODY_OLD.CPP SOURCE T_MatchFonts.cpp SOURCE T_GlyphTreeDel.cpp SOURCE T_OpenFontTypes.cpp -SOURCE T_GetNearestFont.cpp -SOURCE T_GetNearestFontCapability.cpp -SOURCE T_SetDefaultTypefaceName.cpp +SOURCE T_GetNearestFont.cpp +SOURCE T_GetNearestFontCapability.cpp +SOURCE T_SetDefaultTypefaceName.cpp SOURCE T_FontMetrics.cpp SOURCE T_FNT.CPP -SOURCE t_corruptfonts.cpp -SOURCE T_SHAPERCACHE.CPP -source t_cachedeletion.cpp -SOURCE T_LinkedFonts2.cpp -SOURCE t_linkedfontsmemory.cpp -SOURCE t_linkedfontscomparison.cpp -SOURCE t_linkedfontscapability.cpp -SOURCE T_LinkedFontUpdateTests.cpp +SOURCE t_corruptfonts.cpp +SOURCE T_SHAPERCACHE.CPP +source t_cachedeletion.cpp +SOURCE T_LinkedFonts2.cpp +SOURCE t_linkedfontsmemory.cpp +SOURCE t_linkedfontscomparison.cpp +SOURCE t_linkedfontscapability.cpp +SOURCE T_LinkedFontUpdateTests.cpp SOURCE T_IsolatedFontStore.cpp SOURCE T_Cache.CPP +SOURCE T_FontSessionCache.cpp SOURCEPATH ../src SOURCE FNTBODY.CPP diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/fntstore.iby --- a/fontservices/fontstore/group/fntstore.iby Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/group/fntstore.iby Sun Mar 14 13:16:16 2010 +0000 @@ -21,11 +21,7 @@ REM Font File & Object Manager -#ifdef WITH_FLEXIBLE_MM -file=ABI_DIR\BUILD_DIR\fntstr_fmm.dll System\Libs\FntStr.dll -#else file=ABI_DIR\BUILD_DIR\fntstr.dll System\Libs\FntStr.dll -#endif #endif diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/fntstore_fmm.mmp --- a/fontservices/fontstore/group/fntstore_fmm.mmp Mon Mar 08 21:45:11 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* -* Copyright (c) 1998-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: -* fntstr.dll Font store -* -*/ - - -/** - @file -*/ - -TARGET fntstr_fmm.dll -CAPABILITY All -Tcb -TARGETTYPE dll - -UID 0x1000008d 0x10003b1a -VENDORID 0x70000001 - -// This option turns off any warnings in the CW build -// This is a temp workaround until a better solution is found -// for 2 warnings that appear when building fntstore.cpp -// Remove this option when making any changes to this component -// to avoid overlooking any new warnings. -// MAY BE NEEDED IN THE FUTURE -// OPTION CW -w off - -USERINCLUDE ../inc -USERINCLUDE ../../../../graphics/fbs/fontandbitmapserver/inc - -OS_LAYER_SYSTEMINCLUDE_SYMBIAN - -SOURCEPATH ../src - -SOURCE FNTBODY.CPP -SOURCE FNTSTORE.CPP -SOURCE FNTUTIL.CPP -SOURCE OPENFONT.CPP -SOURCE ShaperCache.CPP -SOURCE linkedfonts.cpp -SOURCE patchableconstants.cpp - -LIBRARY euser.lib -LIBRARY efsrv.lib -LIBRARY estor.lib -LIBRARY gdi.lib -LIBRARY ecom.lib -LIBRARY fbscli.lib -LIBRARY hal.lib - -#ifdef WINSCW -DEFFILE FNTSTR2.DEF -#else -DEFFILE fntstr2.def -#endif - -START WINS -BASEADDRESS 0x41700000 -END - -MACRO KMaxGlyphCacheMemory=32768 -MACRO FNTSTORE_SUPPORT_FMM -UNPAGED - - -SMPSAFE diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/group/tfontsessioncacheproc.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/group/tfontsessioncacheproc.mmp Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,36 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// + + +TARGETTYPE EXE +TARGET tfontsessioncacheproc.exe + +UID 0 +SOURCEPATH ../tfs + +userinclude ../tfs ../inc ../src +APP_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + +SOURCE T_fontsessioncacheproc.cpp + +LIBRARY euser.lib +LIBRARY gdi.lib +LIBRARY fntstr.lib +LIBRARY fbscli.lib +LIBRARY bitgdi.lib + + +SMPSAFE diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/inc/FNTSTORE.h --- a/fontservices/fontstore/inc/FNTSTORE.h Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/inc/FNTSTORE.h Sun Mar 14 13:16:16 2010 +0000 @@ -209,19 +209,22 @@ TAlgStyle iAlgStyle; // must not move this member private: - // Binary Compatibility warning - data member iOpenFont is referenced by inline methods - RHeap* iHeap; - TInt iFontBitmapOffset; - COpenFont* iOpenFont; // if iOpenFont is non-null this is an open font and many functions are forwarded to it - -#ifdef FNTSTORE_SUPPORT_FMM - // If iOpenFontOffet is non-zero this is an open font - TInt iOpenFontOffset; -#else - TUint32 iReserved; -#endif // FNTSTORE_SUPPORT_FMM + // Binary Compatibility warning - data member iOpenFont is referenced by inline methods + RHeap* iHeap; + TInt iFontBitmapOffset; + + // In order to be able to work with the flexible memory model, iOpenFont is + // actually an offset from the address of this class. + // iOpenFont's type remains unchanged. + // As Qt code that uses OpenFont() must be able to run on new and old versions + // of Symbian OS, it must be able to determine whether iOpenFont is a pointer or + // an offset at run-time. Therefore an offset will have its lowest significant bit set to 1. + // If iOpenFont is null, this object is not an open font. + // Assumption: a pointer always has least significant bit value of zero. + COpenFont* iOpenFont; // if iOpenFont is non-null this is an open font and many functions are forwarded to it - TUint32 iUniqueFontId; // unique id for this instance of this font + TUint32 iReserved; + TUint32 iUniqueFontId; // unique id for this instance of this font }; /** @@ -459,14 +462,10 @@ */ inline TBool CBitmapFont::IsOpenFont() const { -#ifdef FNTSTORE_SUPPORT_FMM - return iOpenFontOffset!=0; -#else return iOpenFont != NULL; -#endif // FNTSTORE_SUPPORT_FMM } -#ifdef FNTSTORE_SUPPORT_FMM + /** Returns a pointer to the open font being used by the bitmap font object. @return A pointer to an open font. @@ -474,23 +473,15 @@ */ inline COpenFont* CBitmapFont::OpenFont() const { - if (IsOpenFont()) - { - return reinterpret_cast(reinterpret_cast(this)+iOpenFontOffset); - } - return NULL; + if (reinterpret_cast(iOpenFont) & 1) + { + return reinterpret_cast(const_cast(PtrAdd(this, reinterpret_cast(iOpenFont) & ~1))); + } + else + { + return iOpenFont; + } } -#else -/** Returns a pointer to the open font being used by the bitmap font object. - -@return A pointer to an open font. -@see IsOpenFont() -*/ -inline COpenFont* CBitmapFont::OpenFont() const - { - return iOpenFont; - } -#endif // FNTSTORE_SUPPORT_FMM /** Gets the anti-aliasing setting for the font, see TGlyphBitmapType for the range of values. diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/inc/OPENFONT.H --- a/fontservices/fontstore/inc/OPENFONT.H Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/inc/OPENFONT.H Sun Mar 14 13:16:16 2010 +0000 @@ -339,17 +339,15 @@ inline TInt FontMaxHeight() const; void DeleteShaper() const; TInt GetFontTable(TUint32 aTag, TAny*& aTableContent, TInt& aLength); - TInt GetGlyphOutline(TUint aCode, TBool aHinted, - TAny*& aOutline, TInt& aLength); -#ifdef FNTSTORE_SUPPORT_FMM -private: + TInt GetGlyphOutline(TUint aCode, TBool aHinted, TAny*& aOutline, TInt& aLength); + +protected: /** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. */ TInt PointerToThisOffset(const TAny* aAny); /** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. */ TAny* ThisOffsetToPointer(const TInt aOffset); -#endif // FNTSTORE_SUPPORT_FMM protected: RHeap* iHeap; @@ -383,57 +381,44 @@ private: const COpenFontGlyph* Glyph(TInt aSessionHandle,TInt aCode) const; protected: -#ifdef FNTSTORE_SUPPORT_FMM + /** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. */ const COpenFontGlyph* FontCacheGlyph(TInt aCode,TInt*& aNode); + const COpenFontGlyph* FontCacheGlyph(TInt aCode); - /** Used to calculate an offset that is applied to pointers to objects on the - FBServ shared heap to convert them to valid pointers in the current process. - Add the value returned here to pointers to items on the shared heap to get a - valid pointer to the item in the current process. - - WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. - - @return Returns an offset between the "this" pointer that this object had on - construction and its current "this" pointer. - */ - inline TInt Offset() const; -#else - /** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. - */ - const COpenFontGlyph* FontCacheGlyph(TInt aCode,COpenFontGlyphTreeEntry**& aNode); -#endif // FNTSTORE_SUPPORT_FMM - /** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases. - */ - const COpenFontGlyph* FontCacheGlyph(TInt aCode); + void SetGlyphCache(COpenFontGlyphCache* aGlyphCache); + private: const COpenFontGlyph* SessionCacheGlyph(RHeap* aHeap,TInt aSessionHandle,TInt aCode, COpenFontSessionCache*& aCache,TInt& aIndex,TBool aCreate) const; void RasterizeHelperL(TInt aCode,TOpenFontGlyphData* aGlyphData,TOpenFontGlyphData*& aTempGlyphData); -#ifdef FNTSTORE_SUPPORT_FMM - inline COpenFontSessionCacheList* SessionCacheList(); -#endif // FNTSTORE_SUPPORT_FMM + + COpenFontSessionCacheList* SessionCacheList()const; + + void SetSessionCacheList(COpenFontSessionCacheList* aSessionCacheList); + + void SetFile(COpenFontFile* aFile); private: - COpenFontFile* iFile; // the file used by this font; null if it has been deleted - // or cannot be used + + // Offset from the address of the file used by this font. + // If the file has been deleted or cannot be used, the offest will be zero. + TInt iFileOffset; + TInt iFaceIndex; // index of the face in the font file protected: - /** WARNING: Member variable for internal use ONLY. Compatibility is not guaranteed in future releases. Please use the provided APIs only. - */ - COpenFontGlyphCache* iGlyphCache; // the per-font glyph cache; owned by the font + /** + WARNING: Compatibility is not guaranteed in future releases. Please use the provided APIs only. + Offset from the address of this font of the per-font glyph cache which is owned by the font + @internalTechnology + */ + TInt iGlyphCacheOffset; private: - COpenFontSessionCacheList* iSessionCacheList; // the list of per-session glyph caches; owned by CFontStore -#ifdef FNTSTORE_SUPPORT_FMM - /** The initial "this" pointer that this object has when created. When this - object is used in a different process the offset between this starting - "this" pointer and the current "this" pointer can be used to calculate - the offset to other objects that also exist on the shared FBServ heap. - @see Offset() */ - TInt iStartingThis; -#else + // Offset from the address of this font of the list of per-session glyph + // caches which are owned by CFontStore + TInt iSessionCacheListOffset; + TAny* iReserved; // unused; for future expansion -#endif // FNTSTORE_SUPPORT_FMM }; /** Open Font System Extension Interface abstract base class. @@ -1507,11 +1492,7 @@ @return The typeface attributes. */ inline const TOpenFontFaceAttrib* COpenFont::FaceAttrib() const { -#ifdef FNTSTORE_SUPPORT_FMM - return iFile ? &File()->FaceAttrib(iFaceIndex) : NULL; -#else - return iFile ? &iFile->FaceAttrib(iFaceIndex) : NULL; -#endif // FNTSTORE_SUPPORT_FMM + return iFileOffset == 0 ? NULL : &File()->FaceAttrib(iFaceIndex); } /** Gets a pointer to the COpenFontFile which created this object. @@ -1523,11 +1504,7 @@ @return The COpenFontFile which created this object. */ inline COpenFontFile* COpenFont::File() const { -#ifdef FNTSTORE_SUPPORT_FMM - return iFile?reinterpret_cast(reinterpret_cast(iFile)+Offset()):NULL; -#else - return iFile; -#endif // FNTSTORE_SUPPORT_FMM + return iFileOffset == 0 ? NULL : reinterpret_cast(const_cast(PtrAdd(this, iFileOffset))); } /** Gets the index of this typeface within the font file. @@ -1648,26 +1625,6 @@ return iFontMaxAscent + iFontMaxDescent; } -#ifdef FNTSTORE_SUPPORT_FMM -inline COpenFontSessionCacheList* COpenFont::SessionCacheList() - { - return iSessionCacheList?reinterpret_cast(reinterpret_cast(iSessionCacheList)+Offset()):NULL; - } - -/** Used to calculate an offset that can be applied to pointers to objects on the -FBServ shared heap to convert them to valid pointers in the current process. -Add the value returned here to pointers to items on the shared heap to get a -valid pointer to the item in the current process. - -@return Returns an offset between the "this" pointer that this object had on -construction and its current "this" pointer. - */ -inline TInt COpenFont::Offset() const - { - return reinterpret_cast(this)-iStartingThis; - } -#endif // FNTSTORE_SUPPORT_FMM - /** Default C++ constructor. This sets all attribute fields to zero. As for other T classes, there is no diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/inc/openfontsprivate.h --- a/fontservices/fontstore/inc/openfontsprivate.h Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/inc/openfontsprivate.h Sun Mar 14 13:16:16 2010 +0000 @@ -20,7 +20,6 @@ #define __OPENFONTS_PRIVATE_H__ #include - class COpenFontShaperCacheEntry; /* MSB is set to indicate a glyph code rather than a unicode value @@ -38,7 +37,6 @@ CFontStore* iFontStore; // pointer to the CFontStore instance that loaded the COpenFontFile }; -#ifdef FNTSTORE_SUPPORT_FMM /** @internalComponent */ @@ -67,33 +65,6 @@ // 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. @@ -110,94 +81,45 @@ 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 + 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; + /** Pointer to next glyph that was added to the glyph cache. This enables + non-recursive deletion of the cache. This is only ever accessed from server + process, so can be a direct pointer, not an offset. */ + COpenFontGlyphTreeEntry* iNext; private: COpenFontGlyphTreeEntry(TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics) - : COpenFontGlyph(aCode, aGlyphIndex, aMetrics), iLeft(NULL), iRight(NULL), iNext(NULL) { } - + : COpenFontGlyph(aCode, aGlyphIndex, aMetrics), iLeftOffset(0), iRightOffset(0),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. - + * Template for offset implementation of pointer to pointer @internalComponent */ -class RArrayGlyphEntries : public RArray - { +template +class ROffsetArray + { public: - inline const COpenFontGlyphTreeEntry& operator[](TInt anIndex) const; - inline COpenFontGlyphTreeEntry& operator[](TInt anIndex); - TInt Append(COpenFontGlyphTreeEntry& anEntry); + ROffsetArray(); + TInt Create(RHeap* aHeap, TInt aCount); + void Close(RHeap* aHeap); + TInt Count() const; + T* operator[](TInt aIndex) const; + void SetAt(TInt aIndex, T* aEntry); 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. + TInt iOffset; + TInt iCount; + }; - @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 @@ -208,71 +130,48 @@ class COpenFontGlyphCache { public: - COpenFontGlyphCache(): iGlyphTree(NULL), iGlyphCacheMemory(0), iGlyphList(NULL), iShaperCacheSentinel(NULL), iShapingInfoCacheMemory(0), iNumberOfShaperCacheEntries(0) { } + COpenFontGlyphCache(): iGlyphTreeOffset(0), 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 iGlyphTreeOffset; // an offset to 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 + COpenFontGlyphTreeEntry* iGlyphList; // the glyphs, organized as a list COpenFontShaperCacheEntry* iShaperCacheSentinel; TInt iShapingInfoCacheMemory; - TInt iNumberOfShaperCacheEntries; + 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; + inline const COpenFont* Font()const; private: - COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics): - COpenFontGlyph(aCode, aGlyphIndex, aMetrics) - , iFontOffset(reinterpret_cast(aFont) - reinterpret_cast(this)) - { } + inline COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics); ~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!) + 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: @@ -282,44 +181,19 @@ 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(TInt aSessionHandle); ~COpenFontSessionCache(); public: TInt iSessionHandle; - TInt iEntries; TInt iLastAccess; -private: - TInt iEntryOffset; // Offset of the pointer to an offset array which is of COpenFontSessionCacheEntry* + ROffsetArray iEntryArray; }; -#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: @@ -336,20 +210,6 @@ 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 { @@ -571,4 +431,24 @@ }; +// inline functions +inline COpenFontSessionCacheEntry::COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,const TOpenFontCharMetrics& aMetrics) : + COpenFontGlyph(aCode, aGlyphIndex, aMetrics) + { + iFontOffset = aFont ? reinterpret_cast(aFont) - reinterpret_cast(this) : 0; + } + + +inline const COpenFont* COpenFontSessionCacheEntry::Font() const + { + if (iFontOffset) + { + return reinterpret_cast (PtrAdd(this, iFontOffset)); + } + else + { + return NULL; + } + } + #endif // __OPENFONTSPRIVATE_H__ diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/FNTBODY.CPP --- a/fontservices/fontstore/src/FNTBODY.CPP Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/FNTBODY.CPP Sun Mar 14 13:16:16 2010 +0000 @@ -217,7 +217,8 @@ : iHeap(aHeap), iMetricsStartId(KNullStreamId), iCharacterMetricsStartPtr(0), - iNumberOfMetrics(0) + iNumberOfMetrics(0), + iMetricsOnHeap(EFalse) {} void TCharacterMetricsTable::InternalizeL(RReadStream& aStream) @@ -230,8 +231,9 @@ { aStream.ReadInt32L(); // size TBitmapFontCharacterMetrics* charactermetricslist = static_cast(iHeap->AllocL(sizeof(TBitmapFontCharacterMetrics) * iNumberOfMetrics)); - - iCharacterMetricsStartPtr = TInt(charactermetricslist); // Ptr to location on the heap ('cos the file is not in ROM) + iMetricsOnHeap = ETrue; + // Offset from this to location on the heap ('cos the file is not in ROM) + iCharacterMetricsStartPtr = reinterpret_cast(charactermetricslist) - reinterpret_cast(this); TBitmapFontCharacterMetrics* pEnd = charactermetricslist + iNumberOfMetrics; for (TBitmapFontCharacterMetrics* p = charactermetricslist; p < pEnd; p++) { @@ -255,22 +257,33 @@ TBitmapFontCharacterMetrics* charactermetricslist = reinterpret_cast(aFileAddress + sizeof(TInt) + iMetricsStartId.Value()); iCharacterMetricsStartPtr = TInt(charactermetricslist); // Ptr to location in a ROM file iMetricsStartId = KNullStreamId; + iMetricsOnHeap = EFalse; } void TCharacterMetricsTable::Delete() { // This routine is only called if the font file is in RAM, not ROM, and therefore the metrics have been stashed on the heap - if (iCharacterMetricsStartPtr) - { - iHeap->Free(reinterpret_cast(iCharacterMetricsStartPtr)); - iCharacterMetricsStartPtr = 0; - } + if (iMetricsOnHeap && iCharacterMetricsStartPtr) + { + iHeap->Free(reinterpret_cast(MetricsFromOffset(0))); + iCharacterMetricsStartPtr = 0; + iMetricsOnHeap = EFalse; + } } const TBitmapFontCharacterMetrics* TCharacterMetricsTable::Metric(TInt aIndex) const { __ASSERT_DEBUG((aIndex >= 0) && (aIndex <= iNumberOfMetrics), Panic(EFntMetricsIndexOutOfBounds)); - // Sometimes the start ptr is to a metrics heap item and sometimes it points into a ROM file - return reinterpret_cast(iCharacterMetricsStartPtr + (aIndex * sizeof(TBitmapFontCharacterMetrics))); + // Sometimes the start ptr is to a metrics heap item and sometimes it points into a ROM file + if (iMetricsOnHeap) + { + // Start ptr is to metrics heap item + return MetricsFromOffset(aIndex); + } + else + { + // Start ptr is to a file in ROM + return reinterpret_cast (iCharacterMetricsStartPtr + (aIndex * sizeof(TBitmapFontCharacterMetrics))); + } } TInt TCharacterMetricsTable::NumberOfMetrics() const @@ -278,6 +291,12 @@ return iNumberOfMetrics; } +TBitmapFontCharacterMetrics* TCharacterMetricsTable::MetricsFromOffset(TInt aIndex) const + { + __ASSERT_DEBUG(iMetricsOnHeap,Panic(EFntMetricsNotOnHeap)); + return reinterpret_cast(reinterpret_cast(this) + iCharacterMetricsStartPtr+ (aIndex * sizeof(TBitmapFontCharacterMetrics))); + } + CFontBitmap::CFontBitmap(RHeap* aHeap, CFontStoreFile* aFontStoreFile) : iHeap(aHeap), iFontStoreFileOffset(0), diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/FNTBODY.H --- a/fontservices/fontstore/src/FNTBODY.H Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/FNTBODY.H Sun Mar 14 13:16:16 2010 +0000 @@ -111,10 +111,16 @@ const TBitmapFontCharacterMetrics* Metric(TInt aIndex) const; TInt NumberOfMetrics() const; private: + TBitmapFontCharacterMetrics* MetricsFromOffset(TInt aIndex) const; +private: RHeap* iHeap; TStreamId iMetricsStartId; - TInt iCharacterMetricsStartPtr; // Sometimes this address is on the metrics heap and sometimes in a ROM file + // Sometimes this address is on the metrics heap and sometimes in a ROM file + // If the address is on the heap, then this is actually an offset from + // the address of this class. + TInt iCharacterMetricsStartPtr; TInt iNumberOfMetrics; + TBool iMetricsOnHeap; }; NONSHARABLE_CLASS(CFontBitmap) : public CBase diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/FNTSTD.H --- a/fontservices/fontstore/src/FNTSTD.H Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/FNTSTD.H Sun Mar 14 13:16:16 2010 +0000 @@ -41,6 +41,8 @@ EFntNoFontFound, EFntRemovingAlreadyDeletedLinkedFont, EFntOverFlow, + EFntMetricsNotOnHeap, + EFntPointerNotByteAligned, }; /** @@ -53,7 +55,6 @@ class COpenFontSessionCacheListItem; class COpenFont; -#ifdef FNTSTORE_SUPPORT_FMM class COpenFontSessionCacheList /** @internalComponent @@ -76,30 +77,6 @@ iStartOffset(0) { } -#else -class COpenFontSessionCacheList -/** -@internalComponent -*/ - { - friend class COpenFont; - - public: - inline COpenFontSessionCacheList(); - void Delete(RHeap* aHeap); - void DeleteCache(RHeap* aHeap,TInt aSessionHandle); - - private: - void DeleteFontGlyphs(RHeap* aHeap,const COpenFont* aFont); - - COpenFontSessionCacheListItem* iStart; - }; - -inline COpenFontSessionCacheList::COpenFontSessionCacheList(): - iStart(NULL) - { - } -#endif // FNTSTORE_SUPPORT_FMM /** @internalComponent diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/FNTSTORE.CPP --- a/fontservices/fontstore/src/FNTSTORE.CPP Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/FNTSTORE.CPP Sun Mar 14 13:16:16 2010 +0000 @@ -74,7 +74,7 @@ Array stored in Twips as that is the only form of the value currently used. @internalComponent -*/ +*/ #define POINTSIZE_IN_TWIPS(p) ((p) * 20) const TInt gOpenFontSizeInTwipsArray[] = { @@ -538,39 +538,36 @@ COpenFont* aOpenFont): iFontSpecInTwips(aFontSpecInTwips), iAlgStyle(aAlgStyle), - iHeap(aHeap), - iOpenFont(aOpenFont) + iHeap(aHeap) { -#ifdef FNTSTORE_SUPPORT_FMM - iOpenFontOffset=reinterpret_cast(aOpenFont)-reinterpret_cast(this); -#endif // FNTSTORE_SUPPORT_FMM + // Set iOpenFont to be the offset of aOpenFont from the address of CBitmapFont. + // In order to be able to identify iOpenFont as an offset instead of a pointer, + // bitwise or the offset with 1. Pointers will always be byte aligned (and therefore even). + if (aOpenFont) + { + iOpenFont = reinterpret_cast((reinterpret_cast(aOpenFont) - reinterpret_cast(this)) | 1); + __ASSERT_DEBUG((reinterpret_cast(iOpenFont) & 1),Panic(EFntPointerNotByteAligned)); + } + else + { + iOpenFont = NULL; + } } /** This member is private and not intended for use. */ void CBitmapFont::ConstructL() { -#ifdef FNTSTORE_SUPPORT_FMM if (!IsOpenFont()) FontBitmap()->UseL(); -#else - if (!iOpenFont) - FontBitmap()->UseL(); -#endif // FNTSTORE_SUPPORT_FMM } /** This member is private and not intended for use. */ CBitmapFont::~CBitmapFont() { -#ifdef FNTSTORE_SUPPORT_FMM if (!IsOpenFont() && iFontBitmapOffset) FontBitmap()->Release(); else if (IsOpenFont()) delete OpenFont(); -#else - if (!iOpenFont) - FontBitmap()->Release(); - delete iOpenFont; -#endif // FNTSTORE_SUPPORT_FMM } CBitmapFont* CBitmapFont::NewL( @@ -616,13 +613,8 @@ @return A font identifier. */ TUid CBitmapFont::Uid() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return TUid::Uid(0); -#else - if (iOpenFont) - return TUid::Uid(0); -#endif // FNTSTORE_SUPPORT_FMM else return FontBitmap()->iUid; } @@ -635,13 +627,8 @@ */ EXPORT_C TInt CBitmapFont::DoHeightInPixels() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return Height(OpenFont()->Metrics().Size()); -#else - if (iOpenFont) - return Height(iOpenFont->Metrics().Size()); -#endif // FNTSTORE_SUPPORT_FMM else return Height(FontBitmap()->iCellHeightInPixels); } @@ -658,13 +645,8 @@ */ EXPORT_C TInt CBitmapFont::DoAscentInPixels() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return Height(OpenFont()->Metrics().Ascent()); -#else - if (iOpenFont) - return Height(iOpenFont->Metrics().Ascent()); -#endif // FNTSTORE_SUPPORT_FMM else return Height(FontBitmap()->iAscentInPixels); } @@ -766,13 +748,8 @@ @return The maximum character width in pixels. */ EXPORT_C TInt CBitmapFont::DoMaxCharWidthInPixels() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return Width(OpenFont()->Metrics().MaxWidth()); -#else - if (iOpenFont) - return Width(iOpenFont->Metrics().MaxWidth()); -#endif // FNTSTORE_SUPPORT_FMM else return Width(FontBitmap()->iMaxCharWidthInPixels); } @@ -786,13 +763,8 @@ @return The normal maximum character width in pixels. */ EXPORT_C TInt CBitmapFont::DoMaxNormalCharWidthInPixels() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return Width(OpenFont()->Metrics().MaxWidth()); -#else - if (iOpenFont) - return Width(iOpenFont->Metrics().MaxWidth()); -#endif // FNTSTORE_SUPPORT_FMM else return Width(FontBitmap()->iMaxNormalCharWidthInPixels); } @@ -827,13 +799,8 @@ the cache; otherwise EFalse. */ EXPORT_C TBool CBitmapFont::Rasterize(TInt aSessionHandle, TInt aCode, TOpenFontGlyphData* aGlyphData) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return OpenFont()->Rasterize(aSessionHandle, aCode, aGlyphData); -#else - if (iOpenFont) - return iOpenFont->Rasterize(aSessionHandle, aCode, aGlyphData); -#endif // FNTSTORE_SUPPORT_FMM else return EFalse; } @@ -856,11 +823,7 @@ This function does not work for Open Fonts because the character data need not be shared between sessions and a session handle is needed; GetCharacterData should be used instead. */ -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) -#else - if (iOpenFont) -#endif // FNTSTORE_SUPPORT_FMM { aBytes = NULL; return TCharacterMetrics(); @@ -908,18 +871,10 @@ EXPORT_C TBool CBitmapFont::GetCharacterData(TInt aSessionHandle,TInt aCode, TOpenFontCharMetrics& aMetrics,const TUint8*& aBitmap) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) -#else - if (iOpenFont) -#endif // FNTSTORE_SUPPORT_FMM { const TOpenFontCharMetrics* nm; -#ifdef FNTSTORE_SUPPORT_FMM if (OpenFont()->GetCharacterData(aSessionHandle,aCode,nm,aBitmap)) -#else - if (iOpenFont->GetCharacterData(aSessionHandle,aCode,nm,aBitmap)) -#endif // FNTSTORE_SUPPORT_FMM { aMetrics = *nm; return ETrue; @@ -945,13 +900,8 @@ EXPORT_C void CBitmapFont::GetFontMetrics(TOpenFontMetrics& aMetrics) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) aMetrics = OpenFont()->Metrics(); -#else - if (iOpenFont) - aMetrics = iOpenFont->Metrics(); -#endif // FNTSTORE_SUPPORT_FMM else { new(&aMetrics) TOpenFontMetrics; @@ -975,17 +925,9 @@ attributes. */ EXPORT_C TBool CBitmapFont::GetFaceAttrib(TOpenFontFaceAttrib& aAttrib) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) -#else - if (iOpenFont) -#endif // FNTSTORE_SUPPORT_FMM { -#ifdef FNTSTORE_SUPPORT_FMM const TOpenFontFaceAttrib* a = OpenFont()->FaceAttrib(); -#else - const TOpenFontFaceAttrib* a = iOpenFont->FaceAttrib(); -#endif // FNTSTORE_SUPPORT_FMM if (a) { aAttrib = *a; @@ -1000,13 +942,8 @@ @return Bitmap encoding value. */ EXPORT_C TInt CBitmapFont::BitmapEncoding() const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return 0; -#else - if (iOpenFont) - return 0; -#endif // FNTSTORE_SUPPORT_FMM else return FontBitmap()->iBitmapEncoding; } @@ -1017,13 +954,8 @@ @return ETrue if the font has the specified character; otherwise EFalse. */ EXPORT_C TBool CBitmapFont::HasCharacterL(TInt aCode) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return OpenFont()->HasCharacterL(aCode); -#else - if (iOpenFont) - return iOpenFont->HasCharacterL(aCode); -#endif // FNTSTORE_SUPPORT_FMM else { const TUint8* bytes; @@ -1043,13 +975,8 @@ @return ETrue if the character needs to be rasterized; otherwise EFalse. */ EXPORT_C TBool CBitmapFont::CharacterNeedsToBeRasterized(TInt aSessionHandle,TInt aCode) const { -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) return OpenFont()->CharacterNeedsToBeRasterized(aSessionHandle,aCode); -#else - if (iOpenFont) - return iOpenFont->CharacterNeedsToBeRasterized(aSessionHandle,aCode); -#endif // FNTSTORE_SUPPORT_FMM else return FALSE; // characters in bitmap fonts do not need to be rasterized } @@ -1177,17 +1104,11 @@ CFontBitmap* CBitmapFont::FontBitmap() const /** This member is private and not intended for use. */ { -#ifdef FNTSTORE_SUPPORT_FMM - __ASSERT_ALWAYS(!IsOpenFont(),Panic(EFntTypefaceHasNoFontBitmaps)); - if(iFontBitmapOffset) - return reinterpret_cast(reinterpret_cast(this)+iFontBitmapOffset); - else - return NULL; -#else - __ASSERT_ALWAYS(!iOpenFont,Panic(EFntTypefaceHasNoFontBitmaps)); - TInt fontbitmap=TInt(this)+iFontBitmapOffset; - return((CFontBitmap*)fontbitmap); -#endif // FNTSTORE_SUPPORT_FMM + __ASSERT_ALWAYS(!IsOpenFont(),Panic(EFntTypefaceHasNoFontBitmaps)); + if(iFontBitmapOffset) + return reinterpret_cast(reinterpret_cast(this)+iFontBitmapOffset); + else + return NULL; } /** Gets a font table. @@ -1198,18 +1119,12 @@ @return KErrNone on success, specific error code on failure. @internalTechnology */ -EXPORT_C -TInt CBitmapFont::GetFontTable(TUint32 aTag, TAny *&aTableContent, +EXPORT_C TInt CBitmapFont::GetFontTable(TUint32 aTag, TAny *&aTableContent, TInt &aLength, TInt aSessionHandle) { COpenFont *fontPtr = NULL; -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) fontPtr = OpenFont(); -#else - if (iOpenFont) - fontPtr = iOpenFont; -#endif // FNTSTORE_SUPPORT_FMM else return KErrNotSupported; @@ -1252,13 +1167,8 @@ TInt aSessionHandle) { COpenFont *fontPtr = NULL; -#ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) fontPtr = OpenFont(); -#else - if (iOpenFont) - fontPtr = iOpenFont; -#endif // FNTSTORE_SUPPORT_FMM else return; @@ -1284,13 +1194,8 @@ TBool aHinted, TInt aSessionHandle) { COpenFont *fontPtr = NULL; - #ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) fontPtr = OpenFont(); - #else - if (iOpenFont) - fontPtr = iOpenFont; - #endif // FNTSTORE_SUPPORT_FMM else return; @@ -1328,13 +1233,8 @@ TBool aHinted, TAny *&aOutline, TInt &aLength, TInt aSessionHandle) { COpenFont *fontPtr = NULL; - #ifdef FNTSTORE_SUPPORT_FMM if (IsOpenFont()) fontPtr = OpenFont(); - #else - if (iOpenFont) - fontPtr = iOpenFont; - #endif // FNTSTORE_SUPPORT_FMM else return KErrNotSupported; diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/OPENFONT.CPP --- a/fontservices/fontstore/src/OPENFONT.CPP Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/OPENFONT.CPP Sun Mar 14 13:16:16 2010 +0000 @@ -31,53 +31,58 @@ const TInt KDefaultSlantFactor = 20480; const TInt KOneIn16Dot16FixedPointFormat = 65536; -#ifdef FNTSTORE_SUPPORT_FMM -class TPointerArrayBaseOffset - { -public: - TInt iCount; - TAny** iEntries; - TInt iAllocated; - TInt iGranularity; - }; +template +ROffsetArray::ROffsetArray() + : iOffset(0), iCount(0) + {} -/*RArrayGlyphEntries*/ - -inline const COpenFontGlyphTreeEntry& RArrayGlyphEntries::operator[](TInt anIndex) const - { - return *Entry(anIndex); - } - -inline COpenFontGlyphTreeEntry& RArrayGlyphEntries::operator[](TInt anIndex) - { - return *const_cast(Entry(anIndex)); - } +template +TInt ROffsetArray::Create(RHeap* aHeap, TInt aCount) + { + if (iOffset != 0) + { + return KErrAlreadyExists; + } + TAny* p = aHeap->AllocZ(aCount * sizeof(TInt)); + if (p == NULL) + { + return KErrNoMemory; + } + iOffset = (TInt)p - (TInt)this; + iCount = aCount; + return KErrNone; + } -inline const COpenFontGlyphTreeEntry* RArrayGlyphEntries::Entry(TInt anIndex) const - { - return reinterpret_cast(PtrAdd(EntryMemberOffSet()[anIndex],reinterpret_cast(this))); - } - -inline COpenFontGlyphTreeEntry** RArrayGlyphEntries::EntryMemberOffSet() const - { - return reinterpret_cast(iEntriesOffset+reinterpret_cast(this)); - } +template +void ROffsetArray::Close(RHeap* aHeap) + { + if (iOffset != 0) + { + aHeap->Free(PtrAdd(this, iOffset)); + } + iOffset = 0; + iCount = 0; + } -inline TAny** RArrayGlyphEntries::EntryMember() const - { - return reinterpret_cast(this)->iEntries; - } +template +TInt ROffsetArray::Count() const + { + return iCount; + } -TInt RArrayGlyphEntries::Append(COpenFontGlyphTreeEntry& anEntry) - { - TInt err = RArray::Append(reinterpret_cast(&anEntry)-reinterpret_cast(this)); - if (err == KErrNone) - { - iEntriesOffset=reinterpret_cast(EntryMember())-reinterpret_cast(this); - } - return err; - } -#endif // FNTSTORE_SUPPORT_FMM +template +T* ROffsetArray::operator[](TInt aIndex) const + { + TInt e = ((TInt*)PtrAdd(this, iOffset))[aIndex]; + return e != 0 ? (T*)PtrAdd(this, e) : NULL; + } + +template +void ROffsetArray::SetAt(TInt aIndex, T* aEntry) + { + ((TInt*)PtrAdd(this, iOffset))[aIndex] = aEntry ? (TInt)aEntry - (TInt)this : 0; + } + /*COpenFontGlyphCache*/ @@ -149,7 +154,7 @@ COpenFontShaperCacheEntry* new_entry; new_entry = COpenFontShaperCacheEntry::New(aHeap, aInput, aShapeHeader); - if (new_entry) + if (new_entry != NULL) { // increase the reference count for this TInt ret=new_entry->IncRefCount(aSessionHandle); @@ -221,20 +226,12 @@ TInt COpenFont::DecrementCachedRefCount(TInt aSessionHandle, TShapeHeader* aShapeHeader, TBool aResetAll) { -#ifdef FNTSTORE_SUPPORT_FMM COpenFontShaperCacheEntry* ptr=NULL; COpenFontGlyphCache* glyphCache=GetGlyphCache(); - if (glyphCache) + if (glyphCache != NULL) ptr=glyphCache->iShaperCacheSentinel; - if (!ptr) + if (ptr == NULL) return KErrNone; -#else - if (!iGlyphCache || !(iGlyphCache->iShaperCacheSentinel)) - return KErrNone; - - COpenFontShaperCacheEntry* ptr=iGlyphCache->iShaperCacheSentinel; - COpenFontGlyphCache* glyphCache=iGlyphCache; -#endif // FNTSTORE_SUPPORT_FMM TInt ret = KErrNotFound; CFontStore* thisFontStore = File()->GetFontStore(); @@ -243,7 +240,7 @@ TInt deletedBytes = 0; // loop through the cache entry to decrement the ref count for a particular session - while (ptr->iNext) + while (ptr->iNext != NULL) { if (aResetAll) { @@ -264,7 +261,7 @@ ret=KErrNone; } - else if (ptr->iShapeHeader && ptr->iShapeHeader==aShapeHeader) + else if (ptr->iShapeHeader != NULL && ptr->iShapeHeader==aShapeHeader) { // Always update the memory usage of the cache as decreasing the ref count // releases memory @@ -335,23 +332,22 @@ j++; } i++; - } - } - - // If deleted bytes are still less than the required one delete from this font -#ifdef FNTSTORE_SUPPORT_FMM - COpenFontGlyphCache* glyphCache = GetGlyphCache(); -#else - COpenFontGlyphCache* glyphCache = iGlyphCache; -#endif // FNTSTORE_SUPPORT_FMM - while (totalDeletedBytes < aBytesNeeded && !glyphCache->ShaperCacheIsEmpty()) - { - tempDeletedBytes = glyphCache->DeleteLeastRecentlyUsedEntry(iHeap); - if ( tempDeletedBytes == 0) - break; - totalDeletedBytes += tempDeletedBytes; - } - } + } + } + + // If deleted bytes are still less than the required one delete from this font + COpenFontGlyphCache* glyphCache = GetGlyphCache(); + if (glyphCache != NULL) + { + while (totalDeletedBytes < aBytesNeeded && !glyphCache->ShaperCacheIsEmpty()) + { + tempDeletedBytes = glyphCache->DeleteLeastRecentlyUsedEntry(iHeap); + if (tempDeletedBytes == 0) + break; + totalDeletedBytes += tempDeletedBytes; + } + } //if(glyphCache) + } //if(aBytesNeeded <= KMaxShaperSesssionCacheMemory) // Update the global CFontStore cache memory count if (totalDeletedBytes > 0) @@ -376,45 +372,47 @@ input.iReserved1 = 0; CFontStore* thisFontStore = File()->GetFontStore(); + + // Create the glyph cache if it doesn't already exist. + // This call can only come from FBSERV + COpenFontGlyphCache* glyphCache = GetGlyphCache(); + if (glyphCache == NULL) + { + glyphCache = (COpenFontGlyphCache*) iHeap->Alloc(sizeof(COpenFontGlyphCache)); + if (glyphCache == NULL) // no memory + { + return NULL; + } + new (glyphCache) COpenFontGlyphCache; + SetGlyphCache(glyphCache); + } + // If there is no sentinel present, i.e. new cache + if (glyphCache->iShaperCacheSentinel == NULL) + { + // Create a sentinel + glyphCache->iShaperCacheSentinel = COpenFontShaperCacheEntry::New(iHeap); + if (glyphCache->iShaperCacheSentinel == NULL) + { + // no memory + return NULL; + } + glyphCache->iShaperCacheSentinel->iNext = glyphCache->iShaperCacheSentinel; + glyphCache->iShaperCacheSentinel->iPrevious = glyphCache->iShaperCacheSentinel; + glyphCache->iNumberOfShaperCacheEntries = 1; + } - // Create the glyph cache if it doesnt already exist. - // This call can only come from FBSERV - if (iGlyphCache == NULL) - { - iGlyphCache = (COpenFontGlyphCache*)iHeap->Alloc(sizeof(COpenFontGlyphCache)); - if (iGlyphCache == NULL) // no memory - { - return NULL; - } - new(iGlyphCache) COpenFontGlyphCache; - } - // If there is no sentinel present, i.e. new cache - if (iGlyphCache->iShaperCacheSentinel == NULL) - { - // Create a sentinel - iGlyphCache->iShaperCacheSentinel = COpenFontShaperCacheEntry::New(iHeap); - if (!iGlyphCache->iShaperCacheSentinel) - { - // no memory - return NULL; - } - iGlyphCache->iShaperCacheSentinel->iNext = iGlyphCache->iShaperCacheSentinel; - iGlyphCache->iShaperCacheSentinel->iPrevious = iGlyphCache->iShaperCacheSentinel; - iGlyphCache->iNumberOfShaperCacheEntries = 1; - } - - // Before inserting into this cache, check if it was empty. - // If empty, then increment the global cache count signifying one more cache is active - if (iGlyphCache->ShaperCacheIsEmpty()) - { - thisFontStore->IncNumShaperCaches(); - } + // Before inserting into this cache, check if it was empty. + // If empty, then increment the global cache count signifying one more cache is active + if (glyphCache->ShaperCacheIsEmpty()) + { + thisFontStore->IncNumShaperCaches(); + } TInt addedBytes = 0; TShapeHeader* cached_header = NULL; // Insert a new entry and return the newly inserted TShapeHeader entry - cached_header = iGlyphCache->Insert(aSessionHandle, iHeap, input, aShapeHeader, addedBytes); + cached_header = glyphCache->Insert(aSessionHandle, iHeap, input, aShapeHeader, addedBytes); if (cached_header == NULL) return NULL; @@ -432,7 +430,8 @@ TShapeHeader* COpenFont::GetShapedData(TInt aSessionHandle, TFontShapeFunctionParameters* aParams) { - if (iGlyphCache == NULL) + COpenFontGlyphCache* glyphCache = GetGlyphCache(); + if (glyphCache == NULL) return NULL; TShapeHeader* cachedHeader = NULL; @@ -442,12 +441,7 @@ TInt allocBefInc = 0; TInt allocAfterInc = 0; iHeap->AllocSize(allocBefInc); - -#ifdef FNTSTORE_SUPPORT_FMM - COpenFontGlyphCache* glyphCache = GetGlyphCache(); -#else - COpenFontGlyphCache* glyphCache = iGlyphCache; -#endif // FNTSTORE_SUPPORT_FMM + cachedHeader = glyphCache->SearchShaperCache(aSessionHandle,aParams); iHeap->AllocSize(allocAfterInc); @@ -482,29 +476,15 @@ e.g. when creating a COpenFont the COpenFontFile derived object would pass it this. */ -#ifdef FNTSTORE_SUPPORT_FMM EXPORT_C COpenFont::COpenFont(RHeap* aHeap,COpenFontSessionCacheList* aSessionCacheList, COpenFontFile* aFile): iHeap(aHeap), iShaper(NULL), - iFile(aFile), - iFaceIndex(0), - iSessionCacheList(aSessionCacheList) + iFaceIndex(0) { - iStartingThis=reinterpret_cast(this); + SetFile(aFile); + SetSessionCacheList(aSessionCacheList); } -#else -EXPORT_C COpenFont::COpenFont(RHeap* aHeap,COpenFontSessionCacheList* aSessionCacheList, COpenFontFile* aFile) - : iHeap(aHeap), - iShaper(NULL), - iFile(aFile), - iFaceIndex(0), - iSessionCacheList(aSessionCacheList), - iReserved(NULL) - { - - } -#endif // FNTSTORE_SUPPORT_FMM /** C++ constructor taking shared heap, session cache list, font file and face @@ -521,28 +501,14 @@ it this. @param aFaceIndex The index of the typeface within the font file aFile. */ -#ifdef FNTSTORE_SUPPORT_FMM EXPORT_C COpenFont::COpenFont(RHeap* aHeap,COpenFontSessionCacheList* aSessionCacheList, COpenFontFile* aFile,TInt aFaceIndex) : iHeap(aHeap), iShaper(NULL), - iFile(aFile), - iFaceIndex(aFaceIndex), - iSessionCacheList(aSessionCacheList) + iFaceIndex(aFaceIndex) { - iStartingThis=reinterpret_cast(this); + SetFile(aFile); + SetSessionCacheList(aSessionCacheList); } -#else -EXPORT_C COpenFont::COpenFont(RHeap* aHeap,COpenFontSessionCacheList* aSessionCacheList, COpenFontFile* aFile,TInt aFaceIndex) - : iHeap(aHeap), - iShaper(NULL), - iFile(aFile), - iFaceIndex(aFaceIndex), - iSessionCacheList(aSessionCacheList), - iReserved(NULL) - { - - } -#endif // FNTSTORE_SUPPORT_FMM /** Destructor @@ -557,52 +523,48 @@ File()->GetFontStore()->CleanupCacheOnOpenFontRemoval(this); - if (iGlyphCache) + COpenFontGlyphCache* glyphCache = GetGlyphCache(); + if (glyphCache != NULL) { COpenFontGlyphTreeEntry* next = NULL; -#ifdef FNTSTORE_SUPPORT_FMM - TInt ii; - RArrayGlyphEntries& glyphArray=iGlyphCache->iGlyphArray; - for (ii=glyphArray.Count()-1;ii>=0;--ii) - { - next=&glyphArray[ii]; - COpenFontGlyph::Delete(iHeap,next); - } - iGlyphCache->iGlyphArray.Close(); -#else - for (COpenFontGlyphTreeEntry* g = iGlyphCache->iGlyphList; g; g = next) + for (COpenFontGlyphTreeEntry* g = glyphCache->iGlyphList; g != NULL; g = next) { next = g->iNext; COpenFontGlyph::Delete(iHeap, g); } -#endif // FNTSTORE_SUPPORT_FMM // Delete the shaper cache as well - if (iGlyphCache->iShaperCacheSentinel) + if (glyphCache->iShaperCacheSentinel) { COpenFontShaperCacheEntry* previous = NULL; - COpenFontShaperCacheEntry* si = iGlyphCache->iShaperCacheSentinel->iPrevious; + COpenFontShaperCacheEntry* si = glyphCache->iShaperCacheSentinel->iPrevious; TInt heapBefore = 0; TInt heapAfter = 0; iHeap->AllocSize(heapBefore); - while (iGlyphCache->iNumberOfShaperCacheEntries > 0) + while (glyphCache->iNumberOfShaperCacheEntries > 0) { previous = si->iPrevious; COpenFontShaperCacheEntry::Delete(iHeap, si); si = previous; - iGlyphCache->iNumberOfShaperCacheEntries--; + glyphCache->iNumberOfShaperCacheEntries--; } iHeap->AllocSize(heapAfter); File()->GetFontStore()->SetShaperCacheMemUsage(File()->GetFontStore()->GetShaperCacheMemUsage() - (heapBefore - heapAfter)); File()->GetFontStore()->DecNumShaperCaches(); } - iHeap->Free(iGlyphCache); + iHeap->Free(glyphCache); } - if (iSessionCacheList) - iSessionCacheList->DeleteFontGlyphs(iHeap, this); - if (iFile) - iFile->RemoveFontFromList(this); + COpenFontSessionCacheList* sessionCacheList = SessionCacheList(); + if (sessionCacheList != NULL) + { + sessionCacheList->DeleteFontGlyphs(iHeap, this); + } + COpenFontFile* file = File(); + if (file != NULL) + { + file->RemoveFontFromList(this); + } } COpenFontGlyph::~COpenFontGlyph() @@ -611,20 +573,16 @@ void COpenFontGlyph::Delete(RHeap* aHeap, COpenFontGlyph* aGlyph) { - if (aGlyph) + if (aGlyph != NULL) { -#ifdef FNTSTORE_SUPPORT_FMM aHeap->Free(aGlyph->Bitmap()); -#else - aHeap->Free(aGlyph->iBitmap); -#endif // FNTSTORE_SUPPORT_FMM aHeap->Free(aGlyph); } } EXPORT_C void COpenFont::operator delete(TAny *aFont) { - if(aFont) + if(aFont != NULL) { COpenFont* f = (COpenFont*)aFont; if (f->iHeap) @@ -647,20 +605,21 @@ ETrue if aGlyphData contains valid data (that is, if aGlyphData->Bitmap() and aGlyphData->Metrics() are valid), EFalse otherwise. */ -#ifdef FNTSTORE_SUPPORT_FMM TBool COpenFont::Rasterize(TInt aSessionHandle, TInt aCode, TOpenFontGlyphData* aGlyphData) { // create the cache if it doesn't exisit. As this call can only come from // FBSERV if the chunk has to be resized then no panic will happen. - if (iGlyphCache == NULL) + COpenFontGlyphCache* glyphCache = GetGlyphCache(); + if (glyphCache == NULL) { - iGlyphCache = (COpenFontGlyphCache*)iHeap->Alloc(sizeof(COpenFontGlyphCache)); - if (iGlyphCache == NULL) // no memory + glyphCache = (COpenFontGlyphCache*)iHeap->Alloc(sizeof(COpenFontGlyphCache)); + if (glyphCache == NULL) // no memory { return EFalse; } - new(iGlyphCache) COpenFontGlyphCache; + new(glyphCache) COpenFontGlyphCache; + SetGlyphCache(glyphCache); } // Look in the Font Cache @@ -670,15 +629,15 @@ // If it is not found there look in the session cache. COpenFontSessionCache* cache = NULL; TInt index = 0; - if (!g) + if (g == NULL) { g = SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, EFalse); } // If it has already been rasterized return it. - if (g) + if (g != NULL) { - if (aGlyphData) + if (aGlyphData != NULL) { aGlyphData->SetMetricsPointer(&g->iMetrics); aGlyphData->SetBitmapPointer(g->Bitmap()); @@ -703,43 +662,36 @@ // If the maximum per-font cache memory will not be exceeded, put the glyph into the font cache. TInt bytes = sizeof(COpenFontGlyphTreeEntry) + cur_glyph_data->BytesNeeded(); - if(iGlyphCache && bytes + iGlyphCache->iGlyphCacheMemory <= KMaxGlyphCacheMemory) + if(glyphCache != NULL && bytes + glyphCache->iGlyphCacheMemory <= KMaxGlyphCacheMemory) { COpenFontGlyphTreeEntry* new_entry = COpenFontGlyphTreeEntry::New(iHeap, aCode, cur_glyph_data->GlyphIndex(), *cur_glyph_data->Metrics(), cur_glyph_data->Bitmap()); new_glyph=new_entry; - if(new_entry) - { - // Insert new entry into the delete list - error = iGlyphCache->iGlyphArray.Append(*new_entry); - if (error == KErrNone) - { - if(!iGlyphCache->iGlyphTreeOffset) - { - // First entry in tree - iGlyphCache->iGlyphTreeOffset = PointerToThisOffset(new_entry); - } - else if (nodeInsertPtr) - { - // Add the glyph to a leaf node using the nodeInsertPtr that was returned by FontCacheGlyph() - *nodeInsertPtr = PointerToThisOffset(new_entry); - } - else - { - // Failed to add the glyph to the glyph tree, remove it from the delete array. - // (The glyph is deleted below). - iGlyphCache->iGlyphArray.Remove(iGlyphCache->iGlyphArray.Count()-1); - error = KErrGeneral; - } - } - if (error != KErrNone) - { - COpenFontGlyph::Delete(iHeap,new_entry); - } - else - { - iGlyphCache->iGlyphCacheMemory += bytes; - } - } + if (new_entry != NULL) + { + // Add the glyph to a leaf node using the nodeInsertPtr that was returned by FontCacheGlyph() + // This is the first node if the glyph cache is empty. This updates the cache atomically. + *nodeInsertPtr = PointerToThisOffset(new_entry); + + // If new_entry is not the first in the cache, set the previous + // entry to link to this so that a linked-list of entries can be + // maintained to simplify deletion. + COpenFontGlyphTreeEntry* tree = static_cast (ThisOffsetToPointer(glyphCache->iGlyphTreeOffset)); + if (new_entry != tree) + { + while (tree->iNext != NULL) + { + tree = tree->iNext; + } + tree->iNext = new_entry; + } + else + { + // First entry in tree, initialise iGlyphList + glyphCache->iGlyphList = new_entry; + } + + glyphCache->iGlyphCacheMemory += bytes; + }//if (new_entry) } else { @@ -750,11 +702,11 @@ if (error != KErrNone) { // If the session cache is not yet known find it or create one. - if (!cache) + if (cache == NULL) { SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, TRUE); } - if (!cache) + if (cache == NULL) { return EFalse; } @@ -762,21 +714,21 @@ COpenFontSessionCacheEntry* new_entry = COpenFontSessionCacheEntry::New(iHeap, this, aCode, cur_glyph_data->GlyphIndex(), *cur_glyph_data->Metrics(), cur_glyph_data->Bitmap()); new_glyph = new_entry; - if (new_entry) + if (new_entry != NULL) { cache->Insert(iHeap, new_entry, index); } } - if (temp_glyph_data) + if (temp_glyph_data != NULL) { iHeap->Free(temp_glyph_data); } // Fix up the returned glyph data pointers to point to the actual data. - if (!new_glyph) - glyph_data_valid = FALSE; - else if (aGlyphData) + if (new_glyph == NULL) + glyph_data_valid = EFalse; + else if (aGlyphData != NULL) { aGlyphData->SetMetricsPointer(&new_glyph->iMetrics); aGlyphData->SetBitmapPointer(new_glyph->Bitmap()); @@ -784,120 +736,6 @@ return glyph_data_valid; } -#else -TBool COpenFont::Rasterize(TInt aSessionHandle, TInt aCode, - TOpenFontGlyphData* aGlyphData) - { - // First look in the font cache. - COpenFontGlyphTreeEntry** node_ptr = NULL; - // create the cache if it doesn't exisit. As this call can only come from - // FBSERV if the chunk has to be resized then no panic will happen. - if (iGlyphCache == NULL) - { - iGlyphCache = (COpenFontGlyphCache*)iHeap->Alloc(sizeof(COpenFontGlyphCache)); - if (iGlyphCache == NULL) // no memory - { - return FALSE; - } - new(iGlyphCache) COpenFontGlyphCache; - } - - // Look in the fontcache. Do not expect to find a glyph here. However, - // it is called again so that a node pointer is found where the new glyph - // will be placed when added to the font cache. - const COpenFontGlyph* glyph = FontCacheGlyph(aCode, node_ptr); - if (glyph) - { - // Do not expect it to get here, since the font cache has already been searched client-side, - // prior to calling Rasterize(). However, just in case it does find a match, use it. - if (aGlyphData) - { - aGlyphData->SetMetricsPointer(&glyph->iMetrics); - aGlyphData->SetBitmapPointer(glyph->iBitmap); - } - return TRUE; - } - - // Rasterize the glyph. - TOpenFontGlyphData* temp_glyph_data = NULL; - TInt error = KErrNone; - TRAP(error, RasterizeHelperL(aCode, aGlyphData, temp_glyph_data)); - if (error) - { - iHeap->Free(temp_glyph_data); - return FALSE; - } - - TBool glyph_data_valid = TRUE; - const TOpenFontGlyphData* cur_glyph_data = temp_glyph_data ? temp_glyph_data : aGlyphData; - const COpenFontGlyph* new_glyph = NULL; - - // If the maximum per-font cache memory will not be exceeded, put the glyph into the font cache. - TInt bytes = sizeof(COpenFontGlyphTreeEntry) + cur_glyph_data->BytesNeeded(); - if (iGlyphCache && node_ptr && bytes + iGlyphCache->iGlyphCacheMemory <= KMaxGlyphCacheMemory) - { - COpenFontGlyphTreeEntry* new_entry = COpenFontGlyphTreeEntry::New(iHeap, aCode, cur_glyph_data->GlyphIndex(), *cur_glyph_data->Metrics(), cur_glyph_data->Bitmap()); - new_glyph = new_entry; - if (new_entry) - { - *node_ptr = new_entry; // update the cache atomically - - // Insert new entry into the delete list - - COpenFontGlyphTreeEntry* start = iGlyphCache->iGlyphTree; - COpenFontGlyphTreeEntry* tree = start; - - if (new_entry != iGlyphCache->iGlyphTree) - { - while (tree->iNext) - { - tree = tree->iNext; - } - tree->iNext = new_entry; - } - else - { - // First entry in tree, initialise iGlyphList - iGlyphCache->iGlyphList = new_entry; - } - - iGlyphCache->iGlyphCacheMemory += bytes; - } - } - - // Otherwise put the glyph into the per-session cache. - else - { - // If the session cache is not yet known find it or create one. - COpenFontSessionCache* cache = NULL; - TInt index = 0; - SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, TRUE); - if (!cache) - return FALSE; - COpenFontSessionCacheEntry* new_entry = - COpenFontSessionCacheEntry::New(iHeap, this, aCode, cur_glyph_data->GlyphIndex(), *cur_glyph_data->Metrics(), cur_glyph_data->Bitmap()); - new_glyph = new_entry; - if (new_entry) - cache->Insert(iHeap, new_entry, index); - } - - if (temp_glyph_data) - { - iHeap->Free(temp_glyph_data); - } - - // Fix up the returned glyph data pointers to point to the actual data. - if (!new_glyph) - glyph_data_valid = FALSE; - else if (aGlyphData) - { - aGlyphData->SetMetricsPointer(&new_glyph->iMetrics); - aGlyphData->SetBitmapPointer(new_glyph->iBitmap); - } - - return glyph_data_valid; - } -#endif // FNTSTORE_SUPPORT_FMM void COpenFont::RasterizeHelperL(TInt aCode, TOpenFontGlyphData* aGlyphData, TOpenFontGlyphData*& aTempGlyphData) { @@ -915,14 +753,14 @@ ExtendedInterface(KUidOpenFontShapingExtension, ext); extensionInterface = reinterpret_cast(ext); - if (!extensionInterface) + if (extensionInterface == NULL) // an attempt to rasterize a glyph when the rasterizer does not // support it; best to do nothing return; } TOpenFontGlyphData* currGlyphData = aGlyphData; - if (!currGlyphData) + if (currGlyphData == NULL) { aTempGlyphData = TOpenFontGlyphData::New(iHeap, 0); if (!aTempGlyphData) @@ -930,7 +768,7 @@ currGlyphData = aTempGlyphData; } - if (extensionInterface) + if (extensionInterface != NULL) extensionInterface->RasterizeGlyphL(aCode, currGlyphData); else RasterizeL(aCode, currGlyphData); @@ -943,13 +781,13 @@ if (aTempGlyphData) iHeap->Free(aTempGlyphData); aTempGlyphData = TOpenFontGlyphData::New(iHeap, bytesNeeded); - if (!aTempGlyphData) + if (aTempGlyphData == NULL) User::Leave(KErrNoMemory); currGlyphData = aTempGlyphData; // If the extension interface was used above, then use again here - if (extensionInterface) + if (extensionInterface != NULL) extensionInterface->RasterizeGlyphL(aCode, currGlyphData); else RasterizeL(aCode, currGlyphData); @@ -993,7 +831,7 @@ reinterpret_cast(ext); TInt ret = KErrNone; - if (!extensionInterface) + if (extensionInterface == NULL) { ret = KErrNotSupported; } @@ -1020,7 +858,7 @@ reinterpret_cast(ext); TInt ret = KErrNone; - if (!extensionInterface) + if (extensionInterface == NULL) { ret = KErrNotSupported; } @@ -1031,7 +869,7 @@ } return ret; } -#ifdef FNTSTORE_SUPPORT_FMM + /** Given the passed pointer aAny, return an offset from it to the "this" pointer of this COpenFont object. @param aAny A pointer to an object that exists on the shared heap, i.e. the same heap @@ -1043,7 +881,7 @@ */ TInt COpenFont::PointerToThisOffset(const TAny* aAny) { - if (aAny) + if (aAny != NULL) { return ((TInt)aAny - (TInt)this); } @@ -1065,7 +903,6 @@ } return NULL; } -#endif // FNTSTORE_SUPPORT_FMM /** A constructor initialised with a TCharacterMetrics object. @@ -1101,27 +938,23 @@ aMetrics.iLeftAdjustInPixels = iHorizBearingX; aMetrics.iMoveInPixels = iHorizAdvance; aMetrics.iRightAdjustInPixels = (TInt16)(iHorizAdvance - iHorizBearingX - iWidth); - return TRUE; + return ETrue; } TBool COpenFont::GetCharacterData(TInt aSessionHandle, TInt aCode, const TOpenFontCharMetrics*& aMetrics, const TUint8*& aBitmap) const { const COpenFontGlyph* g = Glyph(aSessionHandle, aCode); - if (g) + if (g != NULL) { aMetrics = &g->iMetrics; -#ifdef FNTSTORE_SUPPORT_FMM aBitmap = g->Bitmap(); -#else - aBitmap = g->iBitmap; -#endif // FNTSTORE_SUPPORT_FMM - return TRUE; + return ETrue; } else { aMetrics = NULL; aBitmap = NULL; - return FALSE; + return EFalse; } } @@ -1129,44 +962,29 @@ void COpenFont::OnFileDeleted() { - iFile = NULL; + iFileOffset = 0; } COpenFontGlyphCache* COpenFont::GetGlyphCache() { -#ifdef FNTSTORE_SUPPORT_FMM - if (iGlyphCache) - return reinterpret_cast(reinterpret_cast(iGlyphCache)+Offset()); -#else - if (iGlyphCache) - return iGlyphCache; -#endif // FNTSTORE_SUPPORT_FMM - else - return NULL; + if (iGlyphCacheOffset == 0) + { + return NULL; + } + return reinterpret_cast(PtrAdd(this, iGlyphCacheOffset)); } const COpenFontGlyph* COpenFont::Glyph(TInt aSessionHandle, TInt aCode) const { -#ifdef FNTSTORE_SUPPORT_FMM const COpenFontGlyph* glyph = const_cast(this)->FontCacheGlyph(aCode); - if (!glyph) + if (glyph == NULL) { COpenFontSessionCache* cache; TInt index; - glyph = SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, FALSE); + glyph = SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, EFalse); } return glyph; -#else - const COpenFontGlyph* g = CONST_CAST(COpenFont*,this)->FontCacheGlyph(aCode); - if (!g) - { - COpenFontSessionCache* cache; - TInt index; - g = SessionCacheGlyph(iHeap, aSessionHandle, aCode, cache, index, FALSE); - } - return g; -#endif // FNTSTORE_SUPPORT_FMM } /** @@ -1175,13 +993,12 @@ TBool COpenFont::HasCharacterL(TInt aCode) const { COpenFontFile* file = File(); - if (file) + if (file != NULL) return file->HasUnicodeCharacterL(iFaceIndex, aCode); else - return FALSE; + return EFalse; } -#ifdef FNTSTORE_SUPPORT_FMM /** Retrieve glyph data from the per-font glyph cache. If it is not found return NULL. @@ -1203,7 +1020,7 @@ node = static_cast(ThisOffsetToPointer(glyphCache->iGlyphTreeOffset)); } - while (node) + while (node != NULL) { TInt code = node->iCode; if(code == aCode) @@ -1245,13 +1062,17 @@ if (COpenFontGlyphCache* glyphCache = GetGlyphCache()) { - COpenFontGlyphTreeEntry* node = NULL; - if (glyphCache->iGlyphTreeOffset) - { - node = static_cast(ThisOffsetToPointer(glyphCache->iGlyphTreeOffset)); - } - - while (node) + COpenFontGlyphTreeEntry* node = NULL; + if (glyphCache->iGlyphTreeOffset) + { + node = static_cast (ThisOffsetToPointer(glyphCache->iGlyphTreeOffset)); + } + else + { + aNodeInsertPtr = &glyphCache->iGlyphTreeOffset; + } + + while (node != NULL) { TInt code = node->iCode; if(code == aCode) @@ -1275,67 +1096,6 @@ // No glyph found return NULL; } -#else -/** -Retrieve glyph data from the per-font glyph cache. -If it is not found return NULL. -If the cache hasn't been created, then return null. -Previous versions of this function created the cache, but as this function can potentially -run in the context of threads other than FBSERV the alloc could panic if iHeap's chunk had to -be resized - this is not allowed by the kernel. -The cache is now created in COpenFont::Rasterize which can only be called within the context of FBSERV -*/ -const COpenFontGlyph* COpenFont::FontCacheGlyph(TInt aCode) - { - if (iGlyphCache) - { - COpenFontGlyphTreeEntry* node = iGlyphCache->iGlyphTree; - while (node) - { - if (node->iCode == aCode) - return node; - if (node->iCode > aCode) - node = node->iLeft; - else - node = node->iRight; - } - } - - return NULL; - } - -/** -Retrieve glyph data from the per-font glyph cache. -If it is not found return NULL and place the address of the node pointer -to receive a new glyph in aNode. -If the cache hasn't been created, then return null. -Previous versions of this function created the cache, but as this function can potentially -run in the context of threads other than FBSERV the alloc could panic if iHeap's chunk had to -be resized - this is not allowed by the kernel. -The cache is now created in COpenFont::Rasterize which can only be called within the context of FBSERV -*/ -const COpenFontGlyph* COpenFont::FontCacheGlyph(TInt aCode, COpenFontGlyphTreeEntry**& aNode) - { - if (!iGlyphCache) - { - aNode = NULL; - return NULL; - } - - aNode = &iGlyphCache->iGlyphTree; - while (*aNode) - { - if ((*aNode)->iCode == aCode) - return *aNode; - if ((*aNode)->iCode > aCode) - aNode = &((*aNode)->iLeft); - else - aNode = &((*aNode)->iRight); - } - - return NULL; - } -#endif // FNTSTORE_SUPPORT_FMM /** Retrieve glyph data from the session cache. If the glyph is not in the cache, return the cache and glyph index where the glyph data should be put. If @@ -1359,7 +1119,6 @@ @return The glyph data, or null if the glyph is not in the cache @internalComponent */ -#ifdef FNTSTORE_SUPPORT_FMM const COpenFontGlyph* COpenFont::SessionCacheGlyph(RHeap* aHeap, TInt aSessionHandle, TInt aCode, COpenFontSessionCache*& aCache, TInt& aIndex, TBool aCreate) const @@ -1376,7 +1135,7 @@ } sem.Wait(); COpenFontSessionCacheListItem* cacheListStart=cachelist->Start(); - if(cacheListStart) + if(cacheListStart != NULL) { for (COpenFontSessionCacheListItem* p = cacheListStart; p; p = p->Next()) { @@ -1399,10 +1158,10 @@ COpenFontSessionCache* new_cache = NULL; TRAPD(error, new_cache = COpenFontSessionCache::NewL(aHeap, aSessionHandle, KSessionCacheEntries)); - if ((!error) && new_cache) + if ((!error) && new_cache != NULL) { COpenFontSessionCacheListItem* new_item = (COpenFontSessionCacheListItem*)aHeap->Alloc(sizeof(COpenFontSessionCacheListItem)); - if (!new_item) + if (new_item == NULL) { new_cache->Delete(aHeap); aHeap->Free(new_cache); @@ -1411,7 +1170,7 @@ new(new_item) COpenFontSessionCacheListItem(new_cache); - if (prev) + if (prev != NULL) { prev->SetNext(new_item); } @@ -1426,64 +1185,31 @@ } return NULL; } -#else -const COpenFontGlyph* COpenFont::SessionCacheGlyph(RHeap* aHeap, - TInt aSessionHandle, TInt aCode, COpenFontSessionCache*& aCache, - TInt& aIndex, TBool aCreate) const - { - aCache = NULL; - aIndex = 0; - COpenFontSessionCacheListItem* prev = NULL; - RSemaphore sem; - if(KErrNone != sem.OpenGlobal(KSessionCacheSemaphoreName)) + +COpenFontSessionCacheList* COpenFont::SessionCacheList()const + { + if (iSessionCacheListOffset == 0) { - RDebug::Print(_L("COpenFont::SessionCacheGlyphe() can't open SessionCacheSemaphore")); return NULL; } - sem.Wait(); - for (COpenFontSessionCacheListItem* p = iSessionCacheList->iStart; p; p = p->iNext) - { - if (p->iCache->iSessionHandle == aSessionHandle) - { - aCache = p->iCache; - sem.Signal(); - sem.Close(); - return aCache->Glyph(this, aCode, aIndex); - } - prev = p; - } - sem.Signal(); - sem.Close(); - - if (aCreate) - { - COpenFontSessionCache* new_cache = NULL; - TRAPD(error, new_cache = COpenFontSessionCache::NewL(aHeap, aSessionHandle, KSessionCacheEntries)); - - if ((!error) && new_cache) - { - COpenFontSessionCacheListItem* new_item = (COpenFontSessionCacheListItem*)aHeap->Alloc(sizeof(COpenFontSessionCacheListItem)); - if (!new_item) - { - new_cache->Delete(aHeap); - aHeap->Free(new_cache); - return NULL; - } + return reinterpret_cast(reinterpret_cast(this) + iSessionCacheListOffset); + } + +void COpenFont::SetSessionCacheList(COpenFontSessionCacheList* aSessionCacheList) + { + iSessionCacheListOffset = aSessionCacheList ? reinterpret_cast(aSessionCacheList) - reinterpret_cast(this) : NULL; + } - new(new_item) COpenFontSessionCacheListItem(new_cache); - - if (prev) - prev->iNext = new_item; - else - iSessionCacheList->iStart = new_item; +void COpenFont::SetFile(COpenFontFile* aFile) + { + iFileOffset = aFile ? reinterpret_cast(aFile) - reinterpret_cast(this) : NULL; + } - aCache = new_cache; - aIndex = GLYPH_CODE(aCode) % KSessionCacheEntries; - } - } - return NULL; - } -#endif // FNTSTORE_SUPPORT_FMM +void COpenFont::SetGlyphCache(COpenFontGlyphCache* aGlyphCache) + { + iGlyphCacheOffset = aGlyphCache ? reinterpret_cast(aGlyphCache) - reinterpret_cast(this) : NULL; + } + /** Create a glyph data object on the shared heap, given the code, metrics and the data bytes. @@ -1504,7 +1230,7 @@ COpenFontGlyphTreeEntry* COpenFontGlyphTreeEntry::New(RHeap* aHeap, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap) { COpenFontGlyphTreeEntry* entry = (COpenFontGlyphTreeEntry*)aHeap->Alloc(sizeof(COpenFontGlyphTreeEntry)); - if (!entry) + if (entry == NULL) return NULL; new(entry) COpenFontGlyphTreeEntry(aCode, aGlyphIndex, aMetrics); if (!entry->SetBitmap(aHeap, aBitmap)) @@ -1518,7 +1244,7 @@ COpenFontSessionCacheEntry* COpenFontSessionCacheEntry::New(RHeap* aHeap, const COpenFont* aFont, TInt aCode, TInt aGlyphIndex, const TOpenFontCharMetrics& aMetrics, const TDesC8& aBitmap) { COpenFontSessionCacheEntry* entry = (COpenFontSessionCacheEntry*)aHeap->Alloc(sizeof(COpenFontSessionCacheEntry)); - if (!entry) + if (entry == NULL) return NULL; new(entry) COpenFontSessionCacheEntry(aFont, aCode, aGlyphIndex, aMetrics); if (!entry->SetBitmap(aHeap, aBitmap)) @@ -1529,18 +1255,6 @@ return entry; } -#ifdef FNTSTORE_SUPPORT_FMM - -inline COpenFont* COpenFontSessionCacheEntry::Font()const -{ -if(iFontOffset) - { - return reinterpret_cast(reinterpret_cast(this) + iFontOffset); - } -else - return NULL; -} - /** @return A pointer to the run-length-encoded bitmap stored with this glyph, or NULL if no bitmap has been stored with this glyph. @@ -1549,213 +1263,122 @@ { if (iBitmapOffset) { - return (TUint8*)((TInt)this + iBitmapOffset); + return reinterpret_cast(reinterpret_cast(this) + iBitmapOffset); } return NULL; } -#endif // FNTSTORE_SUPPORT_FMM TBool COpenFontGlyph::SetBitmap(RHeap* aHeap, const TDesC8& aBitmap) { TUint8* bitmap = (TUint8*)aHeap->Alloc(aBitmap.Length()); - if (!bitmap) - return FALSE; + if (bitmap == NULL) + return EFalse; Mem::Copy(bitmap, aBitmap.Ptr(), aBitmap.Length()); -#ifdef FNTSTORE_SUPPORT_FMM aHeap->Free(Bitmap()); - iBitmapOffset = (TInt)bitmap - (TInt)this; -#else - if (iBitmap) - aHeap->Free(iBitmap); - iBitmap = bitmap; -#endif // FNTSTORE_SUPPORT_FMM - return TRUE; + iBitmapOffset = reinterpret_cast(bitmap) - reinterpret_cast(this); + return ETrue; } -#ifdef FNTSTORE_SUPPORT_FMM + COpenFontSessionCache* COpenFontSessionCache::NewL(RHeap* aHeap, TInt aSessionHandle, TInt aEntries) { - COpenFontSessionCache* c = reinterpret_cast(aHeap->AllocL(sizeof(COpenFontSessionCache))); - new(c) COpenFontSessionCache(aSessionHandle,aEntries); - TInt bytes = sizeof(TInt) * aEntries; - TInt* entry= reinterpret_cast(aHeap->Alloc(bytes)); - Mem::FillZ(entry, bytes); - if (!entry) - { - aHeap->Free(c); - User::Leave(KErrNoMemory); - } - c->iEntryOffset = reinterpret_cast(entry) - reinterpret_cast(c); - return c; - } -#else -COpenFontSessionCache* COpenFontSessionCache::NewL(RHeap* aHeap, TInt aSessionHandle, TInt aEntries) - { COpenFontSessionCache* c = (COpenFontSessionCache*)aHeap->AllocL(sizeof(COpenFontSessionCache)); - new(c) COpenFontSessionCache(aSessionHandle,aEntries); - TInt bytes = sizeof(COpenFontSessionCacheEntry*) * aEntries; - c->iEntry = (COpenFontSessionCacheEntry**)aHeap->Alloc(bytes); - Mem::FillZ(c->iEntry, bytes); - if (!c->iEntry) + new(c) COpenFontSessionCache(aSessionHandle); + if (c->iEntryArray.Create(aHeap, aEntries) != KErrNone) { aHeap->Free(c); User::Leave(KErrNoMemory); } return c; - } -#endif //FNTSTORE_SUPPORT_FMM + } -#ifdef FNTSTORE_SUPPORT_FMM + void COpenFontSessionCache::Delete(RHeap* aHeap) { - TInt* e =Entry(); - if(e) + TInt entries = iEntryArray.Count(); + for (TInt i = 0; i < entries; ++i) { - for (TInt i = 0; i < iEntries; i++, e++) + COpenFontSessionCacheEntry* e = iEntryArray[i]; + if (e != NULL) { - if (ToCOpenFontSessionCacheEntryPointer(*e)) - { - COpenFont* font=const_cast((ToCOpenFontSessionCacheEntryPointer(*e))->Font()); - if (font) - font->DecrementCachedRefCount(iSessionHandle, NULL, ETrue); - aHeap->Free((ToCOpenFontSessionCacheEntryPointer(*e))->Bitmap()); - aHeap->Free(ToCOpenFontSessionCacheEntryPointer(*e)); - } + COpenFont* font=const_cast(e->Font()); + if (font != NULL) + font->DecrementCachedRefCount(iSessionHandle,NULL,ETrue); + aHeap->Free(e->Bitmap()); + aHeap->Free(e); } - aHeap->Free(Entry()); - iEntryOffset = 0; } + iEntryArray.Close(aHeap); } -#else -void COpenFontSessionCache::Delete(RHeap* aHeap) - { - COpenFontSessionCacheEntry** e =iEntry; - for (TInt i = 0; i < iEntries; i++, e++) - { - if (*e) - { - COpenFont* font=const_cast((*e)->iFont); - if (font) - font->DecrementCachedRefCount(iSessionHandle, NULL, ETrue); - aHeap->Free((*e)->iBitmap); - aHeap->Free(*e); - } - } - aHeap->Free(iEntry); - } -#endif //FNTSTORE_SUPPORT_FMM const COpenFontGlyph* COpenFontSessionCache::Glyph(const COpenFont* aFont, TInt aCode, TInt& aIndex) { - aIndex = -1; - TInt oldest = KMaxTInt; - TInt oldest_index = 0; - TInt index = GLYPH_CODE(aCode) % iEntries; // simple hash function to shorten searches - for (TInt i = 0; i < iEntries; i++, index++) - { - if (index >= iEntries) - index = 0; -#ifdef FNTSTORE_SUPPORT_FMM - COpenFontSessionCacheEntry* e = ToCOpenFontSessionCacheEntryPointer(Entry()[index]); -#else - COpenFontSessionCacheEntry* e = iEntry[index]; -#endif //FNTSTORE_SUPPORT_FMM - if (!e) - { - if (aIndex == -1) - aIndex = index; - } - else - { -#ifdef FNTSTORE_SUPPORT_FMM - if (e->Font() == aFont && e->iCode == aCode) -#else - if (e->iFont == aFont && e->iCode == aCode) -#endif //FNTSTORE_SUPPORT_FMM - { - e->iLastAccess = iLastAccess++; - return e; - } - if (e->iLastAccess < oldest) - { - oldest = e->iLastAccess; - oldest_index = index; - } - } - } - if (aIndex == -1) - aIndex = oldest_index; - return NULL; + aIndex = -1; + TInt oldest = KMaxTInt; + TInt oldest_index = 0; + TInt entries = iEntryArray.Count(); + TInt index = GLYPH_CODE(aCode) % entries; // simple hash function to shorten searches + for (TInt i = 0; i < entries; ++i, ++index) + { + if (index >= entries) + index = 0; + COpenFontSessionCacheEntry* e = iEntryArray[index]; + if (e == NULL) + { + if (aIndex == -1) + aIndex = index; + } + else + { + if (e->Font() == aFont && e->iCode == aCode) + { + e->iLastAccess = iLastAccess++; + return e; + } + if (e->iLastAccess < oldest) + { + oldest = e->iLastAccess; + oldest_index = index; + } + } + } + if (aIndex == -1) + aIndex = oldest_index; + return NULL; } void COpenFontSessionCache::Insert(RHeap* aHeap, COpenFontSessionCacheEntry* aEntry, TInt aIndex) { - if ((aIndex < 0) || (aIndex > iEntries)) - Panic(EFntSessionCacheIndexOutOfRange); -#ifdef FNTSTORE_SUPPORT_FMM - COpenFontSessionCacheEntry* e = ToCOpenFontSessionCacheEntryPointer(Entry()[aIndex]); - COpenFontGlyph::Delete(aHeap, e); - Entry()[aIndex] = reinterpret_cast(aEntry) - reinterpret_cast(this); -#else - COpenFontGlyph::Delete(aHeap, iEntry[aIndex]); - iEntry[aIndex] = aEntry; -#endif //FNTSTORE_SUPPORT_FMM - aEntry->iLastAccess = iLastAccess++; - } - -COpenFontSessionCache::COpenFontSessionCache(TInt aSessionHandle, TInt aEntries) - : iSessionHandle(aSessionHandle), - iEntries(aEntries), - iLastAccess(0), -#ifdef FNTSTORE_SUPPORT_FMM - iEntryOffset(0) -#else - iEntry(NULL) -#endif //FNTSTORE_SUPPORT_FMM - { + if (aIndex < 0 || aIndex >= iEntryArray.Count()) + Panic(EFntSessionCacheIndexOutOfRange); + COpenFontGlyph::Delete(aHeap, iEntryArray[aIndex]); + iEntryArray.SetAt(aIndex, aEntry); + aEntry->iLastAccess = iLastAccess++; } -#ifdef FNTSTORE_SUPPORT_FMM - -inline TInt* COpenFontSessionCache::Entry() const - { - if (iEntryOffset) - { - return reinterpret_cast(reinterpret_cast(this) + iEntryOffset); - } - return NULL; +COpenFontSessionCache::COpenFontSessionCache(TInt aSessionHandle): + iSessionHandle(aSessionHandle), + iLastAccess(0) + { } -inline COpenFontSessionCacheEntry* COpenFontSessionCache::ToCOpenFontSessionCacheEntryPointer(TInt aOffset)const - { - if(aOffset) - { - return reinterpret_cast(reinterpret_cast(this) + aOffset); - } - return NULL; - } - -#endif // FNTSTORE_SUPPORT_FMM - /*COpenFontSessionCacheListItem*/ -#ifdef FNTSTORE_SUPPORT_FMM COpenFontSessionCacheListItem::COpenFontSessionCacheListItem(COpenFontSessionCache* aCache): iNextOffset(NULL) { - if(aCache) - { - iCacheOffset = (TInt)aCache - (TInt)this; - } - else - { - iCacheOffset = NULL; - } + if(aCache != NULL) + { + iCacheOffset = reinterpret_cast(aCache) - reinterpret_cast(this); + } + else + { + iCacheOffset = NULL; + } } COpenFontSessionCacheListItem::~COpenFontSessionCacheListItem() { } -#endif // FNTSTORE_SUPPORT_FMM /** Delete a COpenFontSessionCacheListItem from the passed heap. @@ -1763,19 +1386,16 @@ */ void COpenFontSessionCacheListItem::Delete(RHeap* aHeap) { -#ifdef FNTSTORE_SUPPORT_FMM - Cache()->Delete(aHeap); - aHeap->Free(Cache()); - iCacheOffset=NULL; - iNextOffset=NULL; -#else - iCache->Delete(aHeap); - aHeap->Free(iCache); - iCache=NULL; -#endif // FNTSTORE_SUPPORT_FMM + COpenFontSessionCache* cache = Cache(); + if (cache != NULL) + { + cache->Delete(aHeap); + aHeap->Free(cache); + } + iCacheOffset=NULL; + iNextOffset=NULL; } -#ifdef FNTSTORE_SUPPORT_FMM /** Get the next item to this cache list item. @return A pointer to the next item to this one in the session cache, or NULL @@ -1785,7 +1405,7 @@ { if(iNextOffset) { - COpenFontSessionCacheListItem* next = (COpenFontSessionCacheListItem*)((TInt)this + (TInt)iNextOffset); + COpenFontSessionCacheListItem* next = reinterpret_cast(reinterpret_cast(this) + iNextOffset); return next; } else @@ -1800,9 +1420,9 @@ */ void COpenFontSessionCacheListItem::SetNext(COpenFontSessionCacheListItem* aNext) { - if(aNext) + if(aNext != NULL) { - iNextOffset = (TInt)aNext - (TInt)this; + iNextOffset = reinterpret_cast(aNext) - reinterpret_cast(this); } else { @@ -1818,7 +1438,7 @@ { if(iCacheOffset) { - COpenFontSessionCache* cache = (COpenFontSessionCache*)((TInt)this + (TInt)iCacheOffset); + COpenFontSessionCache* cache = reinterpret_cast(reinterpret_cast(this) + iCacheOffset); return cache; } else @@ -1835,7 +1455,7 @@ { if(iStartOffset) { - COpenFontSessionCacheListItem* start = (COpenFontSessionCacheListItem*)((TInt)this + (TInt)iStartOffset); + COpenFontSessionCacheListItem* start = reinterpret_cast(reinterpret_cast(this) + iStartOffset); return start; } else @@ -1851,16 +1471,15 @@ */ void COpenFontSessionCacheList::SetStart(COpenFontSessionCacheListItem* aItem) { - if(aItem!=NULL) + if(aItem != NULL) { - iStartOffset = (TInt)aItem - (TInt)this; + iStartOffset = reinterpret_cast(aItem) - reinterpret_cast(this); } else { iStartOffset = 0; } } -#endif // FNTSTORE_SUPPORT_FMM /** Delete all the items in the session cache if the current cache session handle matches the passed session handle. @@ -1877,51 +1496,33 @@ RDebug::Print(_L("COpenFontSessionCacheList::DeleteCache() can't open SessionCacheSemaphore")); return; } -#ifdef FNTSTORE_SUPPORT_FMM - for (COpenFontSessionCacheListItem* curr = Start(); curr; prev = curr, curr = curr->Next()) - { - if (curr->Cache()->iSessionHandle == aSessionHandle) - { - for(TInt i=0; iNext()); - else - prev->SetNext(curr->Next()); - - curr->Delete(aHeap); - aHeap->Free(curr); - sem.Signal(KSessionCacheSemaphoreCount); - sem.Close(); - return; - } - } -#else - for (COpenFontSessionCacheListItem* curr = iStart; curr; prev = curr, curr = curr->iNext) - { - if (curr->iCache->iSessionHandle == aSessionHandle) - { - for(TInt i=0; iiNext; - else - prev->iNext = curr->iNext; + + for (COpenFontSessionCacheListItem* curr = Start(); curr; prev = curr, curr = curr->Next()) + { + COpenFontSessionCache* cache = curr->Cache(); + if (cache != NULL && cache->iSessionHandle == aSessionHandle) + { + for (TInt i = 0; i < KSessionCacheSemaphoreCount; i++) + { + //coverity[lock] + //coverity[double_lock] + sem.Wait(); + } - curr->Delete(aHeap); - aHeap->Free(curr); + if (curr == Start()) + SetStart(curr->Next()); + else + prev->SetNext(curr->Next()); + + curr->Delete(aHeap); + aHeap->Free(curr); + sem.Signal(KSessionCacheSemaphoreCount); sem.Close(); - return; - } - } -#endif // FNTSTORE_SUPPORT_FMM + return; + } + } + sem.Close(); } /** Delete all the items in the current session cache. @@ -1936,11 +1537,7 @@ RDebug::Print(_L("COpenFontSessionCacheList::Delete() can't open SessionCacheSemaphore")); return; } -#ifdef FNTSTORE_SUPPORT_FMM COpenFontSessionCacheListItem* cur = Start(); -#else - COpenFontSessionCacheListItem* cur = iStart; -#endif // FNTSTORE_SUPPORT_FMM COpenFontSessionCacheListItem* next = NULL; for(TInt i=0; iNext(); -#else - next = cur->iNext; -#endif // FNTSTORE_SUPPORT_FMM cur->Delete(aHeap); aHeap->Free(cur); cur = next; @@ -1975,39 +1568,24 @@ RDebug::Print(_L("COpenFontSessionCacheList::DeleteFontGlyphs can't global open SessionCacheSemaphore")); return; } - sem.Wait(); -#ifdef FNTSTORE_SUPPORT_FMM + sem.Wait(); for (COpenFontSessionCacheListItem* p = Start(); p; p = p->Next()) - { - COpenFontSessionCache* cache=p->Cache(); - TInt* e = cache->Entry(); - TInt entries = cache->iEntries; - for (TInt i = 0; i < entries; i++, e++) - { - if ((cache->ToCOpenFontSessionCacheEntryPointer(*e)) - && ((cache->ToCOpenFontSessionCacheEntryPointer(*e))->Font() == aFont)) - { - COpenFontSessionCacheEntry::Delete(aHeap, cache->ToCOpenFontSessionCacheEntryPointer(*e)); - *e = 0; - } - } - } -#else - for (COpenFontSessionCacheListItem* p = iStart; p; p = p->iNext) - { - COpenFontSessionCacheEntry** e = p->iCache->iEntry; - TInt entries = p->iCache->iEntries; - for (TInt i = 0; i < entries; i++, e++) - { - if ((*e) && ((*e)->iFont == aFont)) - { - COpenFontSessionCacheEntry::Delete(aHeap, *e); - *e = NULL; - } - } - } -#endif // FNTSTORE_SUPPORT_FMM - + { + COpenFontSessionCache* cache = p->Cache(); + if (cache != NULL) + { + TInt entries = cache->iEntryArray.Count(); + for (TInt i = 0; i < entries; ++i) + { + COpenFontSessionCacheEntry* e = cache->iEntryArray[i]; + if (e != NULL && e->Font() == aFont) + { + COpenFontSessionCacheEntry::Delete(aHeap, e); + cache->iEntryArray.SetAt(i, NULL); + } + } + } //if(cache != NULL) + } sem.Signal(); sem.Close(); } @@ -2121,7 +1699,7 @@ EXPORT_C COpenFontFile::~COpenFontFile() { CFontStore *fs = GetFontStore(); - if (fs) + if (fs != NULL) { fs->CleanupCacheOnOpenFontFileRemoval(this); } @@ -2540,7 +2118,7 @@ void COpenFontFile::SetFontStoreL(CFontStore* aFontStore) { - if (!iData) + if (iData == NULL) { iData = new (ELeave) TOpenFontFileData; } @@ -2864,7 +2442,7 @@ aBufferSize = 1; TInt bytes = sizeof(TOpenFontGlyphData) + aBufferSize - 1; TOpenFontGlyphData* g = (TOpenFontGlyphData*)aHeap->Alloc(bytes); - if (g) + if (g != NULL) { Mem::FillZ(g, bytes); g->iBitmapBufferSize = aBufferSize; diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/src/linkedfontsprivate.h --- a/fontservices/fontstore/src/linkedfontsprivate.h Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/src/linkedfontsprivate.h Sun Mar 14 13:16:16 2010 +0000 @@ -63,11 +63,8 @@ TInt iSession; //Not owned TInt iUsageCounter; // -#ifdef FNTSTORE_SUPPORT_FMM + const COpenFontGlyph* GlyphLinked(TInt aCode,TInt*& aNode); -#else - const COpenFontGlyph* GlyphLinked(TInt aCode,COpenFontGlyphTreeEntry**& aNode); -#endif // FNTSTORE_SUPPORT_FMM void RasterizeL(TInt aCode,TOpenFontGlyphData* aGlyphData); }; diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/TFntStoreServer.cpp --- a/fontservices/fontstore/tfs/TFntStoreServer.cpp Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/tfs/TFntStoreServer.cpp Sun Mar 14 13:16:16 2010 +0000 @@ -44,6 +44,7 @@ #include "t_linkedfontscapability.h" #include "T_LinkedFontUpdateTests.h" #include "T_CACHE.H" +#include "T_FontSessionCache.h" CTFntStoreServer* CTFntStoreServer::NewL() /** @@ -122,14 +123,10 @@ Implementation of CTestServer pure virtual */ { - if(aStepName == KTFntStep) - { - return new CTFntStep(); - } - else if(aStepName == KTCacheStep) - { - return new CTCacheStep(); - } + if (aStepName == KTFntStep) + { + return new CTFntStep(); + } else if(aStepName == KTFntMemStep) { return new CTFntMemStep(); @@ -188,24 +185,32 @@ } else if (aStepName == KTLinkedFontsMemoryStep) { - return new CTLinkedFontsMemoryStep(); - } - else if (aStepName == KTLinkedFontsComparisonStep) - { - return new CTLinkedFontsComparisonStep(); - } - else if (aStepName == KTLinkedFontsCapabilityStep) - { - return new CTLinkedFontsCapabilityStep(); - } - else if (aStepName == KTLinkedFontsUpdateStage1Step) - { - return new CTLinkedFontsUpdateStage1Step(); - } - else if (aStepName == KTLinkedFontsUpdateStage2Step) - { - return new CTLinkedFontsUpdateStage2Step(); - } + return new CTLinkedFontsMemoryStep(); + } + else if (aStepName == KTLinkedFontsComparisonStep) + { + return new CTLinkedFontsComparisonStep(); + } + else if (aStepName == KTLinkedFontsCapabilityStep) + { + return new CTLinkedFontsCapabilityStep(); + } + else if (aStepName == KTLinkedFontsUpdateStage1Step) + { + return new CTLinkedFontsUpdateStage1Step(); + } + else if (aStepName == KTLinkedFontsUpdateStage2Step) + { + return new CTLinkedFontsUpdateStage2Step(); + } + else if (aStepName == KTCacheStep) + { + return new CTCacheStep(); + } + else if (aStepName == KTFontSessionCacheStep) + { + return new CTFontSessionCacheStep(); + } RDebug::Printf("Test Step is either mis-spelt or doesn't exist - see CTFntStoreServer::CreateTestStep"); return NULL; } diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/T_fontsessioncache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/tfs/T_fontsessioncache.cpp Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,222 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// + +/** + @file + @test + @internalComponent Internal Symbian test code +*/ + +#include "FNTSTORE.H" +#include "OPENFONT.H" +#include "FNTBODY.H" +#include "FNTSTD.H" +#include "t_fontsessioncache.h" +#include +#include +#include + +_LIT(KWorkerProcess,"tfontsessioncacheproc"); + +const TInt KNumOfProc = 4; +const TInt KRunningTime = 1000 * 1000 * 5; + +class CTFontSessionCache : public CTGraphicsBase + { +public: + CTFontSessionCache(CTestStep* aStep); + ~CTFontSessionCache(); + + static void TimerCleanup(TAny *); +protected: +// From CTGraphicsStep + virtual void RunTestCaseL(TInt aCurTestCase); +private: + void TestOpenFontForQtL(); + void RunMultiWorkerProcessL(); + }; + +// This class is a data mirror to CBitmapFont in order to check its private +// member iOpenFont. It is only used by TestOpenFontForQtL(). +class CBitmapFontDummy:public CFont + { +public: + TFontSpec iFontSpecInTwips; + TAlgStyle iAlgStyle; + RHeap* iHeap; + TInt iFontBitmapOffset; + COpenFont* iOpenFont; + TUint32 iReserved; + TUint32 iUniqueFontId; + }; + +class CFbsFontUtil:public CFbsFont + { +public: + static CBitmapFontDummy *getBitmapFont(CFbsFont *aFbsfont) + { + return reinterpret_cast(static_cast(aFbsfont)->Address()); + } + }; + + +CTFontSessionCache::CTFontSessionCache(CTestStep* aStep) + : CTGraphicsBase(aStep) + { + + } + +CTFontSessionCache::~CTFontSessionCache() + { + // no action needed + } + +void CTFontSessionCache::TimerCleanup(TAny *aTimer) + { + ((RTimer*)aTimer)->Cancel(); + } + +/** +Qt needs the last bit of iOpenFont to be set 1 as a workaround to maintain +its compatibility across difference Symbian OS versions. +*/ +void CTFontSessionCache::TestOpenFontForQtL() + { + _LIT(KTypefaceName, "DejaVu Sans Condensed"); + TFontSpec spec(KTypefaceName, 15); + CFbsTypefaceStore *tfs = CFbsTypefaceStore::NewL(NULL); + + CFont* font = NULL; + TInt ret = tfs->GetNearestFontToDesignHeightInPixels(font,spec); + TEST(ret == KErrNone); + + CFbsFont *fbs_font = static_cast(font); + TEST(reinterpret_cast((CFbsFontUtil::getBitmapFont(fbs_font))->iOpenFont) & 1); + + tfs->ReleaseFont(font); + delete tfs; + } + +/* + * Launch 4 worker processes running with random latency at beginning. + * Each one lasts about 1 sec. Within duration of 5 sec, if one terminates, + * re-launch it. + * + */ +void CTFontSessionCache::RunMultiWorkerProcessL() + { + RProcess ProcArray[KNumOfProc]; + TRequestStatus *completeStatus[KNumOfProc]; + + for (TInt i = 0; i < KNumOfProc; i++) + { + RDebug::Print(_L(">>> Launching %d..."),i); + TInt err; + err = ProcArray[i].Create(KWorkerProcess, KNullDesC); + User::LeaveIfError(err); + + completeStatus[i] = new(ELeave) TRequestStatus; + CleanupStack::PushL(completeStatus[i]); + *completeStatus[i] = KRequestPending; + + ProcArray[i].Logon(*completeStatus[i]); + ProcArray[i].Resume(); //start the process + } + + RTimer timer; + timer.CreateLocal(); + TRequestStatus timerStatus = KRequestPending; + TTimeIntervalMicroSeconds32 timeout(KRunningTime); + timer.After(timerStatus, timeout); + + do + { + User::WaitForNRequest(completeStatus, KNumOfProc); + TInt i = 0; + for(;i < KNumOfProc;i++ ) + { + if (*completeStatus[i] != KRequestPending) + { + break; + } + } + + TExitType exit = ProcArray[i].ExitType(); + TEST(exit == EExitKill); + TInt reason = ProcArray[i].ExitReason(); + TEST (reason == 0); + + RDebug::Print(_L("<<< Close %d..."), i); + ProcArray[i].Close(); + + RDebug::Print(_L(">>> Launching %d..."), i); + TInt err; + err = ProcArray[i].Create(KWorkerProcess, KNullDesC); + User::LeaveIfError(err); + + //run process 1 + *completeStatus[i] = KRequestPending; + ProcArray[i].Logon(*completeStatus[i]); + ProcArray[i].Resume(); //start the process + } + while (timerStatus == KRequestPending); + + for (TInt i = 0; i < KNumOfProc; i++) + { + if(*completeStatus[i] == KRequestPending) + { + User::WaitForRequest(*completeStatus[i]); + } + RDebug::Print(_L("<<< Tear down Close %d..."),i); + ProcArray[i].Close(); //tear down + } + CleanupStack::PopAndDestroy(4); + } + + +void CTFontSessionCache::RunTestCaseL( TInt aCurTestCase ) + { +#if defined __WINS__ || defined __WINSCW__ + aCurTestCase = aCurTestCase; //to avoid unused warning + // TestComplete(); //only run test on hardware, always passes on winscw + // return; +#endif + ((CTFontSessionCacheStep*) iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); + + switch (aCurTestCase) + { + case 1: + ((CTFontSessionCacheStep*) iStep)->SetTestStepID(_L("TI18N-FNTSTORE-UT--4003")); + INFO_PRINTF1(_L("Test CBitmapFont::iOpenFont last bit for Qt\n")); + TestOpenFontForQtL(); + break; + + case 2: + ((CTFontSessionCacheStep*) iStep)->SetTestStepID(_L("TI18N-FNTSTORE-CIT-4002")); + INFO_PRINTF1(_L("Test GetCharacterData() in muti-process client\n")); + RunMultiWorkerProcessL(); + break; + + case 3: + ((CTFontSessionCacheStep*) iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); + ((CTFontSessionCacheStep*) iStep)->CloseTMSGraphicsStep(); + TestComplete(); + break; + } + ((CTFontSessionCacheStep*)iStep)->RecordTestResultL(); + } + +// -------------- +__CONSTRUCT_STEP__(FontSessionCache) diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/T_fontsessioncache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/tfs/T_fontsessioncache.h Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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 T_FONTSESSIONCACHE_H_ +#define T_FONTSESSIONCACHE_H_ + +#include "TGraphicsHarness.h" + +class CTFontSessionCacheStep : public CTGraphicsStep + { +public: + CTFontSessionCacheStep(); +protected: + //from CTGraphicsStep + virtual CTGraphicsBase* CreateTestL(); + }; + +_LIT(KTFontSessionCacheStep,"TFontSessionCache"); + + +#endif /* T_FONTSESSIONCACHE_H_ */ diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/T_fontsessioncacheproc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/tfs/T_fontsessioncacheproc.cpp Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,234 @@ +/* +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include +#include +#include +#include +#include +#include "FNTSTORE.H" +#include "FNTBODY.H" +#include "FNTSTD.H" +#include +#include +#include +#include + +_LIT(KOpenFont, "DejaVu Sans Condensed"); + +#ifdef __WINSCW__ +//this is used for winscw breakpoints +#define BR _asm( int 3); +#endif + +const TInt KTimeOut = 1000 * 1000; +//make sure that the font is large enough to ensure that the session +//cache is used. +const TInt KTextHight = 220; + +/* it is expected that the main in this file will be called to test multiple +process output at the same time a process is being deleted (font and bitmap server +disconnection. There are normally two instances of this process. Two virtually +identical processes are required to ensure that the session ID is the same. + +The first is with aThirdProcess set. This sets output to run in a loop until +the timeout is completed. These values are input via program arguments. + +If aThirdProcess is false then only one font creation, draw text, +font deletion cycle is completed. The test code will then repeatedly run +this process with aThirdProcess set to false. +*/ + + +class TRunProc: public CBase + { +public: + static TRunProc* NewL(); + void RunTestL(); + ~TRunProc(); +private: + TRunProc(){}; + void ConstructL(); + void DrawText(); + void CreateFontL(); + +private: + RFbsSession* iFbs; + CFbsBitGc* iGc; + CFbsScreenDevice* iDev; + CFbsFont *iFbsFont; + }; + +TRunProc::~TRunProc() + { + delete iGc; + delete iDev; + iFbs->Disconnect(); + } + +void TRunProc::ConstructL() + { + TInt err = RFbsSession::Connect(); + User::LeaveIfError(err); + iFbs = RFbsSession::GetSession(); + User::LeaveIfNull(iFbs); + + const TInt KDisplayMode = 3; + TDisplayMode mode[KDisplayMode]; + mode[0] = EColor16MA; + mode[1] = EColor16MU; + mode[2] = EColor64K; + + TInt count; + for (count = 0; count < KDisplayMode; count++) + { + TRAP(err, iDev = CFbsScreenDevice::NewL(KNullDesC, mode[count])); + if (err != KErrNotSupported) + { + break; + } + } + + User::LeaveIfNull(iDev); + + if(err == KErrNone) + { + iDev->ChangeScreenDevice(NULL); + iDev->SetAutoUpdate(ETrue); + iDev->CreateContext(iGc); + } + User::LeaveIfNull(iGc); + } + +TRunProc* TRunProc::NewL() + { + TRunProc *ptr = new (ELeave) TRunProc; + CleanupStack::PushL(ptr); + ptr->ConstructL(); + CleanupStack::Pop(); + return ptr; + } + +void TRunProc::CreateFontL() + { + TOpenFontSpec openFontSpec; + openFontSpec.SetName(KOpenFont); + openFontSpec.SetHeight(KTextHight); + openFontSpec.SetItalic(EFalse); + openFontSpec.SetBold(EFalse); + + TTypeface Typeface; + Typeface.iName = KOpenFont; + TFontSpec fs; + fs.iTypeface = Typeface; + + fs.iHeight = KTextHight; + CFbsFont* font = NULL; + TInt err = iDev->GetNearestFontToDesignHeightInPixels(font, fs); + + User::LeaveIfNull(font); + + // Use the font + iFbsFont = font; + iGc->UseFont(font); + iGc->Clear(); + } + +void TRunProc::RunTestL() + { + TTime theTime; + theTime.UniversalTime(); + TInt64 randSeed(theTime.Int64()); + TInt random(Math::Rand(randSeed) % (1000 * 1000)); + User::After(random); + + RTimer timer; + timer.CreateLocal(); + TRequestStatus timerStatus = KRequestPending; + TTimeIntervalMicroSeconds32 timeout(KTimeOut); + timer.After(timerStatus, timeout); + + CreateFontL(); + RDebug::Print(_L("DrawText()random=%d"), random); + DrawText(); + + TText ch; + const TUint8 *bitmap; + TSize bitmapsize; + TOpenFontCharMetrics Metrics; + do + { + for (ch = 'A'; ch <= 'Z'; ch++) + { + iFbsFont->GetCharacterData((TInt) ch, Metrics, bitmap,bitmapsize); + } + } + while (timerStatus == KRequestPending); + + timer.Cancel(); + iGc->DiscardFont(); + timer.Close(); + } + + +void TRunProc::DrawText() + { + TText ch[2]; + ch[1] = '\0'; + for (ch[0] = 'A';ch[0] <= 'Z';ch[0]++) + { + TBufC<2> buf(ch); + iGc->DrawText(buf,TPoint(10,100)); + } + for (ch[0] = 'a';ch[0] <= 'z';ch[0]++) + { + TBufC<2> buf(ch); + iGc->DrawText(buf,TPoint(10,100)); + } + } + + + +void MainL() + { + TRunProc* test = TRunProc::NewL(); + CleanupStack::PushL(test); + + RDebug::Print(_L("T_fontsessioncacheproc MainL()")); + test->RunTestL(); + + CleanupStack::PopAndDestroy(); + } + +// Cleanup stack harness +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + TRAPD(error, MainL()); + _LIT(KTCacheDeletionProcess,"T_fontsessioncacheproc"); + __ASSERT_ALWAYS(!error, User::Panic(KTCacheDeletionProcess, error)); + delete cleanupStack; + __UHEAP_MARKEND; + return 0; + } diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/scripts/fntstoretest_T_All.script --- a/fontservices/fontstore/tfs/scripts/fntstoretest_T_All.script Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/tfs/scripts/fntstoretest_T_All.script Sun Mar 14 13:16:16 2010 +0000 @@ -33,6 +33,7 @@ RUN_TEST_STEP 100 TFntStoreServer TCorruptFonts RUN_TEST_STEP 300 TFntStoreServer TShaperCache RUN_TEST_STEP 300 TFntStoreServer TCacheDeletion +RUN_TEST_STEP 300 TFntStoreServer TFontSessionCache RUN_TEST_STEP !PanicCode=-40 !PanicString="FBSERV" 100 TFntStoreServer TSetDefaultTypefaceName RUN_TEST_STEP 100 TFntStoreServer TLinkedFonts RUN_TEST_STEP 100 TFntStoreServer TGetNearestFontCapability diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/scripts/fntstoretest_T_FontSessionCache.script --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/fontstore/tfs/scripts/fntstoretest_T_FontSessionCache.script Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,21 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// + + + +PRINT Run TFontSessionCache Font Store test +// +LOAD_SUITE TFntStoreServer +RUN_TEST_STEP 300 TFntStoreServer TFontSessionCache \ No newline at end of file diff -r 3969f087709d -r 1d3cadb74b56 fontservices/fontstore/tfs/scripts/fntstoretest_run.bat --- a/fontservices/fontstore/tfs/scripts/fntstoretest_run.bat Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/fontstore/tfs/scripts/fntstoretest_run.bat Sun Mar 14 13:16:16 2010 +0000 @@ -31,6 +31,7 @@ testexecute.exe z:\fntstoretest\fntstoretest_t_setdefaulttypefacename.script testexecute.exe z:\fntstoretest\fntstoretest_t_linkedfonts.script testexecute.exe z:\fntstoretest\fntstoretest_t_cache.script +testexecute.exe z:\fntstoretest\fntstoretest_t_fontsessioncache.script @echo off md e:\logs diff -r 3969f087709d -r 1d3cadb74b56 fontservices/referencefonts/group/bld.inf --- a/fontservices/referencefonts/group/bld.inf Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/referencefonts/group/bld.inf Sun Mar 14 13:16:16 2010 +0000 @@ -10,6 +10,7 @@ * Nokia Corporation - initial contribution. * * Contributors: +* Monotype Imaging Inc. - MYuppyGB-Medium font * * Description: * Font utilities and test UI fonts @@ -55,6 +56,9 @@ ../truetype/DejaVuSerifCondensed-Bold.ttf z:/resource/fonts/DejaVuSerifCondensed-Bold.ttf ../truetype/DejaVuSerifCondensed-Italic.ttf z:/resource/fonts/DejaVuSerifCondensed-Italic.ttf ../truetype/DejaVuSerifCondensed-BoldItalic.ttf z:/resource/fonts/DejaVuSerifCondensed-BoldItalic.ttf + +../truetype/MYuppyGB-Medium.ttf z:/resource/fonts/MYuppyGB-Medium.ttf + #endif PRJ_MMPFILES diff -r 3969f087709d -r 1d3cadb74b56 fontservices/referencefonts/truetype/MYuppy-readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/referencefonts/truetype/MYuppy-readme.txt Sun Mar 14 13:16:16 2010 +0000 @@ -0,0 +1,36 @@ +Monotype Imaging Inc. Read me + +February 12, 2010 + +Contained in this zip file is a TrueType font called MYuppy from Monotype Imaging Inc. + +MYuppyGB-Medium + +Format - TTF TrueType +Character set - GB2312 +Encoding - Unicode + +This font was designed to appeal to young urban professionals, Monotype Yuppy is a newly +designed typeface with a unique, modern feel. The design combines elements +of handwriting with classic letterform characteristics, such as open shapes +and proper proportions that help the typeface retain legibility. + +---------------------------------------------- + +This font is licensed to you under the Eclipse Public Licence version 1.0, which does not cover the use of Monotype Imaging Inc. +trademarks. You may only use the corresponding trademark for this font if you are redistributing this font in a form +that is unmodified from that provided by Monotype Imaging Inc. All usage of trademarks with font software in an unmodified +form inures to the benefit of Monotype Imaging Inc. If you modify this font software in any way, you may not use the +corresponding trademark if you redistribute it and may only describe this font as a “custom font” without any further +designation. + +---------------------------------------------- + +Trademark- MYuppy” is a trademark of Monotype Imaging Inc. and may be registered +in certain jurisdictions. Please check the License tab of the Properties screen +for this font for a description of Monotype Imaging Inc’s trademark usage policy. + +------------------------------------------------ + +Special thanks to the Symbian Foundation for allowing us to participate in their open source consortium + diff -r 3969f087709d -r 1d3cadb74b56 fontservices/referencefonts/truetype/MYuppyGB-Medium.ttf Binary file fontservices/referencefonts/truetype/MYuppyGB-Medium.ttf has changed diff -r 3969f087709d -r 1d3cadb74b56 fontservices/textshaperplugin/group/IcuLayoutEngine.iby --- a/fontservices/textshaperplugin/group/IcuLayoutEngine.iby Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/textshaperplugin/group/IcuLayoutEngine.iby Sun Mar 14 13:16:16 2010 +0000 @@ -20,10 +20,7 @@ REM Shaper -#ifdef WITH_FLEXIBLE_MM -ECOM_PLUGIN(iculayoutengine_fmm.dll, iculayoutengine_fmm.rsc) -#else ECOM_PLUGIN(IcuLayoutEngine.dll, IcuLayoutEngine.RSC) -#endif + #endif diff -r 3969f087709d -r 1d3cadb74b56 fontservices/textshaperplugin/group/bld.inf --- a/fontservices/textshaperplugin/group/bld.inf Mon Mar 08 21:45:11 2010 +0000 +++ b/fontservices/textshaperplugin/group/bld.inf Sun Mar 14 13:16:16 2010 +0000 @@ -29,10 +29,6 @@ PRJ_MMPFILES IcuLayoutEngine.mmp -#ifndef WINS - iculayoutengine_fmm.mmp -#endif - PRJ_TESTMMPFILES TC_SHAP_shapeText.mmp diff -r 3969f087709d -r 1d3cadb74b56 fontservices/textshaperplugin/group/iculayoutengine_fmm.mmp --- a/fontservices/textshaperplugin/group/iculayoutengine_fmm.mmp Mon Mar 08 21:45:11 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* -* Copyright (c) 2008-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: -* Builds the ICU layoutEngine into a Symbian Shaper DDL. -* This version defines the FNTSTORE_SUPPORT_FMM macro in order -* to provide flexible memory model support for fonts. -* Symbian Shaper dll -* -*/ - - -/** - @file -*/ - -target iculayoutengine_fmm.dll -targettype PLUGIN - -CAPABILITY All -Tcb - -userinclude ../source -userinclude ../IcuSource/common -userinclude ../IcuSource/layout -userinclude ../IcuSource -userinclude ../include -OS_LAYER_ESTLIB_SYSTEMINCLUDE -OS_LAYER_SYSTEMINCLUDE_SYMBIAN - -uid 0x10009D8D 0x10274DB8 -VENDORID 0x70000001 - - -// Switch off some warnings for the following files, -// which are imported source code that needs to be -// kept unchanged as far as possible to ease porting -// of upgrades or fixes. -// N.B. As a siIcuLayoutEngine.cpp, Shaper.cpp, -// SymbianFontInstance.cpp and Umemory.cpp (our wrapper code) -// so it should be re-checked with the warnings back on if changes -// are made to it. -OPTION ARMCC -W - -// Symbian sources -sourcepath ../source -source Umemory.cpp -source shaper.cpp -source IcuLayoutEngine.cpp -source SymbianFontInstance.cpp -source FontTableCache.cpp -source cmaps.cpp - -// Icu layout sources -sourcepath ../IcuSource/layout -source AlternateSubstSubtables.cpp -source AnchorTables.cpp -source ArabicLayoutEngine.cpp -source ArabicShaping.cpp -source CanonData.cpp -source CanonShaping.cpp -source ClassDefinitionTables.cpp -source ContextualGlyphSubstProc.cpp -source ContextualSubstSubtables.cpp -source CoverageTables.cpp -source CursiveAttachmentSubtables.cpp -source DeviceTables.cpp -source ExtensionSubtables.cpp -source Features.cpp -source GDEFMarkFilter.cpp -source GlyphDefinitionTables.cpp -source GlyphIterator.cpp -source GlyphLookupTables.cpp -source GlyphPositionAdjustments.cpp -source GlyphPositioningTables.cpp -source GlyphPosnLookupProc.cpp -source GlyphSubstitutionTables.cpp -source GlyphSubstLookupProc.cpp -source GXLayoutEngine.cpp -source HanLayoutEngine.cpp -source IndicClassTables.cpp -source IndicLayoutEngine.cpp -source IndicRearrangementProcessor.cpp -source IndicReordering.cpp -source KernTable.cpp -source KhmerLayoutEngine.cpp -source KhmerReordering.cpp -source LayoutEngine.cpp -source LEFontInstance.cpp -source LEGlyphStorage.cpp -source LEInsertionList.cpp -source LigatureSubstProc.cpp -source LigatureSubstSubtables.cpp -source LookupProcessor.cpp -source Lookups.cpp -source LookupTables.cpp -source MarkArrays.cpp -source MarkToBasePosnSubtables.cpp -source MarkToLigaturePosnSubtables.cpp -source MarkToMarkPosnSubtables.cpp -source MorphTables.cpp -source MPreFixups.cpp -source MultipleSubstSubtables.cpp -source NonContextualGlyphSubstProc.cpp -source OpenTypeLayoutEngine.cpp -source OpenTypeUtilities.cpp -source PairPositioningSubtables.cpp -source ScriptAndLanguage.cpp -source ScriptAndLanguageTags.cpp -source SegmentArrayProcessor.cpp -source SegmentSingleProcessor.cpp -source SimpleArrayProcessor.cpp -source SinglePositioningSubtables.cpp -source SingleSubstitutionSubtables.cpp -source SingleTableProcessor.cpp -source StateTableProcessor.cpp -source SubstitutionLookups.cpp -source SubtableProcessor.cpp -source ThaiLayoutEngine.cpp -source ThaiShaping.cpp -source ThaiStateTables.cpp -source TrimmedArrayProcessor.cpp -source ValueRecords.cpp - -library euser.lib -library estlib.lib -library ecom.lib -library fntstr.lib - -sourcepath ../source -start resource iculayoutengine_fmm.rss -target iculayoutengine_fmm.rsc -lang sc -end - -MACRO FNTSTORE_SUPPORT_FMM - -SMPSAFE diff -r 3969f087709d -r 1d3cadb74b56 fontservices/textshaperplugin/source/iculayoutengine_fmm.rss --- a/fontservices/textshaperplugin/source/iculayoutengine_fmm.rss Mon Mar 08 21:45:11 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* -* Copyright (c) 2008-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: -* 10279727.RSS -* Registration data for a CShaperFactory Interface Implementation Collection. -* For use with IcuLayoutEngine_fmm.dll (the flexible memory model version of -* the ICU Layout Engine). -* -*/ - - -#include "ecom/registryinfov2.rh" -RESOURCE REGISTRY_INFO theInfo - { - resource_format_version = RESOURCE_FORMAT_VERSION_2; - dll_uid = 0x10274DB8; - interfaces = - { - INTERFACE_INFO - { - interface_uid = 0x10279726; - implementations = - { - IMPLEMENTATION_INFO - { - implementation_uid = 0x10279727; - version_no = 1; - display_name = "ICU LayoutEngine Shaper Plugin"; - default_data = "text/wml||This is the type of data that this implementation understands. (Can be anything which will allow the default resolver to identify this implementation as the correct one at run time. In this case it is a mime type)."; - opaque_data = " "; - rom_only = 1; - } - - }; - } - }; - } diff -r 3969f087709d -r 1d3cadb74b56 textrendering/textformatting/group/bld.inf --- a/textrendering/textformatting/group/bld.inf Mon Mar 08 21:45:11 2010 +0000 +++ b/textrendering/textformatting/group/bld.inf Sun Mar 14 13:16:16 2010 +0000 @@ -37,8 +37,6 @@ #endif ../inc/FRMCONST_PARTNER.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(frmconst_partner.h) -../inc/InlineText_Internal.h /epoc32/include/inlinetext_internal.h - ../inc/FRMCONST.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(frmconst.h) ../inc/FRMFRAME.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(frmframe.h) ../inc/FRMLAYDT.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(frmlaydt.h) diff -r 3969f087709d -r 1d3cadb74b56 textrendering/textformatting/inc/InlineText.h --- a/textrendering/textformatting/inc/InlineText.h Mon Mar 08 21:45:11 2010 +0000 +++ b/textrendering/textformatting/inc/InlineText.h Sun Mar 14 13:16:16 2010 +0000 @@ -19,8 +19,13 @@ #ifndef INLINETEXT_H_ #define INLINETEXT_H_ +#include #include -#include + +/** +@publishedPartner +*/ +const TUid KInlineTextApiExtensionUid = { 0x101FD03D }; /** diff -r 3969f087709d -r 1d3cadb74b56 textrendering/textformatting/tagma/TMINTERP.CPP --- a/textrendering/textformatting/tagma/TMINTERP.CPP Mon Mar 08 21:45:11 2010 +0000 +++ b/textrendering/textformatting/tagma/TMINTERP.CPP Sun Mar 14 13:16:16 2010 +0000 @@ -2124,8 +2124,7 @@ void RTmDrawingInterpreter::Draw() { - if (iClipRect.iBr.iY < TextLayoutTopLeft().iY - || (iFlags & EInvisible)) + if (iFlags & EInvisible) return; iGc.Reset(); diff -r 3969f087709d -r 1d3cadb74b56 textrendering/textformatting/tbox/LAYEMU.CPP --- a/textrendering/textformatting/tbox/LAYEMU.CPP Mon Mar 08 21:45:11 2010 +0000 +++ b/textrendering/textformatting/tbox/LAYEMU.CPP Sun Mar 14 13:16:16 2010 +0000 @@ -682,7 +682,7 @@ @return The y coordinate of the bottom of the last formatted line. */ EXPORT_C TInt CTextLayout::YBottomLastFormattedLine() const { - return iText->LayoutHeight() - iBandTop; + return Max(0, iText->LayoutHeight() - iBandTop ); } /** Returns the height in pixels of the formatted text.