graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdimain.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdimain.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,358 @@
+// 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:
+//
+
+#include "directgdiadapter.h"
+#include "swdirectgdidriverimpl.h"
+#include "swdirectgdiimagetargetimpl.h"
+#include <graphics/directgdiimagetarget.h>
+
+// Use on every argument if a method is not implemented yet
+#define UNUSED(x) {(void)(x); User::Invariant();}
+
+/**
+Engine constructor.
+
+@param aDriver The driver implementation.
+ */
+CSwDirectGdiEngine::CSwDirectGdiEngine(CSwDirectGdiDriverImpl* aDriver):
+	iBrushBitmap(),
+	iBrushColor(KRgbWhite),
+	iBrushOrigin(0,0),
+	iBrushStyle(DirectGdi::ENullBrush),
+	iDefaultRegion(),
+	iDefaultRegionPtr(NULL),
+	iDotLength(0),
+	iDotMask(0),
+	iDotParam(0),
+	iDotDirection(1),
+	iDrawDevice(NULL),
+	iDrawMode(DirectGdi::EDrawModePEN),
+	iDriver(aDriver),
+	iLinePosition(0,0),
+	iOrigin(0,0),
+	iPenArray(NULL),
+	iPenColor(KRgbBlack),
+	iTextShadowColor(KRgbGray),
+	iPenSize(1, 1),
+	iPenStyle(DirectGdi::ESolidPen)
+	{			
+	}
+
+CSwDirectGdiEngine::~CSwDirectGdiEngine()
+	{
+	Deactivate();
+	ResetPenArray();
+	iClippingRegion.Close();
+	iBrushBitmap.Reset();
+	}
+
+/**
+@see MDirectGdiEngine::Activate()
+
+@return KErrNone if successful, otherwise one of the the system-wide error codes.
+@panic DGDIAdapter 32, if the handle of aTarget is not null, but is not associated with a valid target. 
+@panic DGDIAdapter 34, if the passed target has a NULL handle (debug only).
+@panic DGDIAdapter 53, if the passed target has a NULL draw device (debug only).
+*/
+TInt CSwDirectGdiEngine::Activate(RDirectGdiImageTarget& aTarget) 
+	{
+	GRAPHICS_ASSERT_DEBUG(aTarget.Handle(), EDirectGdiPanicActivateWithNullHandle);
+	GRAPHICS_ASSERT_ALWAYS(iDriver->ValidImageTarget(aTarget.Handle()), EDirectGdiPanicResourceHandleNotFound);
+		
+	CSwDirectGdiImageTargetImpl* target = reinterpret_cast<CSwDirectGdiImageTargetImpl*>(aTarget.Handle());
+	if(iRenderingTarget == target)
+		{
+		return KErrNone;
+		}
+
+	Deactivate();
+	
+	iRenderingTarget = target;
+	target->Open();	
+	iDrawDevice = target->DrawDevice();
+	GRAPHICS_ASSERT_DEBUG(iDrawDevice, EDirectGdiPanicActivateWithNullDrawDevice);
+	TRect deviceRect;
+	iDrawDevice->GetDrawRect(deviceRect);
+	iDefaultRegion.Clear();
+	iDefaultRegion.AddRect(deviceRect);
+	iDefaultRegionPtr = &iDefaultRegion;	
+	
+	return KErrNone;
+	}
+
+/**
+ Unbinds the drawing engine.
+ */
+void CSwDirectGdiEngine::Deactivate()
+	{
+	if (iRenderingTarget)
+		{
+		iDriver->Deactivate(iRenderingTarget);
+		iDrawDevice = NULL;
+		}		
+	}
+
+/** 
+@see MDirectGdiEngine::ExternalizeL()
+*/
+void CSwDirectGdiEngine::ExternalizeL(RWriteStream& aWriteStream)
+	{	
+	aWriteStream.WriteUint32L(iDotLength);
+	aWriteStream.WriteUint32L(iDotMask);
+	aWriteStream.WriteUint32L(iDotParam);
+	aWriteStream.WriteUint32L(iDotDirection); 
+	aWriteStream << iLinePosition;
+	}
+
+/** 
+@see MDirectGdiEngine::InternalizeL()
+*/
+void CSwDirectGdiEngine::InternalizeL(RReadStream& aReadStream)
+	{	
+	iDotLength = aReadStream.ReadUint32L();
+	iDotMask = aReadStream.ReadUint32L();
+	iDotParam = aReadStream.ReadUint32L();
+	iDotDirection = aReadStream.ReadUint32L(); 
+	aReadStream >> iLinePosition;
+	}
+
+/**
+@see MDirectGdiEngine::ResetBrushPattern()
+*/
+void CSwDirectGdiEngine::ResetBrushPattern()
+	{
+	iBrushBitmap.Reset();
+	}
+
+/** 
+@see MDirectGdiEngine::MoveTo()
+*/
+void CSwDirectGdiEngine::MoveTo(const TPoint& aPoint)
+	{
+	iLinePosition = aPoint;
+	}
+
+/**
+@see MDirectGdiEngine::MoveBy()
+*/
+void CSwDirectGdiEngine::MoveBy(const TPoint& aVector)
+	{
+	iLinePosition += aVector;
+	}
+
+/**
+@see MDirectGdiEngine::Reset()
+
+@pre Has been called by CDirectGdiContext::Reset()
+
+Most states are set by the context Reset(), only states that can't be set by the context need resetting here.
+*/
+void CSwDirectGdiEngine::Reset()
+	{
+	iDotLength = 0;
+	iDotMask = 0;
+	iDotParam = 0;
+	iDotDirection = 1;	
+	ResetPenArray();
+	}
+
+/**
+@see MDirectGdiEngine::SetBrushOrigin()
+*/
+void CSwDirectGdiEngine::SetBrushOrigin(const TPoint& aOrigin)
+	{
+	iBrushOrigin = aOrigin;
+	}
+
+/** 
+@see MDirectGdiEngine::SetBrushColor()
+ */
+void CSwDirectGdiEngine::SetBrushColor(const TRgb& aColor)
+	{
+	iBrushColor = aColor;
+	}
+
+/**	
+@see MDirectGdiEngine::SetBrushStyle()
+@panic DGDIAdapter 12, if aStyle is EPatternedBrush but no valid brush bitmap has been set.
+*/
+void CSwDirectGdiEngine::SetBrushStyle(DirectGdi::TBrushStyle aStyle)
+	{
+	if (aStyle == DirectGdi::EPatternedBrush)
+		{
+		GRAPHICS_ASSERT_ALWAYS(iBrushBitmap.Handle() != 0, EDirectGdiPanicPatternedBrushNotSet);
+		}
+	iBrushStyle = aStyle;
+	}
+
+/**
+@see MDirectGdiEngine::ResetClippingRegion()
+ */
+void CSwDirectGdiEngine::ResetClippingRegion()
+	{
+	iDefaultRegionPtr = &iDefaultRegion;	
+	iClippingRegion.Clear();
+	}
+
+/**
+The error state is set to KErrNoMemory if the required memory could not be allocated.
+
+@see MDirectGdiEngine::SetClippingRegion()
+*/
+void CSwDirectGdiEngine::SetClippingRegion(const TRegion& aRegion)
+	{
+	TRect boundingRect=iDefaultRegion.BoundingRect();
+	boundingRect.iTl-=iDrawOrigin;
+	boundingRect.iBr-=iDrawOrigin;
+	if (!aRegion.IsContainedBy(boundingRect))
+		{
+		iDriver->SetError(KErrArgument);
+		return;
+		}
+	
+	iClippingRegion.Copy(aRegion);
+	
+	if (iClippingRegion.CheckError())		
+		{
+		iDriver->SetError(KErrNoMemory);
+		return;
+		}
+	iClippingRegion.Offset(iDrawOrigin);
+	iDefaultRegionPtr = &iClippingRegion;
+	}
+
+/**
+@see MDirectGdiEngine::SetDrawMode()
+*/
+void CSwDirectGdiEngine::SetDrawMode(DirectGdi::TDrawMode aDrawMode)
+	{
+	iDrawMode = aDrawMode;
+	}
+
+/** 
+@see MDirectGdiEngine::SetOrigin()
+*/
+void CSwDirectGdiEngine::SetOrigin(const TPoint& aOrigin)
+	{
+	iOrigin = aOrigin+iDrawOrigin;
+	}
+
+/** 
+@see MDrawDeviceOrigin::Set()
+*/
+TInt CSwDirectGdiEngine::Set(const TPoint& aDrawOrigin)
+	{
+	TPoint moveOrigin=aDrawOrigin;
+	moveOrigin-=iDrawOrigin;
+	iOrigin+=moveOrigin;
+	iClippingRegion.Offset(moveOrigin);
+	iDrawOrigin = aDrawOrigin;
+	return KErrNone;
+	}
+
+/** 
+@see MDrawDeviceOrigin::Get()
+*/
+void CSwDirectGdiEngine::Get(TPoint& aDrawOrigin)
+	{
+	aDrawOrigin=iDrawOrigin;
+	}
+
+/** 
+@see MDirectGdiEngine::SetPenColor()
+ */
+void CSwDirectGdiEngine::SetPenColor(const TRgb& aColor)
+	{
+	iPenColor = aColor;
+	}
+
+/** 
+@see MDirectGdiEngine::SetPenStyle()
+*/
+void CSwDirectGdiEngine::SetPenStyle(DirectGdi::TPenStyle aStyle)
+	{
+	iPenStyle = aStyle;	
+	switch(iPenStyle)
+		{
+		case DirectGdi::ENullPen:
+			iDotMask=0;
+			iDotLength=0;
+			break;
+		case DirectGdi::EDottedPen:
+			iDotMask=1;
+			iDotLength=4;
+			break;
+		case DirectGdi::EDashedPen:
+			iDotMask=7;	
+			iDotLength=6;
+			break;
+		case DirectGdi::EDotDashPen:
+			iDotMask=113;
+			iDotLength=10;
+			break;
+		case DirectGdi::EDotDotDashPen:
+			iDotMask=1809;
+			iDotLength=14;
+			break;
+		case DirectGdi::ESolidPen:
+		default:
+			iDotMask=1;
+			iDotLength=1;
+			break;
+		};
+	iDotParam=0;
+	}
+
+/**
+The error state is set to KErrNoMemory if the required memory could not be allocated.
+
+@see MDirectGdiEngine::SetPenSize()
+
+@pre aSize is not the same as iPenSize.
+*/
+void CSwDirectGdiEngine::SetPenSize(const TSize& aSize)
+	{
+	iPenSize = aSize;
+
+	if ((iPenSize.iWidth >= 1) || (iPenSize.iHeight >= 1))
+		{
+		TInt err = PenAllocate();
+		iDriver->SetError(err);
+		}
+	else
+		{
+		ResetPenArray();
+		}
+
+	iDotParam = 0;
+	}
+
+/** 
+@see MDirectGdiEngine::SetBrushPattern()
+
+@pre aPattern is a valid bitmap.
+*/
+TInt CSwDirectGdiEngine::SetBrushPattern(const CFbsBitmap& aPattern)
+	{			
+	if (aPattern.ExtendedBitmapType() != KNullUid)
+		{
+		return KErrNotSupported; // Not supported for extended bitmaps		
+		}
+	
+	return iBrushBitmap.Duplicate(aPattern.Handle());
+	}
+
+
+