diff -r 000000000000 -r bde4ae8d615e os/boardsupport/haitest/bspsvs/suite/common/src/DrawUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/boardsupport/haitest/bspsvs/suite/common/src/DrawUtils.cpp Fri Jun 15 03:10:57 2012 +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); + }