diff -r 000000000000 -r 40261b775718 imagingandcamerafws/imagingfws/panorama/src/panorama.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagingandcamerafws/imagingfws/panorama/src/panorama.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -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 +#include +#include "panoramaimpl.h" +#include + +/** +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; + } +