videoeditorengine/vedengine/GenManip/src/DCIetd.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- a/videoeditorengine/vedengine/GenManip/src/DCIetd.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,519 +0,0 @@
-/*
-* 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----
-//*************************************************************************
-//CDCIETD.cpp
-//Version 2.00
-//
-//Contains:
-//	CDCIETD 
-//		Display specific color contrast enhancement, 
-//		Image Enhancement for Transflective Displays version 2,
-//		IETD 2.
-//
-//History:
-//	23.10.2003 version 2.00 created using existing IMAAMI IETD	
-//*************************************************************************
-
-//  Include Files  
-#include <e32std.h>	// The basic definitions
-#include <fbs.h>	// For FBS bitmap
-#include "DCIetd.h"	// The DCIetd class
-
-
-//  MEMBER FUNCTIONS
-//=============================================================================
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  Constructor
-	
-  Default constructor, initializes member variables to initial values
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-CDCIetd::CDCIetd()
-{
-	// Set default values for parameters (from init file)
-	iParameters.aWhitePixels = WhitePixels;
-	iParameters.aBlackPixels = BlackPixels;
-	iParameters.aStretchLimit = StretchLimit;
-	iParameters.aSaturationGain = SaturationGain;
-	iParameters.aBitLimit = BitLimit;
-	iParameters.aWBC = WBC;
-	iParameters.aDBC = DBC;
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  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:  CDCIetd* self:  pointer to the class instance
-
------------------------------------------------------------------------------
-*/
-CDCIetd* CDCIetd::NewLC()
-{
-    CDCIetd* self = new (ELeave) CDCIetd();
-    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:  CDCIetd* self:  pointer to the class instance
-	
------------------------------------------------------------------------------
-*/
-CDCIetd* CDCIetd::NewL()
-{
-    CDCIetd* self = CDCIetd::NewLC();
-    CleanupStack::Pop();
-    return self;
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  ConstructL
-	
-  Second phase constructor. Does nothing at the moment
-	  
-  Return Values:  none
-		
- -----------------------------------------------------------------------------
-*/
-void CDCIetd::ConstructL()
-{
-    // This function is intentionally left blank.
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  Destructor
-	
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-CDCIetd::~CDCIetd()
-{
-    // This function is intentionally left blank.
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  Analyze
-	
-  Analyze image referenced by aBPtr 
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-// Analyze image referenced by aBPtr
-void CDCIetd::Analyze(CFbsBitmap& aBPtr)
-{
-
-	//EColor16M image is needed
-	if (aBPtr.DisplayMode() != EColor16M) return;
-	
-	//Do analysis
-	GatherHistograms(aBPtr);
-	MakeMappings();
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  ProcessL
-	
-  Process image referenced by aImage (modify aImage).
-  May leave with KErrNoMemory if no memory available
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-void CDCIetd::ProcessL (CFbsBitmap& aImage)  // image reference
-{
-	TUint	r, g, b;	// Color components
-	TUint	lum;		// Brightness estimate
-	TInt	dr, dg, db;	// Differences to brightness
-	TUint8*	dataPtr;	// Pointer to data
-	
-	//EColor16M image is needed
-	if (aImage.DisplayMode() != EColor16M) return;
-	
-	//Line Buffer and pointer to the data
-	TUint imageWidth = aImage.SizeInPixels().iWidth;
-	TUint scanLineLengthInBytes = aImage.ScanLineLength(imageWidth, aImage.DisplayMode());
-
-	//Allocate buffer for scanline
-	iScanLineBuffer = HBufC8::NewMaxL(scanLineLengthInBytes);
-	//Pointer to scanline
-	TPtr8 linePtr = iScanLineBuffer->Des();
-	
-	//Step through image pixels and do stretching
-	//and saturation increase
-	//---------------------------------------------
-
-	//Read all lines
-	for (TInt lineNo=0; lineNo<aImage.SizeInPixels().iHeight; ++lineNo)
-	{
-		//Get line
-		aImage.GetScanLine(linePtr, TPoint(0, lineNo), imageWidth, aImage.DisplayMode());
-		//CHECK! CONST_CAST not used in every algorithm which way is better?
-		dataPtr = CONST_CAST(TUint8*, linePtr.Ptr());
-	
-		//Step through pixels in line
-		for (TUint x=0; x < imageWidth; ++x)
-		{
-			// Map color componets according to mapping LUTs
-			b = iMap[2][*dataPtr++];
-			g = iMap[1][*dataPtr++];
-			r = iMap[0][*dataPtr++];
-			
-			//Compute brightness estimate
-			//lum=0.299r+0.587g+0.114b; //true Y
-			//lum=(32768+19595*r+38470*g+7471*b)>>16; //Y
-			//lum = (r+g+b)/3; //Simple approximation
-			lum=(r+(g<<1)+b)>>2; //More effective simple approximation
-			
-			//Compute componentwise differences to luminance
-			dr = r-lum;
-			dg = g-lum;
-			db = b-lum;
-			
-			//Increase differences => saturation increases.
-			//Use gain parameter for adjusting the strength of the effect.
-			b += iParameters.aSaturationGain*db/32;
-			g += iParameters.aSaturationGain*dg/32;
-			r += iParameters.aSaturationGain*dr/32;
-			
-			//Save data to same image & same pixels
-			dataPtr -= 3;
-						
-			//Limit to available dynamic range [0,255].
-			*dataPtr++ = Limit255(b);
-			*dataPtr++ = Limit255(g);
-			*dataPtr++ = Limit255(r);
-		}
-		
-		//Save line
-		aImage.SetScanLine(linePtr, lineNo);
-	}
-
-	//Free memory
-	delete(iScanLineBuffer);
-	iScanLineBuffer = 0;
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  GatherHistograms
-	
-  Gather histograms and make cumulative histogram.
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-void CDCIetd::GatherHistograms (const CFbsBitmap& aImage)  // Pointer to the image bitmap
-{
-	const TUint8* dataPtr; //Pointer to data
-	TInt lineNo; //Line number
-	TUint x;	 //Pixel index	
-	TUint color; //Color index
-	TUint count; // Number of colors in each component
-
-	//Compute image width & allocate scan line memory
-	TUint imageWidth = aImage.SizeInPixels().iWidth;
-	TUint histScanLineLengthInBytes = aImage.ScanLineLength(imageWidth, aImage.DisplayMode());
-	iScanLineBuffer = HBufC8::NewMaxL(histScanLineLengthInBytes);
-	
-	//Pointer to line
-	TPtr8 linePtr = iScanLineBuffer->Des();
-
-	//Clear histograms
-	Mem::FillZ(iHistogram, sizeof(iHistogram));
-
-	// Read all lines and gather histograms
-	for (lineNo=0; lineNo<aImage.SizeInPixels().iHeight; lineNo++)
-	{
-		//Get line
-		aImage.GetScanLine(linePtr, TPoint(0, lineNo), imageWidth, aImage.DisplayMode());
-		dataPtr = linePtr.Ptr();
-
-		//Step through pixels
-		for (x=imageWidth; x != 0; --x)
-		{
-			++iHistogram[2][*dataPtr++]; // Increase Blue bin value
-			++iHistogram[1][*dataPtr++]; // Increase Green bin value
-			++iHistogram[0][*dataPtr++]; // Increase Red bin value
-		}
-	}
-	
-	//Make cumulative histograms & count colors in each histogram
-	for (color=0; color<3; ++color)
-	{
-		 // Count used colors
-		count=0;
-		for (x=0; x<256; ++x)
-		{
-			if (iHistogram[color][x]>0) count++;
-		}
-		
-		// Compute increased stretch limit if a color component has less colors than iBitLimit.
-		// Otherwise use predetermined stretch limit.
-		if (count<iParameters.aBitLimit)
-			iReducedStretchLimit[color] = (TUint8)(iParameters.aStretchLimit*count/iParameters.aBitLimit+255-255*count/iParameters.aBitLimit);
-		else
-			iReducedStretchLimit[color] = iParameters.aStretchLimit;
-		
-		//Make cumulative histogram
-		for (x=1; x<256; ++x)
-			iHistogram[color][x] += iHistogram[color][x-1];
-		
-	}
-	
-	//Free memory
-	delete(iScanLineBuffer);
-	iScanLineBuffer = 0;
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  MakeMappings
-	
-  Make mapping function look-up table (LUT).
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-void CDCIetd::MakeMappings()
-{
-	TInt    MinBins[3];// Smallest existing values in histogram
-	TInt    MaxBins[3];// Largest existing values in histogram
-	TUint    minBin;    // Minimum of smallest existing values
-	TUint    maxBin;    // Maximum of largest existing values
-	TUint    x;         // Index
-	
-	// Stretching limit variables
-	TUint    minShift;
-	TUint    maxShift;
-	TUint    totalShift;
-	
-	TUint    color; //Color index
-	
-	//Step through colors
-	for (color=0; color<3; ++color)
-	{
-		// Find smallest existing values in histograms, discard darkest pixels
-		// according to blackpixels parameter
-		x = 0; // Start from fist bin
-		MinBins[color] = iParameters.aBlackPixels * iHistogram[color][255]/1000; // Compute value to be found
-		while (x < 255 && (TUint)iHistogram[color][x] < MinBins[color])
-			++x; // Find from histogram
-		
-		MinBins[color] = x; // Save bin index = start of stretching part of LUT
-		
-		// Find largest existing values in histograms, discard brightest pixels
-		// according to whitepixels parameter
-		x = 255;  // Start from last bin
-		//Compute value to be found
-		MaxBins[color] = iHistogram[color][255] - iParameters.aWhitePixels * iHistogram[color][255]/1000;
-		while (x > 0 && (TUint)iHistogram[color][x] > MaxBins[color])
-			--x; // Find from histogram
-		
-		MaxBins[color] = x; // Save bin index = end of stretching part of LUT
-	}
-	
-	//Find minimum of all colors
-	minBin=255;
-	for (color=0; color<3; color++)
-	{
-		if (minBin>MinBins[color]) minBin=MinBins[color];
-	}
-	
-	//Find maximum of all colors
-	maxBin=0;
-	for (color=0; color<3; color++)
-	{
-		if (maxBin<MaxBins[color]) maxBin=MaxBins[color];
-	}
-	
-	//Adjust white and dark balance within limits given in parameters (maximum correction).
-	//0 means that largest(or smallest) of all values is used => no WBC(or DBC).
-	for (color=0; color<3; color++)
-	{
-		if(maxBin-MaxBins[color]>iParameters.aWBC) MaxBins[color]=maxBin-iParameters.aWBC;
-		if((MinBins[color]-minBin) > iParameters.aDBC) MinBins[color]=minBin+iParameters.aDBC;
-	}
-	
-	//Step through color components
-	for (color=0; color<3; color++)
-	{
-		// If histogram has only one nonzero bin maxBin can be less than minBin.
-		// In that case change maxBin value to minBin.
-		if(MaxBins[color]<MinBins[color]) MaxBins[color]=MinBins[color];
-		
-		// Limit stretching to narrovest histogram that can be stretched
-		if (MaxBins[color]-MinBins[color] < iReducedStretchLimit[color])
-		{
-			// Compute limiting shifts to measured values.
-			// Compute shifts for dark and bright end in relation
-			// to coresponding available space in dynamic range.
-			totalShift = iReducedStretchLimit[color]-(MaxBins[color]-MinBins[color]);
-			maxShift = totalShift*(255-MaxBins[color])/(255-(MaxBins[color]-MinBins[color]));
-			minShift = totalShift*MinBins[color]/(255-(MaxBins[color]-MinBins[color]));
-			
-			// Shift measured values, so that stretching is limited 
-			MinBins[color] -= minShift;
-			MaxBins[color] += maxShift;
-			
-			// Check that dynamic range is not exceeded
-			// (Should happen only with faulty parameter values)
-			if (MinBins[color]<0)
-				MinBins[color]=0;
-			if (MaxBins[color]>255)
-				MaxBins[color]=255;
-		}
-		
-		// Set 0 mapping part of the LUT
-		for (x=0; x<=MinBins[color]; ++x)
-			iMap[color][x] = 0;
-		
-		// Set 255 mapping part of the LUT
-		for (x=MaxBins[color]; x<=255; ++x)
-			iMap[color][x] = 255;
-		
-		// Compute linear stretching part of the LUT
-		for (x=MinBins[color]+1; x<MaxBins[color]; x++)
-			iMap[color][x] = (TUint8)(255*(x-MinBins[color])/(MaxBins[color]-MinBins[color]));
-	}
-}
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  SetParams
-	
-  Set processing parameters
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-void CDCIetd::SetParams(DCIetdParameters* params)
-{
-	iParameters = *params;
-}
-
-
-
-
-/*
------------------------------------------------------------------------------
-
-  CDCIetd
-  
-  GetParams
-	
-  Get current processing parameters
-	  
-  Return Values:  none
-		
------------------------------------------------------------------------------
-*/
-void CDCIetd::GetParams(DCIetdParameters* params)
-{
-	*params = iParameters;
-}
-//----IMAAMI----