| 1 | /*****************************************************************************/ | 
|---|
| 2 | // Copyright 2006-2007 Adobe Systems Incorporated | 
|---|
| 3 | // All Rights Reserved. | 
|---|
| 4 | // | 
|---|
| 5 | // NOTICE:  Adobe permits you to use, modify, and distribute this file in | 
|---|
| 6 | // accordance with the terms of the Adobe license agreement accompanying it. | 
|---|
| 7 | /*****************************************************************************/ | 
|---|
| 8 |  | 
|---|
| 9 | /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_render.cpp#1 $ */ | 
|---|
| 10 | /* $DateTime: 2012/05/30 13:28:51 $ */ | 
|---|
| 11 | /* $Change: 832332 $ */ | 
|---|
| 12 | /* $Author: tknoll $ */ | 
|---|
| 13 |  | 
|---|
| 14 | /*****************************************************************************/ | 
|---|
| 15 |  | 
|---|
| 16 | #include "dng_render.h" | 
|---|
| 17 |  | 
|---|
| 18 | #include "dng_1d_table.h" | 
|---|
| 19 | #include "dng_bottlenecks.h" | 
|---|
| 20 | #include "dng_camera_profile.h" | 
|---|
| 21 | #include "dng_color_space.h" | 
|---|
| 22 | #include "dng_color_spec.h" | 
|---|
| 23 | #include "dng_filter_task.h" | 
|---|
| 24 | #include "dng_host.h" | 
|---|
| 25 | #include "dng_image.h" | 
|---|
| 26 | #include "dng_negative.h" | 
|---|
| 27 | #include "dng_resample.h" | 
|---|
| 28 | #include "dng_safe_arithmetic.h" | 
|---|
| 29 | #include "dng_utils.h" | 
|---|
| 30 |  | 
|---|
| 31 | /*****************************************************************************/ | 
|---|
| 32 |  | 
|---|
| 33 | dng_function_exposure_ramp::dng_function_exposure_ramp (real64 white, | 
|---|
| 34 | real64 black, | 
|---|
| 35 | real64 minBlack) | 
|---|
| 36 |  | 
|---|
| 37 | :	fSlope ((white == black) ? 0.0f : 1.0 / (white - black)) | 
|---|
| 38 | ,	fBlack (black) | 
|---|
| 39 |  | 
|---|
| 40 | ,	fRadius (0.0) | 
|---|
| 41 | ,	fQScale (0.0) | 
|---|
| 42 |  | 
|---|
| 43 | { | 
|---|
| 44 | if (fSlope == 0.0) | 
|---|
| 45 | { | 
|---|
| 46 | ThrowBadFormat (); | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 | const real64 kMaxCurveX = 0.5;			// Fraction of minBlack. | 
|---|
| 50 |  | 
|---|
| 51 | const real64 kMaxCurveY = 1.0 / 16.0;	// Fraction of white. | 
|---|
| 52 |  | 
|---|
| 53 | fRadius = Min_real64 (kMaxCurveX * minBlack, | 
|---|
| 54 | kMaxCurveY / fSlope); | 
|---|
| 55 |  | 
|---|
| 56 | if (fRadius > 0.0) | 
|---|
| 57 | fQScale= fSlope / (4.0 * fRadius); | 
|---|
| 58 | else | 
|---|
| 59 | fQScale = 0.0; | 
|---|
| 60 |  | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | /*****************************************************************************/ | 
|---|
| 64 |  | 
|---|
| 65 | real64 dng_function_exposure_ramp::Evaluate (real64 x) const | 
|---|
| 66 | { | 
|---|
| 67 |  | 
|---|
| 68 | if (x <= fBlack - fRadius) | 
|---|
| 69 | return 0.0; | 
|---|
| 70 |  | 
|---|
| 71 | if (x >= fBlack + fRadius) | 
|---|
| 72 | return Min_real64 ((x - fBlack) * fSlope, 1.0); | 
|---|
| 73 |  | 
|---|
| 74 | real64 y = x - (fBlack - fRadius); | 
|---|
| 75 |  | 
|---|
| 76 | return fQScale * y * y; | 
|---|
| 77 |  | 
|---|
| 78 | } | 
|---|
| 79 |  | 
|---|
| 80 | /*****************************************************************************/ | 
|---|
| 81 |  | 
|---|
| 82 | dng_function_exposure_tone::dng_function_exposure_tone (real64 exposure) | 
|---|
| 83 |  | 
|---|
| 84 | :	fIsNOP (exposure >= 0.0) | 
|---|
| 85 |  | 
|---|
| 86 | ,	fSlope (0.0) | 
|---|
| 87 |  | 
|---|
| 88 | ,	a (0.0) | 
|---|
| 89 | ,	b (0.0) | 
|---|
| 90 | ,	c (0.0) | 
|---|
| 91 |  | 
|---|
| 92 | { | 
|---|
| 93 |  | 
|---|
| 94 | if (!fIsNOP) | 
|---|
| 95 | { | 
|---|
| 96 |  | 
|---|
| 97 | // Find slope to use for the all except the highest two f-stops. | 
|---|
| 98 |  | 
|---|
| 99 | fSlope = pow (2.0, exposure); | 
|---|
| 100 |  | 
|---|
| 101 | // Find quadradic parameters that match this darking at the crossover | 
|---|
| 102 | // point, yet still map pure white to pure white. | 
|---|
| 103 |  | 
|---|
| 104 | a = 16.0 / 9.0 * (1.0 - fSlope); | 
|---|
| 105 |  | 
|---|
| 106 | b = fSlope - 0.5 * a; | 
|---|
| 107 |  | 
|---|
| 108 | c = 1.0 - a - b; | 
|---|
| 109 |  | 
|---|
| 110 | } | 
|---|
| 111 |  | 
|---|
| 112 | } | 
|---|
| 113 |  | 
|---|
| 114 | /*****************************************************************************/ | 
|---|
| 115 |  | 
|---|
| 116 | real64 dng_function_exposure_tone::Evaluate (real64 x) const | 
|---|
| 117 | { | 
|---|
| 118 |  | 
|---|
| 119 | if (!fIsNOP) | 
|---|
| 120 | { | 
|---|
| 121 |  | 
|---|
| 122 | if (x <= 0.25) | 
|---|
| 123 | x = x * fSlope; | 
|---|
| 124 |  | 
|---|
| 125 | else | 
|---|
| 126 | x = (a * x + b) * x + c; | 
|---|
| 127 |  | 
|---|
| 128 | } | 
|---|
| 129 |  | 
|---|
| 130 | return x; | 
|---|
| 131 |  | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | /*****************************************************************************/ | 
|---|
| 135 |  | 
|---|
| 136 | real64 dng_tone_curve_acr3_default::Evaluate (real64 x) const | 
|---|
| 137 | { | 
|---|
| 138 |  | 
|---|
| 139 | static const real32 kTable [] = | 
|---|
| 140 | { | 
|---|
| 141 | 0.00000f, 0.00078f, 0.00160f, 0.00242f, | 
|---|
| 142 | 0.00314f, 0.00385f, 0.00460f, 0.00539f, | 
|---|
| 143 | 0.00623f, 0.00712f, 0.00806f, 0.00906f, | 
|---|
| 144 | 0.01012f, 0.01122f, 0.01238f, 0.01359f, | 
|---|
| 145 | 0.01485f, 0.01616f, 0.01751f, 0.01890f, | 
|---|
| 146 | 0.02033f, 0.02180f, 0.02331f, 0.02485f, | 
|---|
| 147 | 0.02643f, 0.02804f, 0.02967f, 0.03134f, | 
|---|
| 148 | 0.03303f, 0.03475f, 0.03648f, 0.03824f, | 
|---|
| 149 | 0.04002f, 0.04181f, 0.04362f, 0.04545f, | 
|---|
| 150 | 0.04730f, 0.04916f, 0.05103f, 0.05292f, | 
|---|
| 151 | 0.05483f, 0.05675f, 0.05868f, 0.06063f, | 
|---|
| 152 | 0.06259f, 0.06457f, 0.06655f, 0.06856f, | 
|---|
| 153 | 0.07057f, 0.07259f, 0.07463f, 0.07668f, | 
|---|
| 154 | 0.07874f, 0.08081f, 0.08290f, 0.08499f, | 
|---|
| 155 | 0.08710f, 0.08921f, 0.09134f, 0.09348f, | 
|---|
| 156 | 0.09563f, 0.09779f, 0.09996f, 0.10214f, | 
|---|
| 157 | 0.10433f, 0.10652f, 0.10873f, 0.11095f, | 
|---|
| 158 | 0.11318f, 0.11541f, 0.11766f, 0.11991f, | 
|---|
| 159 | 0.12218f, 0.12445f, 0.12673f, 0.12902f, | 
|---|
| 160 | 0.13132f, 0.13363f, 0.13595f, 0.13827f, | 
|---|
| 161 | 0.14061f, 0.14295f, 0.14530f, 0.14765f, | 
|---|
| 162 | 0.15002f, 0.15239f, 0.15477f, 0.15716f, | 
|---|
| 163 | 0.15956f, 0.16197f, 0.16438f, 0.16680f, | 
|---|
| 164 | 0.16923f, 0.17166f, 0.17410f, 0.17655f, | 
|---|
| 165 | 0.17901f, 0.18148f, 0.18395f, 0.18643f, | 
|---|
| 166 | 0.18891f, 0.19141f, 0.19391f, 0.19641f, | 
|---|
| 167 | 0.19893f, 0.20145f, 0.20398f, 0.20651f, | 
|---|
| 168 | 0.20905f, 0.21160f, 0.21416f, 0.21672f, | 
|---|
| 169 | 0.21929f, 0.22185f, 0.22440f, 0.22696f, | 
|---|
| 170 | 0.22950f, 0.23204f, 0.23458f, 0.23711f, | 
|---|
| 171 | 0.23963f, 0.24215f, 0.24466f, 0.24717f, | 
|---|
| 172 | 0.24967f, 0.25216f, 0.25465f, 0.25713f, | 
|---|
| 173 | 0.25961f, 0.26208f, 0.26454f, 0.26700f, | 
|---|
| 174 | 0.26945f, 0.27189f, 0.27433f, 0.27676f, | 
|---|
| 175 | 0.27918f, 0.28160f, 0.28401f, 0.28641f, | 
|---|
| 176 | 0.28881f, 0.29120f, 0.29358f, 0.29596f, | 
|---|
| 177 | 0.29833f, 0.30069f, 0.30305f, 0.30540f, | 
|---|
| 178 | 0.30774f, 0.31008f, 0.31241f, 0.31473f, | 
|---|
| 179 | 0.31704f, 0.31935f, 0.32165f, 0.32395f, | 
|---|
| 180 | 0.32623f, 0.32851f, 0.33079f, 0.33305f, | 
|---|
| 181 | 0.33531f, 0.33756f, 0.33981f, 0.34205f, | 
|---|
| 182 | 0.34428f, 0.34650f, 0.34872f, 0.35093f, | 
|---|
| 183 | 0.35313f, 0.35532f, 0.35751f, 0.35969f, | 
|---|
| 184 | 0.36187f, 0.36404f, 0.36620f, 0.36835f, | 
|---|
| 185 | 0.37050f, 0.37264f, 0.37477f, 0.37689f, | 
|---|
| 186 | 0.37901f, 0.38112f, 0.38323f, 0.38533f, | 
|---|
| 187 | 0.38742f, 0.38950f, 0.39158f, 0.39365f, | 
|---|
| 188 | 0.39571f, 0.39777f, 0.39982f, 0.40186f, | 
|---|
| 189 | 0.40389f, 0.40592f, 0.40794f, 0.40996f, | 
|---|
| 190 | 0.41197f, 0.41397f, 0.41596f, 0.41795f, | 
|---|
| 191 | 0.41993f, 0.42191f, 0.42388f, 0.42584f, | 
|---|
| 192 | 0.42779f, 0.42974f, 0.43168f, 0.43362f, | 
|---|
| 193 | 0.43554f, 0.43747f, 0.43938f, 0.44129f, | 
|---|
| 194 | 0.44319f, 0.44509f, 0.44698f, 0.44886f, | 
|---|
| 195 | 0.45073f, 0.45260f, 0.45447f, 0.45632f, | 
|---|
| 196 | 0.45817f, 0.46002f, 0.46186f, 0.46369f, | 
|---|
| 197 | 0.46551f, 0.46733f, 0.46914f, 0.47095f, | 
|---|
| 198 | 0.47275f, 0.47454f, 0.47633f, 0.47811f, | 
|---|
| 199 | 0.47989f, 0.48166f, 0.48342f, 0.48518f, | 
|---|
| 200 | 0.48693f, 0.48867f, 0.49041f, 0.49214f, | 
|---|
| 201 | 0.49387f, 0.49559f, 0.49730f, 0.49901f, | 
|---|
| 202 | 0.50072f, 0.50241f, 0.50410f, 0.50579f, | 
|---|
| 203 | 0.50747f, 0.50914f, 0.51081f, 0.51247f, | 
|---|
| 204 | 0.51413f, 0.51578f, 0.51742f, 0.51906f, | 
|---|
| 205 | 0.52069f, 0.52232f, 0.52394f, 0.52556f, | 
|---|
| 206 | 0.52717f, 0.52878f, 0.53038f, 0.53197f, | 
|---|
| 207 | 0.53356f, 0.53514f, 0.53672f, 0.53829f, | 
|---|
| 208 | 0.53986f, 0.54142f, 0.54297f, 0.54452f, | 
|---|
| 209 | 0.54607f, 0.54761f, 0.54914f, 0.55067f, | 
|---|
| 210 | 0.55220f, 0.55371f, 0.55523f, 0.55673f, | 
|---|
| 211 | 0.55824f, 0.55973f, 0.56123f, 0.56271f, | 
|---|
| 212 | 0.56420f, 0.56567f, 0.56715f, 0.56861f, | 
|---|
| 213 | 0.57007f, 0.57153f, 0.57298f, 0.57443f, | 
|---|
| 214 | 0.57587f, 0.57731f, 0.57874f, 0.58017f, | 
|---|
| 215 | 0.58159f, 0.58301f, 0.58443f, 0.58583f, | 
|---|
| 216 | 0.58724f, 0.58864f, 0.59003f, 0.59142f, | 
|---|
| 217 | 0.59281f, 0.59419f, 0.59556f, 0.59694f, | 
|---|
| 218 | 0.59830f, 0.59966f, 0.60102f, 0.60238f, | 
|---|
| 219 | 0.60373f, 0.60507f, 0.60641f, 0.60775f, | 
|---|
| 220 | 0.60908f, 0.61040f, 0.61173f, 0.61305f, | 
|---|
| 221 | 0.61436f, 0.61567f, 0.61698f, 0.61828f, | 
|---|
| 222 | 0.61957f, 0.62087f, 0.62216f, 0.62344f, | 
|---|
| 223 | 0.62472f, 0.62600f, 0.62727f, 0.62854f, | 
|---|
| 224 | 0.62980f, 0.63106f, 0.63232f, 0.63357f, | 
|---|
| 225 | 0.63482f, 0.63606f, 0.63730f, 0.63854f, | 
|---|
| 226 | 0.63977f, 0.64100f, 0.64222f, 0.64344f, | 
|---|
| 227 | 0.64466f, 0.64587f, 0.64708f, 0.64829f, | 
|---|
| 228 | 0.64949f, 0.65069f, 0.65188f, 0.65307f, | 
|---|
| 229 | 0.65426f, 0.65544f, 0.65662f, 0.65779f, | 
|---|
| 230 | 0.65897f, 0.66013f, 0.66130f, 0.66246f, | 
|---|
| 231 | 0.66362f, 0.66477f, 0.66592f, 0.66707f, | 
|---|
| 232 | 0.66821f, 0.66935f, 0.67048f, 0.67162f, | 
|---|
| 233 | 0.67275f, 0.67387f, 0.67499f, 0.67611f, | 
|---|
| 234 | 0.67723f, 0.67834f, 0.67945f, 0.68055f, | 
|---|
| 235 | 0.68165f, 0.68275f, 0.68385f, 0.68494f, | 
|---|
| 236 | 0.68603f, 0.68711f, 0.68819f, 0.68927f, | 
|---|
| 237 | 0.69035f, 0.69142f, 0.69249f, 0.69355f, | 
|---|
| 238 | 0.69461f, 0.69567f, 0.69673f, 0.69778f, | 
|---|
| 239 | 0.69883f, 0.69988f, 0.70092f, 0.70196f, | 
|---|
| 240 | 0.70300f, 0.70403f, 0.70506f, 0.70609f, | 
|---|
| 241 | 0.70711f, 0.70813f, 0.70915f, 0.71017f, | 
|---|
| 242 | 0.71118f, 0.71219f, 0.71319f, 0.71420f, | 
|---|
| 243 | 0.71520f, 0.71620f, 0.71719f, 0.71818f, | 
|---|
| 244 | 0.71917f, 0.72016f, 0.72114f, 0.72212f, | 
|---|
| 245 | 0.72309f, 0.72407f, 0.72504f, 0.72601f, | 
|---|
| 246 | 0.72697f, 0.72794f, 0.72890f, 0.72985f, | 
|---|
| 247 | 0.73081f, 0.73176f, 0.73271f, 0.73365f, | 
|---|
| 248 | 0.73460f, 0.73554f, 0.73647f, 0.73741f, | 
|---|
| 249 | 0.73834f, 0.73927f, 0.74020f, 0.74112f, | 
|---|
| 250 | 0.74204f, 0.74296f, 0.74388f, 0.74479f, | 
|---|
| 251 | 0.74570f, 0.74661f, 0.74751f, 0.74842f, | 
|---|
| 252 | 0.74932f, 0.75021f, 0.75111f, 0.75200f, | 
|---|
| 253 | 0.75289f, 0.75378f, 0.75466f, 0.75555f, | 
|---|
| 254 | 0.75643f, 0.75730f, 0.75818f, 0.75905f, | 
|---|
| 255 | 0.75992f, 0.76079f, 0.76165f, 0.76251f, | 
|---|
| 256 | 0.76337f, 0.76423f, 0.76508f, 0.76594f, | 
|---|
| 257 | 0.76679f, 0.76763f, 0.76848f, 0.76932f, | 
|---|
| 258 | 0.77016f, 0.77100f, 0.77183f, 0.77267f, | 
|---|
| 259 | 0.77350f, 0.77432f, 0.77515f, 0.77597f, | 
|---|
| 260 | 0.77680f, 0.77761f, 0.77843f, 0.77924f, | 
|---|
| 261 | 0.78006f, 0.78087f, 0.78167f, 0.78248f, | 
|---|
| 262 | 0.78328f, 0.78408f, 0.78488f, 0.78568f, | 
|---|
| 263 | 0.78647f, 0.78726f, 0.78805f, 0.78884f, | 
|---|
| 264 | 0.78962f, 0.79040f, 0.79118f, 0.79196f, | 
|---|
| 265 | 0.79274f, 0.79351f, 0.79428f, 0.79505f, | 
|---|
| 266 | 0.79582f, 0.79658f, 0.79735f, 0.79811f, | 
|---|
| 267 | 0.79887f, 0.79962f, 0.80038f, 0.80113f, | 
|---|
| 268 | 0.80188f, 0.80263f, 0.80337f, 0.80412f, | 
|---|
| 269 | 0.80486f, 0.80560f, 0.80634f, 0.80707f, | 
|---|
| 270 | 0.80780f, 0.80854f, 0.80926f, 0.80999f, | 
|---|
| 271 | 0.81072f, 0.81144f, 0.81216f, 0.81288f, | 
|---|
| 272 | 0.81360f, 0.81431f, 0.81503f, 0.81574f, | 
|---|
| 273 | 0.81645f, 0.81715f, 0.81786f, 0.81856f, | 
|---|
| 274 | 0.81926f, 0.81996f, 0.82066f, 0.82135f, | 
|---|
| 275 | 0.82205f, 0.82274f, 0.82343f, 0.82412f, | 
|---|
| 276 | 0.82480f, 0.82549f, 0.82617f, 0.82685f, | 
|---|
| 277 | 0.82753f, 0.82820f, 0.82888f, 0.82955f, | 
|---|
| 278 | 0.83022f, 0.83089f, 0.83155f, 0.83222f, | 
|---|
| 279 | 0.83288f, 0.83354f, 0.83420f, 0.83486f, | 
|---|
| 280 | 0.83552f, 0.83617f, 0.83682f, 0.83747f, | 
|---|
| 281 | 0.83812f, 0.83877f, 0.83941f, 0.84005f, | 
|---|
| 282 | 0.84069f, 0.84133f, 0.84197f, 0.84261f, | 
|---|
| 283 | 0.84324f, 0.84387f, 0.84450f, 0.84513f, | 
|---|
| 284 | 0.84576f, 0.84639f, 0.84701f, 0.84763f, | 
|---|
| 285 | 0.84825f, 0.84887f, 0.84949f, 0.85010f, | 
|---|
| 286 | 0.85071f, 0.85132f, 0.85193f, 0.85254f, | 
|---|
| 287 | 0.85315f, 0.85375f, 0.85436f, 0.85496f, | 
|---|
| 288 | 0.85556f, 0.85615f, 0.85675f, 0.85735f, | 
|---|
| 289 | 0.85794f, 0.85853f, 0.85912f, 0.85971f, | 
|---|
| 290 | 0.86029f, 0.86088f, 0.86146f, 0.86204f, | 
|---|
| 291 | 0.86262f, 0.86320f, 0.86378f, 0.86435f, | 
|---|
| 292 | 0.86493f, 0.86550f, 0.86607f, 0.86664f, | 
|---|
| 293 | 0.86720f, 0.86777f, 0.86833f, 0.86889f, | 
|---|
| 294 | 0.86945f, 0.87001f, 0.87057f, 0.87113f, | 
|---|
| 295 | 0.87168f, 0.87223f, 0.87278f, 0.87333f, | 
|---|
| 296 | 0.87388f, 0.87443f, 0.87497f, 0.87552f, | 
|---|
| 297 | 0.87606f, 0.87660f, 0.87714f, 0.87768f, | 
|---|
| 298 | 0.87821f, 0.87875f, 0.87928f, 0.87981f, | 
|---|
| 299 | 0.88034f, 0.88087f, 0.88140f, 0.88192f, | 
|---|
| 300 | 0.88244f, 0.88297f, 0.88349f, 0.88401f, | 
|---|
| 301 | 0.88453f, 0.88504f, 0.88556f, 0.88607f, | 
|---|
| 302 | 0.88658f, 0.88709f, 0.88760f, 0.88811f, | 
|---|
| 303 | 0.88862f, 0.88912f, 0.88963f, 0.89013f, | 
|---|
| 304 | 0.89063f, 0.89113f, 0.89163f, 0.89212f, | 
|---|
| 305 | 0.89262f, 0.89311f, 0.89360f, 0.89409f, | 
|---|
| 306 | 0.89458f, 0.89507f, 0.89556f, 0.89604f, | 
|---|
| 307 | 0.89653f, 0.89701f, 0.89749f, 0.89797f, | 
|---|
| 308 | 0.89845f, 0.89892f, 0.89940f, 0.89987f, | 
|---|
| 309 | 0.90035f, 0.90082f, 0.90129f, 0.90176f, | 
|---|
| 310 | 0.90222f, 0.90269f, 0.90316f, 0.90362f, | 
|---|
| 311 | 0.90408f, 0.90454f, 0.90500f, 0.90546f, | 
|---|
| 312 | 0.90592f, 0.90637f, 0.90683f, 0.90728f, | 
|---|
| 313 | 0.90773f, 0.90818f, 0.90863f, 0.90908f, | 
|---|
| 314 | 0.90952f, 0.90997f, 0.91041f, 0.91085f, | 
|---|
| 315 | 0.91130f, 0.91173f, 0.91217f, 0.91261f, | 
|---|
| 316 | 0.91305f, 0.91348f, 0.91392f, 0.91435f, | 
|---|
| 317 | 0.91478f, 0.91521f, 0.91564f, 0.91606f, | 
|---|
| 318 | 0.91649f, 0.91691f, 0.91734f, 0.91776f, | 
|---|
| 319 | 0.91818f, 0.91860f, 0.91902f, 0.91944f, | 
|---|
| 320 | 0.91985f, 0.92027f, 0.92068f, 0.92109f, | 
|---|
| 321 | 0.92150f, 0.92191f, 0.92232f, 0.92273f, | 
|---|
| 322 | 0.92314f, 0.92354f, 0.92395f, 0.92435f, | 
|---|
| 323 | 0.92475f, 0.92515f, 0.92555f, 0.92595f, | 
|---|
| 324 | 0.92634f, 0.92674f, 0.92713f, 0.92753f, | 
|---|
| 325 | 0.92792f, 0.92831f, 0.92870f, 0.92909f, | 
|---|
| 326 | 0.92947f, 0.92986f, 0.93025f, 0.93063f, | 
|---|
| 327 | 0.93101f, 0.93139f, 0.93177f, 0.93215f, | 
|---|
| 328 | 0.93253f, 0.93291f, 0.93328f, 0.93366f, | 
|---|
| 329 | 0.93403f, 0.93440f, 0.93478f, 0.93515f, | 
|---|
| 330 | 0.93551f, 0.93588f, 0.93625f, 0.93661f, | 
|---|
| 331 | 0.93698f, 0.93734f, 0.93770f, 0.93807f, | 
|---|
| 332 | 0.93843f, 0.93878f, 0.93914f, 0.93950f, | 
|---|
| 333 | 0.93986f, 0.94021f, 0.94056f, 0.94092f, | 
|---|
| 334 | 0.94127f, 0.94162f, 0.94197f, 0.94231f, | 
|---|
| 335 | 0.94266f, 0.94301f, 0.94335f, 0.94369f, | 
|---|
| 336 | 0.94404f, 0.94438f, 0.94472f, 0.94506f, | 
|---|
| 337 | 0.94540f, 0.94573f, 0.94607f, 0.94641f, | 
|---|
| 338 | 0.94674f, 0.94707f, 0.94740f, 0.94774f, | 
|---|
| 339 | 0.94807f, 0.94839f, 0.94872f, 0.94905f, | 
|---|
| 340 | 0.94937f, 0.94970f, 0.95002f, 0.95035f, | 
|---|
| 341 | 0.95067f, 0.95099f, 0.95131f, 0.95163f, | 
|---|
| 342 | 0.95194f, 0.95226f, 0.95257f, 0.95289f, | 
|---|
| 343 | 0.95320f, 0.95351f, 0.95383f, 0.95414f, | 
|---|
| 344 | 0.95445f, 0.95475f, 0.95506f, 0.95537f, | 
|---|
| 345 | 0.95567f, 0.95598f, 0.95628f, 0.95658f, | 
|---|
| 346 | 0.95688f, 0.95718f, 0.95748f, 0.95778f, | 
|---|
| 347 | 0.95808f, 0.95838f, 0.95867f, 0.95897f, | 
|---|
| 348 | 0.95926f, 0.95955f, 0.95984f, 0.96013f, | 
|---|
| 349 | 0.96042f, 0.96071f, 0.96100f, 0.96129f, | 
|---|
| 350 | 0.96157f, 0.96186f, 0.96214f, 0.96242f, | 
|---|
| 351 | 0.96271f, 0.96299f, 0.96327f, 0.96355f, | 
|---|
| 352 | 0.96382f, 0.96410f, 0.96438f, 0.96465f, | 
|---|
| 353 | 0.96493f, 0.96520f, 0.96547f, 0.96574f, | 
|---|
| 354 | 0.96602f, 0.96629f, 0.96655f, 0.96682f, | 
|---|
| 355 | 0.96709f, 0.96735f, 0.96762f, 0.96788f, | 
|---|
| 356 | 0.96815f, 0.96841f, 0.96867f, 0.96893f, | 
|---|
| 357 | 0.96919f, 0.96945f, 0.96971f, 0.96996f, | 
|---|
| 358 | 0.97022f, 0.97047f, 0.97073f, 0.97098f, | 
|---|
| 359 | 0.97123f, 0.97149f, 0.97174f, 0.97199f, | 
|---|
| 360 | 0.97223f, 0.97248f, 0.97273f, 0.97297f, | 
|---|
| 361 | 0.97322f, 0.97346f, 0.97371f, 0.97395f, | 
|---|
| 362 | 0.97419f, 0.97443f, 0.97467f, 0.97491f, | 
|---|
| 363 | 0.97515f, 0.97539f, 0.97562f, 0.97586f, | 
|---|
| 364 | 0.97609f, 0.97633f, 0.97656f, 0.97679f, | 
|---|
| 365 | 0.97702f, 0.97725f, 0.97748f, 0.97771f, | 
|---|
| 366 | 0.97794f, 0.97817f, 0.97839f, 0.97862f, | 
|---|
| 367 | 0.97884f, 0.97907f, 0.97929f, 0.97951f, | 
|---|
| 368 | 0.97973f, 0.97995f, 0.98017f, 0.98039f, | 
|---|
| 369 | 0.98061f, 0.98082f, 0.98104f, 0.98125f, | 
|---|
| 370 | 0.98147f, 0.98168f, 0.98189f, 0.98211f, | 
|---|
| 371 | 0.98232f, 0.98253f, 0.98274f, 0.98295f, | 
|---|
| 372 | 0.98315f, 0.98336f, 0.98357f, 0.98377f, | 
|---|
| 373 | 0.98398f, 0.98418f, 0.98438f, 0.98458f, | 
|---|
| 374 | 0.98478f, 0.98498f, 0.98518f, 0.98538f, | 
|---|
| 375 | 0.98558f, 0.98578f, 0.98597f, 0.98617f, | 
|---|
| 376 | 0.98636f, 0.98656f, 0.98675f, 0.98694f, | 
|---|
| 377 | 0.98714f, 0.98733f, 0.98752f, 0.98771f, | 
|---|
| 378 | 0.98789f, 0.98808f, 0.98827f, 0.98845f, | 
|---|
| 379 | 0.98864f, 0.98882f, 0.98901f, 0.98919f, | 
|---|
| 380 | 0.98937f, 0.98955f, 0.98973f, 0.98991f, | 
|---|
| 381 | 0.99009f, 0.99027f, 0.99045f, 0.99063f, | 
|---|
| 382 | 0.99080f, 0.99098f, 0.99115f, 0.99133f, | 
|---|
| 383 | 0.99150f, 0.99167f, 0.99184f, 0.99201f, | 
|---|
| 384 | 0.99218f, 0.99235f, 0.99252f, 0.99269f, | 
|---|
| 385 | 0.99285f, 0.99302f, 0.99319f, 0.99335f, | 
|---|
| 386 | 0.99351f, 0.99368f, 0.99384f, 0.99400f, | 
|---|
| 387 | 0.99416f, 0.99432f, 0.99448f, 0.99464f, | 
|---|
| 388 | 0.99480f, 0.99495f, 0.99511f, 0.99527f, | 
|---|
| 389 | 0.99542f, 0.99558f, 0.99573f, 0.99588f, | 
|---|
| 390 | 0.99603f, 0.99619f, 0.99634f, 0.99649f, | 
|---|
| 391 | 0.99664f, 0.99678f, 0.99693f, 0.99708f, | 
|---|
| 392 | 0.99722f, 0.99737f, 0.99751f, 0.99766f, | 
|---|
| 393 | 0.99780f, 0.99794f, 0.99809f, 0.99823f, | 
|---|
| 394 | 0.99837f, 0.99851f, 0.99865f, 0.99879f, | 
|---|
| 395 | 0.99892f, 0.99906f, 0.99920f, 0.99933f, | 
|---|
| 396 | 0.99947f, 0.99960f, 0.99974f, 0.99987f, | 
|---|
| 397 | 1.00000f | 
|---|
| 398 | }; | 
|---|
| 399 |  | 
|---|
| 400 | const uint32 kTableSize = sizeof (kTable    ) / | 
|---|
| 401 | sizeof (kTable [0]); | 
|---|
| 402 |  | 
|---|
| 403 | real32 y = (real32) x * (real32) (kTableSize - 1); | 
|---|
| 404 |  | 
|---|
| 405 | int32 index = Pin_int32 (0, (int32) y, kTableSize - 2); | 
|---|
| 406 |  | 
|---|
| 407 | real32 fract = y - (real32) index; | 
|---|
| 408 |  | 
|---|
| 409 | return kTable [index    ] * (1.0f - fract) + | 
|---|
| 410 | kTable [index + 1] * (       fract); | 
|---|
| 411 |  | 
|---|
| 412 | } | 
|---|
| 413 |  | 
|---|
| 414 | /*****************************************************************************/ | 
|---|
| 415 |  | 
|---|
| 416 | real64 dng_tone_curve_acr3_default::EvaluateInverse (real64 x) const | 
|---|
| 417 | { | 
|---|
| 418 |  | 
|---|
| 419 | static const real32 kTable [] = | 
|---|
| 420 | { | 
|---|
| 421 | 0.00000f, 0.00121f, 0.00237f, 0.00362f, | 
|---|
| 422 | 0.00496f, 0.00621f, 0.00738f, 0.00848f, | 
|---|
| 423 | 0.00951f, 0.01048f, 0.01139f, 0.01227f, | 
|---|
| 424 | 0.01312f, 0.01393f, 0.01471f, 0.01547f, | 
|---|
| 425 | 0.01620f, 0.01692f, 0.01763f, 0.01831f, | 
|---|
| 426 | 0.01899f, 0.01965f, 0.02030f, 0.02094f, | 
|---|
| 427 | 0.02157f, 0.02218f, 0.02280f, 0.02340f, | 
|---|
| 428 | 0.02399f, 0.02458f, 0.02517f, 0.02574f, | 
|---|
| 429 | 0.02631f, 0.02688f, 0.02744f, 0.02800f, | 
|---|
| 430 | 0.02855f, 0.02910f, 0.02965f, 0.03019f, | 
|---|
| 431 | 0.03072f, 0.03126f, 0.03179f, 0.03232f, | 
|---|
| 432 | 0.03285f, 0.03338f, 0.03390f, 0.03442f, | 
|---|
| 433 | 0.03493f, 0.03545f, 0.03596f, 0.03647f, | 
|---|
| 434 | 0.03698f, 0.03749f, 0.03799f, 0.03849f, | 
|---|
| 435 | 0.03899f, 0.03949f, 0.03998f, 0.04048f, | 
|---|
| 436 | 0.04097f, 0.04146f, 0.04195f, 0.04244f, | 
|---|
| 437 | 0.04292f, 0.04341f, 0.04389f, 0.04437f, | 
|---|
| 438 | 0.04485f, 0.04533f, 0.04580f, 0.04628f, | 
|---|
| 439 | 0.04675f, 0.04722f, 0.04769f, 0.04816f, | 
|---|
| 440 | 0.04863f, 0.04910f, 0.04956f, 0.05003f, | 
|---|
| 441 | 0.05049f, 0.05095f, 0.05141f, 0.05187f, | 
|---|
| 442 | 0.05233f, 0.05278f, 0.05324f, 0.05370f, | 
|---|
| 443 | 0.05415f, 0.05460f, 0.05505f, 0.05551f, | 
|---|
| 444 | 0.05595f, 0.05640f, 0.05685f, 0.05729f, | 
|---|
| 445 | 0.05774f, 0.05818f, 0.05863f, 0.05907f, | 
|---|
| 446 | 0.05951f, 0.05995f, 0.06039f, 0.06083f, | 
|---|
| 447 | 0.06126f, 0.06170f, 0.06214f, 0.06257f, | 
|---|
| 448 | 0.06301f, 0.06344f, 0.06388f, 0.06431f, | 
|---|
| 449 | 0.06474f, 0.06517f, 0.06560f, 0.06602f, | 
|---|
| 450 | 0.06645f, 0.06688f, 0.06731f, 0.06773f, | 
|---|
| 451 | 0.06815f, 0.06858f, 0.06900f, 0.06943f, | 
|---|
| 452 | 0.06985f, 0.07027f, 0.07069f, 0.07111f, | 
|---|
| 453 | 0.07152f, 0.07194f, 0.07236f, 0.07278f, | 
|---|
| 454 | 0.07319f, 0.07361f, 0.07402f, 0.07444f, | 
|---|
| 455 | 0.07485f, 0.07526f, 0.07567f, 0.07608f, | 
|---|
| 456 | 0.07650f, 0.07691f, 0.07732f, 0.07772f, | 
|---|
| 457 | 0.07813f, 0.07854f, 0.07895f, 0.07935f, | 
|---|
| 458 | 0.07976f, 0.08016f, 0.08057f, 0.08098f, | 
|---|
| 459 | 0.08138f, 0.08178f, 0.08218f, 0.08259f, | 
|---|
| 460 | 0.08299f, 0.08339f, 0.08379f, 0.08419f, | 
|---|
| 461 | 0.08459f, 0.08499f, 0.08539f, 0.08578f, | 
|---|
| 462 | 0.08618f, 0.08657f, 0.08697f, 0.08737f, | 
|---|
| 463 | 0.08776f, 0.08816f, 0.08855f, 0.08894f, | 
|---|
| 464 | 0.08934f, 0.08973f, 0.09012f, 0.09051f, | 
|---|
| 465 | 0.09091f, 0.09130f, 0.09169f, 0.09208f, | 
|---|
| 466 | 0.09247f, 0.09286f, 0.09324f, 0.09363f, | 
|---|
| 467 | 0.09402f, 0.09440f, 0.09479f, 0.09518f, | 
|---|
| 468 | 0.09556f, 0.09595f, 0.09633f, 0.09672f, | 
|---|
| 469 | 0.09710f, 0.09749f, 0.09787f, 0.09825f, | 
|---|
| 470 | 0.09863f, 0.09901f, 0.09939f, 0.09978f, | 
|---|
| 471 | 0.10016f, 0.10054f, 0.10092f, 0.10130f, | 
|---|
| 472 | 0.10167f, 0.10205f, 0.10243f, 0.10281f, | 
|---|
| 473 | 0.10319f, 0.10356f, 0.10394f, 0.10432f, | 
|---|
| 474 | 0.10469f, 0.10507f, 0.10544f, 0.10582f, | 
|---|
| 475 | 0.10619f, 0.10657f, 0.10694f, 0.10731f, | 
|---|
| 476 | 0.10768f, 0.10806f, 0.10843f, 0.10880f, | 
|---|
| 477 | 0.10917f, 0.10954f, 0.10991f, 0.11029f, | 
|---|
| 478 | 0.11066f, 0.11103f, 0.11141f, 0.11178f, | 
|---|
| 479 | 0.11215f, 0.11253f, 0.11290f, 0.11328f, | 
|---|
| 480 | 0.11365f, 0.11403f, 0.11440f, 0.11478f, | 
|---|
| 481 | 0.11516f, 0.11553f, 0.11591f, 0.11629f, | 
|---|
| 482 | 0.11666f, 0.11704f, 0.11742f, 0.11780f, | 
|---|
| 483 | 0.11818f, 0.11856f, 0.11894f, 0.11932f, | 
|---|
| 484 | 0.11970f, 0.12008f, 0.12046f, 0.12084f, | 
|---|
| 485 | 0.12122f, 0.12161f, 0.12199f, 0.12237f, | 
|---|
| 486 | 0.12276f, 0.12314f, 0.12352f, 0.12391f, | 
|---|
| 487 | 0.12429f, 0.12468f, 0.12506f, 0.12545f, | 
|---|
| 488 | 0.12583f, 0.12622f, 0.12661f, 0.12700f, | 
|---|
| 489 | 0.12738f, 0.12777f, 0.12816f, 0.12855f, | 
|---|
| 490 | 0.12894f, 0.12933f, 0.12972f, 0.13011f, | 
|---|
| 491 | 0.13050f, 0.13089f, 0.13129f, 0.13168f, | 
|---|
| 492 | 0.13207f, 0.13247f, 0.13286f, 0.13325f, | 
|---|
| 493 | 0.13365f, 0.13404f, 0.13444f, 0.13483f, | 
|---|
| 494 | 0.13523f, 0.13563f, 0.13603f, 0.13642f, | 
|---|
| 495 | 0.13682f, 0.13722f, 0.13762f, 0.13802f, | 
|---|
| 496 | 0.13842f, 0.13882f, 0.13922f, 0.13962f, | 
|---|
| 497 | 0.14003f, 0.14043f, 0.14083f, 0.14124f, | 
|---|
| 498 | 0.14164f, 0.14204f, 0.14245f, 0.14285f, | 
|---|
| 499 | 0.14326f, 0.14366f, 0.14407f, 0.14448f, | 
|---|
| 500 | 0.14489f, 0.14530f, 0.14570f, 0.14611f, | 
|---|
| 501 | 0.14652f, 0.14693f, 0.14734f, 0.14776f, | 
|---|
| 502 | 0.14817f, 0.14858f, 0.14900f, 0.14941f, | 
|---|
| 503 | 0.14982f, 0.15024f, 0.15065f, 0.15107f, | 
|---|
| 504 | 0.15148f, 0.15190f, 0.15232f, 0.15274f, | 
|---|
| 505 | 0.15316f, 0.15357f, 0.15399f, 0.15441f, | 
|---|
| 506 | 0.15483f, 0.15526f, 0.15568f, 0.15610f, | 
|---|
| 507 | 0.15652f, 0.15695f, 0.15737f, 0.15779f, | 
|---|
| 508 | 0.15822f, 0.15864f, 0.15907f, 0.15950f, | 
|---|
| 509 | 0.15992f, 0.16035f, 0.16078f, 0.16121f, | 
|---|
| 510 | 0.16164f, 0.16207f, 0.16250f, 0.16293f, | 
|---|
| 511 | 0.16337f, 0.16380f, 0.16423f, 0.16467f, | 
|---|
| 512 | 0.16511f, 0.16554f, 0.16598f, 0.16641f, | 
|---|
| 513 | 0.16685f, 0.16729f, 0.16773f, 0.16816f, | 
|---|
| 514 | 0.16860f, 0.16904f, 0.16949f, 0.16993f, | 
|---|
| 515 | 0.17037f, 0.17081f, 0.17126f, 0.17170f, | 
|---|
| 516 | 0.17215f, 0.17259f, 0.17304f, 0.17349f, | 
|---|
| 517 | 0.17393f, 0.17438f, 0.17483f, 0.17528f, | 
|---|
| 518 | 0.17573f, 0.17619f, 0.17664f, 0.17709f, | 
|---|
| 519 | 0.17754f, 0.17799f, 0.17845f, 0.17890f, | 
|---|
| 520 | 0.17936f, 0.17982f, 0.18028f, 0.18073f, | 
|---|
| 521 | 0.18119f, 0.18165f, 0.18211f, 0.18257f, | 
|---|
| 522 | 0.18303f, 0.18350f, 0.18396f, 0.18442f, | 
|---|
| 523 | 0.18489f, 0.18535f, 0.18582f, 0.18629f, | 
|---|
| 524 | 0.18676f, 0.18723f, 0.18770f, 0.18817f, | 
|---|
| 525 | 0.18864f, 0.18911f, 0.18958f, 0.19005f, | 
|---|
| 526 | 0.19053f, 0.19100f, 0.19147f, 0.19195f, | 
|---|
| 527 | 0.19243f, 0.19291f, 0.19339f, 0.19387f, | 
|---|
| 528 | 0.19435f, 0.19483f, 0.19531f, 0.19579f, | 
|---|
| 529 | 0.19627f, 0.19676f, 0.19724f, 0.19773f, | 
|---|
| 530 | 0.19821f, 0.19870f, 0.19919f, 0.19968f, | 
|---|
| 531 | 0.20017f, 0.20066f, 0.20115f, 0.20164f, | 
|---|
| 532 | 0.20214f, 0.20263f, 0.20313f, 0.20362f, | 
|---|
| 533 | 0.20412f, 0.20462f, 0.20512f, 0.20561f, | 
|---|
| 534 | 0.20611f, 0.20662f, 0.20712f, 0.20762f, | 
|---|
| 535 | 0.20812f, 0.20863f, 0.20913f, 0.20964f, | 
|---|
| 536 | 0.21015f, 0.21066f, 0.21117f, 0.21168f, | 
|---|
| 537 | 0.21219f, 0.21270f, 0.21321f, 0.21373f, | 
|---|
| 538 | 0.21424f, 0.21476f, 0.21527f, 0.21579f, | 
|---|
| 539 | 0.21631f, 0.21683f, 0.21735f, 0.21787f, | 
|---|
| 540 | 0.21839f, 0.21892f, 0.21944f, 0.21997f, | 
|---|
| 541 | 0.22049f, 0.22102f, 0.22155f, 0.22208f, | 
|---|
| 542 | 0.22261f, 0.22314f, 0.22367f, 0.22420f, | 
|---|
| 543 | 0.22474f, 0.22527f, 0.22581f, 0.22634f, | 
|---|
| 544 | 0.22688f, 0.22742f, 0.22796f, 0.22850f, | 
|---|
| 545 | 0.22905f, 0.22959f, 0.23013f, 0.23068f, | 
|---|
| 546 | 0.23123f, 0.23178f, 0.23232f, 0.23287f, | 
|---|
| 547 | 0.23343f, 0.23398f, 0.23453f, 0.23508f, | 
|---|
| 548 | 0.23564f, 0.23620f, 0.23675f, 0.23731f, | 
|---|
| 549 | 0.23787f, 0.23843f, 0.23899f, 0.23956f, | 
|---|
| 550 | 0.24012f, 0.24069f, 0.24125f, 0.24182f, | 
|---|
| 551 | 0.24239f, 0.24296f, 0.24353f, 0.24410f, | 
|---|
| 552 | 0.24468f, 0.24525f, 0.24582f, 0.24640f, | 
|---|
| 553 | 0.24698f, 0.24756f, 0.24814f, 0.24872f, | 
|---|
| 554 | 0.24931f, 0.24989f, 0.25048f, 0.25106f, | 
|---|
| 555 | 0.25165f, 0.25224f, 0.25283f, 0.25342f, | 
|---|
| 556 | 0.25401f, 0.25460f, 0.25520f, 0.25579f, | 
|---|
| 557 | 0.25639f, 0.25699f, 0.25759f, 0.25820f, | 
|---|
| 558 | 0.25880f, 0.25940f, 0.26001f, 0.26062f, | 
|---|
| 559 | 0.26122f, 0.26183f, 0.26244f, 0.26306f, | 
|---|
| 560 | 0.26367f, 0.26429f, 0.26490f, 0.26552f, | 
|---|
| 561 | 0.26614f, 0.26676f, 0.26738f, 0.26800f, | 
|---|
| 562 | 0.26863f, 0.26925f, 0.26988f, 0.27051f, | 
|---|
| 563 | 0.27114f, 0.27177f, 0.27240f, 0.27303f, | 
|---|
| 564 | 0.27367f, 0.27431f, 0.27495f, 0.27558f, | 
|---|
| 565 | 0.27623f, 0.27687f, 0.27751f, 0.27816f, | 
|---|
| 566 | 0.27881f, 0.27945f, 0.28011f, 0.28076f, | 
|---|
| 567 | 0.28141f, 0.28207f, 0.28272f, 0.28338f, | 
|---|
| 568 | 0.28404f, 0.28470f, 0.28536f, 0.28602f, | 
|---|
| 569 | 0.28669f, 0.28736f, 0.28802f, 0.28869f, | 
|---|
| 570 | 0.28937f, 0.29004f, 0.29071f, 0.29139f, | 
|---|
| 571 | 0.29207f, 0.29274f, 0.29342f, 0.29410f, | 
|---|
| 572 | 0.29479f, 0.29548f, 0.29616f, 0.29685f, | 
|---|
| 573 | 0.29754f, 0.29823f, 0.29893f, 0.29962f, | 
|---|
| 574 | 0.30032f, 0.30102f, 0.30172f, 0.30242f, | 
|---|
| 575 | 0.30312f, 0.30383f, 0.30453f, 0.30524f, | 
|---|
| 576 | 0.30595f, 0.30667f, 0.30738f, 0.30809f, | 
|---|
| 577 | 0.30881f, 0.30953f, 0.31025f, 0.31097f, | 
|---|
| 578 | 0.31170f, 0.31242f, 0.31315f, 0.31388f, | 
|---|
| 579 | 0.31461f, 0.31534f, 0.31608f, 0.31682f, | 
|---|
| 580 | 0.31755f, 0.31829f, 0.31904f, 0.31978f, | 
|---|
| 581 | 0.32053f, 0.32127f, 0.32202f, 0.32277f, | 
|---|
| 582 | 0.32353f, 0.32428f, 0.32504f, 0.32580f, | 
|---|
| 583 | 0.32656f, 0.32732f, 0.32808f, 0.32885f, | 
|---|
| 584 | 0.32962f, 0.33039f, 0.33116f, 0.33193f, | 
|---|
| 585 | 0.33271f, 0.33349f, 0.33427f, 0.33505f, | 
|---|
| 586 | 0.33583f, 0.33662f, 0.33741f, 0.33820f, | 
|---|
| 587 | 0.33899f, 0.33978f, 0.34058f, 0.34138f, | 
|---|
| 588 | 0.34218f, 0.34298f, 0.34378f, 0.34459f, | 
|---|
| 589 | 0.34540f, 0.34621f, 0.34702f, 0.34783f, | 
|---|
| 590 | 0.34865f, 0.34947f, 0.35029f, 0.35111f, | 
|---|
| 591 | 0.35194f, 0.35277f, 0.35360f, 0.35443f, | 
|---|
| 592 | 0.35526f, 0.35610f, 0.35694f, 0.35778f, | 
|---|
| 593 | 0.35862f, 0.35946f, 0.36032f, 0.36117f, | 
|---|
| 594 | 0.36202f, 0.36287f, 0.36372f, 0.36458f, | 
|---|
| 595 | 0.36545f, 0.36631f, 0.36718f, 0.36805f, | 
|---|
| 596 | 0.36891f, 0.36979f, 0.37066f, 0.37154f, | 
|---|
| 597 | 0.37242f, 0.37331f, 0.37419f, 0.37507f, | 
|---|
| 598 | 0.37596f, 0.37686f, 0.37775f, 0.37865f, | 
|---|
| 599 | 0.37955f, 0.38045f, 0.38136f, 0.38227f, | 
|---|
| 600 | 0.38317f, 0.38409f, 0.38500f, 0.38592f, | 
|---|
| 601 | 0.38684f, 0.38776f, 0.38869f, 0.38961f, | 
|---|
| 602 | 0.39055f, 0.39148f, 0.39242f, 0.39335f, | 
|---|
| 603 | 0.39430f, 0.39524f, 0.39619f, 0.39714f, | 
|---|
| 604 | 0.39809f, 0.39904f, 0.40000f, 0.40097f, | 
|---|
| 605 | 0.40193f, 0.40289f, 0.40386f, 0.40483f, | 
|---|
| 606 | 0.40581f, 0.40679f, 0.40777f, 0.40875f, | 
|---|
| 607 | 0.40974f, 0.41073f, 0.41172f, 0.41272f, | 
|---|
| 608 | 0.41372f, 0.41472f, 0.41572f, 0.41673f, | 
|---|
| 609 | 0.41774f, 0.41875f, 0.41977f, 0.42079f, | 
|---|
| 610 | 0.42181f, 0.42284f, 0.42386f, 0.42490f, | 
|---|
| 611 | 0.42594f, 0.42697f, 0.42801f, 0.42906f, | 
|---|
| 612 | 0.43011f, 0.43116f, 0.43222f, 0.43327f, | 
|---|
| 613 | 0.43434f, 0.43540f, 0.43647f, 0.43754f, | 
|---|
| 614 | 0.43862f, 0.43970f, 0.44077f, 0.44186f, | 
|---|
| 615 | 0.44295f, 0.44404f, 0.44514f, 0.44624f, | 
|---|
| 616 | 0.44734f, 0.44845f, 0.44956f, 0.45068f, | 
|---|
| 617 | 0.45179f, 0.45291f, 0.45404f, 0.45516f, | 
|---|
| 618 | 0.45630f, 0.45744f, 0.45858f, 0.45972f, | 
|---|
| 619 | 0.46086f, 0.46202f, 0.46318f, 0.46433f, | 
|---|
| 620 | 0.46550f, 0.46667f, 0.46784f, 0.46901f, | 
|---|
| 621 | 0.47019f, 0.47137f, 0.47256f, 0.47375f, | 
|---|
| 622 | 0.47495f, 0.47615f, 0.47735f, 0.47856f, | 
|---|
| 623 | 0.47977f, 0.48099f, 0.48222f, 0.48344f, | 
|---|
| 624 | 0.48467f, 0.48590f, 0.48714f, 0.48838f, | 
|---|
| 625 | 0.48963f, 0.49088f, 0.49213f, 0.49340f, | 
|---|
| 626 | 0.49466f, 0.49593f, 0.49721f, 0.49849f, | 
|---|
| 627 | 0.49977f, 0.50106f, 0.50236f, 0.50366f, | 
|---|
| 628 | 0.50496f, 0.50627f, 0.50758f, 0.50890f, | 
|---|
| 629 | 0.51023f, 0.51155f, 0.51289f, 0.51422f, | 
|---|
| 630 | 0.51556f, 0.51692f, 0.51827f, 0.51964f, | 
|---|
| 631 | 0.52100f, 0.52237f, 0.52374f, 0.52512f, | 
|---|
| 632 | 0.52651f, 0.52790f, 0.52930f, 0.53070f, | 
|---|
| 633 | 0.53212f, 0.53353f, 0.53495f, 0.53638f, | 
|---|
| 634 | 0.53781f, 0.53925f, 0.54070f, 0.54214f, | 
|---|
| 635 | 0.54360f, 0.54506f, 0.54653f, 0.54800f, | 
|---|
| 636 | 0.54949f, 0.55098f, 0.55247f, 0.55396f, | 
|---|
| 637 | 0.55548f, 0.55699f, 0.55851f, 0.56003f, | 
|---|
| 638 | 0.56156f, 0.56310f, 0.56464f, 0.56621f, | 
|---|
| 639 | 0.56777f, 0.56933f, 0.57091f, 0.57248f, | 
|---|
| 640 | 0.57407f, 0.57568f, 0.57727f, 0.57888f, | 
|---|
| 641 | 0.58050f, 0.58213f, 0.58376f, 0.58541f, | 
|---|
| 642 | 0.58705f, 0.58871f, 0.59037f, 0.59204f, | 
|---|
| 643 | 0.59373f, 0.59541f, 0.59712f, 0.59882f, | 
|---|
| 644 | 0.60052f, 0.60226f, 0.60399f, 0.60572f, | 
|---|
| 645 | 0.60748f, 0.60922f, 0.61099f, 0.61276f, | 
|---|
| 646 | 0.61455f, 0.61635f, 0.61814f, 0.61996f, | 
|---|
| 647 | 0.62178f, 0.62361f, 0.62545f, 0.62730f, | 
|---|
| 648 | 0.62917f, 0.63104f, 0.63291f, 0.63480f, | 
|---|
| 649 | 0.63671f, 0.63862f, 0.64054f, 0.64249f, | 
|---|
| 650 | 0.64443f, 0.64638f, 0.64835f, 0.65033f, | 
|---|
| 651 | 0.65232f, 0.65433f, 0.65633f, 0.65836f, | 
|---|
| 652 | 0.66041f, 0.66245f, 0.66452f, 0.66660f, | 
|---|
| 653 | 0.66868f, 0.67078f, 0.67290f, 0.67503f, | 
|---|
| 654 | 0.67717f, 0.67932f, 0.68151f, 0.68368f, | 
|---|
| 655 | 0.68587f, 0.68809f, 0.69033f, 0.69257f, | 
|---|
| 656 | 0.69482f, 0.69709f, 0.69939f, 0.70169f, | 
|---|
| 657 | 0.70402f, 0.70634f, 0.70869f, 0.71107f, | 
|---|
| 658 | 0.71346f, 0.71587f, 0.71829f, 0.72073f, | 
|---|
| 659 | 0.72320f, 0.72567f, 0.72818f, 0.73069f, | 
|---|
| 660 | 0.73323f, 0.73579f, 0.73838f, 0.74098f, | 
|---|
| 661 | 0.74360f, 0.74622f, 0.74890f, 0.75159f, | 
|---|
| 662 | 0.75429f, 0.75704f, 0.75979f, 0.76257f, | 
|---|
| 663 | 0.76537f, 0.76821f, 0.77109f, 0.77396f, | 
|---|
| 664 | 0.77688f, 0.77982f, 0.78278f, 0.78579f, | 
|---|
| 665 | 0.78883f, 0.79187f, 0.79498f, 0.79809f, | 
|---|
| 666 | 0.80127f, 0.80445f, 0.80767f, 0.81095f, | 
|---|
| 667 | 0.81424f, 0.81757f, 0.82094f, 0.82438f, | 
|---|
| 668 | 0.82782f, 0.83133f, 0.83488f, 0.83847f, | 
|---|
| 669 | 0.84210f, 0.84577f, 0.84951f, 0.85328f, | 
|---|
| 670 | 0.85713f, 0.86103f, 0.86499f, 0.86900f, | 
|---|
| 671 | 0.87306f, 0.87720f, 0.88139f, 0.88566f, | 
|---|
| 672 | 0.89000f, 0.89442f, 0.89891f, 0.90350f, | 
|---|
| 673 | 0.90818f, 0.91295f, 0.91780f, 0.92272f, | 
|---|
| 674 | 0.92780f, 0.93299f, 0.93828f, 0.94369f, | 
|---|
| 675 | 0.94926f, 0.95493f, 0.96082f, 0.96684f, | 
|---|
| 676 | 0.97305f, 0.97943f, 0.98605f, 0.99291f, | 
|---|
| 677 | 1.00000f | 
|---|
| 678 | }; | 
|---|
| 679 |  | 
|---|
| 680 | const uint32 kTableSize = sizeof (kTable    ) / | 
|---|
| 681 | sizeof (kTable [0]); | 
|---|
| 682 |  | 
|---|
| 683 | real32 y = (real32) x * (real32) (kTableSize - 1); | 
|---|
| 684 |  | 
|---|
| 685 | int32 index = Pin_int32 (0, (int32) y, kTableSize - 2); | 
|---|
| 686 |  | 
|---|
| 687 | real32 fract = y - (real32) index; | 
|---|
| 688 |  | 
|---|
| 689 | return kTable [index    ] * (1.0f - fract) + | 
|---|
| 690 | kTable [index + 1] * (       fract); | 
|---|
| 691 |  | 
|---|
| 692 | } | 
|---|
| 693 |  | 
|---|
| 694 | /*****************************************************************************/ | 
|---|
| 695 |  | 
|---|
| 696 | const dng_1d_function & dng_tone_curve_acr3_default::Get () | 
|---|
| 697 | { | 
|---|
| 698 |  | 
|---|
| 699 | static dng_tone_curve_acr3_default static_dng_tone_curve_acr3_default; | 
|---|
| 700 |  | 
|---|
| 701 | return static_dng_tone_curve_acr3_default; | 
|---|
| 702 |  | 
|---|
| 703 | } | 
|---|
| 704 |  | 
|---|
| 705 | /*****************************************************************************/ | 
|---|
| 706 |  | 
|---|
| 707 | class dng_render_task: public dng_filter_task | 
|---|
| 708 | { | 
|---|
| 709 |  | 
|---|
| 710 | protected: | 
|---|
| 711 |  | 
|---|
| 712 | const dng_negative &fNegative; | 
|---|
| 713 |  | 
|---|
| 714 | const dng_render &fParams; | 
|---|
| 715 |  | 
|---|
| 716 | dng_point fSrcOffset; | 
|---|
| 717 |  | 
|---|
| 718 | dng_vector fCameraWhite; | 
|---|
| 719 | dng_matrix fCameraToRGB; | 
|---|
| 720 |  | 
|---|
| 721 | AutoPtr<dng_hue_sat_map> fHueSatMap; | 
|---|
| 722 |  | 
|---|
| 723 | dng_1d_table fExposureRamp; | 
|---|
| 724 |  | 
|---|
| 725 | AutoPtr<dng_hue_sat_map> fLookTable; | 
|---|
| 726 |  | 
|---|
| 727 | dng_1d_table fToneCurve; | 
|---|
| 728 |  | 
|---|
| 729 | dng_matrix fRGBtoFinal; | 
|---|
| 730 |  | 
|---|
| 731 | dng_1d_table fEncodeGamma; | 
|---|
| 732 |  | 
|---|
| 733 | AutoPtr<dng_1d_table> fHueSatMapEncode; | 
|---|
| 734 | AutoPtr<dng_1d_table> fHueSatMapDecode; | 
|---|
| 735 |  | 
|---|
| 736 | AutoPtr<dng_1d_table> fLookTableEncode; | 
|---|
| 737 | AutoPtr<dng_1d_table> fLookTableDecode; | 
|---|
| 738 |  | 
|---|
| 739 | AutoPtr<dng_memory_block> fTempBuffer [kMaxMPThreads]; | 
|---|
| 740 |  | 
|---|
| 741 | public: | 
|---|
| 742 |  | 
|---|
| 743 | dng_render_task (const dng_image &srcImage, | 
|---|
| 744 | dng_image &dstImage, | 
|---|
| 745 | const dng_negative &negative, | 
|---|
| 746 | const dng_render ¶ms, | 
|---|
| 747 | const dng_point &srcOffset); | 
|---|
| 748 |  | 
|---|
| 749 | virtual dng_rect SrcArea (const dng_rect &dstArea); | 
|---|
| 750 |  | 
|---|
| 751 | virtual void Start (uint32 threadCount, | 
|---|
| 752 | const dng_point &tileSize, | 
|---|
| 753 | dng_memory_allocator *allocator, | 
|---|
| 754 | dng_abort_sniffer *sniffer); | 
|---|
| 755 |  | 
|---|
| 756 | virtual void ProcessArea (uint32 threadIndex, | 
|---|
| 757 | dng_pixel_buffer &srcBuffer, | 
|---|
| 758 | dng_pixel_buffer &dstBuffer); | 
|---|
| 759 |  | 
|---|
| 760 | }; | 
|---|
| 761 |  | 
|---|
| 762 | /*****************************************************************************/ | 
|---|
| 763 |  | 
|---|
| 764 | dng_render_task::dng_render_task (const dng_image &srcImage, | 
|---|
| 765 | dng_image &dstImage, | 
|---|
| 766 | const dng_negative &negative, | 
|---|
| 767 | const dng_render ¶ms, | 
|---|
| 768 | const dng_point &srcOffset) | 
|---|
| 769 |  | 
|---|
| 770 | :	dng_filter_task (srcImage, | 
|---|
| 771 | dstImage) | 
|---|
| 772 |  | 
|---|
| 773 | ,	fNegative  (negative ) | 
|---|
| 774 | ,	fParams    (params   ) | 
|---|
| 775 | ,	fSrcOffset (srcOffset) | 
|---|
| 776 |  | 
|---|
| 777 | ,	fCameraWhite () | 
|---|
| 778 | ,	fCameraToRGB () | 
|---|
| 779 |  | 
|---|
| 780 | ,	fHueSatMap () | 
|---|
| 781 |  | 
|---|
| 782 | ,	fExposureRamp () | 
|---|
| 783 |  | 
|---|
| 784 | ,	fLookTable () | 
|---|
| 785 |  | 
|---|
| 786 | ,	fToneCurve () | 
|---|
| 787 |  | 
|---|
| 788 | ,	fRGBtoFinal () | 
|---|
| 789 |  | 
|---|
| 790 | ,	fEncodeGamma () | 
|---|
| 791 |  | 
|---|
| 792 | ,	fHueSatMapEncode () | 
|---|
| 793 | ,	fHueSatMapDecode () | 
|---|
| 794 |  | 
|---|
| 795 | ,	fLookTableEncode () | 
|---|
| 796 | ,	fLookTableDecode () | 
|---|
| 797 |  | 
|---|
| 798 | { | 
|---|
| 799 |  | 
|---|
| 800 | fSrcPixelType = ttFloat; | 
|---|
| 801 | fDstPixelType = ttFloat; | 
|---|
| 802 |  | 
|---|
| 803 | } | 
|---|
| 804 |  | 
|---|
| 805 | /*****************************************************************************/ | 
|---|
| 806 |  | 
|---|
| 807 | dng_rect dng_render_task::SrcArea (const dng_rect &dstArea) | 
|---|
| 808 | { | 
|---|
| 809 |  | 
|---|
| 810 | return dstArea + fSrcOffset; | 
|---|
| 811 |  | 
|---|
| 812 | } | 
|---|
| 813 |  | 
|---|
| 814 | /*****************************************************************************/ | 
|---|
| 815 |  | 
|---|
| 816 | void dng_render_task::Start (uint32 threadCount, | 
|---|
| 817 | const dng_point &tileSize, | 
|---|
| 818 | dng_memory_allocator *allocator, | 
|---|
| 819 | dng_abort_sniffer *sniffer) | 
|---|
| 820 | { | 
|---|
| 821 |  | 
|---|
| 822 | dng_filter_task::Start (threadCount, | 
|---|
| 823 | tileSize, | 
|---|
| 824 | allocator, | 
|---|
| 825 | sniffer); | 
|---|
| 826 |  | 
|---|
| 827 | // Compute camera space to linear ProPhoto RGB parameters. | 
|---|
| 828 |  | 
|---|
| 829 | dng_camera_profile_id profileID;	// Default profile ID. | 
|---|
| 830 |  | 
|---|
| 831 | if (!fNegative.IsMonochrome ()) | 
|---|
| 832 | { | 
|---|
| 833 |  | 
|---|
| 834 | AutoPtr<dng_color_spec> spec (fNegative.MakeColorSpec (profileID)); | 
|---|
| 835 |  | 
|---|
| 836 | if (fParams.WhiteXY ().IsValid ()) | 
|---|
| 837 | { | 
|---|
| 838 |  | 
|---|
| 839 | spec->SetWhiteXY (fParams.WhiteXY ()); | 
|---|
| 840 |  | 
|---|
| 841 | } | 
|---|
| 842 |  | 
|---|
| 843 | else if (fNegative.HasCameraNeutral ()) | 
|---|
| 844 | { | 
|---|
| 845 |  | 
|---|
| 846 | spec->SetWhiteXY (spec->NeutralToXY (fNegative.CameraNeutral ())); | 
|---|
| 847 |  | 
|---|
| 848 | } | 
|---|
| 849 |  | 
|---|
| 850 | else if (fNegative.HasCameraWhiteXY ()) | 
|---|
| 851 | { | 
|---|
| 852 |  | 
|---|
| 853 | spec->SetWhiteXY (fNegative.CameraWhiteXY ()); | 
|---|
| 854 |  | 
|---|
| 855 | } | 
|---|
| 856 |  | 
|---|
| 857 | else | 
|---|
| 858 | { | 
|---|
| 859 |  | 
|---|
| 860 | spec->SetWhiteXY (D55_xy_coord ()); | 
|---|
| 861 |  | 
|---|
| 862 | } | 
|---|
| 863 |  | 
|---|
| 864 | fCameraWhite = spec->CameraWhite (); | 
|---|
| 865 |  | 
|---|
| 866 | fCameraToRGB = dng_space_ProPhoto::Get ().MatrixFromPCS () * | 
|---|
| 867 | spec->CameraToPCS (); | 
|---|
| 868 |  | 
|---|
| 869 | // Find Hue/Sat table, if any. | 
|---|
| 870 |  | 
|---|
| 871 | const dng_camera_profile *profile = fNegative.ProfileByID (profileID); | 
|---|
| 872 |  | 
|---|
| 873 | if (profile) | 
|---|
| 874 | { | 
|---|
| 875 |  | 
|---|
| 876 | fHueSatMap.Reset (profile->HueSatMapForWhite (spec->WhiteXY ())); | 
|---|
| 877 |  | 
|---|
| 878 | if (profile->HasLookTable ()) | 
|---|
| 879 | { | 
|---|
| 880 |  | 
|---|
| 881 | fLookTable.Reset (new dng_hue_sat_map (profile->LookTable ())); | 
|---|
| 882 |  | 
|---|
| 883 | } | 
|---|
| 884 |  | 
|---|
| 885 | if (profile->HueSatMapEncoding () != encoding_Linear) | 
|---|
| 886 | { | 
|---|
| 887 |  | 
|---|
| 888 | BuildHueSatMapEncodingTable (*allocator, | 
|---|
| 889 | profile->HueSatMapEncoding (), | 
|---|
| 890 | fHueSatMapEncode, | 
|---|
| 891 | fHueSatMapDecode, | 
|---|
| 892 | false); | 
|---|
| 893 |  | 
|---|
| 894 | } | 
|---|
| 895 |  | 
|---|
| 896 | if (profile->LookTableEncoding () != encoding_Linear) | 
|---|
| 897 | { | 
|---|
| 898 |  | 
|---|
| 899 | BuildHueSatMapEncodingTable (*allocator, | 
|---|
| 900 | profile->LookTableEncoding (), | 
|---|
| 901 | fLookTableEncode, | 
|---|
| 902 | fLookTableDecode, | 
|---|
| 903 | false); | 
|---|
| 904 |  | 
|---|
| 905 | } | 
|---|
| 906 |  | 
|---|
| 907 | } | 
|---|
| 908 |  | 
|---|
| 909 | } | 
|---|
| 910 |  | 
|---|
| 911 | // Compute exposure/shadows ramp. | 
|---|
| 912 |  | 
|---|
| 913 | real64 exposure = fParams.Exposure () + | 
|---|
| 914 | fNegative.TotalBaselineExposure (profileID) - | 
|---|
| 915 | (log (fNegative.Stage3Gain ()) / log (2.0)); | 
|---|
| 916 |  | 
|---|
| 917 | { | 
|---|
| 918 |  | 
|---|
| 919 | real64 white = 1.0 / pow (2.0, Max_real64 (0.0, exposure)); | 
|---|
| 920 |  | 
|---|
| 921 | real64 black = fParams.Shadows () * | 
|---|
| 922 | fNegative.ShadowScale () * | 
|---|
| 923 | fNegative.Stage3Gain () * | 
|---|
| 924 | 0.001; | 
|---|
| 925 |  | 
|---|
| 926 | black = Min_real64 (black, 0.99 * white); | 
|---|
| 927 |  | 
|---|
| 928 | dng_function_exposure_ramp rampFunction (white, | 
|---|
| 929 | black, | 
|---|
| 930 | black); | 
|---|
| 931 |  | 
|---|
| 932 | fExposureRamp.Initialize (*allocator, rampFunction); | 
|---|
| 933 |  | 
|---|
| 934 | } | 
|---|
| 935 |  | 
|---|
| 936 | // Compute tone curve. | 
|---|
| 937 |  | 
|---|
| 938 | { | 
|---|
| 939 |  | 
|---|
| 940 | // If there is any negative exposure compenation to perform | 
|---|
| 941 | // (beyond what the camera provides for with its baseline exposure), | 
|---|
| 942 | // we fake this by darkening the tone curve. | 
|---|
| 943 |  | 
|---|
| 944 | dng_function_exposure_tone exposureTone (exposure); | 
|---|
| 945 |  | 
|---|
| 946 | dng_1d_concatenate totalTone (exposureTone, | 
|---|
| 947 | fParams.ToneCurve ()); | 
|---|
| 948 |  | 
|---|
| 949 | fToneCurve.Initialize (*allocator, totalTone); | 
|---|
| 950 |  | 
|---|
| 951 | } | 
|---|
| 952 |  | 
|---|
| 953 | // Compute linear ProPhoto RGB to final space parameters. | 
|---|
| 954 |  | 
|---|
| 955 | { | 
|---|
| 956 |  | 
|---|
| 957 | const dng_color_space &finalSpace = fParams.FinalSpace (); | 
|---|
| 958 |  | 
|---|
| 959 | fRGBtoFinal = finalSpace.MatrixFromPCS () * | 
|---|
| 960 | dng_space_ProPhoto::Get ().MatrixToPCS (); | 
|---|
| 961 |  | 
|---|
| 962 | fEncodeGamma.Initialize (*allocator, finalSpace.GammaFunction ()); | 
|---|
| 963 |  | 
|---|
| 964 | } | 
|---|
| 965 |  | 
|---|
| 966 | // Allocate temp buffer to hold one row of RGB data. | 
|---|
| 967 |  | 
|---|
| 968 | uint32 tempBufferSize = 0; | 
|---|
| 969 |  | 
|---|
| 970 | if (!SafeUint32Mult (tileSize.h, (uint32) sizeof (real32), &tempBufferSize) || | 
|---|
| 971 | !SafeUint32Mult (tempBufferSize, 3, &tempBufferSize)) | 
|---|
| 972 | { | 
|---|
| 973 |  | 
|---|
| 974 | ThrowMemoryFull( "Arithmetic overflow computing buffer size."); | 
|---|
| 975 |  | 
|---|
| 976 | } | 
|---|
| 977 |  | 
|---|
| 978 | for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++) | 
|---|
| 979 | { | 
|---|
| 980 |  | 
|---|
| 981 | fTempBuffer [threadIndex] . Reset (allocator->Allocate (tempBufferSize)); | 
|---|
| 982 |  | 
|---|
| 983 | } | 
|---|
| 984 |  | 
|---|
| 985 | } | 
|---|
| 986 |  | 
|---|
| 987 | /*****************************************************************************/ | 
|---|
| 988 |  | 
|---|
| 989 | void dng_render_task::ProcessArea (uint32 threadIndex, | 
|---|
| 990 | dng_pixel_buffer &srcBuffer, | 
|---|
| 991 | dng_pixel_buffer &dstBuffer) | 
|---|
| 992 | { | 
|---|
| 993 |  | 
|---|
| 994 | dng_rect srcArea = srcBuffer.fArea; | 
|---|
| 995 | dng_rect dstArea = dstBuffer.fArea; | 
|---|
| 996 |  | 
|---|
| 997 | uint32 srcCols = srcArea.W (); | 
|---|
| 998 |  | 
|---|
| 999 | real32 *tPtrR = fTempBuffer [threadIndex]->Buffer_real32 (); | 
|---|
| 1000 |  | 
|---|
| 1001 | real32 *tPtrG = tPtrR + srcCols; | 
|---|
| 1002 | real32 *tPtrB = tPtrG + srcCols; | 
|---|
| 1003 |  | 
|---|
| 1004 | for (int32 srcRow = srcArea.t; srcRow < srcArea.b; srcRow++) | 
|---|
| 1005 | { | 
|---|
| 1006 |  | 
|---|
| 1007 | // First convert from camera native space to linear PhotoRGB, | 
|---|
| 1008 | // applying the white balance and camera profile. | 
|---|
| 1009 |  | 
|---|
| 1010 | { | 
|---|
| 1011 |  | 
|---|
| 1012 | const real32 *sPtrA = (const real32 *) | 
|---|
| 1013 | srcBuffer.ConstPixel (srcRow, | 
|---|
| 1014 | srcArea.l, | 
|---|
| 1015 | 0); | 
|---|
| 1016 |  | 
|---|
| 1017 | if (fSrcPlanes == 1) | 
|---|
| 1018 | { | 
|---|
| 1019 |  | 
|---|
| 1020 | // For monochrome cameras, this just requires copying | 
|---|
| 1021 | // the data into all three color channels. | 
|---|
| 1022 |  | 
|---|
| 1023 | DoCopyBytes (sPtrA, tPtrR, srcCols * (uint32) sizeof (real32)); | 
|---|
| 1024 | DoCopyBytes (sPtrA, tPtrG, srcCols * (uint32) sizeof (real32)); | 
|---|
| 1025 | DoCopyBytes (sPtrA, tPtrB, srcCols * (uint32) sizeof (real32)); | 
|---|
| 1026 |  | 
|---|
| 1027 | } | 
|---|
| 1028 |  | 
|---|
| 1029 | else | 
|---|
| 1030 | { | 
|---|
| 1031 |  | 
|---|
| 1032 | const real32 *sPtrB = sPtrA + srcBuffer.fPlaneStep; | 
|---|
| 1033 | const real32 *sPtrC = sPtrB + srcBuffer.fPlaneStep; | 
|---|
| 1034 |  | 
|---|
| 1035 | if (fSrcPlanes == 3) | 
|---|
| 1036 | { | 
|---|
| 1037 |  | 
|---|
| 1038 | DoBaselineABCtoRGB (sPtrA, | 
|---|
| 1039 | sPtrB, | 
|---|
| 1040 | sPtrC, | 
|---|
| 1041 | tPtrR, | 
|---|
| 1042 | tPtrG, | 
|---|
| 1043 | tPtrB, | 
|---|
| 1044 | srcCols, | 
|---|
| 1045 | fCameraWhite, | 
|---|
| 1046 | fCameraToRGB); | 
|---|
| 1047 |  | 
|---|
| 1048 | } | 
|---|
| 1049 |  | 
|---|
| 1050 | else | 
|---|
| 1051 | { | 
|---|
| 1052 |  | 
|---|
| 1053 | const real32 *sPtrD = sPtrC + srcBuffer.fPlaneStep; | 
|---|
| 1054 |  | 
|---|
| 1055 | DoBaselineABCDtoRGB (sPtrA, | 
|---|
| 1056 | sPtrB, | 
|---|
| 1057 | sPtrC, | 
|---|
| 1058 | sPtrD, | 
|---|
| 1059 | tPtrR, | 
|---|
| 1060 | tPtrG, | 
|---|
| 1061 | tPtrB, | 
|---|
| 1062 | srcCols, | 
|---|
| 1063 | fCameraWhite, | 
|---|
| 1064 | fCameraToRGB); | 
|---|
| 1065 |  | 
|---|
| 1066 | } | 
|---|
| 1067 |  | 
|---|
| 1068 | // Apply Hue/Sat map, if any. | 
|---|
| 1069 |  | 
|---|
| 1070 | if (fHueSatMap.Get ()) | 
|---|
| 1071 | { | 
|---|
| 1072 |  | 
|---|
| 1073 | DoBaselineHueSatMap (tPtrR, | 
|---|
| 1074 | tPtrG, | 
|---|
| 1075 | tPtrB, | 
|---|
| 1076 | tPtrR, | 
|---|
| 1077 | tPtrG, | 
|---|
| 1078 | tPtrB, | 
|---|
| 1079 | srcCols, | 
|---|
| 1080 | *fHueSatMap.Get (), | 
|---|
| 1081 | fHueSatMapEncode.Get (), | 
|---|
| 1082 | fHueSatMapDecode.Get ()); | 
|---|
| 1083 |  | 
|---|
| 1084 | } | 
|---|
| 1085 |  | 
|---|
| 1086 | } | 
|---|
| 1087 |  | 
|---|
| 1088 | } | 
|---|
| 1089 |  | 
|---|
| 1090 | // Apply exposure curve. | 
|---|
| 1091 |  | 
|---|
| 1092 | DoBaseline1DTable (tPtrR, | 
|---|
| 1093 | tPtrR, | 
|---|
| 1094 | srcCols, | 
|---|
| 1095 | fExposureRamp); | 
|---|
| 1096 |  | 
|---|
| 1097 | DoBaseline1DTable (tPtrG, | 
|---|
| 1098 | tPtrG, | 
|---|
| 1099 | srcCols, | 
|---|
| 1100 | fExposureRamp); | 
|---|
| 1101 |  | 
|---|
| 1102 | DoBaseline1DTable (tPtrB, | 
|---|
| 1103 | tPtrB, | 
|---|
| 1104 | srcCols, | 
|---|
| 1105 | fExposureRamp); | 
|---|
| 1106 |  | 
|---|
| 1107 | // Apply look table, if any. | 
|---|
| 1108 |  | 
|---|
| 1109 | if (fLookTable.Get ()) | 
|---|
| 1110 | { | 
|---|
| 1111 |  | 
|---|
| 1112 | DoBaselineHueSatMap (tPtrR, | 
|---|
| 1113 | tPtrG, | 
|---|
| 1114 | tPtrB, | 
|---|
| 1115 | tPtrR, | 
|---|
| 1116 | tPtrG, | 
|---|
| 1117 | tPtrB, | 
|---|
| 1118 | srcCols, | 
|---|
| 1119 | *fLookTable.Get (), | 
|---|
| 1120 | fLookTableEncode.Get (), | 
|---|
| 1121 | fLookTableDecode.Get ()); | 
|---|
| 1122 |  | 
|---|
| 1123 | } | 
|---|
| 1124 |  | 
|---|
| 1125 | // Apply baseline tone curve. | 
|---|
| 1126 |  | 
|---|
| 1127 | DoBaselineRGBTone (tPtrR, | 
|---|
| 1128 | tPtrG, | 
|---|
| 1129 | tPtrB, | 
|---|
| 1130 | tPtrR, | 
|---|
| 1131 | tPtrG, | 
|---|
| 1132 | tPtrB, | 
|---|
| 1133 | srcCols, | 
|---|
| 1134 | fToneCurve); | 
|---|
| 1135 |  | 
|---|
| 1136 | // Convert to final color space. | 
|---|
| 1137 |  | 
|---|
| 1138 | int32 dstRow = srcRow + (dstArea.t - srcArea.t); | 
|---|
| 1139 |  | 
|---|
| 1140 | if (fDstPlanes == 1) | 
|---|
| 1141 | { | 
|---|
| 1142 |  | 
|---|
| 1143 | real32 *dPtrG = dstBuffer.DirtyPixel_real32 (dstRow, | 
|---|
| 1144 | dstArea.l, | 
|---|
| 1145 | 0); | 
|---|
| 1146 |  | 
|---|
| 1147 | DoBaselineRGBtoGray (tPtrR, | 
|---|
| 1148 | tPtrG, | 
|---|
| 1149 | tPtrB, | 
|---|
| 1150 | dPtrG, | 
|---|
| 1151 | srcCols, | 
|---|
| 1152 | fRGBtoFinal); | 
|---|
| 1153 |  | 
|---|
| 1154 | DoBaseline1DTable (dPtrG, | 
|---|
| 1155 | dPtrG, | 
|---|
| 1156 | srcCols, | 
|---|
| 1157 | fEncodeGamma); | 
|---|
| 1158 |  | 
|---|
| 1159 | } | 
|---|
| 1160 |  | 
|---|
| 1161 | else | 
|---|
| 1162 | { | 
|---|
| 1163 |  | 
|---|
| 1164 | real32 *dPtrR = dstBuffer.DirtyPixel_real32 (dstRow, | 
|---|
| 1165 | dstArea.l, | 
|---|
| 1166 | 0); | 
|---|
| 1167 |  | 
|---|
| 1168 | real32 *dPtrG = dPtrR + dstBuffer.fPlaneStep; | 
|---|
| 1169 | real32 *dPtrB = dPtrG + dstBuffer.fPlaneStep; | 
|---|
| 1170 |  | 
|---|
| 1171 | DoBaselineRGBtoRGB (tPtrR, | 
|---|
| 1172 | tPtrG, | 
|---|
| 1173 | tPtrB, | 
|---|
| 1174 | dPtrR, | 
|---|
| 1175 | dPtrG, | 
|---|
| 1176 | dPtrB, | 
|---|
| 1177 | srcCols, | 
|---|
| 1178 | fRGBtoFinal); | 
|---|
| 1179 |  | 
|---|
| 1180 | DoBaseline1DTable (dPtrR, | 
|---|
| 1181 | dPtrR, | 
|---|
| 1182 | srcCols, | 
|---|
| 1183 | fEncodeGamma); | 
|---|
| 1184 |  | 
|---|
| 1185 | DoBaseline1DTable (dPtrG, | 
|---|
| 1186 | dPtrG, | 
|---|
| 1187 | srcCols, | 
|---|
| 1188 | fEncodeGamma); | 
|---|
| 1189 |  | 
|---|
| 1190 | DoBaseline1DTable (dPtrB, | 
|---|
| 1191 | dPtrB, | 
|---|
| 1192 | srcCols, | 
|---|
| 1193 | fEncodeGamma); | 
|---|
| 1194 |  | 
|---|
| 1195 | } | 
|---|
| 1196 |  | 
|---|
| 1197 | } | 
|---|
| 1198 |  | 
|---|
| 1199 | } | 
|---|
| 1200 |  | 
|---|
| 1201 | /*****************************************************************************/ | 
|---|
| 1202 |  | 
|---|
| 1203 | dng_render::dng_render (dng_host &host, | 
|---|
| 1204 | const dng_negative &negative) | 
|---|
| 1205 |  | 
|---|
| 1206 | :	fHost			(host) | 
|---|
| 1207 | ,	fNegative		(negative) | 
|---|
| 1208 |  | 
|---|
| 1209 | ,	fWhiteXY		() | 
|---|
| 1210 |  | 
|---|
| 1211 | ,	fExposure		(0.0) | 
|---|
| 1212 | ,	fShadows		(5.0) | 
|---|
| 1213 |  | 
|---|
| 1214 | ,	fToneCurve		(&dng_tone_curve_acr3_default::Get ()) | 
|---|
| 1215 |  | 
|---|
| 1216 | ,	fFinalSpace		(&dng_space_sRGB::Get ()) | 
|---|
| 1217 | ,	fFinalPixelType (ttByte) | 
|---|
| 1218 |  | 
|---|
| 1219 | ,	fMaximumSize	(0) | 
|---|
| 1220 |  | 
|---|
| 1221 | ,	fProfileToneCurve () | 
|---|
| 1222 |  | 
|---|
| 1223 | { | 
|---|
| 1224 |  | 
|---|
| 1225 | // Switch to NOP default parameters for non-scene referred data. | 
|---|
| 1226 |  | 
|---|
| 1227 | if (fNegative.ColorimetricReference () != crSceneReferred) | 
|---|
| 1228 | { | 
|---|
| 1229 |  | 
|---|
| 1230 | fShadows = 0.0; | 
|---|
| 1231 |  | 
|---|
| 1232 | fToneCurve = &dng_1d_identity::Get (); | 
|---|
| 1233 |  | 
|---|
| 1234 | } | 
|---|
| 1235 |  | 
|---|
| 1236 | // Use default tone curve from profile if any. | 
|---|
| 1237 |  | 
|---|
| 1238 | const dng_camera_profile *profile = fNegative.ProfileByID (dng_camera_profile_id ()); | 
|---|
| 1239 |  | 
|---|
| 1240 | if (profile && profile->ToneCurve ().IsValid ()) | 
|---|
| 1241 | { | 
|---|
| 1242 |  | 
|---|
| 1243 | fProfileToneCurve.Reset (new dng_spline_solver); | 
|---|
| 1244 |  | 
|---|
| 1245 | profile->ToneCurve ().Solve (*fProfileToneCurve.Get ()); | 
|---|
| 1246 |  | 
|---|
| 1247 | fToneCurve = fProfileToneCurve.Get (); | 
|---|
| 1248 |  | 
|---|
| 1249 | } | 
|---|
| 1250 |  | 
|---|
| 1251 | // Turn off default shadow mapping if requested by profile. | 
|---|
| 1252 |  | 
|---|
| 1253 | if (profile && (profile->DefaultBlackRender () == defaultBlackRender_None)) | 
|---|
| 1254 | { | 
|---|
| 1255 |  | 
|---|
| 1256 | fShadows = 0.0; | 
|---|
| 1257 |  | 
|---|
| 1258 | } | 
|---|
| 1259 |  | 
|---|
| 1260 | } | 
|---|
| 1261 |  | 
|---|
| 1262 | /*****************************************************************************/ | 
|---|
| 1263 |  | 
|---|
| 1264 | dng_image * dng_render::Render () | 
|---|
| 1265 | { | 
|---|
| 1266 |  | 
|---|
| 1267 | const dng_image *srcImage = fNegative.Stage3Image (); | 
|---|
| 1268 |  | 
|---|
| 1269 | dng_rect srcBounds = fNegative.DefaultCropArea (); | 
|---|
| 1270 |  | 
|---|
| 1271 | dng_point dstSize; | 
|---|
| 1272 |  | 
|---|
| 1273 | dstSize.h =	fNegative.DefaultFinalWidth  (); | 
|---|
| 1274 | dstSize.v = fNegative.DefaultFinalHeight (); | 
|---|
| 1275 |  | 
|---|
| 1276 | if (MaximumSize ()) | 
|---|
| 1277 | { | 
|---|
| 1278 |  | 
|---|
| 1279 | if (Max_uint32 (dstSize.h, dstSize.v) > MaximumSize ()) | 
|---|
| 1280 | { | 
|---|
| 1281 |  | 
|---|
| 1282 | real64 ratio = fNegative.AspectRatio (); | 
|---|
| 1283 |  | 
|---|
| 1284 | if (ratio >= 1.0) | 
|---|
| 1285 | { | 
|---|
| 1286 | dstSize.h = MaximumSize (); | 
|---|
| 1287 | dstSize.v = Max_uint32 (1, Round_uint32 (dstSize.h / ratio)); | 
|---|
| 1288 | } | 
|---|
| 1289 |  | 
|---|
| 1290 | else | 
|---|
| 1291 | { | 
|---|
| 1292 | dstSize.v = MaximumSize (); | 
|---|
| 1293 | dstSize.h = Max_uint32 (1, Round_uint32 (dstSize.v * ratio)); | 
|---|
| 1294 | } | 
|---|
| 1295 |  | 
|---|
| 1296 | } | 
|---|
| 1297 |  | 
|---|
| 1298 | } | 
|---|
| 1299 |  | 
|---|
| 1300 | AutoPtr<dng_image> tempImage; | 
|---|
| 1301 |  | 
|---|
| 1302 | if (srcBounds.Size () != dstSize) | 
|---|
| 1303 | { | 
|---|
| 1304 |  | 
|---|
| 1305 | tempImage.Reset (fHost.Make_dng_image (dstSize, | 
|---|
| 1306 | srcImage->Planes    (), | 
|---|
| 1307 | srcImage->PixelType ())); | 
|---|
| 1308 |  | 
|---|
| 1309 | ResampleImage (fHost, | 
|---|
| 1310 | *srcImage, | 
|---|
| 1311 | *tempImage.Get (), | 
|---|
| 1312 | srcBounds, | 
|---|
| 1313 | tempImage->Bounds (), | 
|---|
| 1314 | dng_resample_bicubic::Get ()); | 
|---|
| 1315 |  | 
|---|
| 1316 | srcImage = tempImage.Get (); | 
|---|
| 1317 |  | 
|---|
| 1318 | srcBounds = tempImage->Bounds (); | 
|---|
| 1319 |  | 
|---|
| 1320 | } | 
|---|
| 1321 |  | 
|---|
| 1322 | uint32 dstPlanes = FinalSpace ().IsMonochrome () ? 1 : 3; | 
|---|
| 1323 |  | 
|---|
| 1324 | AutoPtr<dng_image> dstImage (fHost.Make_dng_image (srcBounds.Size (), | 
|---|
| 1325 | dstPlanes, | 
|---|
| 1326 | FinalPixelType ())); | 
|---|
| 1327 |  | 
|---|
| 1328 | dng_render_task task (*srcImage, | 
|---|
| 1329 | *dstImage.Get (), | 
|---|
| 1330 | fNegative, | 
|---|
| 1331 | *this, | 
|---|
| 1332 | srcBounds.TL ()); | 
|---|
| 1333 |  | 
|---|
| 1334 | fHost.PerformAreaTask (task, | 
|---|
| 1335 | dstImage->Bounds ()); | 
|---|
| 1336 |  | 
|---|
| 1337 | return dstImage.Release (); | 
|---|
| 1338 |  | 
|---|
| 1339 | } | 
|---|
| 1340 |  | 
|---|
| 1341 | /*****************************************************************************/ | 
|---|
| 1342 |  | 
|---|