Update contrib.
1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
22 #include <graphics/fbsrasterizer.h>
23 #include "bitgcextradata.h"
26 /** Clears a rectangular area.
28 The cleared area is filled with the current brush colour.The function
29 provides a concrete implementation of the pure virtual function
30 CBitmapContext::Clear(const TRect& aRect). The function
31 behaviour is the same as documented in that class. */
32 EXPORT_C void CFbsBitGc::Clear(const TRect& aRect)
34 if (CheckDevice(aRect))
39 if (UserClipRect(rcpy))
42 TBrushStyle tempbrushstyle = iBrushStyle;
43 iBrushStyle = ESolidBrush;
46 iDevice->DrawingBegin();
48 iDevice->DrawingEnd();
50 iBrushStyle = tempbrushstyle;
55 /** Clears the whole bitmap or a rectangular area of a bitmap.
57 The cleared area is filled with the current brush colour.
59 The function provides a concrete implementation of the pure virtual function
60 CBitmapContext::Clear(). The function behaviour is the same as documented
63 @see CBitmapContext::Clear() */
64 EXPORT_C void CFbsBitGc::Clear()
67 iDevice->iDrawDevice->GetDrawRect(deviceRect);
68 if ((iOrigin.iX!=0) || (iOrigin.iY!=0))
70 deviceRect.Move(-iOrigin);
75 /** Draws a single point.
77 The point is drawn with the current pen settings using the current
78 drawing mode.The function provides a concrete implementation of the
79 pure virtual function CGraphicsContext::Plot(). The
80 function behaviour is the same as documented in that class. */
81 EXPORT_C void CFbsBitGc::Plot(const TPoint& aPoint)
83 if (iPenStyle == ENullPen || (iPenSize.iWidth == 0 && iPenSize.iHeight == 0))
88 TRect plotRect(aPoint + iOrigin,TSize(1,1));
89 plotRect.Grow((iPenSize.iWidth >> 1) + 1,(iPenSize.iHeight >> 1) + 1);
90 if (!plotRect.Intersects(iUserClipRect))
94 iDevice->DrawingBegin();
96 iDevice->DrawingEnd();
99 void CFbsBitGc::DoPlot(const TPoint& aPoint)
101 CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
103 const TSize oneByOne(1,1);
104 const TPoint point(aPoint + iOrigin);
106 TRect temp(point,oneByOne);
107 if (iPenSize.iWidth > 1 || iPenSize.iHeight > 1)
108 temp.Grow(iPenSize.iWidth >> 1,iPenSize.iHeight >> 1);
111 const CGraphicsContext::TPenStyle penStyle = iPenStyle;
112 iPenStyle = CGraphicsContext::ESolidPen;
116 drawDevice->GetDrawRect(deviceRect);
119 const TInt limit = iDefaultRegionPtr->Count();
120 for (TInt count = 0; count < limit; count++)
122 iClipRect = (*iDefaultRegionPtr)[count];
123 if (!iClipRect.Intersects(temp))
126 iClipRect.Intersection(temp);
127 if (UserClipRect(iClipRect))
130 if (iPenSize == oneByOne)
132 if (iClipRect.Contains(point))
134 BG_ASSERT_DEBUG(point.iX >= deviceRect.iTl.iX, EBitgdiPanicOutOfBounds);
135 BG_ASSERT_DEBUG(point.iY >= deviceRect.iTl.iY, EBitgdiPanicOutOfBounds);
136 BG_ASSERT_DEBUG(point.iX <= deviceRect.iBr.iX, EBitgdiPanicOutOfBounds);
137 BG_ASSERT_DEBUG(point.iY <= deviceRect.iBr.iY, EBitgdiPanicOutOfBounds);
139 drawDevice->WriteRgb(point.iX,point.iY,iPenColor,iDrawMode);
142 else if (iPenSize.iWidth > 0 && iPenSize.iHeight > 0)
143 PenDrawClipped(point);
145 drawDevice->UpdateRegion(iClipRect);
148 iPenStyle = penStyle;
152 /** Sets the shadow area.
154 @param aRegion The region defining the shadow area. */
155 EXPORT_C void CFbsBitGc::ShadowArea(const TRegion* aRegion)
157 ShadowFadeArea(aRegion,CFbsDrawDevice::EShadow);
161 /** Sets the fade area.
163 @param aRegion The region defining the fade area. */
164 EXPORT_C void CFbsBitGc::FadeArea(const TRegion* aRegion)
166 ShadowFadeArea(aRegion,CFbsDrawDevice::EFade);
169 void CFbsBitGc::ShadowFadeArea(const TRegion* aRegion,TInt8 aShadowMode)
171 if (!aRegion || aRegion->CheckError())
174 CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
179 drawDevice->GetDrawRect(deviceRect);
181 TInt8 shadowMode = iShadowMode;
182 iShadowMode = aShadowMode;
184 CGraphicsAccelerator* ga = GraphicsAccelerator();
187 iDevice->DrawingBegin();
189 const TInt limit = aRegion->Count();
191 //use Graphics accelerator if available
194 if(iShadowMode & CFbsDrawDevice::EFade)
196 TInt gaOperationResult = KErrUnknown;
197 iDevice->DrawingEnd();
199 TGopFadeParams gopFadeParams;
200 gopFadeParams.iScale = iFadeWhiteMap-iFadeBlackMap+1;
201 gopFadeParams.iOffset = iFadeBlackMap;
203 for (count = 0; count < limit; count++)
205 iClipRect = (*aRegion)[count];
206 iClipRect.Move(iOrigin);
207 if(!iClipRect.Intersects(deviceRect))
210 iClipRect.Intersection(deviceRect);
213 gaOperationResult = ga->Operation(TGopFadeRect(iClipRect,gopFadeParams));
214 if(gaOperationResult != KErrNone)
217 if(gaOperationResult == KErrNone)
219 iDevice->DrawingBegin();
223 //use graphics contex
224 for (count = 0; count < limit; count++)
226 iClipRect = (*aRegion)[count];
227 iClipRect.Move(iOrigin);
228 if(!iClipRect.Intersects(deviceRect))
231 iClipRect.Intersection(deviceRect);
234 drawDevice->ShadowArea(iClipRect);
235 drawDevice->UpdateRegion(iClipRect);
238 iDevice->DrawingEnd();
241 iShadowMode = shadowMode;
244 // if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method
245 void CFbsBitGc::ClipFillLine(TPoint aLeft,TPoint aRight)
247 if (iBrushStyle == ENullBrush ||
248 aLeft.iY < iClipRect.iTl.iY || aLeft.iY >= iClipRect.iBr.iY)
251 aLeft.iX = Max(aLeft.iX,iClipRect.iTl.iX);
252 aRight.iX = Min(aRight.iX,iClipRect.iBr.iX-1);
253 if (aLeft.iX > aRight.iX)
256 BG_ASSERT_DEBUG(iUserClipRect.Contains(aLeft),EBitgdiPanicOutOfBounds);
258 TInt xcoord = aLeft.iX;
259 TInt length = aRight.iX - aLeft.iX + 1;
260 TPoint origin(iOrigin + iBrushOrigin);
262 BG_ASSERT_DEBUG(aLeft.iX + length <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
264 CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
269 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
271 case EPatternedBrush:
273 CBitwiseBitmap* brushBitmap = iBrushBitmap.Address();
274 BG_ASSERT_ALWAYS(iBrushUsed,EBitgdiPanicInvalidBitmap);
275 BG_ASSERT_ALWAYS(brushBitmap != NULL,EBitgdiPanicInvalidBitmap);
277 TRect sourcerect(aLeft,TSize(length,1));
278 sourcerect.Move(-origin);
279 DoBitBlt(aLeft,brushBitmap,iBrushBitmap.DataAddress(),iBrushBitmap.DataStride(),sourcerect);
282 case EHorizontalHatchBrush:
283 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
284 if (Abs((aLeft.iY - origin.iY) % 3) == 2)
285 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iPenColor,iDrawMode);
287 case EVerticalHatchBrush:
288 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
289 while (Abs((xcoord - origin.iX) % 3) != 2)
291 for (; xcoord < aLeft.iX + length; xcoord += 3)
292 drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
294 case ESquareCrossHatchBrush:
295 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
296 if (Abs((aLeft.iY - origin.iY) % 3) == 2)
297 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iPenColor,iDrawMode);
300 while (Abs((xcoord - origin.iX) % 3) != 2)
302 for (; xcoord < aLeft.iX + length; xcoord += 3)
303 drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
306 case EForwardDiagonalHatchBrush:
308 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
309 TInt diff = (origin.iX + origin.iY - aLeft.iX - aLeft.iY) % 3;
313 for (; xcoord < aLeft.iX + length; xcoord += 3)
314 drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
317 case ERearwardDiagonalHatchBrush:
319 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
320 TInt diff = (origin.iX - origin.iY - aLeft.iX + aLeft.iY) % 3;
324 for (; xcoord < aLeft.iX + length; xcoord += 3)
325 drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
328 case EDiamondCrossHatchBrush:
330 drawDevice->WriteRgbMulti(aLeft.iX,aLeft.iY,length,1,iBrushColor,iDrawMode);
331 TInt sum = aLeft.iX + aLeft.iY - origin.iX - origin.iY;
332 for (; xcoord < aLeft.iX + length; xcoord++,sum++)
333 if ((sum & 1) == 0 && ((sum & 3) != 0 || ((xcoord-origin.iX) & 1) == 1))
334 drawDevice->WriteRgb(xcoord,aLeft.iY,iPenColor,iDrawMode);
342 void CFbsBitGc::PenAllocate()
344 iFbsBitGcExtraData->ResetPenArray();
345 if (iPenSize.iWidth == 1 && iPenSize.iHeight == 1)
348 const TInt doublepenheight = iPenSize.iHeight << 1;
350 TInt* penArray = new TInt[doublepenheight];
354 iFbsBitGcExtraData->SetPenArray(penArray);
356 if (iPenSize.iWidth == 1 || iPenSize.iWidth == 2 || iPenSize.iHeight == 1 || iPenSize.iHeight == 2)
358 TInt* bitGcPenArray = iFbsBitGcExtraData->PenArray();
359 for (TInt count = 0; count < iPenSize.iHeight; count += 2)
361 bitGcPenArray[doublepenheight - count - 2] = 0;
362 bitGcPenArray[doublepenheight - count - 1] = iPenSize.iWidth - 1;
363 bitGcPenArray[count] = 0;
364 bitGcPenArray[count + 1] = iPenSize.iWidth - 1;
371 ellipse.Construct(TRect(iPenSize));
372 TInt* bitGcPenArray = iFbsBitGcExtraData->PenArray();
373 for (TInt count = 0; count < iPenSize.iHeight; count += 2)
375 //coverity[check_return]
376 //coverity[unchecked_value]
377 ellipse.NextStep(tl,tr,bl,br);
378 bitGcPenArray[doublepenheight - count - 2] = bl.iX;
379 bitGcPenArray[doublepenheight - count - 1] = br.iX;
380 bitGcPenArray[count] = tl.iX;
381 bitGcPenArray[count + 1] = tr.iX;
386 void CFbsBitGc::PenDrawClipped(TPoint aPoint)
388 BG_ASSERT_DEBUG(iPenSize.iWidth > 0,EBitgdiPanicZeroLength);
389 BG_ASSERT_DEBUG(iPenSize.iHeight > 0,EBitgdiPanicZeroLength);
391 aPoint.iX -= ((iPenSize.iWidth - 1) >> 1);
392 aPoint.iY -= ((iPenSize.iHeight - 1) >> 1);
394 BG_ASSERT_DEBUG(iClipRect.iTl.iX >= iUserClipRect.iTl.iX,EBitgdiPanicOutOfBounds);
395 BG_ASSERT_DEBUG(iClipRect.iTl.iY >= iUserClipRect.iTl.iY,EBitgdiPanicOutOfBounds);
396 BG_ASSERT_DEBUG(iClipRect.iBr.iX <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
397 BG_ASSERT_DEBUG(iClipRect.iBr.iY <= iUserClipRect.iBr.iY,EBitgdiPanicOutOfBounds);
399 CFbsDrawDevice* drawDevice = iDevice->iDrawDevice;
401 if (iPenSize.iWidth == 1 && iPenSize.iHeight == 1)
403 if (iPenStyle == CGraphicsContext::ESolidPen || (iDotMask & (1 << (iDotParam % iDotLength))))
404 if (iClipRect.Contains(aPoint))
405 drawDevice->WriteRgb(aPoint.iX,aPoint.iY,iPenColor,iDrawMode);
407 else if (iFbsBitGcExtraData->PenArray())
409 TInt ycoord = aPoint.iY;
410 const TInt maxdim = Max(iPenSize.iWidth,iPenSize.iHeight);
411 const TInt doublepenheight = iPenSize.iHeight << 1;
413 if (iPenStyle == CGraphicsContext::ESolidPen || (iDotMask & (1 << ((iDotParam / maxdim) % iDotLength))))
415 for (TInt ix = 0; ix < doublepenheight; ycoord++,ix += 2)
417 if (ycoord >= iClipRect.iTl.iY && ycoord < iClipRect.iBr.iY)
419 TInt left = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
420 TInt right = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix+1];
421 if (left < iClipRect.iTl.iX)
422 left = iClipRect.iTl.iX;
423 if (right >= iClipRect.iBr.iX)
424 right = iClipRect.iBr.iX - 1;
426 drawDevice->WriteRgbMulti(left,ycoord,right - left + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
435 ellipse.Construct(TRect(aPoint,iPenSize));
436 while (!ellipse.NextStep(tl,tr,bl,br))
438 if (tl.iY >= iClipRect.iTl.iY && tl.iY < iClipRect.iBr.iY)
440 if (tl.iX < iClipRect.iTl.iX)
441 tl.iX = iClipRect.iTl.iX;
442 if (tr.iX >= iClipRect.iBr.iX)
443 tr.iX = iClipRect.iBr.iX-1;
445 drawDevice->WriteRgbMulti(tl.iX,tl.iY,tr.iX - tl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
447 if (bl.iY >= iClipRect.iTl.iY && bl.iY < iClipRect.iBr.iY)
449 if (bl.iX < iClipRect.iTl.iX)
450 bl.iX = iClipRect.iTl.iX;
451 if (br.iX >= iClipRect.iBr.iX)
452 br.iX = iClipRect.iBr.iX - 1;
454 drawDevice->WriteRgbMulti(bl.iX,bl.iY,br.iX - bl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
458 if (tl.iY == bl.iY && tl.iY >= iClipRect.iTl.iY && tl.iY < iClipRect.iBr.iY)
460 if (tl.iX < iClipRect.iTl.iX)
461 tl.iX = iClipRect.iTl.iX;
462 if (tr.iX >= iClipRect.iBr.iX)
463 tr.iX = iClipRect.iBr.iX - 1;
465 drawDevice->WriteRgbMulti(tl.iX,tl.iY,tr.iX - tl.iX + 1,1,iPenColor,CGraphicsContext::EDrawModePEN);
470 void CFbsBitGc::PenDrawDeferred(TPoint aPoint,TInt* aArray,TInt aFirstElement)
472 BG_ASSERT_DEBUG(iFbsBitGcExtraData->PenArray(),EBitgdiPanicZeroLength);
473 BG_ASSERT_DEBUG(iPenSize.iWidth > 0,EBitgdiPanicZeroLength);
474 BG_ASSERT_DEBUG(iPenSize.iHeight > 0,EBitgdiPanicZeroLength);
475 BG_ASSERT_DEBUG(iClipRect.iTl.iX >= iUserClipRect.iTl.iX,EBitgdiPanicOutOfBounds);
476 BG_ASSERT_DEBUG(iClipRect.iTl.iY >= iUserClipRect.iTl.iY,EBitgdiPanicOutOfBounds);
477 BG_ASSERT_DEBUG(iClipRect.iBr.iX <= iUserClipRect.iBr.iX,EBitgdiPanicOutOfBounds);
478 BG_ASSERT_DEBUG(iClipRect.iBr.iY <= iUserClipRect.iBr.iY,EBitgdiPanicOutOfBounds);
480 aPoint.iX -= ((iPenSize.iWidth - 1) >> 1);
481 const TInt doublepenheight = iPenSize.iHeight << 1;
483 for (TInt ix = 0; ix < doublepenheight; ix++,aFirstElement++)
485 if (aFirstElement == doublepenheight)
487 TInt newval = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
488 if (newval < aArray[aFirstElement])
489 aArray[aFirstElement] = newval;
493 newval = aPoint.iX + iFbsBitGcExtraData->PenArray()[ix];
494 if (newval > aArray[aFirstElement])
495 aArray[aFirstElement] = newval;
499 //Default implementation of reserved virtual
500 EXPORT_C void CFbsBitGc::Reserved_CGraphicsContext_2()
502 CBitmapContext::Reserved_CGraphicsContext_2();
505 //Default implementation of reserved virtual
506 EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_1()
508 CBitmapContext::Reserved_CBitmapContext_1();
511 //Default implementation of reserved virtual
512 EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_2()
514 CBitmapContext::Reserved_CBitmapContext_2();
517 //Default implementation of reserved virtual
518 EXPORT_C void CFbsBitGc::Reserved_CBitmapContext_3()
520 CBitmapContext::Reserved_CBitmapContext_3();
523 //Default implementation of reserved virtual
524 EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_1()
528 //Default implementation of reserved virtual
529 EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_2()
533 //Default implementation of reserved virtual
534 EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_3()
538 //Default implementation of reserved virtual
539 EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_4()
543 //Default implementation of reserved virtual
544 EXPORT_C void CFbsBitGc::Reserved_CFbsBitGc_5()