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 ¶ms, 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 ¶ms, 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