16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2007 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_render.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_render.h"
176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_1d_table.h"
196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_bottlenecks.h"
206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_camera_profile.h"
216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_color_space.h"
226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_color_spec.h"
236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_filter_task.h"
246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_host.h"
256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_image.h"
266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_negative.h"
276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_resample.h"
286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_safe_arithmetic.h"
296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_utils.h"
306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_function_exposure_ramp::dng_function_exposure_ramp (real64 white,
346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														real64 black,
356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														real64 minBlack)
366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
37ae846f59545feffb3642d12f47901cc1f46a2788Kinan Hakim	:	fSlope ((white == black) ? 0.0f : 1.0 / (white - black))
386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fBlack (black)
396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fRadius (0.0)
416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fQScale (0.0)
426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
44ae846f59545feffb3642d12f47901cc1f46a2788Kinan Hakim	if (fSlope == 0.0)
45ae846f59545feffb3642d12f47901cc1f46a2788Kinan Hakim		{
46ae846f59545feffb3642d12f47901cc1f46a2788Kinan Hakim		 ThrowBadFormat ();
47ae846f59545feffb3642d12f47901cc1f46a2788Kinan Hakim		}
487841298310de58d0cddb212ac6295d9a27cf547cFlorian Kriener
496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const real64 kMaxCurveX = 0.5;			// Fraction of minBlack.
506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const real64 kMaxCurveY = 1.0 / 16.0;	// Fraction of white.
526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fRadius = Min_real64 (kMaxCurveX * minBlack,
546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  kMaxCurveY / fSlope);
556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fRadius > 0.0)
576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fQScale= fSlope / (4.0 * fRadius);
586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	else
596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fQScale = 0.0;
606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_function_exposure_ramp::Evaluate (real64 x) const
666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (x <= fBlack - fRadius)
696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return 0.0;
706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (x >= fBlack + fRadius)
726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		return Min_real64 ((x - fBlack) * fSlope, 1.0);
736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 y = x - (fBlack - fRadius);
756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return fQScale * y * y;
776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_function_exposure_tone::dng_function_exposure_tone (real64 exposure)
836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	fIsNOP (exposure >= 0.0)
856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fSlope (0.0)
876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	a (0.0)
896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	b (0.0)
906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	c (0.0)
916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!fIsNOP)
956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Find slope to use for the all except the highest two f-stops.
986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fSlope = pow (2.0, exposure);
1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Find quadradic parameters that match this darking at the crossover
1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// point, yet still map pure white to pure white.
1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		a = 16.0 / 9.0 * (1.0 - fSlope);
1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		b = fSlope - 0.5 * a;
1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		c = 1.0 - a - b;
1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_function_exposure_tone::Evaluate (real64 x) const
1176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!fIsNOP)
1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (x <= 0.25)
1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			x = x * fSlope;
1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else
1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			x = (a * x + b) * x + c;
1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
1296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return x;
1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_tone_curve_acr3_default::Evaluate (real64 x) const
1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	static const real32 kTable [] =
1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00000f, 0.00078f, 0.00160f, 0.00242f,
1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00314f, 0.00385f, 0.00460f, 0.00539f,
1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00623f, 0.00712f, 0.00806f, 0.00906f,
1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.01012f, 0.01122f, 0.01238f, 0.01359f,
1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.01485f, 0.01616f, 0.01751f, 0.01890f,
1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02033f, 0.02180f, 0.02331f, 0.02485f,
1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02643f, 0.02804f, 0.02967f, 0.03134f,
1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03303f, 0.03475f, 0.03648f, 0.03824f,
1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04002f, 0.04181f, 0.04362f, 0.04545f,
1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04730f, 0.04916f, 0.05103f, 0.05292f,
1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05483f, 0.05675f, 0.05868f, 0.06063f,
1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06259f, 0.06457f, 0.06655f, 0.06856f,
1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07057f, 0.07259f, 0.07463f, 0.07668f,
1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07874f, 0.08081f, 0.08290f, 0.08499f,
1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08710f, 0.08921f, 0.09134f, 0.09348f,
1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09563f, 0.09779f, 0.09996f, 0.10214f,
1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10433f, 0.10652f, 0.10873f, 0.11095f,
1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11318f, 0.11541f, 0.11766f, 0.11991f,
1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12218f, 0.12445f, 0.12673f, 0.12902f,
1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13132f, 0.13363f, 0.13595f, 0.13827f,
1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14061f, 0.14295f, 0.14530f, 0.14765f,
1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15002f, 0.15239f, 0.15477f, 0.15716f,
1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15956f, 0.16197f, 0.16438f, 0.16680f,
1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16923f, 0.17166f, 0.17410f, 0.17655f,
1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17901f, 0.18148f, 0.18395f, 0.18643f,
1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18891f, 0.19141f, 0.19391f, 0.19641f,
1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19893f, 0.20145f, 0.20398f, 0.20651f,
1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20905f, 0.21160f, 0.21416f, 0.21672f,
1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21929f, 0.22185f, 0.22440f, 0.22696f,
1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22950f, 0.23204f, 0.23458f, 0.23711f,
1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.23963f, 0.24215f, 0.24466f, 0.24717f,
1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24967f, 0.25216f, 0.25465f, 0.25713f,
1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.25961f, 0.26208f, 0.26454f, 0.26700f,
1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.26945f, 0.27189f, 0.27433f, 0.27676f,
1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.27918f, 0.28160f, 0.28401f, 0.28641f,
1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.28881f, 0.29120f, 0.29358f, 0.29596f,
1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.29833f, 0.30069f, 0.30305f, 0.30540f,
1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.30774f, 0.31008f, 0.31241f, 0.31473f,
1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.31704f, 0.31935f, 0.32165f, 0.32395f,
1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.32623f, 0.32851f, 0.33079f, 0.33305f,
1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.33531f, 0.33756f, 0.33981f, 0.34205f,
1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.34428f, 0.34650f, 0.34872f, 0.35093f,
1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.35313f, 0.35532f, 0.35751f, 0.35969f,
1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.36187f, 0.36404f, 0.36620f, 0.36835f,
1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.37050f, 0.37264f, 0.37477f, 0.37689f,
1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.37901f, 0.38112f, 0.38323f, 0.38533f,
1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.38742f, 0.38950f, 0.39158f, 0.39365f,
1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.39571f, 0.39777f, 0.39982f, 0.40186f,
1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.40389f, 0.40592f, 0.40794f, 0.40996f,
1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.41197f, 0.41397f, 0.41596f, 0.41795f,
1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.41993f, 0.42191f, 0.42388f, 0.42584f,
1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.42779f, 0.42974f, 0.43168f, 0.43362f,
1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.43554f, 0.43747f, 0.43938f, 0.44129f,
1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.44319f, 0.44509f, 0.44698f, 0.44886f,
1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.45073f, 0.45260f, 0.45447f, 0.45632f,
1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.45817f, 0.46002f, 0.46186f, 0.46369f,
1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.46551f, 0.46733f, 0.46914f, 0.47095f,
1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.47275f, 0.47454f, 0.47633f, 0.47811f,
1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.47989f, 0.48166f, 0.48342f, 0.48518f,
2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.48693f, 0.48867f, 0.49041f, 0.49214f,
2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.49387f, 0.49559f, 0.49730f, 0.49901f,
2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.50072f, 0.50241f, 0.50410f, 0.50579f,
2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.50747f, 0.50914f, 0.51081f, 0.51247f,
2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.51413f, 0.51578f, 0.51742f, 0.51906f,
2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.52069f, 0.52232f, 0.52394f, 0.52556f,
2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.52717f, 0.52878f, 0.53038f, 0.53197f,
2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.53356f, 0.53514f, 0.53672f, 0.53829f,
2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.53986f, 0.54142f, 0.54297f, 0.54452f,
2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.54607f, 0.54761f, 0.54914f, 0.55067f,
2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.55220f, 0.55371f, 0.55523f, 0.55673f,
2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.55824f, 0.55973f, 0.56123f, 0.56271f,
2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.56420f, 0.56567f, 0.56715f, 0.56861f,
2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.57007f, 0.57153f, 0.57298f, 0.57443f,
2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.57587f, 0.57731f, 0.57874f, 0.58017f,
2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.58159f, 0.58301f, 0.58443f, 0.58583f,
2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.58724f, 0.58864f, 0.59003f, 0.59142f,
2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.59281f, 0.59419f, 0.59556f, 0.59694f,
2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.59830f, 0.59966f, 0.60102f, 0.60238f,
2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.60373f, 0.60507f, 0.60641f, 0.60775f,
2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.60908f, 0.61040f, 0.61173f, 0.61305f,
2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.61436f, 0.61567f, 0.61698f, 0.61828f,
2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.61957f, 0.62087f, 0.62216f, 0.62344f,
2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.62472f, 0.62600f, 0.62727f, 0.62854f,
2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.62980f, 0.63106f, 0.63232f, 0.63357f,
2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.63482f, 0.63606f, 0.63730f, 0.63854f,
2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.63977f, 0.64100f, 0.64222f, 0.64344f,
2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.64466f, 0.64587f, 0.64708f, 0.64829f,
2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.64949f, 0.65069f, 0.65188f, 0.65307f,
2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.65426f, 0.65544f, 0.65662f, 0.65779f,
2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.65897f, 0.66013f, 0.66130f, 0.66246f,
2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.66362f, 0.66477f, 0.66592f, 0.66707f,
2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.66821f, 0.66935f, 0.67048f, 0.67162f,
2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.67275f, 0.67387f, 0.67499f, 0.67611f,
2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.67723f, 0.67834f, 0.67945f, 0.68055f,
2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.68165f, 0.68275f, 0.68385f, 0.68494f,
2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.68603f, 0.68711f, 0.68819f, 0.68927f,
2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.69035f, 0.69142f, 0.69249f, 0.69355f,
2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.69461f, 0.69567f, 0.69673f, 0.69778f,
2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.69883f, 0.69988f, 0.70092f, 0.70196f,
2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.70300f, 0.70403f, 0.70506f, 0.70609f,
2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.70711f, 0.70813f, 0.70915f, 0.71017f,
2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.71118f, 0.71219f, 0.71319f, 0.71420f,
2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.71520f, 0.71620f, 0.71719f, 0.71818f,
2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.71917f, 0.72016f, 0.72114f, 0.72212f,
2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.72309f, 0.72407f, 0.72504f, 0.72601f,
2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.72697f, 0.72794f, 0.72890f, 0.72985f,
2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.73081f, 0.73176f, 0.73271f, 0.73365f,
2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.73460f, 0.73554f, 0.73647f, 0.73741f,
2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.73834f, 0.73927f, 0.74020f, 0.74112f,
2506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.74204f, 0.74296f, 0.74388f, 0.74479f,
2516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.74570f, 0.74661f, 0.74751f, 0.74842f,
2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.74932f, 0.75021f, 0.75111f, 0.75200f,
2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.75289f, 0.75378f, 0.75466f, 0.75555f,
2546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.75643f, 0.75730f, 0.75818f, 0.75905f,
2556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.75992f, 0.76079f, 0.76165f, 0.76251f,
2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.76337f, 0.76423f, 0.76508f, 0.76594f,
2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.76679f, 0.76763f, 0.76848f, 0.76932f,
2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.77016f, 0.77100f, 0.77183f, 0.77267f,
2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.77350f, 0.77432f, 0.77515f, 0.77597f,
2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.77680f, 0.77761f, 0.77843f, 0.77924f,
2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.78006f, 0.78087f, 0.78167f, 0.78248f,
2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.78328f, 0.78408f, 0.78488f, 0.78568f,
2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.78647f, 0.78726f, 0.78805f, 0.78884f,
2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.78962f, 0.79040f, 0.79118f, 0.79196f,
2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.79274f, 0.79351f, 0.79428f, 0.79505f,
2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.79582f, 0.79658f, 0.79735f, 0.79811f,
2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.79887f, 0.79962f, 0.80038f, 0.80113f,
2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.80188f, 0.80263f, 0.80337f, 0.80412f,
2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.80486f, 0.80560f, 0.80634f, 0.80707f,
2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.80780f, 0.80854f, 0.80926f, 0.80999f,
2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.81072f, 0.81144f, 0.81216f, 0.81288f,
2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.81360f, 0.81431f, 0.81503f, 0.81574f,
2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.81645f, 0.81715f, 0.81786f, 0.81856f,
2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.81926f, 0.81996f, 0.82066f, 0.82135f,
2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.82205f, 0.82274f, 0.82343f, 0.82412f,
2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.82480f, 0.82549f, 0.82617f, 0.82685f,
2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.82753f, 0.82820f, 0.82888f, 0.82955f,
2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.83022f, 0.83089f, 0.83155f, 0.83222f,
2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.83288f, 0.83354f, 0.83420f, 0.83486f,
2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.83552f, 0.83617f, 0.83682f, 0.83747f,
2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.83812f, 0.83877f, 0.83941f, 0.84005f,
2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.84069f, 0.84133f, 0.84197f, 0.84261f,
2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.84324f, 0.84387f, 0.84450f, 0.84513f,
2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.84576f, 0.84639f, 0.84701f, 0.84763f,
2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.84825f, 0.84887f, 0.84949f, 0.85010f,
2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.85071f, 0.85132f, 0.85193f, 0.85254f,
2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.85315f, 0.85375f, 0.85436f, 0.85496f,
2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.85556f, 0.85615f, 0.85675f, 0.85735f,
2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.85794f, 0.85853f, 0.85912f, 0.85971f,
2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.86029f, 0.86088f, 0.86146f, 0.86204f,
2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.86262f, 0.86320f, 0.86378f, 0.86435f,
2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.86493f, 0.86550f, 0.86607f, 0.86664f,
2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.86720f, 0.86777f, 0.86833f, 0.86889f,
2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.86945f, 0.87001f, 0.87057f, 0.87113f,
2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.87168f, 0.87223f, 0.87278f, 0.87333f,
2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.87388f, 0.87443f, 0.87497f, 0.87552f,
2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.87606f, 0.87660f, 0.87714f, 0.87768f,
2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.87821f, 0.87875f, 0.87928f, 0.87981f,
2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.88034f, 0.88087f, 0.88140f, 0.88192f,
3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.88244f, 0.88297f, 0.88349f, 0.88401f,
3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.88453f, 0.88504f, 0.88556f, 0.88607f,
3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.88658f, 0.88709f, 0.88760f, 0.88811f,
3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.88862f, 0.88912f, 0.88963f, 0.89013f,
3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89063f, 0.89113f, 0.89163f, 0.89212f,
3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89262f, 0.89311f, 0.89360f, 0.89409f,
3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89458f, 0.89507f, 0.89556f, 0.89604f,
3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89653f, 0.89701f, 0.89749f, 0.89797f,
3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89845f, 0.89892f, 0.89940f, 0.89987f,
3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90035f, 0.90082f, 0.90129f, 0.90176f,
3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90222f, 0.90269f, 0.90316f, 0.90362f,
3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90408f, 0.90454f, 0.90500f, 0.90546f,
3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90592f, 0.90637f, 0.90683f, 0.90728f,
3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90773f, 0.90818f, 0.90863f, 0.90908f,
3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90952f, 0.90997f, 0.91041f, 0.91085f,
3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91130f, 0.91173f, 0.91217f, 0.91261f,
3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91305f, 0.91348f, 0.91392f, 0.91435f,
3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91478f, 0.91521f, 0.91564f, 0.91606f,
3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91649f, 0.91691f, 0.91734f, 0.91776f,
3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91818f, 0.91860f, 0.91902f, 0.91944f,
3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.91985f, 0.92027f, 0.92068f, 0.92109f,
3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92150f, 0.92191f, 0.92232f, 0.92273f,
3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92314f, 0.92354f, 0.92395f, 0.92435f,
3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92475f, 0.92515f, 0.92555f, 0.92595f,
3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92634f, 0.92674f, 0.92713f, 0.92753f,
3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92792f, 0.92831f, 0.92870f, 0.92909f,
3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92947f, 0.92986f, 0.93025f, 0.93063f,
3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93101f, 0.93139f, 0.93177f, 0.93215f,
3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93253f, 0.93291f, 0.93328f, 0.93366f,
3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93403f, 0.93440f, 0.93478f, 0.93515f,
3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93551f, 0.93588f, 0.93625f, 0.93661f,
3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93698f, 0.93734f, 0.93770f, 0.93807f,
3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93843f, 0.93878f, 0.93914f, 0.93950f,
3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.93986f, 0.94021f, 0.94056f, 0.94092f,
3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94127f, 0.94162f, 0.94197f, 0.94231f,
3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94266f, 0.94301f, 0.94335f, 0.94369f,
3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94404f, 0.94438f, 0.94472f, 0.94506f,
3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94540f, 0.94573f, 0.94607f, 0.94641f,
3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94674f, 0.94707f, 0.94740f, 0.94774f,
3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94807f, 0.94839f, 0.94872f, 0.94905f,
3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94937f, 0.94970f, 0.95002f, 0.95035f,
3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95067f, 0.95099f, 0.95131f, 0.95163f,
3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95194f, 0.95226f, 0.95257f, 0.95289f,
3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95320f, 0.95351f, 0.95383f, 0.95414f,
3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95445f, 0.95475f, 0.95506f, 0.95537f,
3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95567f, 0.95598f, 0.95628f, 0.95658f,
3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95688f, 0.95718f, 0.95748f, 0.95778f,
3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95808f, 0.95838f, 0.95867f, 0.95897f,
3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.95926f, 0.95955f, 0.95984f, 0.96013f,
3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96042f, 0.96071f, 0.96100f, 0.96129f,
3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96157f, 0.96186f, 0.96214f, 0.96242f,
3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96271f, 0.96299f, 0.96327f, 0.96355f,
3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96382f, 0.96410f, 0.96438f, 0.96465f,
3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96493f, 0.96520f, 0.96547f, 0.96574f,
3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96602f, 0.96629f, 0.96655f, 0.96682f,
3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96709f, 0.96735f, 0.96762f, 0.96788f,
3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96815f, 0.96841f, 0.96867f, 0.96893f,
3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.96919f, 0.96945f, 0.96971f, 0.96996f,
3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97022f, 0.97047f, 0.97073f, 0.97098f,
3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97123f, 0.97149f, 0.97174f, 0.97199f,
3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97223f, 0.97248f, 0.97273f, 0.97297f,
3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97322f, 0.97346f, 0.97371f, 0.97395f,
3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97419f, 0.97443f, 0.97467f, 0.97491f,
3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97515f, 0.97539f, 0.97562f, 0.97586f,
3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97609f, 0.97633f, 0.97656f, 0.97679f,
3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97702f, 0.97725f, 0.97748f, 0.97771f,
3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97794f, 0.97817f, 0.97839f, 0.97862f,
3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97884f, 0.97907f, 0.97929f, 0.97951f,
3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97973f, 0.97995f, 0.98017f, 0.98039f,
3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98061f, 0.98082f, 0.98104f, 0.98125f,
3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98147f, 0.98168f, 0.98189f, 0.98211f,
3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98232f, 0.98253f, 0.98274f, 0.98295f,
3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98315f, 0.98336f, 0.98357f, 0.98377f,
3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98398f, 0.98418f, 0.98438f, 0.98458f,
3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98478f, 0.98498f, 0.98518f, 0.98538f,
3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98558f, 0.98578f, 0.98597f, 0.98617f,
3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98636f, 0.98656f, 0.98675f, 0.98694f,
3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98714f, 0.98733f, 0.98752f, 0.98771f,
3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98789f, 0.98808f, 0.98827f, 0.98845f,
3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98864f, 0.98882f, 0.98901f, 0.98919f,
3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.98937f, 0.98955f, 0.98973f, 0.98991f,
3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99009f, 0.99027f, 0.99045f, 0.99063f,
3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99080f, 0.99098f, 0.99115f, 0.99133f,
3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99150f, 0.99167f, 0.99184f, 0.99201f,
3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99218f, 0.99235f, 0.99252f, 0.99269f,
3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99285f, 0.99302f, 0.99319f, 0.99335f,
3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99351f, 0.99368f, 0.99384f, 0.99400f,
3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99416f, 0.99432f, 0.99448f, 0.99464f,
3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99480f, 0.99495f, 0.99511f, 0.99527f,
3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99542f, 0.99558f, 0.99573f, 0.99588f,
3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99603f, 0.99619f, 0.99634f, 0.99649f,
3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99664f, 0.99678f, 0.99693f, 0.99708f,
3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99722f, 0.99737f, 0.99751f, 0.99766f,
3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99780f, 0.99794f, 0.99809f, 0.99823f,
3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99837f, 0.99851f, 0.99865f, 0.99879f,
3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99892f, 0.99906f, 0.99920f, 0.99933f,
3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.99947f, 0.99960f, 0.99974f, 0.99987f,
3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		1.00000f
3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		};
3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const uint32 kTableSize = sizeof (kTable    ) /
4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  sizeof (kTable [0]);
4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 y = (real32) x * (real32) (kTableSize - 1);
4046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	int32 index = Pin_int32 (0, (int32) y, kTableSize - 2);
4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 fract = y - (real32) index;
4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return kTable [index    ] * (1.0f - fract) +
4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		   kTable [index + 1] * (       fract);
4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_tone_curve_acr3_default::EvaluateInverse (real64 x) const
4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	static const real32 kTable [] =
4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00000f, 0.00121f, 0.00237f, 0.00362f,
4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00496f, 0.00621f, 0.00738f, 0.00848f,
4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.00951f, 0.01048f, 0.01139f, 0.01227f,
4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.01312f, 0.01393f, 0.01471f, 0.01547f,
4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.01620f, 0.01692f, 0.01763f, 0.01831f,
4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.01899f, 0.01965f, 0.02030f, 0.02094f,
4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02157f, 0.02218f, 0.02280f, 0.02340f,
4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02399f, 0.02458f, 0.02517f, 0.02574f,
4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02631f, 0.02688f, 0.02744f, 0.02800f,
4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.02855f, 0.02910f, 0.02965f, 0.03019f,
4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03072f, 0.03126f, 0.03179f, 0.03232f,
4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03285f, 0.03338f, 0.03390f, 0.03442f,
4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03493f, 0.03545f, 0.03596f, 0.03647f,
4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03698f, 0.03749f, 0.03799f, 0.03849f,
4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.03899f, 0.03949f, 0.03998f, 0.04048f,
4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04097f, 0.04146f, 0.04195f, 0.04244f,
4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04292f, 0.04341f, 0.04389f, 0.04437f,
4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04485f, 0.04533f, 0.04580f, 0.04628f,
4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04675f, 0.04722f, 0.04769f, 0.04816f,
4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.04863f, 0.04910f, 0.04956f, 0.05003f,
4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05049f, 0.05095f, 0.05141f, 0.05187f,
4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05233f, 0.05278f, 0.05324f, 0.05370f,
4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05415f, 0.05460f, 0.05505f, 0.05551f,
4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05595f, 0.05640f, 0.05685f, 0.05729f,
4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05774f, 0.05818f, 0.05863f, 0.05907f,
4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.05951f, 0.05995f, 0.06039f, 0.06083f,
4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06126f, 0.06170f, 0.06214f, 0.06257f,
4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06301f, 0.06344f, 0.06388f, 0.06431f,
4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06474f, 0.06517f, 0.06560f, 0.06602f,
4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06645f, 0.06688f, 0.06731f, 0.06773f,
4516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06815f, 0.06858f, 0.06900f, 0.06943f,
4526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.06985f, 0.07027f, 0.07069f, 0.07111f,
4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07152f, 0.07194f, 0.07236f, 0.07278f,
4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07319f, 0.07361f, 0.07402f, 0.07444f,
4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07485f, 0.07526f, 0.07567f, 0.07608f,
4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07650f, 0.07691f, 0.07732f, 0.07772f,
4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07813f, 0.07854f, 0.07895f, 0.07935f,
4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.07976f, 0.08016f, 0.08057f, 0.08098f,
4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08138f, 0.08178f, 0.08218f, 0.08259f,
4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08299f, 0.08339f, 0.08379f, 0.08419f,
4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08459f, 0.08499f, 0.08539f, 0.08578f,
4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08618f, 0.08657f, 0.08697f, 0.08737f,
4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08776f, 0.08816f, 0.08855f, 0.08894f,
4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.08934f, 0.08973f, 0.09012f, 0.09051f,
4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09091f, 0.09130f, 0.09169f, 0.09208f,
4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09247f, 0.09286f, 0.09324f, 0.09363f,
4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09402f, 0.09440f, 0.09479f, 0.09518f,
4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09556f, 0.09595f, 0.09633f, 0.09672f,
4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09710f, 0.09749f, 0.09787f, 0.09825f,
4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.09863f, 0.09901f, 0.09939f, 0.09978f,
4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10016f, 0.10054f, 0.10092f, 0.10130f,
4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10167f, 0.10205f, 0.10243f, 0.10281f,
4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10319f, 0.10356f, 0.10394f, 0.10432f,
4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10469f, 0.10507f, 0.10544f, 0.10582f,
4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10619f, 0.10657f, 0.10694f, 0.10731f,
4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10768f, 0.10806f, 0.10843f, 0.10880f,
4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.10917f, 0.10954f, 0.10991f, 0.11029f,
4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11066f, 0.11103f, 0.11141f, 0.11178f,
4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11215f, 0.11253f, 0.11290f, 0.11328f,
4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11365f, 0.11403f, 0.11440f, 0.11478f,
4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11516f, 0.11553f, 0.11591f, 0.11629f,
4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11666f, 0.11704f, 0.11742f, 0.11780f,
4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11818f, 0.11856f, 0.11894f, 0.11932f,
4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.11970f, 0.12008f, 0.12046f, 0.12084f,
4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12122f, 0.12161f, 0.12199f, 0.12237f,
4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12276f, 0.12314f, 0.12352f, 0.12391f,
4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12429f, 0.12468f, 0.12506f, 0.12545f,
4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12583f, 0.12622f, 0.12661f, 0.12700f,
4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12738f, 0.12777f, 0.12816f, 0.12855f,
4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.12894f, 0.12933f, 0.12972f, 0.13011f,
4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13050f, 0.13089f, 0.13129f, 0.13168f,
4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13207f, 0.13247f, 0.13286f, 0.13325f,
4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13365f, 0.13404f, 0.13444f, 0.13483f,
4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13523f, 0.13563f, 0.13603f, 0.13642f,
4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13682f, 0.13722f, 0.13762f, 0.13802f,
4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.13842f, 0.13882f, 0.13922f, 0.13962f,
4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14003f, 0.14043f, 0.14083f, 0.14124f,
4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14164f, 0.14204f, 0.14245f, 0.14285f,
4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14326f, 0.14366f, 0.14407f, 0.14448f,
5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14489f, 0.14530f, 0.14570f, 0.14611f,
5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14652f, 0.14693f, 0.14734f, 0.14776f,
5026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14817f, 0.14858f, 0.14900f, 0.14941f,
5036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.14982f, 0.15024f, 0.15065f, 0.15107f,
5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15148f, 0.15190f, 0.15232f, 0.15274f,
5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15316f, 0.15357f, 0.15399f, 0.15441f,
5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15483f, 0.15526f, 0.15568f, 0.15610f,
5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15652f, 0.15695f, 0.15737f, 0.15779f,
5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15822f, 0.15864f, 0.15907f, 0.15950f,
5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.15992f, 0.16035f, 0.16078f, 0.16121f,
5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16164f, 0.16207f, 0.16250f, 0.16293f,
5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16337f, 0.16380f, 0.16423f, 0.16467f,
5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16511f, 0.16554f, 0.16598f, 0.16641f,
5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16685f, 0.16729f, 0.16773f, 0.16816f,
5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.16860f, 0.16904f, 0.16949f, 0.16993f,
5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17037f, 0.17081f, 0.17126f, 0.17170f,
5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17215f, 0.17259f, 0.17304f, 0.17349f,
5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17393f, 0.17438f, 0.17483f, 0.17528f,
5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17573f, 0.17619f, 0.17664f, 0.17709f,
5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17754f, 0.17799f, 0.17845f, 0.17890f,
5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.17936f, 0.17982f, 0.18028f, 0.18073f,
5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18119f, 0.18165f, 0.18211f, 0.18257f,
5226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18303f, 0.18350f, 0.18396f, 0.18442f,
5236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18489f, 0.18535f, 0.18582f, 0.18629f,
5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18676f, 0.18723f, 0.18770f, 0.18817f,
5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.18864f, 0.18911f, 0.18958f, 0.19005f,
5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19053f, 0.19100f, 0.19147f, 0.19195f,
5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19243f, 0.19291f, 0.19339f, 0.19387f,
5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19435f, 0.19483f, 0.19531f, 0.19579f,
5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19627f, 0.19676f, 0.19724f, 0.19773f,
5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.19821f, 0.19870f, 0.19919f, 0.19968f,
5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20017f, 0.20066f, 0.20115f, 0.20164f,
5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20214f, 0.20263f, 0.20313f, 0.20362f,
5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20412f, 0.20462f, 0.20512f, 0.20561f,
5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20611f, 0.20662f, 0.20712f, 0.20762f,
5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.20812f, 0.20863f, 0.20913f, 0.20964f,
5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21015f, 0.21066f, 0.21117f, 0.21168f,
5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21219f, 0.21270f, 0.21321f, 0.21373f,
5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21424f, 0.21476f, 0.21527f, 0.21579f,
5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21631f, 0.21683f, 0.21735f, 0.21787f,
5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.21839f, 0.21892f, 0.21944f, 0.21997f,
5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22049f, 0.22102f, 0.22155f, 0.22208f,
5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22261f, 0.22314f, 0.22367f, 0.22420f,
5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22474f, 0.22527f, 0.22581f, 0.22634f,
5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22688f, 0.22742f, 0.22796f, 0.22850f,
5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.22905f, 0.22959f, 0.23013f, 0.23068f,
5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.23123f, 0.23178f, 0.23232f, 0.23287f,
5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.23343f, 0.23398f, 0.23453f, 0.23508f,
5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.23564f, 0.23620f, 0.23675f, 0.23731f,
5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.23787f, 0.23843f, 0.23899f, 0.23956f,
5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24012f, 0.24069f, 0.24125f, 0.24182f,
5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24239f, 0.24296f, 0.24353f, 0.24410f,
5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24468f, 0.24525f, 0.24582f, 0.24640f,
5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24698f, 0.24756f, 0.24814f, 0.24872f,
5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.24931f, 0.24989f, 0.25048f, 0.25106f,
5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.25165f, 0.25224f, 0.25283f, 0.25342f,
5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.25401f, 0.25460f, 0.25520f, 0.25579f,
5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.25639f, 0.25699f, 0.25759f, 0.25820f,
5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.25880f, 0.25940f, 0.26001f, 0.26062f,
5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.26122f, 0.26183f, 0.26244f, 0.26306f,
5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.26367f, 0.26429f, 0.26490f, 0.26552f,
5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.26614f, 0.26676f, 0.26738f, 0.26800f,
5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.26863f, 0.26925f, 0.26988f, 0.27051f,
5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.27114f, 0.27177f, 0.27240f, 0.27303f,
5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.27367f, 0.27431f, 0.27495f, 0.27558f,
5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.27623f, 0.27687f, 0.27751f, 0.27816f,
5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.27881f, 0.27945f, 0.28011f, 0.28076f,
5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.28141f, 0.28207f, 0.28272f, 0.28338f,
5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.28404f, 0.28470f, 0.28536f, 0.28602f,
5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.28669f, 0.28736f, 0.28802f, 0.28869f,
5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.28937f, 0.29004f, 0.29071f, 0.29139f,
5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.29207f, 0.29274f, 0.29342f, 0.29410f,
5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.29479f, 0.29548f, 0.29616f, 0.29685f,
5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.29754f, 0.29823f, 0.29893f, 0.29962f,
5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.30032f, 0.30102f, 0.30172f, 0.30242f,
5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.30312f, 0.30383f, 0.30453f, 0.30524f,
5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.30595f, 0.30667f, 0.30738f, 0.30809f,
5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.30881f, 0.30953f, 0.31025f, 0.31097f,
5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.31170f, 0.31242f, 0.31315f, 0.31388f,
5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.31461f, 0.31534f, 0.31608f, 0.31682f,
5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.31755f, 0.31829f, 0.31904f, 0.31978f,
5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.32053f, 0.32127f, 0.32202f, 0.32277f,
5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.32353f, 0.32428f, 0.32504f, 0.32580f,
5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.32656f, 0.32732f, 0.32808f, 0.32885f,
5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.32962f, 0.33039f, 0.33116f, 0.33193f,
5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.33271f, 0.33349f, 0.33427f, 0.33505f,
5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.33583f, 0.33662f, 0.33741f, 0.33820f,
5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.33899f, 0.33978f, 0.34058f, 0.34138f,
5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.34218f, 0.34298f, 0.34378f, 0.34459f,
5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.34540f, 0.34621f, 0.34702f, 0.34783f,
5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.34865f, 0.34947f, 0.35029f, 0.35111f,
5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.35194f, 0.35277f, 0.35360f, 0.35443f,
5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.35526f, 0.35610f, 0.35694f, 0.35778f,
5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.35862f, 0.35946f, 0.36032f, 0.36117f,
5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.36202f, 0.36287f, 0.36372f, 0.36458f,
5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.36545f, 0.36631f, 0.36718f, 0.36805f,
5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.36891f, 0.36979f, 0.37066f, 0.37154f,
5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.37242f, 0.37331f, 0.37419f, 0.37507f,
5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.37596f, 0.37686f, 0.37775f, 0.37865f,
5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.37955f, 0.38045f, 0.38136f, 0.38227f,
6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.38317f, 0.38409f, 0.38500f, 0.38592f,
6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.38684f, 0.38776f, 0.38869f, 0.38961f,
6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.39055f, 0.39148f, 0.39242f, 0.39335f,
6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.39430f, 0.39524f, 0.39619f, 0.39714f,
6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.39809f, 0.39904f, 0.40000f, 0.40097f,
6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.40193f, 0.40289f, 0.40386f, 0.40483f,
6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.40581f, 0.40679f, 0.40777f, 0.40875f,
6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.40974f, 0.41073f, 0.41172f, 0.41272f,
6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.41372f, 0.41472f, 0.41572f, 0.41673f,
6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.41774f, 0.41875f, 0.41977f, 0.42079f,
6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.42181f, 0.42284f, 0.42386f, 0.42490f,
6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.42594f, 0.42697f, 0.42801f, 0.42906f,
6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.43011f, 0.43116f, 0.43222f, 0.43327f,
6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.43434f, 0.43540f, 0.43647f, 0.43754f,
6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.43862f, 0.43970f, 0.44077f, 0.44186f,
6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.44295f, 0.44404f, 0.44514f, 0.44624f,
6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.44734f, 0.44845f, 0.44956f, 0.45068f,
6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.45179f, 0.45291f, 0.45404f, 0.45516f,
6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.45630f, 0.45744f, 0.45858f, 0.45972f,
6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.46086f, 0.46202f, 0.46318f, 0.46433f,
6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.46550f, 0.46667f, 0.46784f, 0.46901f,
6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.47019f, 0.47137f, 0.47256f, 0.47375f,
6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.47495f, 0.47615f, 0.47735f, 0.47856f,
6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.47977f, 0.48099f, 0.48222f, 0.48344f,
6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.48467f, 0.48590f, 0.48714f, 0.48838f,
6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.48963f, 0.49088f, 0.49213f, 0.49340f,
6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.49466f, 0.49593f, 0.49721f, 0.49849f,
6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.49977f, 0.50106f, 0.50236f, 0.50366f,
6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.50496f, 0.50627f, 0.50758f, 0.50890f,
6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.51023f, 0.51155f, 0.51289f, 0.51422f,
6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.51556f, 0.51692f, 0.51827f, 0.51964f,
6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.52100f, 0.52237f, 0.52374f, 0.52512f,
6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.52651f, 0.52790f, 0.52930f, 0.53070f,
6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.53212f, 0.53353f, 0.53495f, 0.53638f,
6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.53781f, 0.53925f, 0.54070f, 0.54214f,
6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.54360f, 0.54506f, 0.54653f, 0.54800f,
6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.54949f, 0.55098f, 0.55247f, 0.55396f,
6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.55548f, 0.55699f, 0.55851f, 0.56003f,
6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.56156f, 0.56310f, 0.56464f, 0.56621f,
6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.56777f, 0.56933f, 0.57091f, 0.57248f,
6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.57407f, 0.57568f, 0.57727f, 0.57888f,
6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.58050f, 0.58213f, 0.58376f, 0.58541f,
6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.58705f, 0.58871f, 0.59037f, 0.59204f,
6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.59373f, 0.59541f, 0.59712f, 0.59882f,
6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.60052f, 0.60226f, 0.60399f, 0.60572f,
6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.60748f, 0.60922f, 0.61099f, 0.61276f,
6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.61455f, 0.61635f, 0.61814f, 0.61996f,
6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.62178f, 0.62361f, 0.62545f, 0.62730f,
6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.62917f, 0.63104f, 0.63291f, 0.63480f,
6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.63671f, 0.63862f, 0.64054f, 0.64249f,
6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.64443f, 0.64638f, 0.64835f, 0.65033f,
6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.65232f, 0.65433f, 0.65633f, 0.65836f,
6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.66041f, 0.66245f, 0.66452f, 0.66660f,
6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.66868f, 0.67078f, 0.67290f, 0.67503f,
6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.67717f, 0.67932f, 0.68151f, 0.68368f,
6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.68587f, 0.68809f, 0.69033f, 0.69257f,
6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.69482f, 0.69709f, 0.69939f, 0.70169f,
6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.70402f, 0.70634f, 0.70869f, 0.71107f,
6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.71346f, 0.71587f, 0.71829f, 0.72073f,
6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.72320f, 0.72567f, 0.72818f, 0.73069f,
6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.73323f, 0.73579f, 0.73838f, 0.74098f,
6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.74360f, 0.74622f, 0.74890f, 0.75159f,
6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.75429f, 0.75704f, 0.75979f, 0.76257f,
6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.76537f, 0.76821f, 0.77109f, 0.77396f,
6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.77688f, 0.77982f, 0.78278f, 0.78579f,
6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.78883f, 0.79187f, 0.79498f, 0.79809f,
6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.80127f, 0.80445f, 0.80767f, 0.81095f,
6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.81424f, 0.81757f, 0.82094f, 0.82438f,
6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.82782f, 0.83133f, 0.83488f, 0.83847f,
6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.84210f, 0.84577f, 0.84951f, 0.85328f,
6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.85713f, 0.86103f, 0.86499f, 0.86900f,
6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.87306f, 0.87720f, 0.88139f, 0.88566f,
6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.89000f, 0.89442f, 0.89891f, 0.90350f,
6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.90818f, 0.91295f, 0.91780f, 0.92272f,
6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.92780f, 0.93299f, 0.93828f, 0.94369f,
6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.94926f, 0.95493f, 0.96082f, 0.96684f,
6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		0.97305f, 0.97943f, 0.98605f, 0.99291f,
6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		1.00000f
6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		};
6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const uint32 kTableSize = sizeof (kTable    ) /
6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  sizeof (kTable [0]);
6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 y = (real32) x * (real32) (kTableSize - 1);
6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	int32 index = Pin_int32 (0, (int32) y, kTableSize - 2);
6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 fract = y - (real32) index;
6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return kTable [index    ] * (1.0f - fract) +
6906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		   kTable [index + 1] * (       fract);
6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimconst dng_1d_function & dng_tone_curve_acr3_default::Get ()
6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	static dng_tone_curve_acr3_default static_dng_tone_curve_acr3_default;
7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return static_dng_tone_curve_acr3_default;
7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_render_task: public dng_filter_task
7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	protected:
7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_negative &fNegative;
7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_render &fParams;
7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_point fSrcOffset;
7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_vector fCameraWhite;
7196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_matrix fCameraToRGB;
7206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_hue_sat_map> fHueSatMap;
7226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_1d_table fExposureRamp;
7246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_hue_sat_map> fLookTable;
7266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_1d_table fToneCurve;
7286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_matrix fRGBtoFinal;
7306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_1d_table fEncodeGamma;
7326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_1d_table> fHueSatMapEncode;
7346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_1d_table> fHueSatMapDecode;
7356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_1d_table> fLookTableEncode;
7376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_1d_table> fLookTableDecode;
7386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_memory_block> fTempBuffer [kMaxMPThreads];
7406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
7426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_render_task (const dng_image &srcImage,
7446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 dng_image &dstImage,
7456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 const dng_negative &negative,
7466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 const dng_render &params,
7476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 const dng_point &srcOffset);
7486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual dng_rect SrcArea (const dng_rect &dstArea);
7506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void Start (uint32 threadCount,
7526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							const dng_point &tileSize,
7536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							dng_memory_allocator *allocator,
7546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							dng_abort_sniffer *sniffer);
7556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual void ProcessArea (uint32 threadIndex,
7576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  dng_pixel_buffer &srcBuffer,
7586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  dng_pixel_buffer &dstBuffer);
7596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
7616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
7636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_render_task::dng_render_task (const dng_image &srcImage,
7656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  dng_image &dstImage,
7666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  const dng_negative &negative,
7676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  const dng_render &params,
7686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  const dng_point &srcOffset)
7696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	dng_filter_task (srcImage,
7716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 dstImage)
7726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fNegative  (negative )
7746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fParams    (params   )
7756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fSrcOffset (srcOffset)
7766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fCameraWhite ()
7786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fCameraToRGB ()
7796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fHueSatMap ()
7816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fExposureRamp ()
7836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fLookTable ()
7856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fToneCurve ()
7876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fRGBtoFinal ()
7896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fEncodeGamma ()
7916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fHueSatMapEncode ()
7936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fHueSatMapDecode ()
7946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fLookTableEncode ()
7966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fLookTableDecode ()
7976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
7996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fSrcPixelType = ttFloat;
8016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fDstPixelType = ttFloat;
8026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
8046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
8066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_rect dng_render_task::SrcArea (const dng_rect &dstArea)
8086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
8096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dstArea + fSrcOffset;
8116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
8136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
8156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_render_task::Start (uint32 threadCount,
8176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 const dng_point &tileSize,
8186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_memory_allocator *allocator,
8196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							 dng_abort_sniffer *sniffer)
8206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
8216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_filter_task::Start (threadCount,
8236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							tileSize,
8246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							allocator,
8256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							sniffer);
8266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Compute camera space to linear ProPhoto RGB parameters.
8286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_camera_profile_id profileID;	// Default profile ID.
8306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!fNegative.IsMonochrome ())
8326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
8336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		AutoPtr<dng_color_spec> spec (fNegative.MakeColorSpec (profileID));
8356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (fParams.WhiteXY ().IsValid ())
8376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			spec->SetWhiteXY (fParams.WhiteXY ());
8406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else if (fNegative.HasCameraNeutral ())
8446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			spec->SetWhiteXY (spec->NeutralToXY (fNegative.CameraNeutral ()));
8476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else if (fNegative.HasCameraWhiteXY ())
8516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			spec->SetWhiteXY (fNegative.CameraWhiteXY ());
8546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else
8586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			spec->SetWhiteXY (D55_xy_coord ());
8616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
8636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fCameraWhite = spec->CameraWhite ();
8656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fCameraToRGB = dng_space_ProPhoto::Get ().MatrixFromPCS () *
8676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   spec->CameraToPCS ();
8686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Find Hue/Sat table, if any.
8706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_camera_profile *profile = fNegative.ProfileByID (profileID);
8726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (profile)
8746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
8756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			fHueSatMap.Reset (profile->HueSatMapForWhite (spec->WhiteXY ()));
8776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (profile->HasLookTable ())
8796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
8806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				fLookTable.Reset (new dng_hue_sat_map (profile->LookTable ()));
8826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
8846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (profile->HueSatMapEncoding () != encoding_Linear)
8866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
8876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				BuildHueSatMapEncodingTable (*allocator,
8896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 profile->HueSatMapEncoding (),
8906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 fHueSatMapEncode,
8916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 fHueSatMapDecode,
8926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 false);
8936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
8956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (profile->LookTableEncoding () != encoding_Linear)
8976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
8986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
8996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				BuildHueSatMapEncodingTable (*allocator,
9006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 profile->LookTableEncoding (),
9016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 fLookTableEncode,
9026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 fLookTableDecode,
9036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											 false);
9046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
9066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
9086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Compute exposure/shadows ramp.
9126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real64 exposure = fParams.Exposure () +
9146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  fNegative.TotalBaselineExposure (profileID) -
9156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  (log (fNegative.Stage3Gain ()) / log (2.0));
9166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
9186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 white = 1.0 / pow (2.0, Max_real64 (0.0, exposure));
9206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 black = fParams.Shadows () *
9226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   fNegative.ShadowScale () *
9236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   fNegative.Stage3Gain () *
9246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   0.001;
9256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		black = Min_real64 (black, 0.99 * white);
9276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_function_exposure_ramp rampFunction (white,
9296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim												 black,
9306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim												 black);
9316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fExposureRamp.Initialize (*allocator, rampFunction);
9336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Compute tone curve.
9376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
9396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// If there is any negative exposure compenation to perform
9416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// (beyond what the camera provides for with its baseline exposure),
9426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// we fake this by darkening the tone curve.
9436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_function_exposure_tone exposureTone (exposure);
9456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_1d_concatenate totalTone (exposureTone,
9476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  fParams.ToneCurve ());
9486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fToneCurve.Initialize (*allocator, totalTone);
9506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Compute linear ProPhoto RGB to final space parameters.
9546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
9566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_color_space &finalSpace = fParams.FinalSpace ();
9586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fRGBtoFinal = finalSpace.MatrixFromPCS () *
9606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  dng_space_ProPhoto::Get ().MatrixToPCS ();
9616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fEncodeGamma.Initialize (*allocator, finalSpace.GammaFunction ());
9636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Allocate temp buffer to hold one row of RGB data.
9676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 tempBufferSize = 0;
9696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (!SafeUint32Mult (tileSize.h, (uint32) sizeof (real32), &tempBufferSize) ||
9716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		 !SafeUint32Mult (tempBufferSize, 3, &tempBufferSize))
9726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
9736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ThrowMemoryFull("Arithmetic overflow computing buffer size.");
9756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
9796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
9806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fTempBuffer [threadIndex] . Reset (allocator->Allocate (tempBufferSize));
9826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
9846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
9866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
9886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_render_task::ProcessArea (uint32 threadIndex,
9906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   dng_pixel_buffer &srcBuffer,
9916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								   dng_pixel_buffer &dstBuffer)
9926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
9936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_rect srcArea = srcBuffer.fArea;
9956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_rect dstArea = dstBuffer.fArea;
9966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 srcCols = srcArea.W ();
9986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
9996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 *tPtrR = fTempBuffer [threadIndex]->Buffer_real32 ();
10006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 *tPtrG = tPtrR + srcCols;
10026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	real32 *tPtrB = tPtrG + srcCols;
10036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	for (int32 srcRow = srcArea.t; srcRow < srcArea.b; srcRow++)
10056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
10066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// First convert from camera native space to linear PhotoRGB,
10086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// applying the white balance and camera profile.
10096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
10116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const real32 *sPtrA = (const real32 *)
10136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  srcBuffer.ConstPixel (srcRow,
10146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													    srcArea.l,
10156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													    0);
10166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (fSrcPlanes == 1)
10186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
10196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// For monochrome cameras, this just requires copying
10216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// the data into all three color channels.
10226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				DoCopyBytes (sPtrA, tPtrR, srcCols * (uint32) sizeof (real32));
10246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				DoCopyBytes (sPtrA, tPtrG, srcCols * (uint32) sizeof (real32));
10256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				DoCopyBytes (sPtrA, tPtrB, srcCols * (uint32) sizeof (real32));
10266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
10286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
10306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
10316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const real32 *sPtrB = sPtrA + srcBuffer.fPlaneStep;
10336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				const real32 *sPtrC = sPtrB + srcBuffer.fPlaneStep;
10346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fSrcPlanes == 3)
10366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
10376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					DoBaselineABCtoRGB (sPtrA,
10396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    sPtrB,
10406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    sPtrC,
10416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    tPtrR,
10426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    tPtrG,
10436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    tPtrB,
10446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    srcCols,
10456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    fCameraWhite,
10466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									    fCameraToRGB);
10476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
10496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				else
10516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
10526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					const real32 *sPtrD = sPtrC + srcBuffer.fPlaneStep;
10546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					DoBaselineABCDtoRGB (sPtrA,
10566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     sPtrB,
10576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     sPtrC,
10586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     sPtrD,
10596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     tPtrR,
10606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     tPtrG,
10616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     tPtrB,
10626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     srcCols,
10636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     fCameraWhite,
10646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									     fCameraToRGB);
10656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
10676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				// Apply Hue/Sat map, if any.
10696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				if (fHueSatMap.Get ())
10716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					{
10726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					DoBaselineHueSatMap (tPtrR,
10746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 tPtrG,
10756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 tPtrB,
10766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 tPtrR,
10776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 tPtrG,
10786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 tPtrB,
10796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 srcCols,
10806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 *fHueSatMap.Get (),
10816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 fHueSatMapEncode.Get (),
10826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										 fHueSatMapDecode.Get ());
10836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					}
10856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
10876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
10896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Apply exposure curve.
10916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DoBaseline1DTable (tPtrR,
10936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrR,
10946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   srcCols,
10956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   fExposureRamp);
10966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
10976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DoBaseline1DTable (tPtrG,
10986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrG,
10996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   srcCols,
11006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   fExposureRamp);
11016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DoBaseline1DTable (tPtrB,
11036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrB,
11046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   srcCols,
11056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   fExposureRamp);
11066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Apply look table, if any.
11086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (fLookTable.Get ())
11106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaselineHueSatMap (tPtrR,
11136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrG,
11146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrB,
11156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrR,
11166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrG,
11176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrB,
11186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 srcCols,
11196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 *fLookTable.Get (),
11206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 fLookTableEncode.Get (),
11216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 fLookTableDecode.Get ());
11226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Apply baseline tone curve.
11266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		DoBaselineRGBTone (tPtrR,
11286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					       tPtrG,
11296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrB,
11306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrR,
11316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					       tPtrG,
11326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   tPtrB,
11336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   srcCols,
11346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   fToneCurve);
11356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Convert to final color space.
11376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 dstRow = srcRow + (dstArea.t - srcArea.t);
11396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (fDstPlanes == 1)
11416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 *dPtrG = dstBuffer.DirtyPixel_real32 (dstRow,
11446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														 dstArea.l,
11456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														 0);
11466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaselineRGBtoGray (tPtrR,
11486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrG,
11496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 tPtrB,
11506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 dPtrG,
11516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 srcCols,
11526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 fRGBtoFinal);
11536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaseline1DTable (dPtrG,
11556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   dPtrG,
11566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   srcCols,
11576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   fEncodeGamma);
11586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		else
11626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
11636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 *dPtrR = dstBuffer.DirtyPixel_real32 (dstRow,
11656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														 dstArea.l,
11666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim														 0);
11676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 *dPtrG = dPtrR + dstBuffer.fPlaneStep;
11696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real32 *dPtrB = dPtrG + dstBuffer.fPlaneStep;
11706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaselineRGBtoRGB (tPtrR,
11726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								tPtrG,
11736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								tPtrB,
11746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								dPtrR,
11756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								dPtrG,
11766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								dPtrB,
11776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								srcCols,
11786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								fRGBtoFinal);
11796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaseline1DTable (dPtrR,
11816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   dPtrR,
11826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   srcCols,
11836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   fEncodeGamma);
11846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaseline1DTable (dPtrG,
11866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   dPtrG,
11876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   srcCols,
11886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   fEncodeGamma);
11896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DoBaseline1DTable (dPtrB,
11916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   dPtrB,
11926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   srcCols,
11936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							   fEncodeGamma);
11946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
11966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
11986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
11996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
12006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
12026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_render::dng_render (dng_host &host,
12046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						const dng_negative &negative)
12056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	:	fHost			(host)
12076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fNegative		(negative)
12086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fWhiteXY		()
12106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fExposure		(0.0)
12126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fShadows		(5.0)
12136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fToneCurve		(&dng_tone_curve_acr3_default::Get ())
12156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fFinalSpace		(&dng_space_sRGB::Get ())
12176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fFinalPixelType (ttByte)
12186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fMaximumSize	(0)
12206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	,	fProfileToneCurve ()
12226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
12246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Switch to NOP default parameters for non-scene referred data.
12266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (fNegative.ColorimetricReference () != crSceneReferred)
12286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fShadows = 0.0;
12316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fToneCurve = &dng_1d_identity::Get ();
12336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Use default tone curve from profile if any.
12376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const dng_camera_profile *profile = fNegative.ProfileByID (dng_camera_profile_id ());
12396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (profile && profile->ToneCurve ().IsValid ())
12416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fProfileToneCurve.Reset (new dng_spline_solver);
12446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		profile->ToneCurve ().Solve (*fProfileToneCurve.Get ());
12466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fToneCurve = fProfileToneCurve.Get ();
12486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	// Turn off default shadow mapping if requested by profile.
12526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (profile && (profile->DefaultBlackRender () == defaultBlackRender_None))
12546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		fShadows = 0.0;
12576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
12616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
12636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_image * dng_render::Render ()
12656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
12666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	const dng_image *srcImage = fNegative.Stage3Image ();
12686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_rect srcBounds = fNegative.DefaultCropArea ();
12706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_point dstSize;
12726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dstSize.h =	fNegative.DefaultFinalWidth  ();
12746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dstSize.v = fNegative.DefaultFinalHeight ();
12756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (MaximumSize ())
12776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
12786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		if (Max_uint32 (dstSize.h, dstSize.v) > MaximumSize ())
12806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
12816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			real64 ratio = fNegative.AspectRatio ();
12836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (ratio >= 1.0)
12856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
12866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				dstSize.h = MaximumSize ();
12876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				dstSize.v = Max_uint32 (1, Round_uint32 (dstSize.h / ratio));
12886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
12896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			else
12916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
12926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				dstSize.v = MaximumSize ();
12936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				dstSize.h = Max_uint32 (1, Round_uint32 (dstSize.v * ratio));
12946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
12956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
12976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
12986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
12996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	AutoPtr<dng_image> tempImage;
13016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	if (srcBounds.Size () != dstSize)
13036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		{
13046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		tempImage.Reset (fHost.Make_dng_image (dstSize,
13066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											   srcImage->Planes    (),
13076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim											   srcImage->PixelType ()));
13086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		ResampleImage (fHost,
13106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   *srcImage,
13116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   *tempImage.Get (),
13126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   srcBounds,
13136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   tempImage->Bounds (),
13146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   dng_resample_bicubic::Get ());
13156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		srcImage = tempImage.Get ();
13176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		srcBounds = tempImage->Bounds ();
13196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		}
13216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	uint32 dstPlanes = FinalSpace ().IsMonochrome () ? 1 : 3;
13236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	AutoPtr<dng_image> dstImage (fHost.Make_dng_image (srcBounds.Size (),
13256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													   dstPlanes,
13266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim													   FinalPixelType ()));
13276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	dng_render_task task (*srcImage,
13296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  *dstImage.Get (),
13306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  fNegative,
13316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  *this,
13326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  srcBounds.TL ());
13336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	fHost.PerformAreaTask (task,
13356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						   dstImage->Bounds ());
13366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	return dstImage.Release ();
13386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	}
13406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
13416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
1342