16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2011 Adobe Systems Incorporated
36e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// All Rights Reserved.
46e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim//
56e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// NOTICE:  Adobe permits you to use, modify, and distribute this file in
66e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// accordance with the terms of the Adobe license agreement accompanying it.
76e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
86e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
96e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_linearization_info.cpp#1 $ */
106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $DateTime: 2012/05/30 13:28:51 $ */
116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Change: 832332 $ */
126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Author: tknoll $ */
136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_linearization_info.h"
176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_area_task.h"
196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_exceptions.h"
206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_host.h"
216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_image.h"
226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_info.h"
236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_negative.h"
246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_pixel_buffer.h"
256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_safe_arithmetic.h"
266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tag_types.h"
276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tile_iterator.h"
286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_utils.h"
296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_linearize_plane
336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	private:
366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image & fSrcImage;
386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		      dng_image & fDstImage;
396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fPlane;
416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_rect fActiveArea;
436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fSrcPixelType;
456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fDstPixelType;
466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fReal32;
486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real32 fScale;
506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fScale_buffer;
526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fBlack_2D_rows;
546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fBlack_2D_cols;
556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fBlack_2D_buffer;
576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fBlack_1D_rows;
596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fBlack_1D_buffer;
616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_linearize_plane (dng_host &host,
656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_linearization_info &info,
666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 const dng_image &srcImage,
676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_image &dstImage,
686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 uint32 plane);
696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		~dng_linearize_plane ();
716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void Process (const dng_rect &tile);
736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_plane::dng_linearize_plane (dng_host &host,
796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  dng_linearization_info &info,
806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  const dng_image &srcImage,
816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  dng_image &dstImage,
826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  uint32 plane)
836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	fSrcImage (srcImage)
856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fDstImage (dstImage)
866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fPlane (plane)
876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fActiveArea (info.fActiveArea)
886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fSrcPixelType (srcImage.PixelType ())
896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fDstPixelType (dstImage.PixelType ())
906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fReal32 (false)
916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fScale (0.0f)
926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fScale_buffer ()
936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack_2D_rows (0)
946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack_2D_cols (0)
956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack_2D_buffer ()
966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack_1D_rows (0)
976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack_1D_buffer ()
986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 j;
1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 k;
1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Make sure the source pixel type is supported.
1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fSrcPixelType != ttByte  &&
1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fSrcPixelType != ttShort &&
1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fSrcPixelType != ttLong  &&
1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fSrcPixelType != ttFloat)
1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DNG_REPORT ("Unsupported source pixel type");
1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ThrowProgramError ();
1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fDstPixelType != ttShort &&
1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fDstPixelType != ttFloat)
1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DNG_REPORT ("Unsupported destination pixel type");
1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ThrowProgramError ();
1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fSrcPixelType == ttFloat &&
1296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fDstPixelType != ttFloat)
1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DNG_REPORT ("Cannot convert floating point stage1 to non-floating stage2");
1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ThrowProgramError ();
1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Are we using floating point math?
1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fReal32 = (fSrcPixelType == ttLong ||
1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			   fDstPixelType == ttFloat);
1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Find the scale for this plane.
1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 maxBlack = info.MaxBlackLevel (plane);
1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 minRange = info.fWhiteLevel [plane] - maxBlack;
1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (minRange <= 0.0)
1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ThrowBadFormat ();
1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 scale = 1.0 / minRange;
1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fScale = (real32) scale;
1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Calculate two-dimensional black pattern, if any.
1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (info.fBlackDeltaH.Get ())
1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_2D_rows = info.fBlackLevelRepeatRows;
1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_2D_cols = info.fActiveArea.W ();
1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	else if (info.fBlackLevelRepeatCols > 1)
1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_2D_rows = info.fBlackLevelRepeatRows;
1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_2D_cols = info.fBlackLevelRepeatCols;
1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlack_2D_rows)
1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_2D_buffer.Reset (host.Allocate (
1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SafeUint32Mult (fBlack_2D_rows, fBlack_2D_cols, 4)));
1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < fBlack_2D_rows; j++)
1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (k = 0;  k < fBlack_2D_cols; k++)
1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real64 x = info.fBlackLevel [j]
1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											[k % info.fBlackLevelRepeatCols]
1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											[plane];
1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (info.fBlackDeltaH.Get ())
1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x += info.fBlackDeltaH->Buffer_real64 () [k];
1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				x *= scale;
2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 index = j * fBlack_2D_cols + k;
2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fReal32)
2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fBlack_2D_buffer->Buffer_real32 () [index] = (real32) x;
2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x *= 0x0FFFF * 256.0;
2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 y = Round_int32 (x);
2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fBlack_2D_buffer->Buffer_int32 () [index] = y;
2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Calculate one-dimensional (per row) black pattern, if any.
2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (info.fBlackDeltaV.Get ())
2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_1D_rows = info.fActiveArea.H ();
2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	else if (fBlack_2D_rows == 0 &&
2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			 (info.fBlackLevelRepeatRows > 1 || fSrcPixelType != ttShort))
2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_1D_rows = info.fBlackLevelRepeatRows;
2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlack_1D_rows)
2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlack_1D_buffer.Reset (host.Allocate (
2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SafeUint32Mult(fBlack_1D_rows, 4)));
2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool allZero = true;
2516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < fBlack_1D_rows; j++)
2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real64 x = 0.0;
2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fBlack_2D_rows == 0)
2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				x = info.fBlackLevel [j % info.fBlackLevelRepeatRows]
2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									 [0]
2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									 [plane];
2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (info.fBlackDeltaV.Get ())
2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				x += info.fBlackDeltaV->Buffer_real64 () [j];
2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			allZero = allZero && (x == 0.0);
2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			x *= scale;
2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fReal32)
2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlack_1D_buffer->Buffer_real32 () [j] = (real32) x;
2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				x *= 0x0FFFF * 256.0;
2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				int32 y = Round_int32 (x);
2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlack_1D_buffer->Buffer_int32 () [j] = y;
2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (allZero)
2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBlack_1D_rows = 0;
3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fBlack_1D_buffer.Reset ();
3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Calculate scale table, if any.
3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fSrcPixelType != ttLong &&
3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fSrcPixelType != ttFloat)
3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Find linearization table, if any.
3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint16 *lut = NULL;
3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 lutEntries = 0;
3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (info.fLinearizationTable.Get ())
3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			lut = info.fLinearizationTable->Buffer_uint16 ();
3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			lutEntries = info.fLinearizationTable->LogicalSize () >> 1;
3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// If the black level does not vary from pixel to pixel, then
3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// the entire process can be a single LUT.
3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (fBlack_1D_rows == 0 &&
3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		    fBlack_2D_rows == 0)
3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fScale_buffer.Reset (host.Allocate (0x10000 *
3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											    TagTypeSize (fDstPixelType)));
3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (j = 0; j < 0x10000; j++)
3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 x = j;
3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Apply linearization table, if any.
3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (lut)
3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x = Min_uint32 (x, lutEntries - 1);
3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x = lut [x];
3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Subtract constant black level.
3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real64 y = x - info.fBlackLevel [0] [0] [plane];
3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Apply scale.
3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				y *= scale;
3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// We can burn in the clipping also.
3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				y = Pin_real64 (0.0, y, 1.0);
3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Store output value in table.
3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fDstPixelType == ttShort)
3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint16 z = (uint16) Round_uint32 (y * 0x0FFFF);
3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fScale_buffer->Buffer_uint16 () [j] = z;
3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fScale_buffer->Buffer_real32 () [j] = (real32) y;
3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Else we only do the scaling operation in the scale table.
3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else
3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fScale_buffer.Reset (host.Allocate (0x10000 * 4));
3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (j = 0; j < 0x10000; j++)
3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 x = j;
4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Apply linearization table, if any.
4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (lut)
4046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
4056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x = Min_uint32 (x, lutEntries - 1);
4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x = lut [x];
4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Apply scale.
4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real64 y = x * scale;
4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Store output value in table.
4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fReal32)
4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fScale_buffer->Buffer_real32 () [j] = (real32) y;
4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 z = Round_int32 (y * 0x0FFFF * 256.0);
4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					fScale_buffer->Buffer_int32 () [j] = z;
4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_plane::~dng_linearize_plane ()
4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearize_plane::Process (const dng_rect &srcTile)
4526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Process tile.
4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_rect dstTile = srcTile - fActiveArea.TL ();
4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_const_tile_buffer srcBuffer (fSrcImage, srcTile);
4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_dirty_tile_buffer dstBuffer (fDstImage, dstTile);
4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	int32 sStep = srcBuffer.fColStep;
4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	int32 dStep = dstBuffer.fColStep;
4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 count = srcTile.W ();
4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 dstCol = dstTile.l;
4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 rows = srcTile.H ();
4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (uint32 row = 0; row < rows; row++)
4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 dstRow = dstTile.t + row;
4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void *sPtr = srcBuffer.ConstPixel (srcTile.t + row,
4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											     srcTile.l,
4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											     fPlane);
4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void *dPtr = dstBuffer.DirtyPixel (dstRow,
4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										   dstCol,
4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										   fPlane);
4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Floating point source case.
4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (fSrcPixelType == ttFloat)
4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 scale = fScale;
4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const real32 *srcPtr = (const real32 *) sPtr;
4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 *dstPtr = (real32 *) dPtr;
4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Optimize scale only case, which is the most common.
4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fBlack_1D_rows == 0 &&
4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlack_2D_cols == 0)
4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				for (uint32 j = 0; j < count; j++)
5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					*dstPtr = (*srcPtr) * scale;
5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					srcPtr += sStep;
5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					dstPtr += dStep;
5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real32 b1 = 0.0f;
5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fBlack_1D_rows)
5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					b1 = fBlack_1D_buffer->Buffer_real32 () [dstRow % fBlack_1D_rows];
5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const real32 *b2 = NULL;
5236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 b2_count = fBlack_2D_cols;
5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 b2_phase = 0;
5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (b2_count)
5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					b2 = fBlack_2D_buffer->Buffer_real32 () +
5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 b2_count * (dstRow % fBlack_2D_rows);
5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					b2_phase = dstCol % b2_count;
5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				for (uint32 j = 0; j < count; j++)
5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					real32 x = (*srcPtr) * scale - b1;
5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					if (b2_count)
5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x -= b2 [b2_phase];
5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (++b2_phase == b2_count)
5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							b2_phase = 0;
5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					*dstPtr = x;
5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					srcPtr += sStep;
5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					dstPtr += dStep;
5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Simple LUT case.
5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else if (fBlack_1D_rows == 0 &&
5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				 fBlack_2D_rows == 0 && fSrcPixelType != ttLong)
5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fDstPixelType == ttShort)
5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const uint16 *lut = fScale_buffer->Buffer_uint16 ();
5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint16 *dstPtr = (uint16 *) dPtr;
5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fSrcPixelType == ttByte)
5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint8 *srcPtr = (const uint8 *) sPtr;
5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = lut [*srcPtr];
5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint16 *srcPtr = (const uint16 *) sPtr;
5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = lut [*srcPtr];
6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const real32 *lut = fScale_buffer->Buffer_real32 ();
6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real32 *dstPtr = (real32 *) dPtr;
6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fSrcPixelType == ttByte)
6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint8 *srcPtr = (const uint8 *) sPtr;
6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = lut [*srcPtr];
6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint16 *srcPtr = (const uint16 *) sPtr;
6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = lut [*srcPtr];
6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Integer math case.
6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else if (!fReal32)
6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int32 *lut = fScale_buffer->Buffer_int32 ();
6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			int32 b1 = 0;
6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fBlack_1D_rows)
6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b1 = fBlack_1D_buffer->Buffer_int32 () [dstRow % fBlack_1D_rows];
6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int32 *b2 = NULL;
6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 b2_count = fBlack_2D_cols;
6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 b2_phase = 0;
6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (b2_count)
6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b2 = fBlack_2D_buffer->Buffer_int32 () +
6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 b2_count * (dstRow % fBlack_2D_rows);
6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b2_phase = dstCol % b2_count;
6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint16 *dstPtr = (uint16 *) dPtr;
6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6907841298310de58d0cddb212ac6295d9a27cf547cFlorian Kriener			b1 -= 128;		// Rounding for 8 bit shift
6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fSrcPixelType == ttByte)
6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const uint8 *srcPtr = (const uint8 *) sPtr;
6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				for (uint32 j = 0; j < count; j++)
6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 x = lut [*srcPtr] - b1;
7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					if (b2_count)
7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x -= b2 [b2_phase];
7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (++b2_phase == b2_count)
7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							b2_phase = 0;
7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x >>= 8;
7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					*dstPtr = Pin_uint16 (x);
7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					srcPtr += sStep;
7196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					dstPtr += dStep;
7206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
7226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
7246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
7266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
7276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const uint16 *srcPtr = (const uint16 *) sPtr;
7296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				for (uint32 j = 0; j < count; j++)
7316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
7326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 x = lut [*srcPtr] - b1;
7346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					if (b2_count)
7366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
7376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7387841298310de58d0cddb212ac6295d9a27cf547cFlorian Kriener						x -= b2 [b2_phase];
7396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (++b2_phase == b2_count)
7416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
7426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							b2_phase = 0;
7436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
7446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
7466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					x >>= 8;
7486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					*dstPtr = Pin_uint16 (x);
7506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					srcPtr += sStep;
7526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					dstPtr += dStep;
7536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
7556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
7576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
7596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Floating point math cases.
7616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else
7636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
7646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 b1 = 0.0f;
7666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fBlack_1D_rows)
7686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
7696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b1 = fBlack_1D_buffer->Buffer_real32 () [dstRow % fBlack_1D_rows];
7706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
7716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const real32 *b2 = NULL;
7736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 b2_count = fBlack_2D_cols;
7756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			uint32 b2_phase = 0;
7766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (b2_count)
7786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
7796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b2 = fBlack_2D_buffer->Buffer_real32 () +
7816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					 b2_count * (dstRow % fBlack_2D_rows);
7826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				b2_phase = dstCol % b2_count;
7846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
7866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Case 1: uint8/uint16 -> real32
7886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fSrcPixelType != ttLong)
7906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
7916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const real32 *lut = fScale_buffer->Buffer_real32 ();
7936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real32 *dstPtr = (real32 *) dPtr;
7956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fSrcPixelType == ttByte)
7976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
7986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint8 *srcPtr = (const uint8 *) sPtr;
8006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
8026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
8036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						real32 x = lut [*srcPtr] - b1;
8056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (b2_count)
8076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
8086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							x -= b2 [b2_phase];
8106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							if (++b2_phase == b2_count)
8126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								{
8136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								b2_phase = 0;
8146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								}
8156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
8176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x = Pin_real32 (0.0f, x, 1.0f);
8196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = x;
8216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
8236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
8246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
8266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
8286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
8306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
8316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const uint16 *srcPtr = (const uint16 *) sPtr;
8336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
8356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
8366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						real32 x = lut [*srcPtr] - b1;
8386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (b2_count)
8406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
8416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							x -= b2 [b2_phase];
8436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							if (++b2_phase == b2_count)
8456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								{
8466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								b2_phase = 0;
8476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								}
8486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
8506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x = Pin_real32 (0.0f, x, 1.0f);
8526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = x;
8546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
8566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
8576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
8596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
8616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
8636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Otherwise source is uint32
8656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
8676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
8686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real32 scale = fScale;
8706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const uint32 *srcPtr = (const uint32 *) sPtr;
8726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Case 2: uint32 -> real32
8746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fDstPixelType == ttFloat)
8766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
8776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					real32 *dstPtr = (real32 *) dPtr;
8796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
8816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
8826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						real32 x = ((real32) *srcPtr) * scale - b1;
8846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (b2_count)
8866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
8876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							x -= b2 [b2_phase];
8896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							if (++b2_phase == b2_count)
8916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								{
8926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								b2_phase = 0;
8936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								}
8946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
8966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x = Pin_real32 (0.0f, x, 1.0f);
8986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = x;
9006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
9026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
9036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
9056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
9076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Case 3: uint32 -> uint16
9096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
9116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
9126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint16 *dstPtr = (uint16 *) dPtr;
9146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					real32 dstScale = (real32) 0x0FFFF;
9166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					for (uint32 j = 0; j < count; j++)
9186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						{
9196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						real32 x = ((real32) *srcPtr) * scale - b1;
9216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						if (b2_count)
9236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							{
9246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							x -= b2 [b2_phase];
9266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							if (++b2_phase == b2_count)
9286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								{
9296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								b2_phase = 0;
9306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								}
9316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							}
9336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						x = Pin_real32 (0.0f, x, 1.0f);
9356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						*dstPtr = (uint16) (x * dstScale + 0.5f);
9376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						srcPtr += sStep;
9396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						dstPtr += dStep;
9406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						}
9426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
9446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
9466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
9526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
9546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_linearize_image: public dng_area_task
9566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
9576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	private:
9596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_image & fSrcImage;
9616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		      dng_image & fDstImage;
9626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_rect fActiveArea;
9646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_linearize_plane> fPlaneTask [kMaxColorPlanes];
9666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
9686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_linearize_image (dng_host &host,
9706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_linearization_info &info,
9716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 const dng_image &srcImage,
9726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_image &dstImage);
9736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual ~dng_linearize_image ();
9756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_rect RepeatingTile1 () const;
9776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_rect RepeatingTile2 () const;
9796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void Process (uint32 threadIndex,
9816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  const dng_rect &tile,
9826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  dng_abort_sniffer *sniffer);
9836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
9856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
9876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_image::dng_linearize_image (dng_host &host,
9896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  dng_linearization_info &info,
9906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  const dng_image &srcImage,
9916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  dng_image &dstImage)
9926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	fSrcImage   (srcImage)
9946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fDstImage   (dstImage)
9956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fActiveArea (info.fActiveArea)
9966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
9986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Build linearization table for each plane.
10006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (uint32 plane = 0; plane < srcImage.Planes (); plane++)
10026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
10036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fPlaneTask [plane].Reset (new dng_linearize_plane (host,
10056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														   info,
10066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														   srcImage,
10076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														   dstImage,
10086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														   plane));
10096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
10116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Adjust maximum tile size.
10136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fMaxTileSize = dng_point (1024, 1024);
10156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_image::~dng_linearize_image ()
10216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_rect dng_linearize_image::RepeatingTile1 () const
10286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return fSrcImage.RepeatingTile ();
10316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_rect dng_linearize_image::RepeatingTile2 () const
10376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return fDstImage.RepeatingTile () + fActiveArea.TL ();
10406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearize_image::Process (uint32 /* threadIndex */,
10466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  	   const dng_rect &srcTile,
10476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  	   dng_abort_sniffer * /* sniffer */)
10486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Process each plane.
10516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (uint32 plane = 0; plane < fSrcImage.Planes (); plane++)
10536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
10546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fPlaneTask [plane]->Process (srcTile);
10566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
10586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearization_info::dng_linearization_info ()
10646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	fActiveArea ()
10666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fMaskedAreaCount (0)
10676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fLinearizationTable ()
10686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlackLevelRepeatRows (1)
10696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlackLevelRepeatCols (1)
10706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlackDeltaH ()
10716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlackDeltaV ()
10726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlackDenom (256)
10736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 j;
10776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 k;
10786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 n;
10796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < kMaxBlackPattern; j++)
10816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (k = 0; k < kMaxBlackPattern; k++)
10826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (n = 0; n < kMaxSamplesPerPixel; n++)
10836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
10846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlackLevel [j] [k] [n] = 0.0;
10856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
10866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (n = 0; n < kMaxSamplesPerPixel; n++)
10886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
10896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fWhiteLevel [n] = 65535.0;
10906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
10916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
10936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
10956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearization_info::~dng_linearization_info ()
10976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
10986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
11006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
11026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::RoundBlacks ()
11046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
11056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 j;
11076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 k;
11086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 n;
11096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 maxAbs = 0.0;
11116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fBlackLevelRepeatRows; j++)
11136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (k = 0; k < fBlackLevelRepeatCols; k++)
11146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (n = 0; n < kMaxSamplesPerPixel; n++)
11156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
11166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				maxAbs = Max_real64 (maxAbs,
11186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									 Abs_real64 (fBlackLevel [j] [k] [n]));
11196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
11216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 count = RowBlackCount ();
11236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < count; j++)
11256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
11266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		maxAbs = Max_real64 (maxAbs,
11286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 Abs_real64 (fBlackDeltaV->Buffer_real64 () [j]));
11296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	count = ColumnBlackCount ();
11336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < count; j++)
11356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
11366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		maxAbs = Max_real64 (maxAbs,
11386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 Abs_real64 (fBlackDeltaH->Buffer_real64 () [j]));
11396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fBlackDenom = 256;
11446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	while (fBlackDenom > 1 && (maxAbs * fBlackDenom) >= 30000.0 * 65536.0)
11466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
11476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlackDenom >>= 1;
11486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fBlackLevelRepeatRows; j++)
11516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (k = 0; k < fBlackLevelRepeatCols; k++)
11526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (n = 0; n < kMaxSamplesPerPixel; n++)
11536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
11546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlackLevel [j] [k] [n] = BlackLevel (j, k, n).As_real64 ();
11566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
11586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	count = RowBlackCount ();
11606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < count; j++)
11626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
11636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlackDeltaV->Buffer_real64 () [j] = RowBlack (j).As_real64 ();
11656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	count = ColumnBlackCount ();
11696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < count; j++)
11716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
11726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlackDeltaH->Buffer_real64 () [j] = ColumnBlack (j).As_real64 ();
11746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
11786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
11806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::Parse (dng_host &host,
11826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    dng_stream &stream,
11836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    dng_info &info)
11846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
11856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 j;
11876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 k;
11886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 n;
11896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Find main image IFD.
11916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_ifd &rawIFD = *info.fIFD [info.fMainIndex].Get ();
11936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Copy active area.
11956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fActiveArea = rawIFD.fActiveArea;
11976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Copy masked areas.
11996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fMaskedAreaCount = rawIFD.fMaskedAreaCount;
12016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fMaskedAreaCount; j++)
12036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fMaskedArea [j] = rawIFD.fMaskedArea [j];
12056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Read linearization LUT.
12086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (rawIFD.fLinearizationTableCount)
12106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 size = SafeUint32Mult (rawIFD.fLinearizationTableCount,
12136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  static_cast<uint32> (sizeof (uint16)));
12146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fLinearizationTable.Reset (host.Allocate (size));
12166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint16 *table = fLinearizationTable->Buffer_uint16 ();
12186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		stream.SetReadPosition (rawIFD.fLinearizationTableOffset);
12206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < rawIFD.fLinearizationTableCount; j++)
12226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			table [j] = stream.Get_uint16 ();
12246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Copy black level pattern.
12296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fBlackLevelRepeatRows = rawIFD.fBlackLevelRepeatRows;
12316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fBlackLevelRepeatCols = rawIFD.fBlackLevelRepeatCols;
12326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < kMaxBlackPattern; j++)
12346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (k = 0; k < kMaxBlackPattern; k++)
12356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			for (n = 0; n < kMaxSamplesPerPixel; n++)
12366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
12376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fBlackLevel [j] [k] [n] = rawIFD.fBlackLevel [j] [k] [n];
12386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
12396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Read BlackDeltaH.
12416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (rawIFD.fBlackLevelDeltaHCount)
12436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 size = SafeUint32Mult (rawIFD.fBlackLevelDeltaHCount,
12466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  static_cast<uint32> (sizeof (real64)));
12476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlackDeltaH.Reset (host.Allocate (size));
12496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 *blacks = fBlackDeltaH->Buffer_real64 ();
12516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		stream.SetReadPosition (rawIFD.fBlackLevelDeltaHOffset);
12536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < rawIFD.fBlackLevelDeltaHCount; j++)
12556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			blacks [j] = stream.TagValue_real64 (rawIFD.fBlackLevelDeltaHType);
12576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Read BlackDeltaV.
12626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (rawIFD.fBlackLevelDeltaVCount)
12646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 size = SafeUint32Mult (rawIFD.fBlackLevelDeltaVCount,
12676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  static_cast<uint32> (sizeof (real64)));
12686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fBlackDeltaV.Reset (host.Allocate (size));
12706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 *blacks = fBlackDeltaV->Buffer_real64 ();
12726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		stream.SetReadPosition (rawIFD.fBlackLevelDeltaVOffset);
12746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < rawIFD.fBlackLevelDeltaVCount; j++)
12766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			blacks [j] = stream.TagValue_real64 (rawIFD.fBlackLevelDeltaVType);
12786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Copy white level.
12836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (n = 0; n < kMaxSamplesPerPixel; n++)
12856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fWhiteLevel [n] = rawIFD.fWhiteLevel [n];
12876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Round off black levels.
12906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	RoundBlacks ();
12926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
12946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
12966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::PostParse (dng_host & /* host */,
12986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										dng_negative &negative)
12996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
13006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fActiveArea.IsEmpty ())
13026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fActiveArea = negative.Stage1Image ()->Bounds ();
13056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
13096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
13116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_linearization_info::MaxBlackLevel (uint32 plane) const
13136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
13146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 j;
13166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 k;
13176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Find maximum value of fBlackDeltaH for each phase of black pattern.
13196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 maxDeltaH [kMaxBlackPattern];
13216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fBlackLevelRepeatCols; j++)
13236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		maxDeltaH [j] = 0.0;
13256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaH.Get ())
13286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 *table = fBlackDeltaH->Buffer_real64 ();
13316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 entries = fBlackDeltaH->LogicalSize () / (uint32) sizeof (table [0]);
13336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < entries; j++)
13356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real64 &entry = maxDeltaH [j % fBlackLevelRepeatCols];
13386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (j < fBlackLevelRepeatCols)
13406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
13416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				entry = table [j];
13426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
13436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
13446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
13456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				entry = Max_real64 (entry, table [j]);
13466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
13476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Find maximum value of fBlackDeltaV for each phase of black pattern.
13536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 maxDeltaV [kMaxBlackPattern];
13556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fBlackLevelRepeatRows; j++)
13576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		maxDeltaV [j] = 0.0;
13596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaV.Get ())
13626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 *table = fBlackDeltaV->Buffer_real64 ();
13656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 entries = fBlackDeltaV->LogicalSize () / (uint32) sizeof (table [0]);
13676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (j = 0; j < entries; j++)
13696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real64 &entry = maxDeltaV [j % fBlackLevelRepeatRows];
13726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (j < fBlackLevelRepeatRows)
13746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
13756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				entry = table [j];
13766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
13776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
13786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
13796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				entry = Max_real64 (entry, table [j]);
13806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
13816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
13836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Now scan the pattern and find the maximum value after row and column
13876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// deltas.
13886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 maxBlack = 0.0;
13906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (j = 0; j < fBlackLevelRepeatRows; j++)
13926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		for (k = 0; k < fBlackLevelRepeatCols; k++)
13956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
13966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real64 black = fBlackLevel [j] [k] [plane];
13986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			black += maxDeltaH [k];
14006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			black += maxDeltaV [j];
14016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (j == 0 && k == 0)
14036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
14046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				maxBlack = black;
14056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
14066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
14076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
14086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				maxBlack = Max_real64 (maxBlack, black);
14096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
14106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
14126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
14146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return maxBlack;
14166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
14186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
14206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::Linearize (dng_host &host,
14226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										const dng_image &srcImage,
14236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										dng_image &dstImage)
14246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
14256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_linearize_image processor (host,
14276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   *this,
14286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   srcImage,
14296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   dstImage);
14306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	host.PerformAreaTask (processor,
14326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  fActiveArea);
14336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
14356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
14376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_urational dng_linearization_info::BlackLevel (uint32 row,
14396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim												  uint32 col,
14406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim												  uint32 plane) const
14416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
14426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_urational r;
14446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	r.Set_real64 (fBlackLevel [row] [col] [plane], fBlackDenom);
14466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return r;
14486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
14506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
14526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimuint32 dng_linearization_info::RowBlackCount () const
14546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
14556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaV.Get ())
14576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
14586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return fBlackDeltaV->LogicalSize () >> 3;
14606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
14626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return 0;
14646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
14666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
14686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_srational dng_linearization_info::RowBlack (uint32 row) const
14706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
14716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaV.Get ())
14736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
14746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_srational r;
14766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		r.Set_real64 (fBlackDeltaV->Buffer_real64 () [row], fBlackDenom);
14786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return r;
14806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
14826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dng_srational (0, 1);
14846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
14866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
14886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimuint32 dng_linearization_info::ColumnBlackCount () const
14906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
14916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaH.Get ())
14936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
14946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return fBlackDeltaH->LogicalSize () >> 3;
14966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
14986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
14996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return 0;
15006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
15026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
15046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_srational dng_linearization_info::ColumnBlack (uint32 col) const
15066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
15076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fBlackDeltaH.Get ())
15096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
15106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_srational r;
15126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		r.Set_real64 (fBlackDeltaH->Buffer_real64 () [col], fBlackDenom);
15146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return r;
15166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
15186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dng_srational (0, 1);
15206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
15226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
15236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
1524