fbs/fontandbitmapserver/sfbs/FBSFONT.CPP
changeset 0 5d03bc08d59c
child 26 15986eb6c500
child 36 01a6848ebfd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/FBSFONT.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,679 @@
+// Copyright (c) 1995-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:
+//
+
+#include <fntstore.h>
+#include <fbs.h>
+#include <openfont.h>
+#include <graphics/shapeimpl.h>
+#include "UTILS.H"
+#include <graphics/shaperparams.h>
+#include "fbsmessage.h"
+#include <graphics/gdi/gdiconsts.h>
+#include <graphics/gdi/gdistructs.h>
+
+GLREF_C void Panic(TFbsPanic aPanic);
+
+/** Helper function for converting a pointer to an offset from the passed
+heap base. Use OffsetToPointer() to convert the returned offset back to a
+useable pointer.
+@param aAny A pointer to be converted to an offset.
+@param aHeapBase A pointer to the heap base of the current process.
+@return An offset representing the passed pointer that can be converted
+back to a pointer using the function OffsetToPointer(). 
+@see OffsetToPointer()
+ */
+LOCAL_C TInt PointerToOffset(const TAny* aAny, TUint8* aHeapBase)
+	{
+	if (aAny && aHeapBase)
+		{
+		return (TInt)aAny - (TInt)aHeapBase;
+		}
+	return 0;
+	}
+
+/** Helper function for converting an offset (that was calculated using
+PointerToOffset()) back to a pointer relative to the passed heap base.
+@param aOffset The offset to be converted to a pointer.
+@param aHeapBase A pointer to the heap base of the current process.
+@return A pointer relative to the passed heap base.
+@see PointerToOffset()
+ */
+LOCAL_C TAny* OffsetToPointer(const TInt aOffset, TUint8* aHeapBase)
+	{
+	if (aOffset && aHeapBase)
+		{
+		return (TAny*)(aOffset + (TInt)aHeapBase);
+		}
+	return NULL;
+	}
+
+EXPORT_C CFbsFont::CFbsFont():
+	CFont(),
+	iFbs(RFbsSession::GetSession()),
+	iAddressPointer(NULL),
+	iHandle(0),
+	iServerHandle(0)
+	{
+	}
+	
+EXPORT_C CFbsFont::CFbsFont(const CFbsFont& aFont):
+	CFont(),
+	iFbs(aFont.iFbs),
+	iAddressPointer(NULL),
+	iHandle(0),
+	iServerHandle(0)
+	{
+	}
+	
+EXPORT_C CFbsFont::~CFbsFont()
+	{
+	Reset();
+	}
+	
+EXPORT_C void CFbsFont::Reset()
+	{
+	if (iHandle)
+		iFbs->SendCommand(EFbsMessClose,iHandle);
+	iHandle = 0;
+	}
+	
+EXPORT_C CBitmapFont* CFbsFont::Address() const
+	{
+	__ASSERT_DEBUG(iHandle != NULL,Panic(EFbsFontAddressViolation));
+	__ASSERT_DEBUG(iAddressPointer != NULL,Panic(EFbsFontAddressViolation));
+	return iAddressPointer;
+	}
+
+/** Duplicates a font.
+This function does not create a copy of the font. It just assigns another 
+handle to the bitmap in the font and bitmap server, and sets this object's 
+handle to that.
+
+@param aFontHandle The handle to an existing CFbsFont.
+@return KErrNone if successful; KErrCouldNotConnect if no connection to the 
+font and bitmap server could be made; KErrUnknown if no font could be found 
+with the specified handle number.
+@publishedAll
+@released
+*/
+EXPORT_C TInt CFbsFont::Duplicate(TInt aFontHandle)
+	{
+	if (!iFbs)
+		return KErrCouldNotConnect;
+	if (!aFontHandle)
+		return KErrUnknown;
+	// close any existing handle
+	Reset();
+	// ask server to create the duplicate handle
+	TPckgBuf<TFontInfo> tfpckg;
+	TIpcArgs args(aFontHandle,&tfpckg);
+	TInt ret = iFbs->SendCommand(EFbsMessFontDuplicate,args);
+	if (ret != KErrNone || !tfpckg().iHandle)
+		return ret;
+	// created
+	iHandle = tfpckg().iHandle;
+	iServerHandle = tfpckg().iServerHandle;
+	iAddressPointer = (CBitmapFont*)(iFbs->HeapBase()+tfpckg().iAddressOffset);
+	return KErrNone;
+	}
+
+/** Gets the Font and Bitmap server handle of the font.
+@return The handle of the font. 
+@publishedAll
+@released
+*/
+EXPORT_C TInt CFbsFont::Handle() const
+	{
+	if (!iHandle)
+		return 0;
+	return iServerHandle;
+	}
+
+/** Gets how much of the specified descriptor can be displayed in this font without 
+exceeding the specified width.
+
+Note:
+This function does not display any of the descriptor itself.  It is used 
+before display, to test whether the whole descriptor can be displayed.
+@param aText The descriptor. 
+@param aWidthInPixels The available width for character display 
+@return The number of characters (starting from the beginning of the descriptor) 
+which will be able to be displayed without exceeding the specified width. 
+@see CFont::TextCount() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoTextCount(const TDesC& aText,TInt aWidthInPixels) const
+	{
+	TInt dummy;
+	return DoTextCount(aText, aWidthInPixels, dummy);
+	}
+
+/** Gets how much of the specified descriptor can be displayed in this font without 
+exceeding the specified width.
+It also returns the excess width defined as the specified available width 
+minus the width of the portion of the descriptor which can be displayed without 
+exceeding the available width.
+@param aText The descriptor. 
+@param aWidthInPixels The available width for character display. 
+@param aExcessWidthInPixels The excess width after displaying the portion of 
+the descriptor, in pixels. 
+@return The number of characters (starting from the beginning of the descriptor) 
+which will be able to be displayed without exceeding the specified width. 
+@see CFont::TextCount()
+@see TextCount() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoTextCount(const TDesC& aText,TInt aWidthInPixels,TInt& aExcessWidth) const
+	{
+	TMeasureTextInput input;
+	input.iMaxAdvance = aWidthInPixels;
+	TMeasureTextOutput output;
+	aExcessWidth = aWidthInPixels - MeasureText(aText,&input,&output);
+	return output.iChars;
+	}
+
+/** Gets the width of the specified character in this font, in pixels.
+
+Note: For OpenType fonts this function returns the horizontal advance of
+the character, which may be different from the actual width.
+
+@param aChar The character whose width should be determined. 
+@return The width of the specified character in this font, in pixels. 
+@see CFont::CharWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoCharWidthInPixels(TChar aChar) const
+	{
+	TOpenFontCharMetrics metrics;
+	const TUint8* bitmap;
+	TSize size;
+	if (GetCharacterData(aChar,metrics,bitmap,size) != ENoCharacterData)
+		{
+		return metrics.HorizAdvance();
+		}
+	return 0;
+	}
+
+/** Gets the width of the specified descriptor when displayed in this font, in 
+pixels.
+@param aText The descriptor whose width should be determined. 
+@return The width of the specified descriptor when displayed in this font, 
+in pixels 
+@see CFont::TextWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoTextWidthInPixels(const TDesC& aText) const
+	{
+	TMeasureTextInput* dummy = NULL;
+	return DoTextWidthInPixels(aText,dummy);
+	}
+
+/** Gets the width of the specified descriptor when displayed in this font, in 
+pixels.
+@param aText The descriptor whose width should be determined. 
+@param aParam Parameter block that controls how much of aText is measured
+@return The width of the specified descriptor when displayed in this font, 
+in pixels 
+*/
+TInt CFbsFont::DoTextWidthInPixels(const TDesC& aText,const TMeasureTextInput* aParam) const
+	{
+	TMeasureTextOutput output;
+	TInt advance_width = MeasureText(aText,aParam,&output);
+	return Max(advance_width,output.iBounds.Width());
+	}
+
+/** Gets the width of the specified descriptor when displayed in this font, in 
+pixels. Override of the base class to resolve name clash with other
+TextWidthInPixels variant.
+@param aText The descriptor whose width should be determined. 
+@return The width of the specified descriptor when displayed in this font, 
+in pixels 
+@see CFont::TextWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::TextWidthInPixels(const TDesC& aText) const
+	{
+	return DoTextWidthInPixels(aText);
+	}
+
+/** Gets the width of the specified descriptor when displayed in this font, in 
+pixels. Override of the base class to resolve name clash with other
+TextWidthInPixels variant.
+@param aText The descriptor whose width should be determined. 
+@param aParam Parameter block that controls how much of aText is measured
+@return The width of the specified descriptor when displayed in this font, 
+in pixels 
+@see CFont::TextWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::TextWidthInPixels(const TDesC& aText,const TMeasureTextInput* aParam) const
+	{
+	return DoTextWidthInPixels(aText,aParam);
+	}
+
+/** Gets the text width, move and adjusts of the specified descriptor when displayed 
+in this font.
+@param aText The descriptor whose width should be determined. 
+@param aCharWidth The width of the specified descriptor when displayed in this 
+font, in pixels (including information on the width, move and adjusts of the 
+descriptor). 
+@publishedAll 
+@released
+*/
+EXPORT_C void CFbsFont::TextWidthInPixels(const TDesC& aText,SCharWidth& aCharWidth) const
+	{
+	TMeasureTextInput* dummy = NULL;
+	TextWidthInPixels(aText,dummy,aCharWidth);
+	}
+
+/** Gets the text width, move and adjusts of the specified descriptor when displayed 
+in this font.
+@param aText The descriptor whose width should be determined. 
+@param aParam Parameter block that controls how much of aText is measured
+@param aCharWidth The width of the specified descriptor when displayed in this 
+font, in pixels (including information on the width, move and adjusts of the 
+descriptor). 
+@publishedAll 
+@released
+*/
+EXPORT_C void CFbsFont::TextWidthInPixels(const TDesC& aText,const TMeasureTextInput* aParam, SCharWidth& aCharWidth) const
+	{
+	TMeasureTextOutput output;
+	aCharWidth.iMove = MeasureText(aText,aParam,&output);
+	aCharWidth.iLeftAdjust = output.iBounds.iTl.iX;
+	aCharWidth.iRightAdjust = aCharWidth.iMove - output.iBounds.iBr.iX;
+	aCharWidth.iWidth = output.iBounds.Width();
+	}
+
+/** Gets the raw width of the text in the descriptor, in pixels. 
+ DEPRECATED: Same as MeasureText(const TDesC&).
+This is the width of the text without adjusting for side bearings, algorithmic 
+style etc.
+@deprecated
+@param aText Any text descriptor (TPtrC, TPtr, _LIT, TBuf etc.). 
+@return The width (in pixels) of the text in the descriptor. */
+EXPORT_C TInt CFbsFont::RawTextWidthInPixels(const TDesC& aText) const
+	{
+	return MeasureText(aText);
+	}
+
+/** Gets the baseline offset, in pixels.
+The offset is how far a font is raised or lowered from its normal baseline.
+@return Offset from normal baseline, in pixels. 
+@see CFont::BaselineOffsetInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoBaselineOffsetInPixels() const
+	{
+	if (!iHandle)
+		return 0;
+	return Address()->iAlgStyle.iBaselineOffsetInPixels;
+	}
+
+/** Gets the width of the widest character in this font, in pixels.
+@return The width of the maximum width character, in pixels. 
+@see CFont::MaxCharWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoMaxCharWidthInPixels() const
+	{
+	if (!iHandle)
+		return 0;
+	TInt width = Address()->CBitmapFont::DoMaxCharWidthInPixels();
+	if (Address()->iAlgStyle.IsBold())
+		width += Address()->iAlgStyle.WidthFactor();
+	return width;
+	}
+
+/** Gets the width of the widest normal character in this font, in pixels.
+Normal characters include all character in a character set except non-alphabetic 
+characters (e.g. the copyright symbol, or a block graphics symbol, for example).
+@return The width of the maximum width normal character, in pixels. 
+@see CFont::MaxNormalCharWidthInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoMaxNormalCharWidthInPixels() const
+	{
+	if (!iHandle)
+		return 0;
+	TInt width = Address()->CBitmapFont::DoMaxNormalCharWidthInPixels();
+	if (Address()->iAlgStyle.IsBold())
+		width += Address()->iAlgStyle.WidthFactor();
+	return width;
+	}
+
+/** Gets the font height in pixels.
+@return The font height in pixels.
+@see CFont::HeightInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoHeightInPixels() const
+	{
+	if (!iHandle)
+		return 0;
+	return Address()->CBitmapFont::DoHeightInPixels();
+	}
+
+/** Gets the font ascent in pixels.
+@return The font ascent in pixels.
+@see CFont::AscentInPixels() 
+@publishedAll 
+@released
+*/
+EXPORT_C TInt CFbsFont::DoAscentInPixels() const
+	{
+	if (!iHandle)
+		return 0;
+	return Address()->CBitmapFont::DoAscentInPixels();
+	}
+
+/** Gets the font specification of this font in twips.
+@return The font specification of this font (in twips). 
+@see CFont::FontSpecInTwips() 
+@publishedAll 
+@released
+*/
+EXPORT_C TFontSpec CFbsFont::DoFontSpecInTwips() const
+	{
+	TFontSpec fs;
+	if (!iHandle)
+		return fs;
+	fs = Address()->CBitmapFont::DoFontSpecInTwips();
+	TPckgBuf<TInt> tfpckg;
+	TIpcArgs args(iHandle,&tfpckg);
+	TInt ret = iFbs->SendCommand(EFbsMessGetTwipsHeight,args);
+	fs.iHeight = tfpckg();
+	return fs;
+	}
+
+/** Gets the character metrics and a pointer to the compressed glyph bitmap for 
+the specified character. 
+This function is deprecated, because TCharacterMetrics cannot store metrics 
+larger than 127 or less than 127  use GetCharacterData() instead.
+@param aCode The code for the character to be checked. 
+@param aBytes On return, contains a pointer to the compressed glyph bitmap. 
+@return The character metrics for the font. 
+@publishedAll 
+@released
+@deprecated
+*/
+EXPORT_C TCharacterMetrics CFbsFont::CharacterMetrics(TInt aCode,const TUint8*& aBytes) const
+	{
+	TCharacterMetrics metrics;
+	// Save time by not converting from TCharacterMetrics to TOpenFontCharMetrics and back if this is a real bitmap font.
+	if (iHandle)
+		{	
+ 		CBitmapFont* bitmap_font = Address();
+
+ 		if (!bitmap_font->IsOpenFont())
+			metrics = bitmap_font->CharacterMetrics(aCode,aBytes);
+		else
+			{
+			TOpenFontCharMetrics new_metrics;
+			aBytes = NULL;
+			TSize size;
+			if (GetCharacterData(aCode,new_metrics,aBytes,size) != ENoCharacterData)
+				new_metrics.GetTCharacterMetrics(metrics);
+			}
+		}
+	return metrics;
+	}
+
+/** Gets the character metrics and the glyph bitmap. 
+@param aCode The character code in Unicode. 
+@param aMetrics On return, contains the character metrics. 
+@param aBitmap On return, contains a pointer to the compressed glyph bitmap. 
+@param aBitmapSize The size of the returned glyph bitmap in pixels. This is 
+not necessarily the same as the size implied by the returned metrics, which 
+may incorporate algorithmic multiplication. 
+@publishedAll 
+@released
+*/
+EXPORT_C CFont::TCharacterDataAvailability CFbsFont::DoGetCharacterData(TUint aCode,TOpenFontCharMetrics& aMetrics,
+		const TUint8*& aBitmap,TSize& aBitmapSize) const
+	{
+	aBitmap = NULL;
+	if (!iHandle)
+		return CFont::ENoCharacterData;
+
+	CBitmapFont* bitmap_font = Address();
+
+	if (!bitmap_font->GetCharacterData(iFbs->ServerSessionHandle(),aCode,aMetrics,aBitmap))
+		{
+		TPckgBuf<TRasterizeParams> paramsBuf;
+		TIpcArgs args(iHandle, aCode, &paramsBuf);
+		
+		if(iFbs->SendCommand(EFbsMessRasterize, args))
+			{				
+			// Translate the offsets sent to the server back to pointers relative to
+			// the heap base of the current process
+			const TOpenFontCharMetrics* temp = (const TOpenFontCharMetrics*)OffsetToPointer(paramsBuf().iMetricsOffset, iFbs->HeapBase());
+			if (temp)
+				{
+				aMetrics = *temp;
+				}
+			aBitmap = static_cast<TUint8*>(OffsetToPointer(paramsBuf().iBitmapPointerOffset, iFbs->HeapBase()));			
+			}
+		else
+			{
+			return CFont::ENoCharacterData;
+			}
+		}
+
+	aBitmapSize.SetSize(aMetrics.Width(),aMetrics.Height());
+
+	if (!bitmap_font->IsOpenFont())
+		{
+		TAlgStyle null_style;
+		if (!(bitmap_font->iAlgStyle == null_style))
+			{
+			const int width_factor = bitmap_font->iAlgStyle.WidthFactor();
+			const int height_factor = bitmap_font->iAlgStyle.HeightFactor();
+			const int bold_addition =	bitmap_font->iAlgStyle.IsBold() ? width_factor : 0;
+			const int italic_addition = bitmap_font->iAlgStyle.IsItalic() ? width_factor : 0;
+
+			aMetrics.SetWidth(aMetrics.Width() * width_factor + bold_addition + italic_addition);
+			aMetrics.SetHeight(aMetrics.Height() * height_factor);
+			aMetrics.SetHorizBearingX(aMetrics.HorizBearingX() * width_factor);
+			aMetrics.SetHorizBearingY(aMetrics.HorizBearingY() * height_factor);
+			aMetrics.SetVertBearingX(aMetrics.VertBearingX() * width_factor);
+			aMetrics.SetVertBearingY(aMetrics.VertBearingY() * height_factor);
+			if (bitmap_font->iAlgStyle.IsMono())
+				aMetrics.SetHorizAdvance(bitmap_font->CBitmapFont::DoMaxNormalCharWidthInPixels() + bold_addition);
+			else
+				aMetrics.SetHorizAdvance(aMetrics.HorizAdvance() * width_factor + bold_addition);
+			aMetrics.SetVertAdvance(aMetrics.VertAdvance() * height_factor);
+			}
+		}
+	return CFont::EAllCharacterData;
+	}
+
+/** Gets the open font metrics. If the metrics cannot be obtained the function 
+returns EFalse.
+@param aMetrics On return, contains the font metrics 
+@return EFalse if the metrics cannot be obtained 
+@publishedAll 
+@released
+*/
+EXPORT_C TBool CFbsFont::GetFontMetrics(TOpenFontMetrics& aMetrics) const
+	{
+	if (iHandle)
+		{
+		CBitmapFont* bitmap_font = Address();
+		bitmap_font->GetFontMetrics(aMetrics);
+		return TRUE;
+		}
+	else
+		return FALSE;
+	}
+
+/** Gets the typeface attributes of Open Font System fonts.
+Notes: 
+Typeface attributes are different from the font metrics; they are not metrics, 
+which are different for every different size, but size-independent attributes 
+of the typeface, like name and style. 
+This function can be used if IsOpenFont() returns true i.e. the font is 
+an Open Font.
+@param aAttrib On return, contains the typeface attributes. 
+@return EFalse if the attributes cannot be obtained, or if the font is not an 
+Open Font (IsOpenFont() returns EFalse). 
+@publishedAll 
+@released
+*/
+EXPORT_C TBool CFbsFont::GetFaceAttrib(TOpenFontFaceAttrib& aAttrib) const
+	{
+	if (!iHandle)
+		{
+		return EFalse;
+		}
+	TPckgBuf<TOpenFontFaceAttrib> package;
+	TIpcArgs args(iHandle,&package);
+	if (iFbs->SendCommand(EFbsMessFaceAttrib,args))
+		{
+		aAttrib = package();
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/** Tests whether the font is an Open Font system font.
+Note: 
+If this function returns ETrue, the function GetFaceAttrib() will work.
+@return ETrue if font is an Open Font system font (e.g. TrueType). EFalse if 
+the font is a bitmap font loaded from a GDR file. 
+@publishedAll 
+@released
+*/
+EXPORT_C TBool CFbsFont::IsOpenFont() const
+	{
+	if (iHandle)
+		{
+		CBitmapFont* bitmap_font = Address();
+		return bitmap_font->IsOpenFont();
+		}
+	else
+		return FALSE;
+	}
+
+/** Tests whether the font contains a particular character.
+@param aCode Character code to be tested. This code is in the code page 1252 
+encoding in v5, otherwise it is in Unicode 
+@return ETrue if the font contains aCode. 
+@publishedAll 
+@released
+*/
+EXPORT_C TBool CFbsFont::HasCharacter(TInt aCode) const
+	{
+	if (iHandle)
+		{		
+		return iFbs->SendCommand(EFbsMessHasCharacter,iHandle,aCode);
+		}
+	return EFalse;
+	}
+
+
+/** help DoExtendedFunction to perform KFontGetShaping function
+@param aParam Input & output parameter block, 
+if successful aParam->iShapeHeaderOutput points to the shape data.
+@return KErrNone if successful, otherwise a system wide error code.
+*/
+TInt CFbsFont::DoFontGetShaping(TFontShapeFunctionParameters* aParam) const
+	{
+	if (!iHandle)
+		{
+		return KErrGeneral;
+		}
+	TPckgBuf<TShapeMessageParameters> sp;
+	sp().iStart = aParam->iStart;
+	sp().iEnd = aParam->iEnd;
+	sp().iScript = aParam->iScript;
+	sp().iLanguage = aParam->iLanguage;
+
+	TInt offset = iFbs->SendCommand( EFbsMessShapeText,TIpcArgs(iHandle, aParam->iText, &sp));
+
+	// Convert the returned offset to pointer relative to the heap base of the current process
+	aParam->iShapeHeaderOutput = reinterpret_cast<const TShapeHeader*>(OffsetToPointer(offset, iFbs->HeapBase()));
+	return aParam->iShapeHeaderOutput? KErrNone : KErrGeneral;
+	}
+
+
+/** help DoExtendedFunction to perform KFontDeleteShaping function
+@param aParam Input parameter block
+@return KErrNone if successful, KErrBadHandle if the font does not have a valid handle.
+*/
+TInt CFbsFont::DoFontDeleteShaping(TFontShapeDeleteFunctionParameters* aParam) const
+	{
+	if (!iHandle)
+		{
+		return KErrGeneral;
+		}
+	// Convert the address of the shape header to an offset from the heap base
+	// of this process before the offset is sent to the server
+	iFbs->SendCommand(EFbsMessShapeDelete,iHandle,PointerToOffset(aParam->iShapeHeader, iFbs->HeapBase()));
+	return KErrNone;
+	}
+
+
+/** API extension system that enables the caller to access a particular API
+extension function. As an overload of this function in a derived class
+it calls its immediate parent implementation for any extension function Uid
+that it does not recognize and handle.
+@param aInterfaceId UID of the required extension function
+@param aParam Pointer to an arbitrary parameter block that can be used to
+provide and/or return information to/from the particular extension function,
+defaults to NULL.
+@return Integer return value from extension function, a system wide error code.
+@internalTechnology
+@released
+*/
+EXPORT_C TInt CFbsFont::DoExtendedFunction(TUid aFunctionId, TAny* aParam) const
+	{
+	if (iHandle)
+		{
+		if (aFunctionId == KFontGetShaping)
+			{
+			return DoFontGetShaping(reinterpret_cast<TFontShapeFunctionParameters*>(aParam));
+			}
+		else if (aFunctionId == KFontDeleteShaping)
+			{
+			return DoFontDeleteShaping(reinterpret_cast<TFontShapeDeleteFunctionParameters*>(aParam));
+			}
+		else if ( (aFunctionId == KFontCapitalAscent)
+			|| (aFunctionId == KFontMaxAscent)
+			|| (aFunctionId == KFontStandardDescent)
+			|| (aFunctionId == KFontMaxDescent)
+			|| (aFunctionId == KFontLineGap) )
+			{
+			// Call the version on the CBitmapFont instance
+			return Address()->CBitmapFont::DoExtendedFunction(aFunctionId, aParam);
+			}
+		else if (aFunctionId == KTextInContextWidthInPixelsUid)
+			{
+			TTextWidthInternal* contextParam = (TTextWidthInternal*)aParam;
+			return DoTextWidthInPixels(contextParam->iText,&contextParam->iParam);
+			}
+		}
+	return CFont::DoExtendedFunction(aFunctionId, aParam);
+	}