sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "directgdiadapter.h" sl@0: #include "swdirectgdidriverimpl.h" sl@0: #include "swdirectgdiimagetargetimpl.h" sl@0: #include sl@0: sl@0: // Use on every argument if a method is not implemented yet sl@0: #define UNUSED(x) {(void)(x); User::Invariant();} sl@0: sl@0: /** sl@0: Engine constructor. sl@0: sl@0: @param aDriver The driver implementation. sl@0: */ sl@0: CSwDirectGdiEngine::CSwDirectGdiEngine(CSwDirectGdiDriverImpl* aDriver): sl@0: iBrushBitmap(), sl@0: iBrushColor(KRgbWhite), sl@0: iBrushOrigin(0,0), sl@0: iBrushStyle(DirectGdi::ENullBrush), sl@0: iDefaultRegion(), sl@0: iDefaultRegionPtr(NULL), sl@0: iDotLength(0), sl@0: iDotMask(0), sl@0: iDotParam(0), sl@0: iDotDirection(1), sl@0: iDrawDevice(NULL), sl@0: iDrawMode(DirectGdi::EDrawModePEN), sl@0: iDriver(aDriver), sl@0: iLinePosition(0,0), sl@0: iOrigin(0,0), sl@0: iPenArray(NULL), sl@0: iPenColor(KRgbBlack), sl@0: iTextShadowColor(KRgbGray), sl@0: iPenSize(1, 1), sl@0: iPenStyle(DirectGdi::ESolidPen) sl@0: { sl@0: } sl@0: sl@0: CSwDirectGdiEngine::~CSwDirectGdiEngine() sl@0: { sl@0: Deactivate(); sl@0: ResetPenArray(); sl@0: iClippingRegion.Close(); sl@0: iBrushBitmap.Reset(); sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::Activate() sl@0: sl@0: @return KErrNone if successful, otherwise one of the the system-wide error codes. sl@0: @panic DGDIAdapter 32, if the handle of aTarget is not null, but is not associated with a valid target. sl@0: @panic DGDIAdapter 34, if the passed target has a NULL handle (debug only). sl@0: @panic DGDIAdapter 53, if the passed target has a NULL draw device (debug only). sl@0: */ sl@0: TInt CSwDirectGdiEngine::Activate(RDirectGdiImageTarget& aTarget) sl@0: { sl@0: GRAPHICS_ASSERT_DEBUG(aTarget.Handle(), EDirectGdiPanicActivateWithNullHandle); sl@0: GRAPHICS_ASSERT_ALWAYS(iDriver->ValidImageTarget(aTarget.Handle()), EDirectGdiPanicResourceHandleNotFound); sl@0: sl@0: CSwDirectGdiImageTargetImpl* target = reinterpret_cast(aTarget.Handle()); sl@0: if(iRenderingTarget == target) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: Deactivate(); sl@0: sl@0: iRenderingTarget = target; sl@0: target->Open(); sl@0: iDrawDevice = target->DrawDevice(); sl@0: GRAPHICS_ASSERT_DEBUG(iDrawDevice, EDirectGdiPanicActivateWithNullDrawDevice); sl@0: TRect deviceRect; sl@0: iDrawDevice->GetDrawRect(deviceRect); sl@0: iDefaultRegion.Clear(); sl@0: iDefaultRegion.AddRect(deviceRect); sl@0: iDefaultRegionPtr = &iDefaultRegion; sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: Unbinds the drawing engine. sl@0: */ sl@0: void CSwDirectGdiEngine::Deactivate() sl@0: { sl@0: if (iRenderingTarget) sl@0: { sl@0: iDriver->Deactivate(iRenderingTarget); sl@0: iDrawDevice = NULL; sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::ExternalizeL() sl@0: */ sl@0: void CSwDirectGdiEngine::ExternalizeL(RWriteStream& aWriteStream) sl@0: { sl@0: aWriteStream.WriteUint32L(iDotLength); sl@0: aWriteStream.WriteUint32L(iDotMask); sl@0: aWriteStream.WriteUint32L(iDotParam); sl@0: aWriteStream.WriteUint32L(iDotDirection); sl@0: aWriteStream << iLinePosition; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::InternalizeL() sl@0: */ sl@0: void CSwDirectGdiEngine::InternalizeL(RReadStream& aReadStream) sl@0: { sl@0: iDotLength = aReadStream.ReadUint32L(); sl@0: iDotMask = aReadStream.ReadUint32L(); sl@0: iDotParam = aReadStream.ReadUint32L(); sl@0: iDotDirection = aReadStream.ReadUint32L(); sl@0: aReadStream >> iLinePosition; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::ResetBrushPattern() sl@0: */ sl@0: void CSwDirectGdiEngine::ResetBrushPattern() sl@0: { sl@0: iBrushBitmap.Reset(); sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::MoveTo() sl@0: */ sl@0: void CSwDirectGdiEngine::MoveTo(const TPoint& aPoint) sl@0: { sl@0: iLinePosition = aPoint; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::MoveBy() sl@0: */ sl@0: void CSwDirectGdiEngine::MoveBy(const TPoint& aVector) sl@0: { sl@0: iLinePosition += aVector; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::Reset() sl@0: sl@0: @pre Has been called by CDirectGdiContext::Reset() sl@0: sl@0: Most states are set by the context Reset(), only states that can't be set by the context need resetting here. sl@0: */ sl@0: void CSwDirectGdiEngine::Reset() sl@0: { sl@0: iDotLength = 0; sl@0: iDotMask = 0; sl@0: iDotParam = 0; sl@0: iDotDirection = 1; sl@0: ResetPenArray(); sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetBrushOrigin() sl@0: */ sl@0: void CSwDirectGdiEngine::SetBrushOrigin(const TPoint& aOrigin) sl@0: { sl@0: iBrushOrigin = aOrigin; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetBrushColor() sl@0: */ sl@0: void CSwDirectGdiEngine::SetBrushColor(const TRgb& aColor) sl@0: { sl@0: iBrushColor = aColor; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetBrushStyle() sl@0: @panic DGDIAdapter 12, if aStyle is EPatternedBrush but no valid brush bitmap has been set. sl@0: */ sl@0: void CSwDirectGdiEngine::SetBrushStyle(DirectGdi::TBrushStyle aStyle) sl@0: { sl@0: if (aStyle == DirectGdi::EPatternedBrush) sl@0: { sl@0: GRAPHICS_ASSERT_ALWAYS(iBrushBitmap.Handle() != 0, EDirectGdiPanicPatternedBrushNotSet); sl@0: } sl@0: iBrushStyle = aStyle; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::ResetClippingRegion() sl@0: */ sl@0: void CSwDirectGdiEngine::ResetClippingRegion() sl@0: { sl@0: iDefaultRegionPtr = &iDefaultRegion; sl@0: iClippingRegion.Clear(); sl@0: } sl@0: sl@0: /** sl@0: The error state is set to KErrNoMemory if the required memory could not be allocated. sl@0: sl@0: @see MDirectGdiEngine::SetClippingRegion() sl@0: */ sl@0: void CSwDirectGdiEngine::SetClippingRegion(const TRegion& aRegion) sl@0: { sl@0: TRect boundingRect=iDefaultRegion.BoundingRect(); sl@0: boundingRect.iTl-=iDrawOrigin; sl@0: boundingRect.iBr-=iDrawOrigin; sl@0: if (!aRegion.IsContainedBy(boundingRect)) sl@0: { sl@0: iDriver->SetError(KErrArgument); sl@0: return; sl@0: } sl@0: sl@0: iClippingRegion.Copy(aRegion); sl@0: sl@0: if (iClippingRegion.CheckError()) sl@0: { sl@0: iDriver->SetError(KErrNoMemory); sl@0: return; sl@0: } sl@0: iClippingRegion.Offset(iDrawOrigin); sl@0: iDefaultRegionPtr = &iClippingRegion; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetDrawMode() sl@0: */ sl@0: void CSwDirectGdiEngine::SetDrawMode(DirectGdi::TDrawMode aDrawMode) sl@0: { sl@0: iDrawMode = aDrawMode; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetOrigin() sl@0: */ sl@0: void CSwDirectGdiEngine::SetOrigin(const TPoint& aOrigin) sl@0: { sl@0: iOrigin = aOrigin+iDrawOrigin; sl@0: } sl@0: sl@0: /** sl@0: @see MDrawDeviceOrigin::Set() sl@0: */ sl@0: TInt CSwDirectGdiEngine::Set(const TPoint& aDrawOrigin) sl@0: { sl@0: TPoint moveOrigin=aDrawOrigin; sl@0: moveOrigin-=iDrawOrigin; sl@0: iOrigin+=moveOrigin; sl@0: iClippingRegion.Offset(moveOrigin); sl@0: iDrawOrigin = aDrawOrigin; sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: @see MDrawDeviceOrigin::Get() sl@0: */ sl@0: void CSwDirectGdiEngine::Get(TPoint& aDrawOrigin) sl@0: { sl@0: aDrawOrigin=iDrawOrigin; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetPenColor() sl@0: */ sl@0: void CSwDirectGdiEngine::SetPenColor(const TRgb& aColor) sl@0: { sl@0: iPenColor = aColor; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetPenStyle() sl@0: */ sl@0: void CSwDirectGdiEngine::SetPenStyle(DirectGdi::TPenStyle aStyle) sl@0: { sl@0: iPenStyle = aStyle; sl@0: switch(iPenStyle) sl@0: { sl@0: case DirectGdi::ENullPen: sl@0: iDotMask=0; sl@0: iDotLength=0; sl@0: break; sl@0: case DirectGdi::EDottedPen: sl@0: iDotMask=1; sl@0: iDotLength=4; sl@0: break; sl@0: case DirectGdi::EDashedPen: sl@0: iDotMask=7; sl@0: iDotLength=6; sl@0: break; sl@0: case DirectGdi::EDotDashPen: sl@0: iDotMask=113; sl@0: iDotLength=10; sl@0: break; sl@0: case DirectGdi::EDotDotDashPen: sl@0: iDotMask=1809; sl@0: iDotLength=14; sl@0: break; sl@0: case DirectGdi::ESolidPen: sl@0: default: sl@0: iDotMask=1; sl@0: iDotLength=1; sl@0: break; sl@0: }; sl@0: iDotParam=0; sl@0: } sl@0: sl@0: /** sl@0: The error state is set to KErrNoMemory if the required memory could not be allocated. sl@0: sl@0: @see MDirectGdiEngine::SetPenSize() sl@0: sl@0: @pre aSize is not the same as iPenSize. sl@0: */ sl@0: void CSwDirectGdiEngine::SetPenSize(const TSize& aSize) sl@0: { sl@0: iPenSize = aSize; sl@0: sl@0: if ((iPenSize.iWidth >= 1) || (iPenSize.iHeight >= 1)) sl@0: { sl@0: TInt err = PenAllocate(); sl@0: iDriver->SetError(err); sl@0: } sl@0: else sl@0: { sl@0: ResetPenArray(); sl@0: } sl@0: sl@0: iDotParam = 0; sl@0: } sl@0: sl@0: /** sl@0: @see MDirectGdiEngine::SetBrushPattern() sl@0: sl@0: @pre aPattern is a valid bitmap. sl@0: */ sl@0: TInt CSwDirectGdiEngine::SetBrushPattern(const CFbsBitmap& aPattern) sl@0: { sl@0: if (aPattern.ExtendedBitmapType() != KNullUid) sl@0: { sl@0: return KErrNotSupported; // Not supported for extended bitmaps sl@0: } sl@0: sl@0: return iBrushBitmap.Duplicate(aPattern.Handle()); sl@0: } sl@0: sl@0: sl@0: