graphicsdeviceinterface/gdi/sgdi/GDIMAIN.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/gdi/sgdi/GDIMAIN.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,444 @@
+// 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:
+//
+
+#include <gdi.h>
+#include <bidi.h>
+#include "GDIPANIC.h"
+#include "gdistructs.h"
+#include "gdiconsts.h"
+
+
+// Global panic function
+
+_LIT(KGdiPanicCategory,"GDI");
+
+void Panic(TGdiPanic aError)
+	{
+	User::Panic(KGdiPanicCategory,aError);
+	}
+	
+_LIT(KGDIPanicDesc1, "Gdi internal Panic %S, in file %S @ line %i");
+_LIT(KGDIPanicDesc2, "Assert condition = \"%S\"");
+_LIT(KGDIPanicDesc3, "Gdi internal %S, in file %S @ line %i");
+
+void PanicWithCondAndInfo(TGdiPanic aError, const TDesC& aCondition, const TDesC& aFileName, const TDesC& aPanicName, TInt aLine)
+	{
+	TBuf<256> buf;
+	buf.Format(KGDIPanicDesc1, &aPanicName, &aFileName, aLine);
+	RDebug::Print(buf);
+
+	buf.Format(KGDIPanicDesc2, &aCondition);
+	RDebug::Print(buf);
+	Panic(aError);
+	}
+	
+void PanicLogWithInfo(const TDesC& aCommand, const TDesC& aCondition, const TDesC& aFileName, TInt aLine)
+	{
+	TBuf<256> buf;
+	buf.Format(KGDIPanicDesc3, &aCommand, &aFileName, aLine);
+	RDebug::Print(buf);
+	
+	buf.Format(KGDIPanicDesc2, &aCondition);
+	RDebug::Print(buf);
+	}
+
+
+//
+// MGraphicsDeviceMap
+//
+
+
+EXPORT_C MGraphicsDeviceMap::MGraphicsDeviceMap()
+/** Default constructor. */
+	{}
+
+
+EXPORT_C MGraphicsDeviceMap::~MGraphicsDeviceMap()
+/** Destructor. */
+	{}
+
+
+EXPORT_C TPoint MGraphicsDeviceMap::TwipsToPixels(const TPoint& aTwipPoint) const
+/** Converts a point in twips to a point in pixels.
+
+@param aTwipPoint A point on the graphics device in twips. 
+@return A point on the graphics device in pixels. */
+	{
+	return TPoint(HorizontalTwipsToPixels(aTwipPoint.iX),VerticalTwipsToPixels(aTwipPoint.iY));
+	}
+
+
+EXPORT_C TRect MGraphicsDeviceMap::TwipsToPixels(const TRect& aTwipRect) const
+/** Converts a rectangle in twips to a rectangle in pixels.
+
+@param aTwipRect A rectangle on the graphics device in twips 
+@return A rectangle on the graphics device in pixels. */
+	{
+	return TRect(TwipsToPixels(aTwipRect.iTl),TwipsToPixels(aTwipRect.iBr));
+	}
+
+
+EXPORT_C TPoint MGraphicsDeviceMap::PixelsToTwips(const TPoint& aPixelPoint) const
+/** Converts a point in pixels to a point in twips.
+
+@param aPixelPoint A point on the graphics device in pixels. 
+@return A point on the graphics device in twips. */
+	{
+	return TPoint(HorizontalPixelsToTwips(aPixelPoint.iX),VerticalPixelsToTwips(aPixelPoint.iY));
+	}
+
+
+EXPORT_C TRect MGraphicsDeviceMap::PixelsToTwips(const TRect& aPixelRect) const
+/** Converts a rectangle in pixels to a rectangle in twips.
+
+@param aPixelRect A rectangle on the graphics device in pixels. 
+@return A rectangle on the graphics device in twips. */
+	{
+	return TRect(PixelsToTwips(aPixelRect.iTl),PixelsToTwips(aPixelRect.iBr));
+	}
+
+//
+// CGraphicsContext
+//
+
+EXPORT_C TInt CGraphicsContext::JustificationInPixels(TInt aExcessPixels,TInt aTotalUnits,TInt aFirstUnit,TInt aNumUnits)
+/** Gets the amount of space in pixels by which to adjust letter or word spacing, 
+given the total number of words and spaces, a start space, and the number 
+of units to be adjusted.
+
+The first two arguments are the number of pixels (character groups) and the 
+number of units (word spaces) over which justification is to occur. The third 
+argument specifies the current character group or word space, while the final 
+argument specifies the number of units that are to be adjusted.
+
+A panic occurs if aExcessPixels is 0, aTotalUnits is not greater than 0, or 
+aFirstUnit is not less than aTotalUnits. 
+
+@param aExcessPixels The number of pixels by which the width of the text is 
+to be changed. It may be positive, in which case the text is stretched, or 
+negative, in which case it is shrunk. 
+@param aTotalUnits The number of word spaces over which the change in width 
+is to be distributed. 
+@param aFirstUnit The current unit — the character group or word space we 
+are 'on'. 
+@param aNumUnits The number of units that are to be adjusted — starting 
+at aFirstUnit. 
+@return The number of pixels to be added to the width of the current unit. 
+@see SetWordJustification()
+@see SetCharJustification() */
+	{
+	if(aExcessPixels==0 || aTotalUnits<=0 || aFirstUnit>=aTotalUnits)
+		return(0);
+	TInt noExtra=Abs(aExcessPixels%aTotalUnits);
+	TInt extraPixel=aExcessPixels/Abs(aExcessPixels);
+	GDI_ASSERT_DEBUG_GENERAL( aFirstUnit>=0 , User::Panic(KGdiPanicCategory,KErrArgument) ) ;
+	GDI_ASSERT_DEBUG_GENERAL( aNumUnits>=0 , User::Panic(KGdiPanicCategory,KErrArgument) ) ;
+	if(aFirstUnit+aNumUnits>aTotalUnits)
+		aNumUnits=aTotalUnits-aFirstUnit;
+	TInt clip=aNumUnits*(aExcessPixels/aTotalUnits);
+	if(aFirstUnit>=noExtra)
+		return(clip);
+	if(aFirstUnit+aNumUnits>noExtra)
+		aNumUnits=noExtra-aFirstUnit;
+	return(clip+aNumUnits*extraPixel);
+	}
+
+
+EXPORT_C TInt CGraphicsContext::JustificationInPixels(TInt& aExcessPixels,TInt& aTotalUnits)
+/** Gets the amount of space in pixels by which to adjust the current letter or 
+word spacing, and also retrieves the number of excess pixels and word spaces 
+remaining after the adjustment is performed. 
+
+The arguments are the number of remaining pixels (character groups) and units 
+(word spaces) over which justification is to occur. The function can be called 
+repetitively until the number of units is zero, and hence justification is 
+complete. A panic occurs if the number of units is less than one or the amount 
+of pixels is zero.
+
+@param aExcessPixels The number of pixels by which the width of the text is 
+to be changed. It may be positive, in which case the text is stretched, or 
+negative, in which case it is shrunk. On return, this is equal to its old 
+value minus the return value. 
+@param aTotalUnits The number of word spaces over which the change in width 
+is to be distributed. On return, this is reduced by one. 
+@return The number of pixels to be added to the width of the current unit. 
+@see SetWordJustification()
+@see SetCharJustification() */
+	{
+	GDI_ASSERT_DEBUG_GENERAL(aExcessPixels!=0,User::Panic(KGdiPanicCategory,KErrArgument));
+	GDI_ASSERT_DEBUG_GENERAL(aTotalUnits>0,User::Panic(KGdiPanicCategory,KErrArgument));
+	TInt justification=aExcessPixels/aTotalUnits;
+	if(aExcessPixels%aTotalUnits)
+		{
+		if(aExcessPixels>0)
+			justification++;
+		else
+			justification--;
+		}
+	aTotalUnits--;
+	aExcessPixels-=justification;
+	return(justification);
+	}
+
+
+EXPORT_C TInt CGraphicsContext::DrawTextExtended(const TDesC& aText,const TPoint& aPosition,
+												 const TDrawTextExtendedParam& aParam)
+/** Draws text, optionally changing its direction (right-to-left / left-to-right).
+
+Apart from reordering the text, the function is the same as the two parameter 
+variant of DrawText(), described above.
+
+@param aText The text string to be drawn, optionally changing its direction 
+(right-to-left / left-to-right).
+@param aPosition A point specifying the position of the left end of the text.
+@param aParam Indicates whether the text should be drawn from right-to-left 
+(for scripts like Arabic and Hebrew) or left-to-right.
+@return KErrNoMemory indicates there was an OOM error when reordering the text; 
+KErrNone if the reordering was successful. */
+	{
+	// Reorder the text bidirectionally.
+	TText* reordered_text = NULL;
+	int error = TBidirectionalState::ReorderText(aText.Ptr(),aText.Length(),aParam.iParRightToLeft,reordered_text);
+	TPtrC p(reordered_text,aText.Length());
+	DrawText(p,aPosition,aParam);
+	if (reordered_text != aText.Ptr())
+		delete [] reordered_text;
+	return error;
+	}
+
+
+EXPORT_C void CGraphicsContext::DrawText(const TDesC& aText,const TPoint& aPosition,const TDrawTextParam& /*aParam*/)
+/** Draws the specified text at the given position using the parameters supplied.
+
+@param   aText  The text to be drawn.
+@param  aPosition The position to draw the text at.
+@param   aParam Parameters to use for text drawing. */	
+	{
+	DrawText(aText,aPosition);
+	}
+	
+/*
+Can be used to find out the top and bottom of an underline for the active font.
+This allows correct calculation of the area required in which to draw text with underline.
+
+@param TInt& aTop The top of the underline position
+@param TInt& aBottom The bottom of the underline position
+@return TInt KErrNone if successful, else a standard system wide error value. 
+*/
+EXPORT_C TInt CGraphicsContext::GetUnderlineMetrics(TInt& aTop,TInt& aBottom)
+	{
+
+	TTwoTInt outputPackage;
+	TTwoTInt* outputPtr = &outputPackage;
+	TInt err = APIExtension(KGetUnderlineMetrics, (TAny*&) outputPtr, NULL);
+	aTop = outputPackage.iTop;
+	aBottom = outputPackage.iBottom;
+	return err;
+	}
+
+EXPORT_C TInt CGraphicsContext::SetShadowColor(const TRgb& aShadowColor)
+	{
+	TRgb shadowColor = aShadowColor;
+	TInt *dummy = NULL;
+	return APIExtension(KSetShadowColor, (TAny*&)dummy, (TAny*)&shadowColor);
+	}
+
+EXPORT_C TInt CGraphicsContext::GetShadowColor(TRgb& aShadowColor)
+	{
+	TRgb* shadowColor = &aShadowColor;
+	return APIExtension(KGetShadowColor, (TAny*&)shadowColor, NULL);
+	}
+
+EXPORT_C TBool CGraphicsContext::IsFbsBitGc() const
+	{
+	TBool isFbsBitGc=EFalse;
+	TBool* isFbsBitGcPtr=&isFbsBitGc;
+
+	//Have a non const this since want the published API to be const
+	CGraphicsContext *nonConstThis = const_cast<CGraphicsContext*>(this);
+
+	//The API extension function is non-const, and this is const function
+	TInt err= nonConstThis->APIExtension(KUidIsFbsBitmapGc, (TAny*&)isFbsBitGcPtr, NULL);
+
+	//on error, return EFalse
+	return (!err ? isFbsBitGc : EFalse);
+	}
+
+EXPORT_C void CGraphicsContext::DrawText(const TDesC& aText,const TTextParameters* iParam,const TPoint& aPosition)
+	{
+	TInt *dummy = NULL;
+	
+	TDrawTextInContextInternal context;
+	TDrawTextInContextInternal* contextPtr = &context;
+	contextPtr->iText.Set(aText);
+	contextPtr->iPosition.SetXY(0,0);
+	contextPtr->iPosition += aPosition;
+	contextPtr->iParam.iStart = iParam->iStart;
+	contextPtr->iParam.iEnd = iParam->iEnd;
+	if (KErrNotSupported == APIExtension(KDrawTextInContextUid, (TAny*&)dummy, (TAny*)contextPtr))
+		{
+		DrawText(aText,aPosition);
+		}
+	}
+
+EXPORT_C void CGraphicsContext::DrawText(const TDesC& aText,const TTextParameters* iParam,const TRect& aBox,TInt aBaselineOffset,TTextAlign aHrz,TInt aMargin)
+	{
+	TInt *dummy = NULL;
+
+	TDrawTextInContextInternal context;
+	TDrawTextInContextInternal* contextPtr = &context;
+	contextPtr->iText.Set(aText);
+	contextPtr->iBox.SetRect(aBox.iTl, aBox.iBr);
+	contextPtr->iBaselineOffset = aBaselineOffset;
+	contextPtr->iAlign = aHrz;
+	contextPtr->iMargin = aMargin;
+	contextPtr->iParam.iStart = iParam->iStart;
+	contextPtr->iParam.iEnd = iParam->iEnd;
+	if (KErrNotSupported == APIExtension(KDrawBoxTextInContextUid, (TAny*&)dummy, (TAny*)contextPtr))
+		{
+		DrawText(aText,aBox,aBaselineOffset,aHrz,aMargin);
+		}
+	}
+	
+EXPORT_C void CGraphicsContext::DrawText(const TDesC& aText,const TTextParameters* iParam,const TPoint& aPosition,const TDrawTextParam& /*aParam*/)
+	{
+	TInt *dummy = NULL;
+
+	TDrawTextInContextInternal context;
+	TDrawTextInContextInternal* contextPtr = &context;
+	contextPtr->iText.Set(aText);
+	contextPtr->iPosition.SetXY(0,0);
+	contextPtr->iPosition += aPosition;
+	contextPtr->iParam.iStart = iParam->iStart;
+	contextPtr->iParam.iEnd = iParam->iEnd;
+	if (KErrNotSupported == APIExtension(KDrawTextInContextUid, (TAny*&)dummy, (TAny*)contextPtr))
+		{
+		DrawText(aText,aPosition);
+		}
+	}
+	
+EXPORT_C void CGraphicsContext::DrawTextVertical(const TDesC& aText,const TTextParameters* iParam,const TPoint& aPos,TBool aUp)
+	{
+	TInt *dummy = NULL;
+
+	TDrawTextInContextInternal context;
+	TDrawTextInContextInternal* contextPtr = &context;
+	contextPtr->iText.Set(aText);
+	contextPtr->iPosition.SetXY(0,0);
+	contextPtr->iPosition += aPos;
+	contextPtr->iUp = aUp;
+	contextPtr->iParam.iStart = iParam->iStart;
+	contextPtr->iParam.iEnd = iParam->iEnd;
+	if (KErrNotSupported == APIExtension(KDrawTextInContextVerticalUid, (TAny*&)dummy, (TAny*)contextPtr))
+		{
+		DrawTextVertical(aText,aPos,aUp);
+		}
+	}
+	
+EXPORT_C void CGraphicsContext::DrawTextVertical(const TDesC& aText,const TTextParameters* iParam,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin)
+	{
+	TInt *dummy = NULL;
+
+	TDrawTextInContextInternal context;
+	TDrawTextInContextInternal* contextPtr = &context;
+	contextPtr->iText.Set(aText);
+	contextPtr->iBox.SetRect(aBox.iTl, aBox.iBr);
+	contextPtr->iBaselineOffset = aBaselineOffset;
+	contextPtr->iAlign = aVert;
+	contextPtr->iMargin = aMargin;
+	contextPtr->iUp = aUp;
+	contextPtr->iParam.iStart = iParam->iStart;
+	contextPtr->iParam.iEnd = iParam->iEnd;
+	if (KErrNotSupported == APIExtension(KDrawBoxTextInContextVerticalUid, (TAny*&)dummy, (TAny*)contextPtr))
+		{
+		DrawTextVertical(aText,aBox,aBaselineOffset,aUp,aVert,aMargin);
+		}
+	}
+
+EXPORT_C TInt CGraphicsContext::DrawTextExtended(const TDesC& aText,const TTextParameters* aTextParam,const TPoint& aPosition,
+												 const TDrawTextExtendedParam& aParam)
+/** Draws text, optionally changing its direction (right-to-left / left-to-right).
+
+Apart from reordering the text, the function is the same as the two parameter 
+variant of DrawText(), described above.
+
+@param aText The text string to be drawn, optionally changing its direction 
+(right-to-left / left-to-right).
+@param aPosition A point specifying the position of the left end of the text.
+@param aParam Indicates whether the text should be drawn from right-to-left 
+(for scripts like Arabic and Hebrew) or left-to-right.
+@return KErrNoMemory indicates there was an OOM error when reordering the text; 
+KErrNone if the reordering was successful. */
+	{
+	// Reorder the text bidirectionally.
+	TText* reordered_text = NULL;
+	int error = TBidirectionalState::ReorderText(aText.Ptr(),aText.Length(),aParam.iParRightToLeft,reordered_text);
+	TPtrC p(reordered_text,aText.Length());
+	DrawText(p,aTextParam,aPosition,aParam);
+	if (reordered_text != aText.Ptr())
+		delete [] reordered_text;
+	return error;
+	}
+EXPORT_C void CGraphicsContext::Reserved()
+/**Reserved function for future use. */	
+	{
+	}
+
+/**
+An API extension for CGraphics context replacing a reserved virtual method.
+Effectively allows multiple methods to use just one ordinal number.
+
+@param TUid aUid A unique identifier for the internal method required
+@param TAny*& aOutput The output parameter
+@param TAny* aInput The input argument. Notably not const.
+@return KErrNone If a successful derived function is found, if the
+default is used then KErrNotSupported is returned.
+*/
+EXPORT_C TInt CGraphicsContext::APIExtension(TUid /*aUid*/, TAny*& /*aOutput*/, TAny* /*aInput*/)
+	{
+	return KErrNotSupported;
+	}
+
+//Default implementation of reserved virtual
+EXPORT_C void CGraphicsContext::Reserved_CGraphicsContext_2()
+	{
+	}
+
+EXPORT_C TInt CBitmapContext::APIExtension(TUid aUid, TAny*& aOutput, TAny* aInput)
+  	{
+  	return CGraphicsContext::APIExtension(aUid, aOutput, aInput);
+  	}
+
+//Default implementation of reserved virtual
+EXPORT_C void CBitmapContext::Reserved_CGraphicsContext_2()
+	{
+	CGraphicsContext::Reserved_CGraphicsContext_2();
+	}
+
+//Default implementation of reserved virtual
+EXPORT_C void CBitmapContext::Reserved_CBitmapContext_1()
+	{
+	}
+
+//Default implementation of reserved virtual
+EXPORT_C void CBitmapContext::Reserved_CBitmapContext_2()
+	{
+	}
+
+//Default implementation of reserved virtual
+EXPORT_C void CBitmapContext::Reserved_CBitmapContext_3()
+	{
+	}
+