Mercurial > s60_experiments
diff DemoCube/src/DemoCubeAppView.cpp @ 0:43361e733c66
Origination.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Tue, 12 Feb 2008 17:18:02 -0600 |
parents | |
children | 0a2b5a968ce7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DemoCube/src/DemoCubeAppView.cpp Tue Feb 12 17:18:02 2008 -0600 @@ -0,0 +1,237 @@ +/*===================================================================== + + Copyright © 2007 Nokia Corporation. All rights reserved. + +======================================================================*/ + +/* +============================================================================ + Name : DemoCubeAppView.cpp + Author : Nokia Computer Vision Team in NRC Palo Alto + Copyright : Your copyright notice + Description : Application view implementation +============================================================================ +*/ + +// INCLUDE FILES +#include <coemain.h> +#include "DemoCubeAppView.h" + +#include "DemoCamera.h" +#include "ncvImage.h" +#include "ncvCamus.h" +#include "ncvOpticalFlow.h" +#include "ncvEgoMovement.h" +#include "DemoCube.h" + +#define PADDING_WIDTH 40 +#define PADDING_HEIGHT 30 + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CDemoCubeAppView::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CDemoCubeAppView* CDemoCubeAppView::NewL(const TRect& aRect, CDemoCubeAppUi* aAppUi) + { + CDemoCubeAppView* self = new(ELeave) CDemoCubeAppView(aAppUi); + CleanupStack::PushL(self); + self->ConstructL(aRect); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CDemoCubeAppView::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CDemoCubeAppView::ConstructL( const TRect& aRect ) + { + Reset(); + + if ( CCamera::CamerasAvailable() ) //Yingen added for detecting camera + {//Yingen added for detecting camera + iCamera = CDemoCamera::NewL(aRect.Size() - TSize(PADDING_WIDTH, PADDING_HEIGHT), this); + iCamera->Acquire(); + + iCamusImage = CNokiaCVImage::NewL(); + iCamusImage->CreateL(iBitmapSize, EColor16M); + }//Yingen added for detecting camera + iCube = CDemoCube::NewL(aRect); + iCubePoints = new(ELeave) CArrayFixFlat<TPoint>(5); + for(TInt i = 0; i < 5; i++) + { + TPoint tmp(0, 0); + iCubePoints->AppendL(tmp); + } + // Create a window for this application view + CreateWindowL(); + + // Set the windows size + SetRect( aRect ); + + // Activate the window, which makes it ready to be drawn + ActivateL(); + } + +// ----------------------------------------------------------------------------- +// CDemoCubeAppView::CDemoCubeAppView() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CDemoCubeAppView::CDemoCubeAppView(CDemoCubeAppUi* aAppUi) : + iAppUi(aAppUi), + iCamera(NULL), + iCamusImage(NULL), + iBitmapSize(25, 18), + iCamus(NULL), + iOpticalFlow(NULL), + iCube(NULL) + { + } + +void CDemoCubeAppView::Reset() + { + iCubeWidth = 10; + iMove.iX = 0.0; + iMove.iY = 0.0; + iAngle = 0.0; + } +// ----------------------------------------------------------------------------- +// CDemoCubeAppView::~CDemoCubeAppView() +// Destructor. +// ----------------------------------------------------------------------------- +// +CDemoCubeAppView::~CDemoCubeAppView() + { + // No implementation required + if(iCamera) + { + delete iCamera; + iCamera = NULL; + } + if(iCamusImage) + { + delete iCamusImage; + iCamusImage = NULL; + } + if(iCamus) + { + delete iCamus; + iCamus = NULL; + } + if(iOpticalFlow) + { + delete iOpticalFlow; + iOpticalFlow = NULL; + } + if(iCube) + { + delete iCube; + iCube = NULL; + } + if(iCubePoints) + { + delete iCubePoints; + iCubePoints = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CDemoCubeAppView::Draw() +// Draws the display. +// ----------------------------------------------------------------------------- +// +void CDemoCubeAppView::Draw(CFbsBitmap& aBitmap, CArrayFixFlat<TPoint>* aCube) const + { + CWindowGc& gc = SystemGc(); + gc.Activate(Window()); + gc.Clear(); + gc.BitBlt(TPoint(PADDING_WIDTH / 2, PADDING_HEIGHT / 2), &aBitmap); + gc.SetPenColor(TRgb(0xff, 0, 0)); + gc.DrawPolyLine(aCube); + gc.Deactivate(); + iCoeEnv->WsSession().Flush(); + } + +void CDemoCubeAppView::CameraReady() + { + iCamera->StartFeedL(); + } + +void CDemoCubeAppView::SetCameraFrame(CFbsBitmap& aBitmap) + { + BitmapDownScale(aBitmap); + + if(!iCamus) + { + iCamus = CCamus::NewL(*iCamusImage, 5); + iOpticalFlow = COpticalFlow::NewL(iCamusImage->Size()); + } + + iCamus->GetOpticalFlow(*iOpticalFlow, *iCamusImage, CAMUS_SETCAMUSOPTS(CCamus::EMedium, CCamus::EMedium, 3)); + CEgoMovement mean = iOpticalFlow->Mean(); + iMove.iX -= mean.iX * 6.3; + iMove.iY += mean.iY * 6.3; + iAngle += iOpticalFlow->Rotation().Real() * 10.5; + + // + iCubeWidth += (TInt)(iOpticalFlow->Depth().Real() * 5); + iCubeWidth = Max(2, iCubeWidth); + iCubeWidth = Min(iCubeWidth, 40); + // + + + iCube->Calculate(*iCubePoints, (TInt)iMove.iX.Real(), (TInt)iMove.iY.Real(), (TInt)iAngle, iCubeWidth); + + Draw(aBitmap, iCubePoints); + } + +void CDemoCubeAppView::BitmapDownScale(CFbsBitmap& aOriginal) + { + const TInt xBlockSize = aOriginal.SizeInPixels().iWidth / iBitmapSize.iWidth; + const TInt yBlockSize = aOriginal.SizeInPixels().iHeight / iBitmapSize.iHeight; + + TRgb color; + TPoint pos(0, 0); + + CPixelAccess* pa = CPixelAccess::NewLC(iCamusImage); + + + for(TInt y = 0; y < iBitmapSize.iHeight; y++) + { + for(TInt x = 0; x < iBitmapSize.iWidth; x++) + { + TInt red = 0; + TInt green = 0; + TInt blue = 0; + + for(TInt j = 0; j < yBlockSize; j++) + { + for(TInt i = 0; i < xBlockSize; i++) + { + pos.SetXY(x * xBlockSize + i, y * yBlockSize + j); + aOriginal.GetPixel(color, pos); + red += color.Red(); + green += color.Green(); + blue += color.Blue(); + } + } + + pos.SetXY(x, y); + pa->SetPos(pos); + const TInt pixels = xBlockSize * yBlockSize; + color.SetBlue(blue / pixels); + color.SetGreen(green / pixels); + color.SetRed(red / pixels); + pa->SetRGB(color.Value()); + } + } + CleanupStack::Pop(pa); + delete pa; + } + +// End of File