imaging/imagingfws/panorama/src/panorama.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/panorama/src/panorama.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,543 @@
+// Copyright (c) 2008-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 <e32base.h>
+#include <panorama/panorama.h>
+#include "panoramaimpl.h"
+#include <fbs.h>
+
+/**
+Constructs a new image panorama object.
+
+A leave occurs if there is insufficient memory available.
+
+@return A pointer to the new image panorama object.
+*/
+EXPORT_C CImagePanorama* CImagePanorama::NewL()
+	{
+	CImagePanorama* self = new(ELeave) CImagePanorama();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+	
+CImagePanorama::CImagePanorama()
+	{
+	}
+	
+void CImagePanorama::ConstructL()
+	{
+	iImgPanImpl = CImagePanoramaImpl::NewL();
+	}
+	
+EXPORT_C CImagePanorama::~CImagePanorama()
+	{
+	delete iImgPanImpl;
+	}
+
+/**
+Initialises the size, direction and panoramalens on plugin and creates the CCapsPanorama,
+CCapsPanoramaTransform objects.
+@param  aSize
+        Size of the image.
+@param  aPanoramaLens
+        Panorama lens which is specific to camera
+@param  aDirection
+        Direction of the panorama
+*/	
+EXPORT_C void CImagePanorama::InitializeL(const TSize & aSize, const TPanoramaLens& aPanoramaLens, const TDirection& aDirection)
+	{
+	iImgPanImpl->InitializeL(aSize, aPanoramaLens, aDirection);	
+	}
+
+/**
+Renders the currest session image to file.
+@param aFilename
+	   Filename specifying where to store the output file.
+*/
+EXPORT_C void CImagePanorama::RenderL(const TDesC& aFilename)
+	{
+	iImgPanImpl->RenderL(aFilename);  	
+	}
+	
+/**
+Renders the current session image to file.
+@param aFilename
+	    Filename specifying where to store the output file.
+@param aSize
+	   Dimensions of the output image.
+@param aMaintainAspectRatio
+	   Aspect ratio based on which output options will be defined
+@param aImageTypeUid
+	   The format Uid in which to encode the output image
+*/
+EXPORT_C void CImagePanorama::RenderL(const TDesC& aFilename, const TSize& aSize, const TBool aMaintainAspectRatio, const TUid& aImageTypeUid)
+	{
+	iImgPanImpl->RenderL(aFilename, aSize, aMaintainAspectRatio, aImageTypeUid);  	
+	}
+
+/**
+Renders the current session image to an open file handle.
+@param aFile
+	   A file handler.
+*/
+EXPORT_C void CImagePanorama::RenderL(RFile& aFile)
+	{
+	iImgPanImpl->RenderL(aFile);	
+	}
+
+/**
+Renders the current session image to an open file handle.
+@param aFile
+	   A file handler
+@param aSize
+	   Dimensions of the output image.
+@param aMaintainAspectRatio
+	   Aspect ratio based on which output options will be defined.
+@param aImageTypeUid
+	   The format Uid in which to encode the output image.
+*/	
+EXPORT_C void CImagePanorama::RenderL(RFile& aFile, const TSize& aSize, const TBool aMaintainAspectRatio, const TUid& aImageTypeUid)
+	{
+	iImgPanImpl->RenderL(aFile, aSize, aMaintainAspectRatio, aImageTypeUid);	
+	}
+	
+/**
+Renders the current session image encoded to a buffer.
+@param aDestData
+       Pointer to a buffer which will recieve the encoded image data.
+*/
+EXPORT_C void CImagePanorama::RenderL(HBufC8*& aDestData)
+	{
+	iImgPanImpl->RenderL(aDestData);  	
+	}
+
+/**
+Renders the current session image encoded to a buffer.
+@param aDestData
+       Pointer to a buffer which will recieve the encoded image data.
+@param aMaxBufferSize
+	   The maximum size of the buffer in bytes.
+@param aSize
+	   Dimensions of the output image.
+@param aMaintainAspectRatio
+	   Aspect ratio based on which output options will be defined.
+@param aImageTypeUid
+	   The format Uid in which to encode the output image.
+*/	
+EXPORT_C void CImagePanorama::RenderL(HBufC8*& aDestData, TUint32 aMaxBufferSize, const TSize& aSize, const TBool aMaintainAspectRatio, const TUid& aImageTypeUid)
+	{
+	iImgPanImpl->RenderL(aDestData, aMaxBufferSize, aSize, aMaintainAspectRatio, aImageTypeUid);  	
+	}
+
+/**
+Renders the output to a buffer in raw format.
+@param aBitmap
+	   A bitmap to get the output image.
+*/
+EXPORT_C void CImagePanorama::RenderL(const CFbsBitmap& aBitmap)
+	{
+	if(aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid)
+	    {
+	    User::Leave(KErrNotSupported);
+	    }
+	iImgPanImpl->RenderL(aBitmap);
+	}
+
+/**
+Renders the output to a buffer in raw format.
+@param aBitmap
+	   A bitmap to get the output image.
+@param aMaintainAspectRatio
+	   Aspect ration based on which output options will be defined.
+*/	
+EXPORT_C void CImagePanorama::RenderL(const CFbsBitmap& aBitmap, const TBool aMaintainAspectRatio)
+	{
+	if(aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid)
+	        {
+	        User::Leave(KErrNotSupported);
+	        }
+	
+	iImgPanImpl->RenderL(aBitmap, aMaintainAspectRatio); 	
+	}
+
+/**
+Renders the output to a buffer in raw format.
+@param aImageFrame
+	   A imageframe object to get the output image.
+*/
+EXPORT_C void CImagePanorama::RenderL(const CImageFrame& aImageFrame)
+	{
+	iImgPanImpl->RenderL(aImageFrame);	
+	}
+	
+/**
+Renders the output to a buffer in raw format.
+@param aImageFrame
+	   A imageframe object to get the output image.
+@param aMaintainAspectRatio
+	   Aspect ration based on which output options will be defined.
+*/	
+EXPORT_C void CImagePanorama::RenderL(const CImageFrame& aImageFrame, const TBool aMaintainAspectRatio)
+	{
+	iImgPanImpl->RenderL(aImageFrame, aMaintainAspectRatio);	
+	}
+	
+/**
+Retrieves the dimensions of the current session image.
+@param aSize
+	   Dimensions of the image.
+*/
+EXPORT_C void CImagePanorama::CurrentImageSizeL(TSize& aSize)
+	{
+	iImgPanImpl->CurrentImageSizeL(aSize);	
+	}
+	
+/**
+Add an image to the panorama creation
+@param aFilename
+	   Input filename
+@param aPanTrans
+	   Panorama transform object
+*/
+EXPORT_C void CImagePanorama::AddFileL(const TDesC& aFilename, CPanoramaTransform& aPanTrans)
+	{
+	iImgPanImpl->AddFileL(aFilename, aPanTrans);	
+	}
+
+/**
+Add an image to the panorama creation
+@param aData
+	   The buffer containing the image data
+@param aPanTrans
+	   Panorama transform object
+*/	
+EXPORT_C void CImagePanorama::AddBufferL(const TDesC8& aData, CPanoramaTransform& aPanTrans)
+	{
+	iImgPanImpl->AddBufferL(aData, aPanTrans);	
+	}
+
+/**
+Add an image to the panorama creation in progress
+@param aBitmap
+	   A bitmap that will contain the image
+@param aPanTrans
+	   Panorama transform object
+*/	
+EXPORT_C void CImagePanorama::AddImageL(const CFbsBitmap& aBitmap, CPanoramaTransform& aPanTrans)
+	{
+	if(aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid)
+	        {
+	        User::Leave(KErrNotSupported);
+	        }
+	
+	iImgPanImpl->AddImageL(aBitmap, aPanTrans);	
+	}
+
+/**
+Add an image to the panorama creation in progress
+@param aImageFrame
+	   A imageframe object.
+@param aPanTrans
+	   Panorama transform object.
+*/	
+EXPORT_C void CImagePanorama::AddImageL(const CImageFrame& aImageFrame, CPanoramaTransform& aPanTrans)
+	{
+	iImgPanImpl->AddImageL(aImageFrame, aPanTrans);	
+	}
+
+/**
+Retrieves a non-standard extension on the image panorama.
+
+@param	aExtension
+		The UID of the extension to be retrieved
+
+@return	Extension corresponding to the UID given as a parameter.
+*/
+EXPORT_C TAny* CImagePanorama::Extension(TUid aExtension)
+	{
+	return iImgPanImpl->Extension(aExtension);
+	}
+
+/**
+Constructs a new panorama transform object.
+
+A leave occurs if there is insufficient memory available.
+
+@return A pointer to the new panorama transform object.
+*/
+EXPORT_C CPanoramaTransform* CPanoramaTransform::NewL()
+	{
+	CPanoramaTransform* self = new(ELeave) CPanoramaTransform();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;		
+	}
+
+CPanoramaTransform::CPanoramaTransform()
+	{	
+	}
+	
+void CPanoramaTransform::ConstructL()
+	{
+	iPanTransImpl = CPanoramaTransformImpl::NewL();	
+	}
+
+EXPORT_C CPanoramaTransform::~CPanoramaTransform()
+	{
+	delete iPanTransImpl;
+	}
+	
+/**
+Get the translation part of a PanoramaTransform
+@param aDxDy
+	   x and y coordinates
+@param aDims
+	   Image dimensions for the transform
+*/	
+EXPORT_C void CPanoramaTransform::GetTranslation(TPoint& aDxDy, TSize& aDims) const
+	{
+	iPanTransImpl->GetTranslation(aDxDy, aDims);	
+	}
+	
+/**
+Set the desired translation values on a panorama transform object.
+@param aDxDy
+	   x and y coordinates
+@param aDims
+	   Image dimenstion for the transform
+*/
+EXPORT_C void CPanoramaTransform::SetTranslationL(const TPoint& aDxDy, const TSize& aDims)
+	{
+	iPanTransImpl->SetTranslationL(aDxDy, aDims);	
+	}
+
+/**
+Get the direction of a panorama transform
+@param aDirection
+	   Direction of the panorama
+*/	
+EXPORT_C void CPanoramaTransform::GetDirection(TDirection& aDirection)
+	{
+	return iPanTransImpl->GetDirection(aDirection);	
+	}
+
+/**
+Get the direction of a panorama transform
+@param aDirection
+	   Direction of the panorama
+@param aMinimumDelta
+	   Minimum translation in percent.
+*/	
+EXPORT_C void CPanoramaTransform::GetDirection(TDirection& aDirection, TInt& aMinimumDelta)
+	{
+	return iPanTransImpl->GetDirection(aDirection, aMinimumDelta);	
+	}
+
+/**
+Set the desired direction of a panorama transform
+@param aDirection
+	   Direction of the panorama
+*/	
+EXPORT_C void CPanoramaTransform::SetDirection(TDirection& aDirection)
+	{
+	iPanTransImpl->SetDirection(aDirection);	
+	}
+
+/**
+Set the desired direction of a panorama transform
+@param aDirection
+	   Direction of the panorama
+@param aMinDelta
+	   Minimum translation in percent.
+*/
+EXPORT_C void CPanoramaTransform::SetDirection(TDirection& aDirection, TInt aMinDelta)
+	{
+	iPanTransImpl->SetDirection(aDirection, aMinDelta);	
+	}
+
+/**
+Constructs a new VFTracker object.
+
+A leave occurs if there is insufficient memory available.
+
+@return A pointer to a new VFTracker object.
+*/	
+EXPORT_C CVFTracker* CVFTracker::NewL()
+	{
+	CVFTracker* self = new(ELeave) CVFTracker();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+	
+CVFTracker::CVFTracker()
+	{
+	}
+	
+void CVFTracker::ConstructL()
+	{
+	iVFTrackImpl = CVFTrackerImpl::NewL();
+	}
+	
+EXPORT_C CVFTracker::~CVFTracker()
+	{
+	delete iVFTrackImpl;
+	}
+	
+/**
+Initialises the dimensions of the image on the plugin and creates the VFTracker object.
+@param aSize
+	   Dimensions of the image.	
+*/
+EXPORT_C void CVFTracker::InitializeL(const TSize & aSize)	
+	{
+	iVFTrackImpl->InitializeL(aSize);	
+	}
+
+/**
+Performs overlapping calculations from viewfinder image.
+Pass all viewfinder images to this function to find out when its time to capture a new image.
+@param aBitmap
+	   A bitmap that needs to be registered
+@param aPanTrans
+	   A panorama transform object.
+*/
+EXPORT_C void CVFTracker::RegisterImageL(const CFbsBitmap& aBitmap, CPanoramaTransform& aPanTrans)
+	{
+	if(aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid)
+	        {
+	        User::Leave(KErrNotSupported);
+	        }
+	
+	iVFTrackImpl->RegisterImageL(aBitmap, aPanTrans);	
+	}
+
+/**
+Performs overlapping calculations from viewfinder image.
+Pass all viewfinder images to this function to find out when its time to capture a new image.
+@param aImageFrame
+	   A imageframe object.
+@param aPanTrans
+	   A panorama transform object.
+*/	
+EXPORT_C void CVFTracker::RegisterImageL(const CImageFrame& aImageFrame, CPanoramaTransform& aPanTrans)
+	{
+	iVFTrackImpl->RegisterImageL(aImageFrame, aPanTrans);	
+	}
+
+/**
+Determines from a PanoramaTransform if it is time to capture a new image.
+@param aDirection
+	   The type of panorama being created.
+*/
+EXPORT_C TBool CVFTracker::IsTimeToCapture(TDirection& aDirection) const
+	{
+	return iVFTrackImpl->IsTimeToCapture(aDirection);	
+	}
+
+/**
+Determines from a PanoramaTransform if it is time to capture a new image.
+@param aDirection
+	   The type of panorama being created.
+@param aOverlap
+	   Desired overlap in the panorama image.
+*/	
+EXPORT_C TBool CVFTracker::IsTimeToCapture(TDirection& aDirection, TInt aOverlap) const
+	{
+	return iVFTrackImpl->IsTimeToCapture(aDirection, aOverlap);	
+	}
+
+/**
+Resets the transform return for the next RegisterImageL().
+*/	
+EXPORT_C void CVFTracker::Reset()
+	{
+	iVFTrackImpl->Reset();	
+	}
+
+/**
+Retrieves a non-standard extension on the VFTracker
+
+@param	aExtension
+		The UID of the extension to be retrieved
+
+@return	Extension corresponding to the UID given as a parameter.
+*/
+EXPORT_C TAny* CVFTracker::Extension(TUid aExtension)
+	{
+	return iVFTrackImpl->Extension(aExtension);	
+	}
+
+/**
+Creates a TPanoramaLens object
+
+@param  aFocalLength
+		Focal length coordinates, this is an array of size KPanLensIndex.
+		
+@param  aPrincipalPoint
+		Principal point coordinates, this is an array of size KPanLensIndex.
+
+@param  aSkew
+		Skew coefficient. @remark 0.0f means no skew
+
+@param  aDist
+		Distortion coefficients, this is an array of size KPanLensDist.
+
+@param  aWidth
+		Image width when the camera was calibrated.
+
+@param  aHeight
+		Image height when the camera was calibrated.
+*/
+EXPORT_C TPanoramaLens::TPanoramaLens(TReal32* aFocalLength, TReal32* aPrincipalPoint, TReal32 aSkew, TReal32* aDist, TUint32 aWidth, TUint32 aHeight)
+	{
+	TInt i = 0;
+	for (i = 0; i < KPanLensIndex; i++)
+		{
+		iFocalLength[i]	= aFocalLength[i];
+		iPrincipalPoint[i] = aPrincipalPoint[i];
+		}
+	iSkew = aSkew;
+	for (i = 0; i < KPanLensDist; i++)
+		{
+		iDist[i] = aDist[i];
+		}
+	iWidth = aWidth;
+	iHeight = aHeight;
+	}
+	
+EXPORT_C TPanoramaLens::TPanoramaLens()
+	{
+	// Empirical values from CAPS documentation so forgive the magic numbers. The values should probably come from a configuration or resource file
+	iFocalLength[0]	   = 665.0f;
+	iPrincipalPoint[0] = 665.0f;
+	iFocalLength[1]	   = 320.0f;
+	iPrincipalPoint[1] = 240.0f;
+ 
+ 	iSkew = 0.0f;
+
+	for (TInt i = 0; i < KPanLensDist; i++)
+		{
+		iDist[i] = 0.0f;
+		}
+
+	iWidth  = 640; // VGA
+	iHeight = 480;
+	}
+