os/graphics/graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdimain.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdimain.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,358 @@
1.4 +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include "directgdiadapter.h"
1.20 +#include "swdirectgdidriverimpl.h"
1.21 +#include "swdirectgdiimagetargetimpl.h"
1.22 +#include <graphics/directgdiimagetarget.h>
1.23 +
1.24 +// Use on every argument if a method is not implemented yet
1.25 +#define UNUSED(x) {(void)(x); User::Invariant();}
1.26 +
1.27 +/**
1.28 +Engine constructor.
1.29 +
1.30 +@param aDriver The driver implementation.
1.31 + */
1.32 +CSwDirectGdiEngine::CSwDirectGdiEngine(CSwDirectGdiDriverImpl* aDriver):
1.33 + iBrushBitmap(),
1.34 + iBrushColor(KRgbWhite),
1.35 + iBrushOrigin(0,0),
1.36 + iBrushStyle(DirectGdi::ENullBrush),
1.37 + iDefaultRegion(),
1.38 + iDefaultRegionPtr(NULL),
1.39 + iDotLength(0),
1.40 + iDotMask(0),
1.41 + iDotParam(0),
1.42 + iDotDirection(1),
1.43 + iDrawDevice(NULL),
1.44 + iDrawMode(DirectGdi::EDrawModePEN),
1.45 + iDriver(aDriver),
1.46 + iLinePosition(0,0),
1.47 + iOrigin(0,0),
1.48 + iPenArray(NULL),
1.49 + iPenColor(KRgbBlack),
1.50 + iTextShadowColor(KRgbGray),
1.51 + iPenSize(1, 1),
1.52 + iPenStyle(DirectGdi::ESolidPen)
1.53 + {
1.54 + }
1.55 +
1.56 +CSwDirectGdiEngine::~CSwDirectGdiEngine()
1.57 + {
1.58 + Deactivate();
1.59 + ResetPenArray();
1.60 + iClippingRegion.Close();
1.61 + iBrushBitmap.Reset();
1.62 + }
1.63 +
1.64 +/**
1.65 +@see MDirectGdiEngine::Activate()
1.66 +
1.67 +@return KErrNone if successful, otherwise one of the the system-wide error codes.
1.68 +@panic DGDIAdapter 32, if the handle of aTarget is not null, but is not associated with a valid target.
1.69 +@panic DGDIAdapter 34, if the passed target has a NULL handle (debug only).
1.70 +@panic DGDIAdapter 53, if the passed target has a NULL draw device (debug only).
1.71 +*/
1.72 +TInt CSwDirectGdiEngine::Activate(RDirectGdiImageTarget& aTarget)
1.73 + {
1.74 + GRAPHICS_ASSERT_DEBUG(aTarget.Handle(), EDirectGdiPanicActivateWithNullHandle);
1.75 + GRAPHICS_ASSERT_ALWAYS(iDriver->ValidImageTarget(aTarget.Handle()), EDirectGdiPanicResourceHandleNotFound);
1.76 +
1.77 + CSwDirectGdiImageTargetImpl* target = reinterpret_cast<CSwDirectGdiImageTargetImpl*>(aTarget.Handle());
1.78 + if(iRenderingTarget == target)
1.79 + {
1.80 + return KErrNone;
1.81 + }
1.82 +
1.83 + Deactivate();
1.84 +
1.85 + iRenderingTarget = target;
1.86 + target->Open();
1.87 + iDrawDevice = target->DrawDevice();
1.88 + GRAPHICS_ASSERT_DEBUG(iDrawDevice, EDirectGdiPanicActivateWithNullDrawDevice);
1.89 + TRect deviceRect;
1.90 + iDrawDevice->GetDrawRect(deviceRect);
1.91 + iDefaultRegion.Clear();
1.92 + iDefaultRegion.AddRect(deviceRect);
1.93 + iDefaultRegionPtr = &iDefaultRegion;
1.94 +
1.95 + return KErrNone;
1.96 + }
1.97 +
1.98 +/**
1.99 + Unbinds the drawing engine.
1.100 + */
1.101 +void CSwDirectGdiEngine::Deactivate()
1.102 + {
1.103 + if (iRenderingTarget)
1.104 + {
1.105 + iDriver->Deactivate(iRenderingTarget);
1.106 + iDrawDevice = NULL;
1.107 + }
1.108 + }
1.109 +
1.110 +/**
1.111 +@see MDirectGdiEngine::ExternalizeL()
1.112 +*/
1.113 +void CSwDirectGdiEngine::ExternalizeL(RWriteStream& aWriteStream)
1.114 + {
1.115 + aWriteStream.WriteUint32L(iDotLength);
1.116 + aWriteStream.WriteUint32L(iDotMask);
1.117 + aWriteStream.WriteUint32L(iDotParam);
1.118 + aWriteStream.WriteUint32L(iDotDirection);
1.119 + aWriteStream << iLinePosition;
1.120 + }
1.121 +
1.122 +/**
1.123 +@see MDirectGdiEngine::InternalizeL()
1.124 +*/
1.125 +void CSwDirectGdiEngine::InternalizeL(RReadStream& aReadStream)
1.126 + {
1.127 + iDotLength = aReadStream.ReadUint32L();
1.128 + iDotMask = aReadStream.ReadUint32L();
1.129 + iDotParam = aReadStream.ReadUint32L();
1.130 + iDotDirection = aReadStream.ReadUint32L();
1.131 + aReadStream >> iLinePosition;
1.132 + }
1.133 +
1.134 +/**
1.135 +@see MDirectGdiEngine::ResetBrushPattern()
1.136 +*/
1.137 +void CSwDirectGdiEngine::ResetBrushPattern()
1.138 + {
1.139 + iBrushBitmap.Reset();
1.140 + }
1.141 +
1.142 +/**
1.143 +@see MDirectGdiEngine::MoveTo()
1.144 +*/
1.145 +void CSwDirectGdiEngine::MoveTo(const TPoint& aPoint)
1.146 + {
1.147 + iLinePosition = aPoint;
1.148 + }
1.149 +
1.150 +/**
1.151 +@see MDirectGdiEngine::MoveBy()
1.152 +*/
1.153 +void CSwDirectGdiEngine::MoveBy(const TPoint& aVector)
1.154 + {
1.155 + iLinePosition += aVector;
1.156 + }
1.157 +
1.158 +/**
1.159 +@see MDirectGdiEngine::Reset()
1.160 +
1.161 +@pre Has been called by CDirectGdiContext::Reset()
1.162 +
1.163 +Most states are set by the context Reset(), only states that can't be set by the context need resetting here.
1.164 +*/
1.165 +void CSwDirectGdiEngine::Reset()
1.166 + {
1.167 + iDotLength = 0;
1.168 + iDotMask = 0;
1.169 + iDotParam = 0;
1.170 + iDotDirection = 1;
1.171 + ResetPenArray();
1.172 + }
1.173 +
1.174 +/**
1.175 +@see MDirectGdiEngine::SetBrushOrigin()
1.176 +*/
1.177 +void CSwDirectGdiEngine::SetBrushOrigin(const TPoint& aOrigin)
1.178 + {
1.179 + iBrushOrigin = aOrigin;
1.180 + }
1.181 +
1.182 +/**
1.183 +@see MDirectGdiEngine::SetBrushColor()
1.184 + */
1.185 +void CSwDirectGdiEngine::SetBrushColor(const TRgb& aColor)
1.186 + {
1.187 + iBrushColor = aColor;
1.188 + }
1.189 +
1.190 +/**
1.191 +@see MDirectGdiEngine::SetBrushStyle()
1.192 +@panic DGDIAdapter 12, if aStyle is EPatternedBrush but no valid brush bitmap has been set.
1.193 +*/
1.194 +void CSwDirectGdiEngine::SetBrushStyle(DirectGdi::TBrushStyle aStyle)
1.195 + {
1.196 + if (aStyle == DirectGdi::EPatternedBrush)
1.197 + {
1.198 + GRAPHICS_ASSERT_ALWAYS(iBrushBitmap.Handle() != 0, EDirectGdiPanicPatternedBrushNotSet);
1.199 + }
1.200 + iBrushStyle = aStyle;
1.201 + }
1.202 +
1.203 +/**
1.204 +@see MDirectGdiEngine::ResetClippingRegion()
1.205 + */
1.206 +void CSwDirectGdiEngine::ResetClippingRegion()
1.207 + {
1.208 + iDefaultRegionPtr = &iDefaultRegion;
1.209 + iClippingRegion.Clear();
1.210 + }
1.211 +
1.212 +/**
1.213 +The error state is set to KErrNoMemory if the required memory could not be allocated.
1.214 +
1.215 +@see MDirectGdiEngine::SetClippingRegion()
1.216 +*/
1.217 +void CSwDirectGdiEngine::SetClippingRegion(const TRegion& aRegion)
1.218 + {
1.219 + TRect boundingRect=iDefaultRegion.BoundingRect();
1.220 + boundingRect.iTl-=iDrawOrigin;
1.221 + boundingRect.iBr-=iDrawOrigin;
1.222 + if (!aRegion.IsContainedBy(boundingRect))
1.223 + {
1.224 + iDriver->SetError(KErrArgument);
1.225 + return;
1.226 + }
1.227 +
1.228 + iClippingRegion.Copy(aRegion);
1.229 +
1.230 + if (iClippingRegion.CheckError())
1.231 + {
1.232 + iDriver->SetError(KErrNoMemory);
1.233 + return;
1.234 + }
1.235 + iClippingRegion.Offset(iDrawOrigin);
1.236 + iDefaultRegionPtr = &iClippingRegion;
1.237 + }
1.238 +
1.239 +/**
1.240 +@see MDirectGdiEngine::SetDrawMode()
1.241 +*/
1.242 +void CSwDirectGdiEngine::SetDrawMode(DirectGdi::TDrawMode aDrawMode)
1.243 + {
1.244 + iDrawMode = aDrawMode;
1.245 + }
1.246 +
1.247 +/**
1.248 +@see MDirectGdiEngine::SetOrigin()
1.249 +*/
1.250 +void CSwDirectGdiEngine::SetOrigin(const TPoint& aOrigin)
1.251 + {
1.252 + iOrigin = aOrigin+iDrawOrigin;
1.253 + }
1.254 +
1.255 +/**
1.256 +@see MDrawDeviceOrigin::Set()
1.257 +*/
1.258 +TInt CSwDirectGdiEngine::Set(const TPoint& aDrawOrigin)
1.259 + {
1.260 + TPoint moveOrigin=aDrawOrigin;
1.261 + moveOrigin-=iDrawOrigin;
1.262 + iOrigin+=moveOrigin;
1.263 + iClippingRegion.Offset(moveOrigin);
1.264 + iDrawOrigin = aDrawOrigin;
1.265 + return KErrNone;
1.266 + }
1.267 +
1.268 +/**
1.269 +@see MDrawDeviceOrigin::Get()
1.270 +*/
1.271 +void CSwDirectGdiEngine::Get(TPoint& aDrawOrigin)
1.272 + {
1.273 + aDrawOrigin=iDrawOrigin;
1.274 + }
1.275 +
1.276 +/**
1.277 +@see MDirectGdiEngine::SetPenColor()
1.278 + */
1.279 +void CSwDirectGdiEngine::SetPenColor(const TRgb& aColor)
1.280 + {
1.281 + iPenColor = aColor;
1.282 + }
1.283 +
1.284 +/**
1.285 +@see MDirectGdiEngine::SetPenStyle()
1.286 +*/
1.287 +void CSwDirectGdiEngine::SetPenStyle(DirectGdi::TPenStyle aStyle)
1.288 + {
1.289 + iPenStyle = aStyle;
1.290 + switch(iPenStyle)
1.291 + {
1.292 + case DirectGdi::ENullPen:
1.293 + iDotMask=0;
1.294 + iDotLength=0;
1.295 + break;
1.296 + case DirectGdi::EDottedPen:
1.297 + iDotMask=1;
1.298 + iDotLength=4;
1.299 + break;
1.300 + case DirectGdi::EDashedPen:
1.301 + iDotMask=7;
1.302 + iDotLength=6;
1.303 + break;
1.304 + case DirectGdi::EDotDashPen:
1.305 + iDotMask=113;
1.306 + iDotLength=10;
1.307 + break;
1.308 + case DirectGdi::EDotDotDashPen:
1.309 + iDotMask=1809;
1.310 + iDotLength=14;
1.311 + break;
1.312 + case DirectGdi::ESolidPen:
1.313 + default:
1.314 + iDotMask=1;
1.315 + iDotLength=1;
1.316 + break;
1.317 + };
1.318 + iDotParam=0;
1.319 + }
1.320 +
1.321 +/**
1.322 +The error state is set to KErrNoMemory if the required memory could not be allocated.
1.323 +
1.324 +@see MDirectGdiEngine::SetPenSize()
1.325 +
1.326 +@pre aSize is not the same as iPenSize.
1.327 +*/
1.328 +void CSwDirectGdiEngine::SetPenSize(const TSize& aSize)
1.329 + {
1.330 + iPenSize = aSize;
1.331 +
1.332 + if ((iPenSize.iWidth >= 1) || (iPenSize.iHeight >= 1))
1.333 + {
1.334 + TInt err = PenAllocate();
1.335 + iDriver->SetError(err);
1.336 + }
1.337 + else
1.338 + {
1.339 + ResetPenArray();
1.340 + }
1.341 +
1.342 + iDotParam = 0;
1.343 + }
1.344 +
1.345 +/**
1.346 +@see MDirectGdiEngine::SetBrushPattern()
1.347 +
1.348 +@pre aPattern is a valid bitmap.
1.349 +*/
1.350 +TInt CSwDirectGdiEngine::SetBrushPattern(const CFbsBitmap& aPattern)
1.351 + {
1.352 + if (aPattern.ExtendedBitmapType() != KNullUid)
1.353 + {
1.354 + return KErrNotSupported; // Not supported for extended bitmaps
1.355 + }
1.356 +
1.357 + return iBrushBitmap.Duplicate(aPattern.Handle());
1.358 + }
1.359 +
1.360 +
1.361 +