--- /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 <e32base.h>
+#include <gdi.h>
+#include <s32btree.h>
+#include <VG/openvg.h>
+#include <graphics/directgdiextensioninterfaces.h>
+
+
+/**
+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 <class K>
+ 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 <class K>
+ 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<TGlyphEntry, TChar> or TBtreeFix<TGlyphEntryCompound, TChar>
+ */
+ 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<TUint32> & aFontListId) const; /**< @internalTechnology*/
+ void EnforceOOMFailure(TBool aEnforce); /**< @internalTechnology*/
+ TInt SetMaxGlyphCacheSize(TInt aMaxCacheSize); /**< @internalTechnology*/
+private:
+ void DeletePreAllocatedImages();
+ void CleanCacheIfRequired();
+private:
+ RPointerArray<CFontGlyphTree> 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