Revise some of the compositor performance improvements to improve correctness.
Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm.
Move transparency type simplification further up the composition code.
Remove some unnecessary fields.
Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).
// 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