camerauis/cameraapp/generic/src/camlinevfgriddrawer.cpp
branchRCL_3
changeset 54 bac7acad7cb3
child 57 2c87b2808fd7
--- /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 <gdi.h>
+#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 ================================