--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/haitest/bspsvs/suite/common/src/DrawUtils.cpp Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2005-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 "DrawUtils.h"
+
+//These are for masks and shifts for rgb 332 data format.
+const TUint Blue_Mask =0x03;
+const TUint Green_Mask =0x1C;
+const TUint Red_Mask =0xE0;
+const TUint BBP8_GreenShift =2;
+const TUint BBP8_RedShift =5;
+
+//Number of bits per pixel
+const TInt BPP8 =8;
+const TInt BPP12 =12;
+const TInt BPP16 =16;
+const TInt BPP24 =24;
+const TInt BPP32 =32;
+
+//16BPP has rgb565 format rrrrrggggggbbbbb.
+const TInt BPP16RedShift =13;
+const TInt BPP16GreenShift =8;
+const TInt BPP16BlueShift =3;
+
+//12 bpp has rgb 444 format rrrrggggbbbb.
+const TInt BPP12RedShift =9;
+const TInt BPP12GreenShift =5;
+const TInt BPP12BlueShift =2;
+
+//24bpp has rgb888 format and 32 bpp has AlRGB 8888 format where Al is alpha.
+const TInt BPP32RedShift =21;
+const TInt BPP32GreenShift =13;
+const TInt BPP32BlueShift =6;
+
+
+void CDrawUtils::ColourFillUtility(TUint8 aColorVal,const TPoint& aPos)
+/**
+*
+* Utility Function that fills required colour in at the given x,y positions on the screen,
+* in a 16 pixels * 16 pixels lines area
+*
+* @param aColorVal: The Colour to be filled in .
+* Scenarios:
+* 1) 4 bits per pixel mode
+* aColorVal contains empty upper
+* 4 bits & only contains 4 bits of info,
+* 2) 8 bits per pixel mode
+* all 8 bits in aColorVal are filled and the value,
+* is taken from the standard OS palette.
+* 3) Other modes: all other modes aColorVal
+* holds data in rgb 332 format.
+*
+* @param aPos The position of the pixel
+*
+*
+*/
+ {
+ //get screendriver attributes
+ TInt displayMode;
+ HAL::Get(HAL::EDisplayMode, displayMode);
+ TInt displayMemoryAddress;
+ HAL::Get(HAL::EDisplayMemoryAddress, displayMemoryAddress);
+ TInt displayOffsetBetweenLines =displayMode;
+ HAL::Get(HAL::EDisplayOffsetBetweenLines, displayOffsetBetweenLines);
+ TInt offsetToFirstPixel =displayMode;
+ HAL::Get(HAL::EDisplayOffsetToFirstPixel, offsetToFirstPixel);
+ TInt displayBitsPerPixel =displayMode;
+ HAL::Get(HAL::EDisplayBitsPerPixel, displayBitsPerPixel);
+
+ TUint red =(aColorVal&Red_Mask)>>BBP8_RedShift;
+ TUint green =(aColorVal&Green_Mask)>>BBP8_GreenShift;
+ TUint blue =aColorVal&Blue_Mask;
+ TUint8 color8bpp =aColorVal;
+ TInt bbp =displayBitsPerPixel;
+
+ //Shifts to convert RGB332 into a respective formats.
+ //12 bpp has rgb format 444, 16 bpp has rgb format 565, 24 bpp has rgb 888 format, 32 bpp has Al rgb 8888 format : Al is alpha
+ TUint color12bpp=(red << BPP12RedShift) | (green << BPP12GreenShift) | (blue << BPP12BlueShift);
+ TUint color16bpp=(red << BPP16RedShift) | (green << BPP16GreenShift) | (blue << BPP16BlueShift);
+ TUint color32bpp=(red << BPP32RedShift) | (green << BPP32GreenShift) | (blue << BPP32BlueShift);
+
+ if( displayBitsPerPixel == BPP12 )
+ {
+ bbp = BPP16;
+ }
+ else if ( displayBitsPerPixel == BPP24 )
+ {
+ bbp = BPP32;
+ }
+ else
+ {
+ bbp = displayBitsPerPixel;
+ }
+
+ TInt baseAddress=displayMemoryAddress + offsetToFirstPixel + aPos.iY * displayOffsetBetweenLines + aPos.iX * bbp / BPP8;
+ if ( displayBitsPerPixel==BPP8 )
+ {
+ TUint8 *pixelPtr=(TUint8*)baseAddress;
+ *pixelPtr++=color8bpp;
+ *pixelPtr=color8bpp;
+ }
+ else if ( displayBitsPerPixel == BPP12 )
+ {
+ TUint16 *pixelPtr=(TUint16*)baseAddress;
+ *pixelPtr++=color12bpp;
+ *pixelPtr=color12bpp;
+ }
+ else if ( displayBitsPerPixel == BPP16 )
+ {
+ TUint16 *pixelPtr =(TUint16*)baseAddress;
+ *pixelPtr++=color16bpp;
+ *pixelPtr=color16bpp;
+ }
+ else if ( bbp == BPP32 )
+ {
+ TUint32 *pixelPtr=(TUint32*)baseAddress;
+ *pixelPtr++=color32bpp;
+ *pixelPtr=color32bpp;
+ }
+ }
+
+
+
+
+void CDrawUtils::DrawSquareUtility(const TPoint& aTopLeft,const TInt aBoxLength,const TInt aBoxWidth,TUint8 aColorVal)
+/**
+ *
+ * Draw a filled in square according to the length and width supplied
+ *
+ * @param aTopLeft Pixel position of the top left corner of the box
+ *
+ * @param aBoxLength length in pixels of the box to be drawn.
+ *
+ * @param aBoxWidth width in pixels of the box to be drawn.
+ *
+ * @param aColorVal colour of the box
+ *
+ */
+ {
+ TInt offSet =1;
+ TInt xOrigin =0;
+ TPoint endPos;
+ TPoint currentPos;
+ if( aTopLeft.iX > xOrigin )
+ {
+ endPos.iX =aTopLeft.iX + aBoxWidth - offSet;
+ }
+ else//TopLeft x co-ordinate is zero
+ {
+ endPos.iX =aTopLeft.iX + aBoxWidth;
+ }
+
+ endPos.iY =aTopLeft.iY;
+ currentPos =aTopLeft;
+
+ for(TInt i=0; i<=aBoxLength; i++)
+ {
+ DrawLineUtility(currentPos,endPos,aColorVal);
+ currentPos.iY =currentPos.iY + offSet;
+ endPos.iY =endPos.iY + offSet;
+ }
+ }
+
+
+void CDrawUtils::DrawLineUtility(const TPoint& aStartPos, const TPoint& aEndPos,const TUint8 aColorVal)
+/**
+ *
+ * Draw a line with colour specified
+ *
+ * @param aStartPos pixel position to start line.
+ * @param aEndPos pixel position to end line.
+ *
+ */
+ {
+ TPoint step =aEndPos-aStartPos;
+ TBool isDiagonal =EFalse;
+ TInt origin =0;
+ if (( step.iX>origin ) && ( step.iY>origin ))
+ {
+ isDiagonal =ETrue;
+ }
+ TPoint currentPos=aStartPos;
+ for(TInt i=0; i<=step.iX; i++)
+ {
+ currentPos.iX =( aStartPos.iX + i );
+ for(TInt j=0; j<=step.iY; j++)
+ {
+ if ( !isDiagonal )
+ {
+ currentPos.iY =( aStartPos.iY + j );
+ ColourFillUtility(aColorVal, currentPos);
+ }
+ else //line is diagonal
+ {
+ currentPos.iY =( aStartPos.iY + i );
+ ColourFillUtility( aColorVal,currentPos);
+ break;
+ }
+ }
+ }
+ }
+
+void CDrawUtils::DrawSquareOutLineUtility(const TPoint& aTopLeft,const TInt aBoxHeight,const TInt aBoxWidth,TUint8 aColorVal)
+/**
+ *
+ * Draw an outline of a square i.e a square that has not been filled in with colour
+ * Draw a filled in square according to the length and width supplied
+ *
+ * @param aTopLeft Pixel position of the top left corner of the box
+ *
+ * @param aBoxLength length in pixels of the box to be drawn.
+ *
+ * @param aBoxWidth width in pixels of the box to be drawn.
+ *
+ *
+ */
+ {
+ TPoint startPos =aTopLeft;
+ TPoint endPos;
+ //top horizontal line
+ endPos.iX =aTopLeft.iX + aBoxWidth;
+ endPos.iY =aTopLeft.iY;
+ DrawLineUtility(startPos, endPos, aColorVal);
+
+ //vertical left
+ endPos.iX =aTopLeft.iX;
+ endPos.iY =aTopLeft.iY + aBoxHeight;
+ DrawLineUtility(startPos, endPos, aColorVal);
+
+ //vertical right
+ startPos.iX =aTopLeft.iX + aBoxWidth;
+ startPos.iY =aTopLeft.iY;
+ endPos.iX =aTopLeft.iX + aBoxWidth;
+ endPos.iY =aTopLeft.iY + aBoxHeight;
+ DrawLineUtility(startPos, endPos, aColorVal);
+
+ //bottom horizontal
+ startPos.iX =aTopLeft.iX;
+ startPos.iY =aTopLeft.iY + aBoxHeight;
+ endPos.iX =aTopLeft.iX + aBoxWidth;
+ endPos.iY =aTopLeft.iY + aBoxHeight;
+ DrawLineUtility(startPos, endPos, aColorVal);
+ }