diff -r 000000000000 -r 951a5db380a0 videoeditorengine/vedengine/GenManip/src/DisplayChain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/vedengine/GenManip/src/DisplayChain.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,530 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "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: +* Ixonos Plc +* +* Description: +* +*/ + + +//----IMAAMI---- +//************************************************************************* +// +//Version 1.00 +// +//Contains: +// CDisplayChain +// Image processing class implementing +// display specific image processing: +// - Scaling to display size with pan support +// - IETD - display specific color contrast enhancement +// - Sharpening +// - Display feature compensation by simple color management +// - Dithering +// +//History: +// 30.10.2003 version 1.00 created using existing IMAAMI algorithms +//************************************************************************* + +#include +#include "DisplayChain.h" + + +/* +----------------------------------------------------------------------------- + + Constructor + + Default constructor, initializes member variables to initial values + + Return Values: none + +----------------------------------------------------------------------------- +*/ +CDisplayChain::CDisplayChain() +{ + // This function is intentionally left blank. +} + + + + +/* +----------------------------------------------------------------------------- + + NewLC + + Factory function to instantiate the class. + This function leaves the class pointer to the cleanup stack + May leave with KErrNoMemory if no memory available + + Return Values: CDisplayChain* self: pointer to the class instance + +----------------------------------------------------------------------------- +*/ +CDisplayChain* CDisplayChain::NewLC() +{ + CDisplayChain* self = new (ELeave) CDisplayChain(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + + + + +/* +----------------------------------------------------------------------------- + + CDCIetd + + NewL + + Factory function to instantiate the class. + May leave with KErrNoMemory if no memory available + + Return Values: CDisplayChain* self: pointer to the class instance + +----------------------------------------------------------------------------- +*/ +CDisplayChain* CDisplayChain::NewL() +{ + CDisplayChain* self = CDisplayChain::NewLC(); + CleanupStack::Pop(); + return self; +} + + + + + +/* +----------------------------------------------------------------------------- + + CDCIetd + + ConstructL + + Second phase constructor. Does nothing at the moment + + Return Values: none + + ----------------------------------------------------------------------------- +*/ +void CDisplayChain::ConstructL() +{ + // Create objects for ImaamiImageChain + DigitalZoomPtr = CDCDigitalZoom::NewL(); + CleanupStack::PushL(DigitalZoomPtr); + + SharpeningPtr = DCSharpening::NewL(); + CleanupStack::PushL(SharpeningPtr); + + DitheringPtr = CDCDithering::NewL(); + CleanupStack::PushL(DitheringPtr); + + IetdPtr = CDCIetd::NewL(); + CleanupStack::PushL(IetdPtr); + + ColorManagementPtr = CDCColorManagement::NewL(); + CleanupStack::PushL(ColorManagementPtr); + + + TInt i; //Index + + //As default image is just opened to be processed + Parameters.FirstOpening = ETrue; + + //Get current processing parameters from processing objects + DigitalZoomPtr->GetParameters(&Parameters.DZParameters); + IetdPtr->GetParams(&Parameters.IETDParameters); + SharpeningPtr->GetParameters(&Parameters.SharpeningParameters); + ColorManagementPtr->GetParameters(&Parameters.ColorManagementParameters); + + //Here the parameters can be read for example from a text file or from the registers, etc. + //if (!ReadFileL()) + { + //Set default parameter values + //(Defined in DCInit.h) + //---------------------------- + + //Set each processing ON/OFF + Parameters.DigitalZoomON = DZ; + Parameters.DitheringON = DITHER; + Parameters.ColorManagementON = ETrue; //CM; + Parameters.IetdON = IETD; + Parameters.SharpeningON = SHARP; + + //DigitalZoom + DigitalZoomPtr->GetParameters(&Parameters.DZParameters); + Parameters.DZParameters.sizeX = DZsizeX; + Parameters.DZParameters.sizeY = DZsizeY; + Parameters.DZParameters.scaleX = DZscaleX; + Parameters.DZParameters.scaleY = DZscaleY; + Parameters.DZParameters.allShiftX = DZallX; + Parameters.DZParameters.allShiftY = DZallY; + Parameters.DZParameters.newShiftX = DZnewX; + Parameters.DZParameters.newShiftY = DZnewY; + + //IETD + Parameters.IETDParameters.aStretchLimit = StretchLimit; + Parameters.IETDParameters.aBlackPixels = BlackPixels; + Parameters.IETDParameters.aWhitePixels = WhitePixels; + Parameters.IETDParameters.aSaturationGain = SaturationGain; + Parameters.IETDParameters.aBitLimit = BitLimit; + Parameters.IETDParameters.aWBC = WBC; + Parameters.IETDParameters.aDBC = DBC; + + //Sharpening + Parameters.SharpeningParameters.SHARP_GAIN = SharpGain; + Parameters.SharpeningParameters.SHARP_DZONE = SharpDZone; + Parameters.SharpeningParameters.SHARP_OVER = SharpOver; + + //Color Management (fill LUTs and matrix) + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.GammaR[i] = CMGammaR[i]; + } + + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.GammaG[i] = CMGammaG[i]; + } + + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.GammaB[i] = CMGammaB[i]; + } + + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.TRCR[i] = CMTRCR[i]; + } + + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.TRCG[i] = CMTRCG[i]; + } + + for(i=0;i<256;i++) + { + Parameters.ColorManagementParameters.TRCB[i] = CMTRCB[i]; + } + + for(i=0;i<9;i++) + { + Parameters.ColorManagementParameters.Matrix[i] = CMMatrix[i]; + } + + } + + //Set the default parameters + IetdPtr->SetParams(&Parameters.IETDParameters); + SharpeningPtr->SetParameters(&Parameters.SharpeningParameters); + ColorManagementPtr->SetParameters(&Parameters.ColorManagementParameters); + + CleanupStack::Pop(5); //Processing objects +} + + + + +/* +----------------------------------------------------------------------------- + + CDCIetd + + Destructor + + Deletes the allocated memory + + Return Values: none + +----------------------------------------------------------------------------- +*/ +CDisplayChain::~CDisplayChain() +{ + //Delete processing objects + delete DigitalZoomPtr; + delete SharpeningPtr; + delete DitheringPtr; + delete IetdPtr; + delete ColorManagementPtr; +} + + + +/* +----------------------------------------------------------------------------- + + ProcessL + + Process image referenced by InBitmap (modify aTargetBitmap). + If scaling is not used aTargetBitmap is processed directly. + + May leave with KErrNoMemory if no memory available + + Return Values: none + +----------------------------------------------------------------------------- +*/ +void CDisplayChain::ProcessL(const CFbsBitmap* InBitmap, CFbsBitmap* aTargetBitmap) +{ + + //CHECK! pan check needed only when DZ is ON + //Scaling + if (Parameters.DigitalZoomON) + { + // refine the zooming parameters based on input data + TSize inSize = InBitmap->SizeInPixels(); + TSize outSize = aTargetBitmap->SizeInPixels(); + Parameters.DZParameters.sizeX = outSize.iWidth; + Parameters.DZParameters.sizeY = outSize.iHeight; + Parameters.DZParameters.scaleX = (TReal)outSize.iWidth/(TReal)inSize.iWidth; + Parameters.DZParameters.scaleY = (TReal)outSize.iHeight/(TReal)inSize.iHeight; + + //If the image is tried to pan over the image borders, bound to the borders + if (Parameters.DZParameters.allShiftX < (-InBitmap->SizeInPixels().iWidth/2 * Parameters.DZParameters.scaleX + aTargetBitmap->SizeInPixels().iWidth/2)) + { + Parameters.DZParameters.allShiftX = (TInt)((-InBitmap->SizeInPixels().iWidth/2)*Parameters.DZParameters.scaleX + aTargetBitmap->SizeInPixels().iWidth/2); + } + + if (Parameters.DZParameters.allShiftX > (InBitmap->SizeInPixels().iWidth/2 * Parameters.DZParameters.scaleX - aTargetBitmap->SizeInPixels().iWidth/2)) + { + Parameters.DZParameters.allShiftX = (TInt)((InBitmap->SizeInPixels().iWidth/2)*Parameters.DZParameters.scaleX - aTargetBitmap->SizeInPixels().iWidth/2); + } + + if (Parameters.DZParameters.allShiftY < (-InBitmap->SizeInPixels().iHeight/2 * Parameters.DZParameters.scaleY + aTargetBitmap->SizeInPixels().iHeight/2)) + { + Parameters.DZParameters.allShiftY = (TInt)((-InBitmap->SizeInPixels().iHeight/2)*Parameters.DZParameters.scaleY + aTargetBitmap->SizeInPixels().iHeight/2); + } + + if (Parameters.DZParameters.allShiftY > (InBitmap->SizeInPixels().iHeight/2 * Parameters.DZParameters.scaleY - aTargetBitmap->SizeInPixels().iHeight/2)) + { + Parameters.DZParameters.allShiftY = (TInt)((InBitmap->SizeInPixels().iHeight/2)*Parameters.DZParameters.scaleY - aTargetBitmap->SizeInPixels().iHeight/2); + } + + DigitalZoomPtr->SetParameters(&Parameters.DZParameters); + DigitalZoomPtr->ProcessL(InBitmap, aTargetBitmap); + } + + //IETD + if (Parameters.IetdON) + { + if (Parameters.FirstOpening) + { + IetdPtr->Analyze(*aTargetBitmap); + Parameters.FirstOpening = EFalse; + } + //Set parameters is needed if default values can change (read from file etc.) + //IetdPtr->SetParams(&Parameters.IETDParameters); + IetdPtr->ProcessL(*aTargetBitmap); + } + + //Sharpening + if (Parameters.SharpeningON) + { + //Set parameters is needed if default values can change (read from file etc.) + //SharpeningPtr->SetParameters(&Parameters.SharpeningParameters); + SharpeningPtr->ProcessL(aTargetBitmap); + } + + //ColorManagement + if (Parameters.ColorManagementON) + { + //Set parameters is needed if default values can change (read from file etc.) + //ColorManagementPtr->SetParameters(&Parameters.ColorManagementParameters); + ColorManagementPtr->ProcessL(aTargetBitmap); + } + + //Dithering + if (Parameters.DitheringON) + { + DitheringPtr->ProcessL(*aTargetBitmap); + } +} + + + + +/* +----------------------------------------------------------------------------- + + SetParams + + Set processing parameters + + Return Values: none + +----------------------------------------------------------------------------- +*/ +void CDisplayChain::SetParameters(DisplayChainParams* params) +{ + //Copy parameter struct + Parameters = *params; +} + + + +/* +----------------------------------------------------------------------------- + + GetParams + + Get current processing parameters + + Return Values: none + +----------------------------------------------------------------------------- +*/ +void CDisplayChain::GetParameters(DisplayChainParams* params) +{ + //Copy parameter struct + *params = Parameters; +} + + +/* +----------------------------------------------------------------------------- + + ReadFileL + + Example function for reading processing parameters from file + + Return Values: none + +----------------------------------------------------------------------------- +TBool CDisplayChain::ReadFileL() +{ + + FILE *fp; + TInt i,j,data; + TUint8 data_uchar; + TReal data_real; + + // Open for read (will fail if file does not exist) + if((fp = fopen("e:\\DisplayChain.txt","r"))==NULL ) + { + if((fp = fopen("c:\\DisplayChain.txt","r"))==NULL ) + { + //AfxMessageBox("CMData.txt was not opened"); + return EFalse; + } + } + + //Digital Zoom + fscanf(fp,"%d",&data); + Parameters.DigitalZoomON = data; + + //Ietd + fscanf(fp,"%d",&data); + Parameters.IetdON = data; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aWhitePixels = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aBlackPixels = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aStretchLimit = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aSaturationGain = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aBitLimit = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aWBC = data_uchar; + + fscanf(fp,"%d",&data_uchar); + Parameters.IETDParameters.aDBC = data_uchar; + + //Sharpening + fscanf(fp,"%d",&data); + Parameters.SharpeningON = data; + + fscanf(fp,"%d",&data); + Parameters.SharpeningParameters.SHARP_OVER = data; + + fscanf(fp,"%d",&data); + Parameters.SharpeningParameters.SHARP_DZONE = data; + + //fscanf(fp,"%f",&data_real); + fscanf(fp,"%d",&data); + data_real = ((TReal)data)/65536; + Parameters.SharpeningParameters.SHARP_GAIN = data_real; + + //Dithering + fscanf(fp,"%d",&data); + Parameters.DitheringON = data; + + //ColorManagement + fscanf(fp,"%d",&data); + Parameters.ColorManagementON = data; + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.GammaR[i]=data; + } + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.GammaG[i]=data; + } + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.GammaB[i]=data; + } + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.TRCR[i]=data; + } + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.TRCG[i]=data; + } + + for(i=0;i<256;i++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.TRCB[i]=data; + } + + + for(i=0;i<3;i++) + { + for(j=0;j<3;j++) + { + fscanf(fp,"%d",&data); + Parameters.ColorManagementParameters.Matrix [3*i+j]=data; + } + } + + + // Close stream + fclose(fp); + + return ETrue; +} +*/ +//----IMAAMI----