diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/camlinevfgriddrawer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/camlinevfgriddrawer.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,377 @@ +/* +* Copyright (c) 2007 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: Implemantation for CCamLineVfGridDrawer class. +* +* Copyright © 2007 Nokia. All rights reserved. +* This material, including documentation and any related computer +* programs, is protected by copyright controlled by Nokia. All +* rights are reserved. Copying, including reproducing, storing, +* adapting or translating, any or all of this material requires the +* prior written consent of Nokia. This material also contains +* confidential information which may not be disclosed to others +* without the prior written consent of Nokia. + +* +* +*/ + + +#include +#include "camlinevfgriddrawer.h" +#include "camlogging.h" + +// ======== LOCAL CONSTANTS ======== + +namespace + { + const TInt KArrayGranularity = 8; + const TInt KMaxLineCount = 64; + + const TInt KPenColorRed = 255; + const TInt KPenColorGreen = 0;//255; + const TInt KPenColorBlue = 0;//255; + const TInt KPenColorAlpha = 255;//128; + const TInt KPenWidth = 2; + const TInt KPenHeight = 2; + const CGraphicsContext::TPenStyle KPenStyle = CGraphicsContext::ESolidPen; + } + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// =========================================================================== +// Public part + +// --------------------------------------------------------------------------- +// static NewL +// +// 2-phased constructor +// --------------------------------------------------------------------------- +// +CCamLineVfGridDrawer* +CCamLineVfGridDrawer::NewL() + { + CCamLineVfGridDrawer* self = new (ELeave) CCamLineVfGridDrawer; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCamLineVfGridDrawer::~CCamLineVfGridDrawer() + { + PRINT( _L("Camera => ~CCamLineVfGridDrawer") ); + iLineArray.Reset(); + iLineArray.Close(); + PRINT( _L("Camera <= ~CCamLineVfGridDrawer") ); + } + + + +// --------------------------------------------------------------------------- +// virtual InitL +// * from MCamVfGridDrawer +// +// Initialize the drawer. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::InitL( TAny* /*aParam*/ ) + { + } + +// --------------------------------------------------------------------------- +// virtual Draw( CBitmapContext& ) +// * from MCamVfGridDrawer +// +// Draw the grid. If not set visible nothing is drawn. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::Draw( CBitmapContext& aGc ) const + { + if( iVisible && + iLineArray.Count() > 0 ) + { + // Set drawing properties. + aGc.SetPenStyle( iPenStyle ); + aGc.SetPenSize ( iPenSize ); + aGc.SetPenColor( iPenColor ); + + // Draw the lines + for( TInt i = 0; i < iLineArray.Count(); i++ ) + { + // Top-left and bottom-right corners of the rect + // represent the line ends. + aGc.DrawLine( iLineArray[i].iTl, iLineArray[i].iBr ); + } + + // Clear any settings made to gc + aGc.Reset(); + } + else + { + // Not visible => draw nothing. + } + } + + +// --------------------------------------------------------------------------- +// virtual Draw( const TRect&, CBitmapContext& ) +// * from MCamVfGridDrawer +// +// Draw part of the grid. If not set visible nothing is drawn. +// Note: +// Only pure vertical and pure horizontal lines +// get drawn to right place if lines expand outside +// the aRect rectangle given here as parameter. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::Draw( const TRect& aRect, + CBitmapContext& aGc ) const + { + if( iVisible && + iLineArray.Count() > 0 ) + { + // Limit the drawing to given rectangle. + // Drawing outside this rectangle has no visible effect. + aGc.SetClippingRect( aRect ); + // Make the same drawing operations as in full screen draw. + // The drawing is so simple that any optimization is + // probably more time consuming than the drawing itself. + // Draw resets the gc in the end, so clipping rect is cleared. + Draw( aGc ); + } + else + { + // Not visible => draw nothing. + } + } + +// --------------------------------------------------------------------------- +// virtual SetVisible +// * from MCamVfGridDrawer +// +// Set visibility of the grid. +// +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetVisible( TBool aVisible ) + { + iVisible = aVisible; + } + + + +// --------------------------------------------------------------------------- +// virtual IsVisible +// * from MCamVfGridDrawer +// +// Get visibility of the grid. +// +// --------------------------------------------------------------------------- +// +TBool +CCamLineVfGridDrawer::IsVisible() const + { + return iVisible; + } + + +// --------------------------------------------------------------------------- +// SetLinesL +// * from MCamVfGridDrawer +// +// Set the line end pair array. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetLinesL( const RLineArray& aLineArray ) + { + TInt newLineCount = aLineArray.Count(); + if( newLineCount > KMaxLineCount ) + { + User::Leave( KErrArgument ); + } + + iLineArray.Reset(); + for( TInt i = 0; i < newLineCount; i++ ) + { + iLineArray.Append( aLineArray[i] ); + } + } + + +// --------------------------------------------------------------------------- +// SetLinesL +// +// Set the line end pair array by defining the count and bordered property +// of lines per horizontal and vertical axis. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetLinesL( const TRect& aDrawingRect, + TInt aHorizontalLines, + TInt aVerticalLines, + TBool aBorderedGrid /* = EFalse */) + { + // ------------------------------------------------------- + // Check the max limit for lines does not exceed. + if( aHorizontalLines < 0 + || aVerticalLines < 0 + || aHorizontalLines + aVerticalLines > KMaxLineCount + ) + { + User::Leave( KErrArgument ); + } + + // ------------------------------------------------------- + // Fill the line end array + // + // The lines are evenly spaced over the draw area axis in question. + // The aBorderedGrid parameter determines whether the grid + // draws lines to the borders of draw area: + // E.g. 3 vertical lines: '[' and ']' are the draw area borders. + // aBorderedGrid: [| | |] + // !aBorderedGrid: [ | | | ] + // + // The formula for the location of i:th line when N lines + // are used along dimension D: + // - aBorderedGrid: ( i * D) / (N - 1) + // - !aBorderedGrid: ((i+1) * D) / (N + 1) + // * Divide by (N-1) needs special handling with N=1. + // * Half of pen width is subtracted from the above formula result + // to center the line to the calculated location. + // * odd area or pen width/height may cause error of 1 pixel. + TInt indexOffset = (aBorderedGrid ? 0 : 1); + TInt countOffset = (aBorderedGrid ? -1 : 1); + + // ----------------------------------- + // First horizontal lines + TInt height = aDrawingRect.Height(); + TInt leftX = aDrawingRect.iTl.iX; + TInt rightX = aDrawingRect.iBr.iX; + + TInt i = 0; + while( i < aHorizontalLines ) + { + // Max used to make sure no div-by-zero + TInt currentY = ((i+indexOffset)*height) / Max(1,aHorizontalLines+countOffset) - KPenHeight/2; + iLineArray.Append( TRect( leftX, currentY, rightX, currentY ) ); + i++; + } + + // ----------------------------------- + // Then vertical lines + TInt width = aDrawingRect.Width(); + TInt topY = aDrawingRect.iTl.iY; + TInt bottomY = aDrawingRect.iBr.iY; + + TInt j = 0; + while( j < aVerticalLines ) + { + // Max used to make sure no div-by-zero + TInt currentX = leftX + ((j+indexOffset)*width) / Max(1,aVerticalLines+countOffset) - KPenWidth/2; + iLineArray.Append( TRect( currentX, topY, currentX, bottomY ) ); + j++; + } + // ------------------------------------------------------- + } + + +// --------------------------------------------------------------------------- +// SetPenStyle +// +// Set the style of drawing pen. +// See CGraphicsContext. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetPenStyle( const CGraphicsContext::TPenStyle& aPenStyle ) + { + iPenStyle = aPenStyle; + } + + +// --------------------------------------------------------------------------- +// SetPenSize +// +// Set the size of drawing pen. +// See CGraphicsContext. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetPenSize( const TSize& aPenSize ) + { + iPenSize = aPenSize; + } + +// --------------------------------------------------------------------------- +// SetPenColor +// +// Set the color of drawing pen. +// See CGraphicsContext. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::SetPenColor( const TRgb aPenColor ) + { + iPenColor = aPenColor; + } + + +// =========================================================================== +// Protected part + +// --------------------------------------------------------------------------- +// ConstructL +// +// 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void +CCamLineVfGridDrawer::ConstructL() + { + // empty + } + + + +// =========================================================================== +// Private part + +// --------------------------------------------------------------------------- +// C++ constructor. +// Called in 1st phase of construction. +// --------------------------------------------------------------------------- +// +CCamLineVfGridDrawer::CCamLineVfGridDrawer() + : iLineArray( KArrayGranularity ), + iVisible( EFalse ), + iPenStyle( KPenStyle ), + iPenSize( KPenWidth, KPenHeight ), + iPenColor( KPenColorRed, KPenColorGreen, KPenColorBlue, KPenColorAlpha ) + { + // empty + } + + +// ============================== end of file ================================