Coverage Report

Created: 2025-10-10 07:04

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