diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/directgdiadaptation/hwsrc/glyphimagecache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicsdeviceinterface/directgdiadaptation/hwsrc/glyphimagecache.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,171 @@ +// 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 "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 GLYPHIMAGECACHE_H_ +#define GLYPHIMAGECACHE_H_ + +/** +@file +@internalComponent +*/ + +#include +#include +#include +#include +#include + + +/** +Data structure which holds OpenVG images for monochrome and anti-aliased fonts +*/ +class TGlyphEntry + { +public: + TChar iGlyphCode; //unique code, used as an index in a tree + VGImage iForeground; //blend using a brush colour + }; + +/** +Data structure which holds OpenVG images for compound fonts. +These fonts are specified by four components: + -foreground + -background + -shadow + -outline +*/ +class TGlyphEntryCompound : public TGlyphEntry + { +public: + VGImage iOutline; //blend using a pen colour + VGImage iShadow; //blend using a shadow colour + }; + +/** +This class represents the concrete implementation of the CFontGlyphImageStorage. +It holds all entries in the form of a binary tree and provides functionality for image creation and searching. +*/ +NONSHARABLE_CLASS(CFontGlyphTree) : public CBase + { +public: + static CFontGlyphTree* NewL(TUint32 aFontId, TGlyphBitmapType aGlyphType); + ~CFontGlyphTree(); +template + void GlyphImageEntryL(TChar aGlyphCode, const TUint8* aGlyphImage, const TSize& aGlyphImageSize, K& aEntry, TUint8* aDataForeground); + inline TUint32 FontId() const; + inline TUint CacheSize() const; + void DestroyAllVGImagesL(); + //do not add to the tree. For OOM conditions +template + static void GlyphImageEntryOOML(TGlyphBitmapType aGlyphType, const TUint8* aGlyphImage, const TSize& aGlyphImageSize, K& aEntry, TUint8* aData, TUint8* aDataOutline, TUint8* aDataShadow); +private: + CFontGlyphTree(TUint32 aFontId, TGlyphBitmapType aGlyphType); + void ConstructL(); + static void DestroyVGImage(VGImage* aForeground, VGImage* aOutline = NULL, VGImage* aShadow = NULL); + //for monochrome and antialiased fonts + static void CreateVGImageL(const TUint8* aGlyphImage, const TSize& aGlyphImageSize, TDisplayMode aDisplayMode, VGImage& aForeground, TUint8* aPreAllocForeground); + //for four colours fonts + static void CreateVGImageL(const TUint8* aGlyphImage, const TSize& aGlyphImageSize, VGImage& aForeground, VGImage& aOutline, VGImage& aShadow, TUint8* aPreAllocForeground, TUint8* aPreAllocOutline, TUint8* aPreAllocShadow); + static void DecodeBinaryData(const TSize& aDataSize, const TUint8* aData, TUint32* aBinaryData); + static void DecodeBinaryDataExLarge(const TSize& aDataSize, const TUint8* aData, TInt aStride, TUint32* aBinaryData); + + inline static TInt16 Load16(const TUint8* aPtr); + static void CopyCharLine(TUint32*& aBinaryDataPtr,TInt aBufferWords,const TUint8* aData,TInt aBitShift,TInt aCharWidth, TInt16 aRepeatCount); +private: + /** + Binary tree with fixed size. One of following will be used: + TBtreeFix or TBtreeFix + */ + TBtree* iGlyphTree; + + CMemPagePool* iPagePool; /**< Non persistent pool for pages.*/ + TBtreeKey iKey; /**< Tree key.*/ + TUint32 iFontId; /**< Unique font id.*/ + TGlyphBitmapType iGlyphType; /**< Glyph bitmap type.*/ + TUint iCacheSize; /**< Number of bytes allocated by all elements in the tree.*/ + }; + +/** +@return The unique id of the font +*/ +inline TUint32 CFontGlyphTree::FontId() const + { + return iFontId; + } + +/** +@return The total size of the cache +*/ +inline TUint CFontGlyphTree::CacheSize() const + { + return iCacheSize; + } + +/** +@param aPtr A pointer to a source buffer of 2 8-bit unsigned integers. +@return The two 8-bit integers combined into a 16-bit integer. +*/ +inline TInt16 CFontGlyphTree::Load16(const TUint8* aPtr) + { + return TInt16(aPtr[0]+(aPtr[1]<<8)); + } + +/** +The class provides an interface for handling image caching and will be maintained by the DirectGDI driver at adaptation level. +Any instance of this class cannot be shared between threads. +*/ +NONSHARABLE_CLASS(CFontGlyphImageStorage) : public CBase, + public MFontGlyphImageStorage +{ +public: + CFontGlyphImageStorage(TInt aMaxCacheSize); + TInt PreAllocateImages(); + ~CFontGlyphImageStorage(); + + // from MFontGlyphImageStorage + TInt GlyphImage(TUint32 aFontId, TChar aGlyphCode, TGlyphBitmapType aGlyphBitmapType, + const TUint8* aGlyphImage, const TSize& aGlyphImageSize, + TAny* aImageForeground, TAny* aImageShadow, TAny* aImageOutline); /**< @internalTechnology*/ + void CleanGlyphImageCache(); /**< @internalTechnology*/ + TInt GlyphCacheSize() const; /**< @internalTechnology*/ + TInt MaxGlyphCacheSize() const; /**< @internalTechnology*/ + TInt FontIdInOrder(RArray & aFontListId) const; /**< @internalTechnology*/ + void EnforceOOMFailure(TBool aEnforce); /**< @internalTechnology*/ + TInt SetMaxGlyphCacheSize(TInt aMaxCacheSize); /**< @internalTechnology*/ +private: + void DeletePreAllocatedImages(); + void CleanCacheIfRequired(); +private: + RPointerArray iFontTreeList; /**< Array of all image trees in the cache.*/ + TInt iMaxCacheSize; /**< Maximum cache size the class can hold.*/ + TInt iCacheSize; /**< Current total cache size which amounts to cache sizes of all trees in the list .*/ + TGlyphEntry iEntry; /**< Work member, which will be filled when user requests glyph image.*/ + TGlyphEntryCompound iEntryCompound; /**< Work member, which will be filled when user requests glyph image.*/ + //for OOM conditions + TUint8* iForegroundData; + TUint8* iShadowData; + TUint8* iOutlineData; + VGImage iImageForeground; /**< Pre-allocated image for OOM conditions.*/ + VGImage iImageShadow; /**< Pre-allocated image for OOM conditions.*/ + VGImage iImageOutline; /**< Pre-allocated image for OOM conditions.*/ + TSize iImageSize; /**< Pre-defined image size.*/ + TBool iImagesPreAllocated; /**< True if all OOM variables were created successfully.*/ +#ifdef _DEBUG + TBool iEnforceOOM; /**< If true will always try to use pre-allocated images.*/ +#endif +}; + + +#endif