os/graphics/graphicsdeviceinterface/bitgdi/sbit/GRAPHICS.CPP
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <fntstore.h>
sl@0
    17
#include <bitmap.h>
sl@0
    18
#include <bitstd.h>
sl@0
    19
#include <bitdev.h>
sl@0
    20
#include "BITPANIC.H"
sl@0
    21
#include <bitdraw.h>
sl@0
    22
#include <graphics/fbsrasterizer.h>
sl@0
    23
#include "bitgcextradata.h"
sl@0
    24
sl@0
    25
sl@0
    26
/** Clears a rectangular area.
sl@0
    27
sl@0
    28
The cleared area is filled with the current brush colour.The function
sl@0
    29
provides a concrete implementation of the pure virtual function
sl@0
    30
CBitmapContext::Clear(const TRect& aRect). The function
sl@0
    31
behaviour is the same as documented in that class. */	
sl@0
    32
EXPORT_C void CFbsBitGc::Clear(const TRect& aRect)
sl@0
    33
    {
sl@0
    34
	if (CheckDevice(aRect))
sl@0
    35
		return;
sl@0
    36
sl@0
    37
	TRect rcpy(aRect);
sl@0
    38
	rcpy.Move(iOrigin);
sl@0
    39
	if (UserClipRect(rcpy))
sl@0
    40
		return;
sl@0
    41
sl@0
    42
	TBrushStyle tempbrushstyle = iBrushStyle;
sl@0
    43
	iBrushStyle = ESolidBrush;
sl@0
    44
sl@0
    45
	SetupDevice();
sl@0
    46
	iDevice->DrawingBegin();
sl@0
    47
	RectFill(rcpy);
sl@0
    48
	iDevice->DrawingEnd();
sl@0
    49
sl@0
    50
	iBrushStyle = tempbrushstyle;
sl@0
    51
	}
sl@0
    52
sl@0
    53
sl@0
    54
sl@0
    55
/** Clears the whole bitmap or a rectangular area of a bitmap.
sl@0
    56
sl@0
    57
The cleared area is filled with the current brush colour.
sl@0
    58
sl@0
    59
The function provides a concrete implementation of the pure virtual function 
sl@0
    60
CBitmapContext::Clear(). The function behaviour is the same as documented 
sl@0
    61
in that class. 
sl@0
    62
sl@0
    63
@see CBitmapContext::Clear() */
sl@0
    64
EXPORT_C void CFbsBitGc::Clear()
sl@0
    65
	{
sl@0
    66
	TRect deviceRect;
sl@0
    67
	iDevice->iDrawDevice->GetDrawRect(deviceRect);
sl@0
    68
	if ((iOrigin.iX!=0) || (iOrigin.iY!=0))
sl@0
    69
		{
sl@0
    70
		deviceRect.Move(-iOrigin);
sl@0
    71
		}
sl@0
    72
	Clear(deviceRect);
sl@0
    73
	}
sl@0
    74
sl@0
    75
/** Draws a single point.
sl@0
    76
sl@0
    77
The point is drawn with the current pen settings using the current
sl@0
    78
drawing mode.The function provides a concrete implementation of the
sl@0
    79
pure virtual function CGraphicsContext::Plot(). The
sl@0
    80
function behaviour is the same as documented in that class. */
sl@0
    81
EXPORT_C void CFbsBitGc::Plot(const TPoint& aPoint)
sl@0
    82
	{
sl@0
    83
	if (iPenStyle == ENullPen || (iPenSize.iWidth == 0 && iPenSize.iHeight == 0))
sl@0
    84
		return;
sl@0
    85
sl@0
    86
	CheckDevice();
sl@0
    87
sl@0
    88
	TRect plotRect(aPoint + iOrigin,TSize(1,1));
sl@0
    89
	plotRect.Grow((iPenSize.iWidth >> 1) + 1,(iPenSize.iHeight >> 1) + 1);
sl@0
    90
	if (!plotRect.Intersects(iUserClipRect))
sl@0
    91
		return;
sl@0
    92
sl@0
    93
	SetupDevice();
sl@0
    94
	iDevice->DrawingBegin();
sl@0
    95
	DoPlot(aPoint);
sl@0
    96
	iDevice->DrawingEnd();
sl@0
    97
	}
sl@0
    98
sl@0
    99
void CFbsBitGc::DoPlot(const TPoint& aPoint)
sl@0
   100
	{
sl@0
   101
	CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
sl@0
   102
sl@0
   103
	const TSize oneByOne(1,1);
sl@0
   104
	const TPoint point(aPoint + iOrigin);
sl@0
   105
sl@0
   106
	TRect temp(point,oneByOne);
sl@0
   107
	if (iPenSize.iWidth > 1 || iPenSize.iHeight > 1)
sl@0
   108
		temp.Grow(iPenSize.iWidth >> 1,iPenSize.iHeight >> 1);
sl@0
   109
	AddRect(temp);
sl@0
   110
sl@0
   111
	const CGraphicsContext::TPenStyle penStyle = iPenStyle;
sl@0
   112
	iPenStyle = CGraphicsContext::ESolidPen;
sl@0
   113
sl@0
   114
#if defined(_DEBUG)
sl@0
   115
	TRect deviceRect;
sl@0
   116
	drawDevice->GetDrawRect(deviceRect);
sl@0
   117
#endif
sl@0
   118
sl@0
   119
	const TInt limit = iDefaultRegionPtr->Count();
sl@0
   120
	for (TInt count = 0; count < limit; count++)
sl@0
   121
		{
sl@0
   122
		iClipRect = (*iDefaultRegionPtr)[count];
sl@0
   123
		if (!iClipRect.Intersects(temp))
sl@0
   124
			continue;
sl@0
   125
sl@0
   126
		iClipRect.Intersection(temp);
sl@0
   127
		if (UserClipRect(iClipRect))
sl@0
   128
			continue;
sl@0
   129
sl@0
   130
		if (iPenSize == oneByOne)
sl@0
   131
			{
sl@0
   132
			if (iClipRect.Contains(point))
sl@0
   133
				{
sl@0
   134
				BG_ASSERT_DEBUG(point.iX >= deviceRect.iTl.iX, EBitgdiPanicOutOfBounds);
sl@0
   135
				BG_ASSERT_DEBUG(point.iY >= deviceRect.iTl.iY, EBitgdiPanicOutOfBounds);
sl@0
   136
				BG_ASSERT_DEBUG(point.iX <= deviceRect.iBr.iX, EBitgdiPanicOutOfBounds);
sl@0
   137
				BG_ASSERT_DEBUG(point.iY <= deviceRect.iBr.iY, EBitgdiPanicOutOfBounds);
sl@0
   138
sl@0
   139
				drawDevice->WriteRgb(point.iX,point.iY,iPenColor,iDrawMode);
sl@0
   140
				}
sl@0
   141
			}
sl@0
   142
		else if (iPenSize.iWidth > 0 && iPenSize.iHeight > 0)
sl@0
   143
			PenDrawClipped(point);
sl@0
   144
sl@0
   145
		drawDevice->UpdateRegion(iClipRect);
sl@0
   146
		}
sl@0
   147
sl@0
   148
	iPenStyle = penStyle;
sl@0
   149
	}
sl@0
   150
sl@0
   151
sl@0
   152
/** Sets the shadow area.
sl@0
   153
sl@0
   154
@param aRegion The region defining the shadow area. */
sl@0
   155
EXPORT_C void CFbsBitGc::ShadowArea(const TRegion* aRegion)
sl@0
   156
	{
sl@0
   157
	ShadowFadeArea(aRegion,CFbsDrawDevice::EShadow);
sl@0
   158
	}
sl@0
   159
sl@0
   160
 
sl@0
   161
/** Sets the fade area.
sl@0
   162
sl@0
   163
@param aRegion The region defining the fade area. */
sl@0
   164
EXPORT_C void CFbsBitGc::FadeArea(const TRegion* aRegion)
sl@0
   165
	{
sl@0
   166
	ShadowFadeArea(aRegion,CFbsDrawDevice::EFade);
sl@0
   167
	}
sl@0
   168
sl@0
   169
void CFbsBitGc::ShadowFadeArea(const TRegion* aRegion,TInt8 aShadowMode)
sl@0
   170
	{
sl@0
   171
	if (!aRegion || aRegion->CheckError())
sl@0
   172
		return;
sl@0
   173
sl@0
   174
	CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
sl@0
   175
sl@0
   176
	CheckDevice();
sl@0
   177
sl@0
   178
	TRect deviceRect;
sl@0
   179
	drawDevice->GetDrawRect(deviceRect);
sl@0
   180
sl@0
   181
	TInt8 shadowMode = iShadowMode;
sl@0
   182
	iShadowMode = aShadowMode;
sl@0
   183
sl@0
   184
	CGraphicsAccelerator* ga = GraphicsAccelerator();
sl@0
   185
sl@0
   186
	SetupDevice();
sl@0
   187
	iDevice->DrawingBegin();
sl@0
   188
sl@0
   189
	const TInt limit = aRegion->Count();
sl@0
   190
	TInt count;
sl@0
   191
    //use Graphics accelerator if available
sl@0
   192
	if(ga)
sl@0
   193
		{
sl@0
   194
		if(iShadowMode & CFbsDrawDevice::EFade)
sl@0
   195
			{
sl@0
   196
	        TInt gaOperationResult = KErrUnknown;
sl@0
   197
            iDevice->DrawingEnd();
sl@0
   198
sl@0
   199
			TGopFadeParams gopFadeParams;
sl@0
   200
			gopFadeParams.iScale = iFadeWhiteMap-iFadeBlackMap+1;
sl@0
   201
			gopFadeParams.iOffset = iFadeBlackMap;
sl@0
   202
sl@0
   203
			for (count = 0; count < limit; count++)
sl@0
   204
				{
sl@0
   205
				iClipRect = (*aRegion)[count];
sl@0
   206
				iClipRect.Move(iOrigin);
sl@0
   207
				if(!iClipRect.Intersects(deviceRect))
sl@0
   208
					continue;
sl@0
   209
sl@0
   210
				iClipRect.Intersection(deviceRect);
sl@0
   211
				AddRect(iClipRect);
sl@0
   212
sl@0
   213
				gaOperationResult = ga->Operation(TGopFadeRect(iClipRect,gopFadeParams));
sl@0
   214
				if(gaOperationResult != KErrNone)
sl@0
   215
					break;
sl@0
   216
				}
sl@0
   217
			if(gaOperationResult == KErrNone)
sl@0
   218
				goto finish;
sl@0
   219
			iDevice->DrawingBegin();
sl@0
   220
			}
sl@0
   221
		}
sl@0
   222
sl@0
   223
    //use graphics contex
sl@0
   224
	for (count = 0; count < limit; count++)
sl@0
   225
		{
sl@0
   226
		iClipRect = (*aRegion)[count];
sl@0
   227
		iClipRect.Move(iOrigin);
sl@0
   228
		if(!iClipRect.Intersects(deviceRect))
sl@0
   229
			continue;
sl@0
   230
sl@0
   231
		iClipRect.Intersection(deviceRect);
sl@0
   232
		AddRect(iClipRect);
sl@0
   233
sl@0
   234
		drawDevice->ShadowArea(iClipRect);
sl@0
   235
		drawDevice->UpdateRegion(iClipRect);
sl@0
   236
		}
sl@0
   237
sl@0
   238
	iDevice->DrawingEnd();
sl@0
   239
sl@0
   240
finish:
sl@0
   241
	iShadowMode = shadowMode;
sl@0
   242
	}
sl@0
   243
sl@0
   244
// if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method
sl@0
   245
void CFbsBitGc::ClipFillLine(TPoint aLeft,TPoint aRight)
sl@0
   246
	{
sl@0
   247
	if (iBrushStyle == ENullBrush || 
sl@0
   248
		aLeft.iY < iClipRect.iTl.iY || aLeft.iY >= iClipRect.iBr.iY)
sl@0
   249
		return;
sl@0
   250
sl@0
   251
	aLeft.iX = Max(aLeft.iX,iClipRect.iTl.iX);
sl@0
   252
	aRight.iX = Min(aRight.iX,iClipRect.iBr.iX-1);
sl@0
   253
	if (aLeft.iX > aRight.iX)
sl@0
   254
		return;
sl@0
   255
sl@0
   256
	BG_ASSERT_DEBUG(iUserClipRect.Contains(aLeft),EBitgdiPanicOutOfBounds);
sl@0
   257
sl@0
   258
	TInt xcoord = aLeft.iX;
sl@0
   259
	TInt length = aRight.iX - aLeft.iX + 1;
sl@0
   260
	TPoint origin(iOrigin + iBrushOrigin);
sl@0
   261
sl@0
   262
	BG_ASSERT_DEBUG(aLeft.iX + length <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
sl@0
   263
sl@0
   264
	CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
sl@0
   265
sl@0
   266
	switch(iBrushStyle)
sl@0
   267
		{
sl@0
   268
	case ESolidBrush:
sl@0
   269
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   270
		return;
sl@0
   271
	case EPatternedBrush:
sl@0
   272
		{
sl@0
   273
		CBitwiseBitmap* brushBitmap = iBrushBitmap.Address();
sl@0
   274
		BG_ASSERT_ALWAYS(iBrushUsed,EBitgdiPanicInvalidBitmap);
sl@0
   275
		BG_ASSERT_ALWAYS(brushBitmap != NULL,EBitgdiPanicInvalidBitmap);
sl@0
   276
sl@0
   277
		TRect sourcerect(aLeft,TSize(length,1));
sl@0
   278
		sourcerect.Move(-origin);
sl@0
   279
		DoBitBlt(aLeft,brushBitmap,iBrushBitmap.DataAddress(),iBrushBitmap.DataStride(),sourcerect);
sl@0
   280
		return;
sl@0
   281
		}
sl@0
   282
	case EHorizontalHatchBrush:
sl@0
   283
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   284
		if (Abs((aLeft.iY - origin.iY) % 3) == 2)
sl@0
   285
			drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iPenColor,iDrawMode);
sl@0
   286
		return;
sl@0
   287
	case EVerticalHatchBrush:
sl@0
   288
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   289
		while (Abs((xcoord - origin.iX) % 3) != 2)
sl@0
   290
			xcoord++;
sl@0
   291
		for (; xcoord < aLeft.iX + length; xcoord += 3)
sl@0
   292
			drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
sl@0
   293
		return;
sl@0
   294
	case ESquareCrossHatchBrush:
sl@0
   295
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   296
		if (Abs((aLeft.iY - origin.iY) % 3) == 2)
sl@0
   297
			drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iPenColor,iDrawMode);
sl@0
   298
		else
sl@0
   299
			{
sl@0
   300
			while (Abs((xcoord - origin.iX) % 3) != 2)
sl@0
   301
				xcoord++;
sl@0
   302
			for (; xcoord < aLeft.iX + length; xcoord += 3)
sl@0
   303
				drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
sl@0
   304
			}
sl@0
   305
		return;
sl@0
   306
	case EForwardDiagonalHatchBrush:
sl@0
   307
		{
sl@0
   308
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   309
		TInt diff = (origin.iX + origin.iY - aLeft.iX - aLeft.iY) % 3;
sl@0
   310
		if (diff < 0)
sl@0
   311
			diff += 3;
sl@0
   312
		xcoord += diff;
sl@0
   313
		for (; xcoord < aLeft.iX + length; xcoord += 3)
sl@0
   314
			drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
sl@0
   315
		}
sl@0
   316
		return;
sl@0
   317
	case ERearwardDiagonalHatchBrush:
sl@0
   318
		{
sl@0
   319
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   320
		TInt diff = (origin.iX - origin.iY - aLeft.iX + aLeft.iY) % 3;
sl@0
   321
		if (diff < 0)
sl@0
   322
			diff += 3;
sl@0
   323
		xcoord += diff;
sl@0
   324
		for (; xcoord < aLeft.iX + length; xcoord += 3)
sl@0
   325
			drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
sl@0
   326
		}
sl@0
   327
		return;
sl@0
   328
	case EDiamondCrossHatchBrush:
sl@0
   329
		{
sl@0
   330
		drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
sl@0
   331
		TInt sum = aLeft.iX + aLeft.iY - origin.iX - origin.iY;
sl@0
   332
		for (; xcoord < aLeft.iX + length; xcoord++,sum++)
sl@0
   333
			if ((sum & 1) == 0 && ((sum & 3) != 0 || ((xcoord-origin.iX) & 1) == 1))
sl@0
   334
				drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
sl@0
   335
		}
sl@0
   336
		return;
sl@0
   337
	default:
sl@0
   338
		return;
sl@0
   339
		}
sl@0
   340
	}
sl@0
   341
sl@0
   342
void CFbsBitGc::PenAllocate()
sl@0
   343
	{
sl@0
   344
	iFbsBitGcExtraData->ResetPenArray();
sl@0
   345
	if (iPenSize.iWidth == 1 && iPenSize.iHeight == 1)
sl@0
   346
		return;
sl@0
   347
sl@0
   348
	const TInt doublepenheight = iPenSize.iHeight << 1;
sl@0
   349
sl@0
   350
	TInt* penArray = new TInt[doublepenheight];
sl@0
   351
	if (!penArray)
sl@0
   352
		return;
sl@0
   353
sl@0
   354
	iFbsBitGcExtraData->SetPenArray(penArray);
sl@0
   355
sl@0
   356
	if (iPenSize.iWidth == 1 || iPenSize.iWidth == 2 || iPenSize.iHeight == 1 || iPenSize.iHeight == 2)
sl@0
   357
		{
sl@0
   358
		TInt* bitGcPenArray = iFbsBitGcExtraData->PenArray();
sl@0
   359
		for (TInt count = 0; count < iPenSize.iHeight; count += 2)
sl@0
   360
			{
sl@0
   361
			bitGcPenArray[doublepenheight - count - 2] = 0;
sl@0
   362
			bitGcPenArray[doublepenheight - count - 1] = iPenSize.iWidth - 1;
sl@0
   363
			bitGcPenArray[count] = 0;
sl@0
   364
			bitGcPenArray[count + 1] = iPenSize.iWidth - 1;
sl@0
   365
			}
sl@0
   366
		}
sl@0
   367
	else
sl@0
   368
		{
sl@0
   369
		TPoint tl,tr,bl,br;
sl@0
   370
		TEllipse ellipse;
sl@0
   371
		ellipse.Construct(TRect(iPenSize));
sl@0
   372
		TInt* bitGcPenArray = iFbsBitGcExtraData->PenArray();
sl@0
   373
		for (TInt count = 0; count < iPenSize.iHeight; count += 2)
sl@0
   374
			{
sl@0
   375
			//coverity[check_return]
sl@0
   376
			//coverity[unchecked_value]
sl@0
   377
			ellipse.NextStep(tl,tr,bl,br);
sl@0
   378
			bitGcPenArray[doublepenheight - count - 2] = bl.iX;
sl@0
   379
			bitGcPenArray[doublepenheight - count - 1] = br.iX;
sl@0
   380
			bitGcPenArray[count] = tl.iX;
sl@0
   381
			bitGcPenArray[count + 1] = tr.iX;
sl@0
   382
			}
sl@0
   383
		}
sl@0
   384
	}
sl@0
   385
sl@0
   386
void CFbsBitGc::PenDrawClipped(TPoint aPoint)
sl@0
   387
	{
sl@0
   388
	BG_ASSERT_DEBUG(iPenSize.iWidth > 0,EBitgdiPanicZeroLength);
sl@0
   389
	BG_ASSERT_DEBUG(iPenSize.iHeight > 0,EBitgdiPanicZeroLength);
sl@0
   390
sl@0
   391
	aPoint.iX -= ((iPenSize.iWidth - 1) >> 1);
sl@0
   392
	aPoint.iY -= ((iPenSize.iHeight - 1) >> 1);
sl@0
   393
sl@0
   394
	BG_ASSERT_DEBUG(iClipRect.iTl.iX >= iUserClipRect.iTl.iX,EBitgdiPanicOutOfBounds);
sl@0
   395
	BG_ASSERT_DEBUG(iClipRect.iTl.iY >= iUserClipRect.iTl.iY,EBitgdiPanicOutOfBounds);
sl@0
   396
	BG_ASSERT_DEBUG(iClipRect.iBr.iX <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
sl@0
   397
	BG_ASSERT_DEBUG(iClipRect.iBr.iY <= iUserClipRect.iBr.iY,EBitgdiPanicOutOfBounds);
sl@0
   398
sl@0
   399
	CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
sl@0
   400
sl@0
   401
	if (iPenSize.iWidth == 1 && iPenSize.iHeight == 1)
sl@0
   402
		{
sl@0
   403
		if (iPenStyle == CGraphicsContext::ESolidPen || (iDotMask & (1 << (iDotParam % iDotLength))))
sl@0
   404
			if (iClipRect.Contains(aPoint))
sl@0
   405
				drawDevice->WriteRgb(aPoint.iX,aPoint.iY,iPenColor,iDrawMode);
sl@0
   406
		}
sl@0
   407
	else if (iFbsBitGcExtraData->PenArray())
sl@0
   408
		{
sl@0
   409
		TInt ycoord = aPoint.iY;
sl@0
   410
		const TInt maxdim = Max(iPenSize.iWidth,iPenSize.iHeight);
sl@0
   411
		const TInt doublepenheight = iPenSize.iHeight << 1;
sl@0
   412
sl@0
   413
		if (iPenStyle == CGraphicsContext::ESolidPen || (iDotMask & (1 << ((iDotParam / maxdim) % iDotLength))))
sl@0
   414
			{
sl@0
   415
			for (TInt ix = 0; ix < doublepenheight; ycoord++,ix += 2)
sl@0
   416
				{
sl@0
   417
				if (ycoord >= iClipRect.iTl.iY && ycoord < iClipRect.iBr.iY)
sl@0
   418
					{
sl@0
   419
					TInt left = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
sl@0
   420
					TInt right = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix+1];
sl@0
   421
					if (left < iClipRect.iTl.iX)
sl@0
   422
						left = iClipRect.iTl.iX;
sl@0
   423
					if (right >= iClipRect.iBr.iX)
sl@0
   424
						right = iClipRect.iBr.iX - 1;
sl@0
   425
					if (left <= right)
sl@0
   426
						drawDevice->WriteRgbMulti(left,ycoord,right - left + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
sl@0
   427
					}
sl@0
   428
				}
sl@0
   429
			}
sl@0
   430
		}
sl@0
   431
	else
sl@0
   432
		{
sl@0
   433
		TPoint tl,tr,bl,br;
sl@0
   434
		TEllipse ellipse;
sl@0
   435
		ellipse.Construct(TRect(aPoint,iPenSize));
sl@0
   436
		while (!ellipse.NextStep(tl,tr,bl,br))
sl@0
   437
			{
sl@0
   438
			if (tl.iY >= iClipRect.iTl.iY && tl.iY < iClipRect.iBr.iY)
sl@0
   439
				{
sl@0
   440
				if (tl.iX < iClipRect.iTl.iX)
sl@0
   441
					tl.iX = iClipRect.iTl.iX;
sl@0
   442
				if (tr.iX >= iClipRect.iBr.iX)
sl@0
   443
					tr.iX = iClipRect.iBr.iX-1;
sl@0
   444
				if (tl.iX <= tr.iX)
sl@0
   445
					drawDevice->WriteRgbMulti(tl.iX,tl.iY,tr.iX - tl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
sl@0
   446
				}
sl@0
   447
			if (bl.iY >= iClipRect.iTl.iY && bl.iY < iClipRect.iBr.iY)
sl@0
   448
				{
sl@0
   449
				if (bl.iX < iClipRect.iTl.iX)
sl@0
   450
					bl.iX = iClipRect.iTl.iX;
sl@0
   451
				if (br.iX >= iClipRect.iBr.iX)
sl@0
   452
					br.iX = iClipRect.iBr.iX - 1;
sl@0
   453
				if (bl.iX <= br.iX)
sl@0
   454
					drawDevice->WriteRgbMulti(bl.iX,bl.iY,br.iX - bl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
sl@0
   455
				}
sl@0
   456
			}
sl@0
   457
sl@0
   458
		if (tl.iY == bl.iY && tl.iY >= iClipRect.iTl.iY && tl.iY < iClipRect.iBr.iY)
sl@0
   459
			{
sl@0
   460
			if (tl.iX < iClipRect.iTl.iX)
sl@0
   461
				tl.iX = iClipRect.iTl.iX;
sl@0
   462
			if (tr.iX >= iClipRect.iBr.iX)
sl@0
   463
				tr.iX = iClipRect.iBr.iX - 1;
sl@0
   464
			if (tl.iX <= tr.iX)
sl@0
   465
				drawDevice->WriteRgbMulti(tl.iX,tl.iY,tr.iX - tl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
sl@0
   466
			}
sl@0
   467
		}
sl@0
   468
	}
sl@0
   469
sl@0
   470
void CFbsBitGc::PenDrawDeferred(TPoint aPoint,TInt* aArray,TInt aFirstElement)
sl@0
   471
	{
sl@0
   472
	BG_ASSERT_DEBUG(iFbsBitGcExtraData->PenArray(),EBitgdiPanicZeroLength);
sl@0
   473
	BG_ASSERT_DEBUG(iPenSize.iWidth > 0,EBitgdiPanicZeroLength);
sl@0
   474
	BG_ASSERT_DEBUG(iPenSize.iHeight > 0,EBitgdiPanicZeroLength);
sl@0
   475
	BG_ASSERT_DEBUG(iClipRect.iTl.iX >= iUserClipRect.iTl.iX,EBitgdiPanicOutOfBounds);
sl@0
   476
	BG_ASSERT_DEBUG(iClipRect.iTl.iY >= iUserClipRect.iTl.iY,EBitgdiPanicOutOfBounds);
sl@0
   477
	BG_ASSERT_DEBUG(iClipRect.iBr.iX <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
sl@0
   478
	BG_ASSERT_DEBUG(iClipRect.iBr.iY <= iUserClipRect.iBr.iY,EBitgdiPanicOutOfBounds);
sl@0
   479
sl@0
   480
	aPoint.iX -= ((iPenSize.iWidth - 1) >> 1);
sl@0
   481
	const TInt doublepenheight = iPenSize.iHeight << 1;
sl@0
   482
sl@0
   483
	for (TInt ix = 0; ix < doublepenheight; ix++,aFirstElement++)
sl@0
   484
		{
sl@0
   485
		if (aFirstElement == doublepenheight)
sl@0
   486
			aFirstElement = 0;
sl@0
   487
		TInt newval = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
sl@0
   488
		if (newval < aArray[aFirstElement])
sl@0
   489
			aArray[aFirstElement] = newval;
sl@0
   490
sl@0
   491
		ix++;
sl@0
   492
		aFirstElement++;
sl@0
   493
		newval = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
sl@0
   494
		if (newval > aArray[aFirstElement])
sl@0
   495
			aArray[aFirstElement] = newval;
sl@0
   496
		}
sl@0
   497
	}
sl@0
   498
sl@0
   499
//Default implementation of reserved virtual
sl@0
   500
EXPORT_C void CFbsBitGc::Reserved_CGraphicsContext_2()
sl@0
   501
	{
sl@0
   502
	CBitmapContext::Reserved_CGraphicsContext_2();
sl@0
   503
	}
sl@0
   504
sl@0
   505
//Default implementation of reserved virtual
sl@0
   506
EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_1()
sl@0
   507
	{
sl@0
   508
	CBitmapContext::Reserved_CBitmapContext_1();
sl@0
   509
	}
sl@0
   510
sl@0
   511
//Default implementation of reserved virtual
sl@0
   512
EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_2()
sl@0
   513
	{
sl@0
   514
	CBitmapContext::Reserved_CBitmapContext_2();
sl@0
   515
	}
sl@0
   516
sl@0
   517
//Default implementation of reserved virtual
sl@0
   518
EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_3()
sl@0
   519
	{
sl@0
   520
	CBitmapContext::Reserved_CBitmapContext_3();
sl@0
   521
	}
sl@0
   522
sl@0
   523
//Default implementation of reserved virtual
sl@0
   524
EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_1()
sl@0
   525
	{
sl@0
   526
	}
sl@0
   527
sl@0
   528
//Default implementation of reserved virtual
sl@0
   529
EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_2()
sl@0
   530
	{
sl@0
   531
	}
sl@0
   532
sl@0
   533
//Default implementation of reserved virtual
sl@0
   534
EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_3()
sl@0
   535
	{
sl@0
   536
	}
sl@0
   537
sl@0
   538
//Default implementation of reserved virtual
sl@0
   539
EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_4()
sl@0
   540
	{
sl@0
   541
	}
sl@0
   542
sl@0
   543
//Default implementation of reserved virtual
sl@0
   544
EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_5()
sl@0
   545
	{
sl@0
   546
	}