--- /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;
+ }
+