sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0: // All rights reserved.
sl@0: // This component and the accompanying materials are made available
sl@0: // under the terms of "Eclipse Public License v1.0"
sl@0: // which accompanies this distribution, and is available
sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: //
sl@0: // Initial Contributors:
sl@0: // Nokia Corporation - initial contribution.
sl@0: //
sl@0: // Contributors:
sl@0: //
sl@0: // Description:
sl@0: // testimageprocessing.cpp
sl@0: // 
sl@0: //
sl@0: 
sl@0: #include "test_image_processing.h"
sl@0: #include <ecamerrors.h>
sl@0: #include "ecamversion.h"
sl@0: 
sl@0: CTestCamImgProc::CTestCamImgProc(CTestCamera& aOwner): iOwner(aOwner)
sl@0: 	{}
sl@0: 	
sl@0: CTestCamImgProc::~CTestCamImgProc()
sl@0: 	{
sl@0: 	iSupportedTranformations.Close();
sl@0: 	iActiveTransformations.Close();
sl@0: 	iActiveTransformSequence.Close();
sl@0: 	
sl@0: 	CDataGlobal* globalData = static_cast <CDataGlobal*> (Dll::Tls());	
sl@0: 	if(globalData != NULL)
sl@0: 		{
sl@0: 		if(!globalData->iTestCamAdvSet && !globalData->iTestCamPresets && !globalData->iTestCamSnapshot)
sl@0: 			{
sl@0: 			delete globalData;
sl@0: 			Dll::FreeTls();
sl@0: 			}	
sl@0: 		else
sl@0: 			{
sl@0: 			globalData->iTestCamImgProc = NULL;	
sl@0: 			Dll::SetTls(globalData);
sl@0: 			}
sl@0: 		}
sl@0: 	}
sl@0: 		
sl@0: CTestCamImgProc* CTestCamImgProc::NewL(CTestCamera& aOwner)
sl@0: 	{
sl@0: 	CDataGlobal* globalData = static_cast <CDataGlobal*> (Dll::Tls());
sl@0: 	
sl@0: 	if(globalData == NULL)
sl@0: 		{
sl@0: 		globalData = new (ELeave) CDataGlobal;
sl@0: 		CleanupStack::PushL(globalData);
sl@0: 		globalData->iImgProcReferenceCount = 0;
sl@0: 		globalData->iTestCamImgProc = new (ELeave) CTestCamImgProc(aOwner);
sl@0: 		CleanupStack::PushL(globalData->iTestCamImgProc);
sl@0: 		globalData->iTestCamImgProc->ConstructL();
sl@0: 		globalData->iTestCamImgProc->iRefCount = 1;
sl@0: 		User::LeaveIfError(Dll::SetTls(globalData));
sl@0: 		CleanupStack::Pop(globalData->iTestCamImgProc);
sl@0: 		CleanupStack::Pop(globalData);
sl@0: 		return globalData->iTestCamImgProc;
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		if(globalData->iTestCamImgProc == NULL)
sl@0: 			{
sl@0: 			globalData->iImgProcReferenceCount = 0;
sl@0: 			globalData->iTestCamImgProc = new (ELeave) CTestCamImgProc(aOwner);
sl@0: 			CleanupStack::PushL(globalData->iTestCamImgProc);
sl@0: 			globalData->iTestCamImgProc->ConstructL();
sl@0: 			globalData->iTestCamImgProc->iRefCount = 1;
sl@0: 			User::LeaveIfError(Dll::SetTls(globalData));
sl@0: 			CleanupStack::Pop(globalData->iTestCamImgProc);
sl@0: 			return globalData->iTestCamImgProc;
sl@0: 			}
sl@0: 			
sl@0: 		CTestCamImgProc* self = globalData->iTestCamImgProc;
sl@0: 		
sl@0: 		globalData->iImgProcReferenceCount++;
sl@0: 		self->iRefCount = globalData->iImgProcReferenceCount + 1;
sl@0: 		if (globalData->iImgProcReferenceCount == KNumOfImgProcExtensions-1)
sl@0: 			{
sl@0: 			globalData->iTestCamImgProc = NULL;
sl@0: 			if(!globalData->iTestCamAdvSet && !globalData->iTestCamPresets && !globalData->iTestCamSnapshot)
sl@0: 				{
sl@0: 				delete globalData;
sl@0: 				Dll::FreeTls();
sl@0: 				}
sl@0: 			else
sl@0: 				{
sl@0: 				User::LeaveIfError(Dll::SetTls(globalData));	
sl@0: 				}
sl@0: 			}
sl@0: 		else
sl@0: 			{
sl@0: 			User::LeaveIfError(Dll::SetTls(globalData));	
sl@0: 			}
sl@0: 		return self;		
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: void CTestCamImgProc::Release()
sl@0: 	{
sl@0: 	iRefCount--; 
sl@0: 	if(iRefCount == 0)
sl@0: 		{
sl@0: 		iOwner.iImgProcImpl = NULL;
sl@0: 		delete this;
sl@0: 		}
sl@0: 	}	
sl@0: 	
sl@0: void CTestCamImgProc::ConstructL()
sl@0: 	{
sl@0: 	iSupportedTranformations.Reset();
sl@0: 	iSupportedTranformations.AppendL(KUidECamEventImageProcessingAdjustBrightness);
sl@0: 	iSupportedTranformations.AppendL(KUidECamEventImageProcessingAdjustContrast);
sl@0: 	
sl@0: 	iActiveTransformations.Reset();
sl@0: 	
sl@0: 	iActiveTransformSequence.Reset();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetSupportedTransformationsL(RArray<TUid>& aTransformations) const
sl@0: 	{
sl@0: 	aTransformations.Reset();
sl@0: 	for(TInt index=0; index < iSupportedTranformations.Count(); index++)
sl@0: 		{
sl@0: 		aTransformations.AppendL(iSupportedTranformations[index]);
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: void CTestCamImgProc::GetActiveTransformationsL(RArray<TUid>& aTransformations) const
sl@0: 	{
sl@0: 	aTransformations.Reset();
sl@0: 	for(TInt index=0; index < iActiveTransformations.Count(); index++)
sl@0: 		{
sl@0: 		aTransformations.AppendL(iActiveTransformations[index]);
sl@0: 		}	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetTransformationSupportedValuesL(TUid aTransformation, RArray<TInt>& aValues, TValueInfo& aInfo) const
sl@0: 	{
sl@0: 	TInt err = iActiveTransformations.Find(aTransformation);
sl@0: 	if(err == KErrNotFound)
sl@0: 		{
sl@0: 		User::Leave(err);
sl@0: 		}
sl@0: 		
sl@0: 	switch(aTransformation.iUid)
sl@0: 		{
sl@0: 		case KUidECamEventImageProcessingAdjustBrightnessUidValue:
sl@0: 			{
sl@0: 			aInfo = EContinuousRangeMinMax;
sl@0: 			aValues.Reset();
sl@0: 			aValues.AppendL(KMinBrightness);
sl@0: 			aValues.AppendL(KMaxBrightness);	
sl@0: 			break;
sl@0: 			}
sl@0: 			
sl@0: 		case KUidECamEventImageProcessingAdjustContrastUidValue:
sl@0: 			{
sl@0: 			aInfo = EContinuousRangeMinMax;
sl@0: 			aValues.Reset();
sl@0: 			aValues.AppendL(KMinContrast);
sl@0: 			aValues.AppendL(KMaxContrast);	
sl@0: 			break;
sl@0: 			}
sl@0: 			
sl@0: 		default:
sl@0: 			User::Leave(KErrNotSupported);
sl@0: 		}
sl@0: 	}
sl@0: 	
sl@0: TInt CTestCamImgProc::TransformationValue(TUid aTransformation) const
sl@0: 	{
sl@0: 	switch(aTransformation.iUid)
sl@0: 		{
sl@0: 		case KUidECamEventImageProcessingAdjustBrightnessUidValue:
sl@0: 			{
sl@0: 			return iOwner.iImgProcBrightness;
sl@0: 			}
sl@0: 			
sl@0: 		case KUidECamEventImageProcessingAdjustContrastUidValue:
sl@0: 			{
sl@0: 			return iOwner.iImgProcContrast;
sl@0: 			}
sl@0: 			
sl@0: 		default:
sl@0: 			return 0;
sl@0: 		}	
sl@0: 	}
sl@0: 	
sl@0: TInt CTestCamImgProc::GetTransformationValue(TUid aTransformation, TInt& aTransformationValue) const
sl@0: 	{
sl@0: 	switch(aTransformation.iUid)
sl@0: 		{
sl@0: 		case KUidECamEventImageProcessingAdjustBrightnessUidValue:
sl@0: 			{
sl@0: 			aTransformationValue = iOwner.iImgProcBrightness;
sl@0: 			return KErrNone;
sl@0: 			}
sl@0: 			
sl@0: 		case KUidECamEventImageProcessingAdjustContrastUidValue:
sl@0: 			{
sl@0: 			aTransformationValue = iOwner.iImgProcContrast;
sl@0: 			return KErrNone;
sl@0: 			}
sl@0: 			
sl@0: 		default:
sl@0: 			return KErrNotSupported;
sl@0: 		}	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::SetTransformationValue(TUid aTransformation, TInt aValue)
sl@0: 	{
sl@0: 	TInt eventError = iOwner.CheckReserveAndPower();
sl@0: 	
sl@0: 	if(eventError == KErrNone)
sl@0: 		{
sl@0: 		switch(aTransformation.iUid)
sl@0: 			{
sl@0: 			case KUidECamEventImageProcessingAdjustBrightnessUidValue:
sl@0: 				{
sl@0: 				if(aValue < KMinBrightness)
sl@0: 					{
sl@0: 					iOwner.iImgProcBrightness = KMinBrightness;
sl@0: 					}
sl@0: 				else
sl@0: 					{
sl@0: 					if(aValue > KMaxBrightness)	
sl@0: 						{
sl@0: 						iOwner.iImgProcBrightness = KMaxBrightness;
sl@0: 						}
sl@0: 					else
sl@0: 						{
sl@0: 						iOwner.iImgProcBrightness = aValue;	
sl@0: 						}
sl@0: 					}
sl@0: 				break;
sl@0: 				}
sl@0: 				
sl@0: 			case KUidECamEventImageProcessingAdjustContrastUidValue:
sl@0: 				{
sl@0: 				if(aValue < KMinContrast)
sl@0: 					{
sl@0: 					iOwner.iImgProcContrast = KMinContrast;
sl@0: 					}
sl@0: 				else
sl@0: 					{
sl@0: 					if(aValue > KMaxContrast)	
sl@0: 						{
sl@0: 						iOwner.iImgProcContrast = KMaxContrast;
sl@0: 						}
sl@0: 					else
sl@0: 						{
sl@0: 						iOwner.iImgProcContrast = aValue;	
sl@0: 						}
sl@0: 					}
sl@0: 				break;
sl@0: 				}
sl@0: 				
sl@0: 			default:
sl@0: 				eventError = KErrNotSupported;
sl@0: 			}	
sl@0: 		}
sl@0: 	
sl@0: 	if(eventError == KErrNone)	
sl@0: 		{
sl@0: 		eventError = iActiveTransformations.Find(aTransformation);
sl@0: 		
sl@0: 		if(eventError == KErrNotFound)
sl@0: 			{
sl@0: 			eventError = iActiveTransformations.Append(aTransformation);
sl@0: 			
sl@0: 			if(eventError == KErrNone)
sl@0: 				{
sl@0: 				if(IsTransform(aTransformation))
sl@0: 					{
sl@0: 					eventError = iActiveTransformSequence.Append(aTransformation);
sl@0: 					}
sl@0: 				}
sl@0: 			}
sl@0: 		else
sl@0: 			{
sl@0: 			eventError = KErrNone;	
sl@0: 			}	
sl@0: 		}
sl@0: 		
sl@0: 	TECAMEvent ecamevent(aTransformation, eventError);
sl@0: 	
sl@0: 	iOwner.iECamEvent = ecamevent;
sl@0: 	iOwner.iHandleEventAsync.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetActiveTransformSequenceL(RArray<TUid>& aTransformSequence) const
sl@0: 	{
sl@0: 	aTransformSequence.Reset();
sl@0: 	for(TInt index=0; index < iActiveTransformSequence.Count(); index++)
sl@0: 		{
sl@0: 		aTransformSequence.AppendL(iActiveTransformSequence[index]);
sl@0: 		}	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::SetActiveTransformSequenceL(RArray<TUid>& aTransformSequence)
sl@0: 	{
sl@0: 	TInt err = KErrNone;
sl@0: 	for(TInt index=0; index < aTransformSequence.Count(); index++)
sl@0: 		{
sl@0: 		err = iActiveTransformations.Find(aTransformSequence[index]);
sl@0: 		if(err == KErrNotFound)
sl@0: 			{
sl@0: 			User::Leave(err);
sl@0: 			}
sl@0: 		}
sl@0: 		
sl@0: 	iActiveTransformSequence.Reset();
sl@0: 	for(TInt index=0; index < aTransformSequence.Count(); index++)
sl@0: 		{
sl@0: 		iActiveTransformSequence.AppendL(aTransformSequence[index]);
sl@0: 		}
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::SetSourceRect(const TRect& /*aRect*/)
sl@0: 	{
sl@0: 	return;
sl@0: 	}
sl@0: 
sl@0: void CTestCamImgProc::GetSourceRect(TRect& /*aRect*/) const
sl@0: 	{
sl@0: 	return;	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetConcurrentColorSwappingsSupportedL(TInt& /*aConcurrentColorSwappingSupported*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetColorSwapCapabilitiesL(TInt /*aIndex*/, CCamera::CCameraImageProcessing::TColorOperationCapabilities& /*aColorSwapCapabilities*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::SetColorSwapEntry(TInt aIndex, const CCamera::CCameraImageProcessing::TColorOperationEntry& /*aColorSwapParameters*/)
sl@0: 	{
sl@0: 	TECAMEvent2 ecamevent2(KUidECamEventCIPSetColorSwapEntry, KErrNotSupported, aIndex);
sl@0: 	
sl@0: 	iOwner.iECamEvent2 = ecamevent2;
sl@0: 	iOwner.iHandleEvent2Async.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::RemoveColorSwapEntry(TInt aIndex)
sl@0: 	{
sl@0: 	TECAMEvent2 ecamevent2(KUidECamEventCIPRemoveColorSwapEntry, KErrNotSupported, aIndex);
sl@0: 	
sl@0: 	iOwner.iECamEvent2 = ecamevent2;
sl@0: 	iOwner.iHandleEvent2Async.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetColorSwapEntryL(TInt /*aIndex*/, CCamera::CCameraImageProcessing::TColorOperationEntry& /*aColorSwapParameters*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::StartColorSwapping()
sl@0: 	{
sl@0: 	TECAMEvent ecamevent(KUidECamEventCIPStartColorSwap, KErrNotSupported);
sl@0: 	
sl@0: 	iOwner.iECamEvent = ecamevent;
sl@0: 	iOwner.iHandleEventAsync.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::CancelColorSwappingL()
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetConcurrentColorAccentSupportedL(TInt& /*aConcurrentColorAccentSupported*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetColorAccentCapabilitiesL(TInt /*aIndex*/, CCamera::CCameraImageProcessing::TColorOperationCapabilities& /*aColorAccentCapabilities*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::SetColorAccentEntry(TInt aIndex, const CCamera::CCameraImageProcessing::TColorOperationEntry& /*aColorAccentParameters*/)
sl@0: 	{
sl@0: 	TECAMEvent2 ecamevent2(KUidECamEventCIPSetColorAccentEntry, KErrNotSupported, aIndex);
sl@0: 	
sl@0: 	iOwner.iECamEvent2 = ecamevent2;
sl@0: 	iOwner.iHandleEvent2Async.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::RemoveColorAccentEntry(TInt aIndex)
sl@0: 	{
sl@0: 	TECAMEvent2 ecamevent2(KUidECamEventCIPRemoveColorAccentEntry, KErrNotSupported, aIndex);
sl@0: 	
sl@0: 	iOwner.iECamEvent2 = ecamevent2;
sl@0: 	iOwner.iHandleEvent2Async.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::GetColorAccentEntryL(TInt /*aIndex*/, CCamera::CCameraImageProcessing::TColorOperationEntry& /*aColorAccentParameters*/) const
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);	
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::StartColorAccent()
sl@0: 	{
sl@0: 	TECAMEvent ecamevent(KUidECamEventCIPStartColorAccent, KErrNotSupported);
sl@0: 	
sl@0: 	iOwner.iECamEvent = ecamevent;
sl@0: 	iOwner.iHandleEventAsync.CallBack();
sl@0: 	}
sl@0: 	
sl@0: void CTestCamImgProc::CancelColorAccentL()
sl@0: 	{
sl@0: 	User::Leave(KErrNotSupported);
sl@0: 	}
sl@0: 
sl@0: TBool CTestCamImgProc::IsTransform(TUid aTransformation)
sl@0: 	{
sl@0: 	switch(aTransformation.iUid)
sl@0: 		{
sl@0: 		//fall through
sl@0: 		case KUidECamEventImageProcessingTransformCropUidValue:
sl@0: 		case KUidECamEventImageProcessingTransformRotateUidValue:
sl@0: 		case KUidECamEventImageProcessingTransformMirrorUidValue:
sl@0: 		case KUidECamEventImageProcessingTransformScaleUidValue:
sl@0: 		case KUidECamEventImageProcessingSourceRectUidValue:
sl@0: 		case KUidECamEventImageProcessingNoiseReductionUidValue:
sl@0: 		case KUidECamEventImageProcessingGlareRemovalUidValue:
sl@0: 			{
sl@0: 			return ETrue;	
sl@0: 			}
sl@0: 		default:
sl@0: 			return EFalse;
sl@0: 		}
sl@0: 	}