--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/thumbnailengine/ImaamiSrc/DisplayChain.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,519 @@
+/*
+* Copyright (c) 2006 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:
+* 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
+*
+*/
+
+
+
+#include <fbs.h>
+#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----