Coverage Report

Created: 2025-11-09 06:37

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
12.8k
  : fSlope ((white == black) ? 0.0f : 1.0 / (white - black))
38
12.8k
  , fBlack (black)
39
  
40
12.8k
  , fRadius (0.0)
41
12.8k
  , fQScale (0.0)
42
  
43
12.8k
  {
44
12.8k
  if (fSlope == 0.0)
45
32
    {
46
32
     ThrowBadFormat ();
47
32
    }
48
49
12.8k
  const real64 kMaxCurveX = 0.5;      // Fraction of minBlack.
50
  
51
12.8k
  const real64 kMaxCurveY = 1.0 / 16.0; // Fraction of white.
52
  
53
12.8k
  fRadius = Min_real64 (kMaxCurveX * minBlack,
54
12.8k
              kMaxCurveY / fSlope);
55
  
56
12.8k
  if (fRadius > 0.0)
57
12.4k
    fQScale= fSlope / (4.0 * fRadius);
58
351
  else
59
351
    fQScale = 0.0;
60
    
61
12.8k
  }
62
      
63
/*****************************************************************************/
64
65
real64 dng_function_exposure_ramp::Evaluate (real64 x) const
66
52.4M
  {
67
  
68
52.4M
  if (x <= fBlack - fRadius)
69
135k
    return 0.0;
70
    
71
52.2M
  if (x >= fBlack + fRadius)
72
52.0M
    return Min_real64 ((x - fBlack) * fSlope, 1.0);
73
    
74
245k
  real64 y = x - (fBlack - fRadius);
75
  
76
245k
  return fQScale * y * y;
77
  
78
52.2M
  }
79
      
80
/*****************************************************************************/
81
82
dng_function_exposure_tone::dng_function_exposure_tone (real64 exposure)
83
    
84
12.7k
  : fIsNOP (exposure >= 0.0)
85
  
86
12.7k
  , fSlope (0.0)
87
  
88
12.7k
  , a (0.0)
89
12.7k
  , b (0.0)
90
12.7k
  , c (0.0)
91
  
92
12.7k
  {
93
  
94
12.7k
  if (!fIsNOP)
95
182
    {
96
    
97
    // Find slope to use for the all except the highest two f-stops.
98
    
99
182
    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
182
    a = 16.0 / 9.0 * (1.0 - fSlope);
105
  
106
182
    b = fSlope - 0.5 * a;
107
  
108
182
    c = 1.0 - a - b;
109
110
182
    }
111
  
112
12.7k
  }
113
  
114
/*****************************************************************************/
115
116
real64 dng_function_exposure_tone::Evaluate (real64 x) const
117
52.4M
  {
118
  
119
52.4M
  if (!fIsNOP)
120
745k
    {
121
    
122
745k
    if (x <= 0.25)
123
186k
      x = x * fSlope;
124
      
125
559k
    else
126
559k
      x = (a * x + b) * x + c;
127
128
745k
    }
129
    
130
52.4M
  return x;
131
  
132
52.4M
  }
133
  
134
/*****************************************************************************/
135
136
real64 dng_tone_curve_acr3_default::Evaluate (real64 x) const
137
50.9M
  {
138
  
139
50.9M
  static const real32 kTable [] =
140
50.9M
    {
141
50.9M
    0.00000f, 0.00078f, 0.00160f, 0.00242f,
142
50.9M
    0.00314f, 0.00385f, 0.00460f, 0.00539f,
143
50.9M
    0.00623f, 0.00712f, 0.00806f, 0.00906f,
144
50.9M
    0.01012f, 0.01122f, 0.01238f, 0.01359f,
145
50.9M
    0.01485f, 0.01616f, 0.01751f, 0.01890f,
146
50.9M
    0.02033f, 0.02180f, 0.02331f, 0.02485f,
147
50.9M
    0.02643f, 0.02804f, 0.02967f, 0.03134f,
148
50.9M
    0.03303f, 0.03475f, 0.03648f, 0.03824f,
149
50.9M
    0.04002f, 0.04181f, 0.04362f, 0.04545f,
150
50.9M
    0.04730f, 0.04916f, 0.05103f, 0.05292f,
151
50.9M
    0.05483f, 0.05675f, 0.05868f, 0.06063f,
152
50.9M
    0.06259f, 0.06457f, 0.06655f, 0.06856f,
153
50.9M
    0.07057f, 0.07259f, 0.07463f, 0.07668f,
154
50.9M
    0.07874f, 0.08081f, 0.08290f, 0.08499f,
155
50.9M
    0.08710f, 0.08921f, 0.09134f, 0.09348f,
156
50.9M
    0.09563f, 0.09779f, 0.09996f, 0.10214f,
157
50.9M
    0.10433f, 0.10652f, 0.10873f, 0.11095f,
158
50.9M
    0.11318f, 0.11541f, 0.11766f, 0.11991f,
159
50.9M
    0.12218f, 0.12445f, 0.12673f, 0.12902f,
160
50.9M
    0.13132f, 0.13363f, 0.13595f, 0.13827f,
161
50.9M
    0.14061f, 0.14295f, 0.14530f, 0.14765f,
162
50.9M
    0.15002f, 0.15239f, 0.15477f, 0.15716f,
163
50.9M
    0.15956f, 0.16197f, 0.16438f, 0.16680f,
164
50.9M
    0.16923f, 0.17166f, 0.17410f, 0.17655f,
165
50.9M
    0.17901f, 0.18148f, 0.18395f, 0.18643f,
166
50.9M
    0.18891f, 0.19141f, 0.19391f, 0.19641f,
167
50.9M
    0.19893f, 0.20145f, 0.20398f, 0.20651f,
168
50.9M
    0.20905f, 0.21160f, 0.21416f, 0.21672f,
169
50.9M
    0.21929f, 0.22185f, 0.22440f, 0.22696f,
170
50.9M
    0.22950f, 0.23204f, 0.23458f, 0.23711f,
171
50.9M
    0.23963f, 0.24215f, 0.24466f, 0.24717f,
172
50.9M
    0.24967f, 0.25216f, 0.25465f, 0.25713f,
173
50.9M
    0.25961f, 0.26208f, 0.26454f, 0.26700f,
174
50.9M
    0.26945f, 0.27189f, 0.27433f, 0.27676f,
175
50.9M
    0.27918f, 0.28160f, 0.28401f, 0.28641f,
176
50.9M
    0.28881f, 0.29120f, 0.29358f, 0.29596f,
177
50.9M
    0.29833f, 0.30069f, 0.30305f, 0.30540f,
178
50.9M
    0.30774f, 0.31008f, 0.31241f, 0.31473f,
179
50.9M
    0.31704f, 0.31935f, 0.32165f, 0.32395f,
180
50.9M
    0.32623f, 0.32851f, 0.33079f, 0.33305f,
181
50.9M
    0.33531f, 0.33756f, 0.33981f, 0.34205f,
182
50.9M
    0.34428f, 0.34650f, 0.34872f, 0.35093f,
183
50.9M
    0.35313f, 0.35532f, 0.35751f, 0.35969f,
184
50.9M
    0.36187f, 0.36404f, 0.36620f, 0.36835f,
185
50.9M
    0.37050f, 0.37264f, 0.37477f, 0.37689f,
186
50.9M
    0.37901f, 0.38112f, 0.38323f, 0.38533f,
187
50.9M
    0.38742f, 0.38950f, 0.39158f, 0.39365f,
188
50.9M
    0.39571f, 0.39777f, 0.39982f, 0.40186f,
189
50.9M
    0.40389f, 0.40592f, 0.40794f, 0.40996f,
190
50.9M
    0.41197f, 0.41397f, 0.41596f, 0.41795f,
191
50.9M
    0.41993f, 0.42191f, 0.42388f, 0.42584f,
192
50.9M
    0.42779f, 0.42974f, 0.43168f, 0.43362f,
193
50.9M
    0.43554f, 0.43747f, 0.43938f, 0.44129f,
194
50.9M
    0.44319f, 0.44509f, 0.44698f, 0.44886f,
195
50.9M
    0.45073f, 0.45260f, 0.45447f, 0.45632f,
196
50.9M
    0.45817f, 0.46002f, 0.46186f, 0.46369f,
197
50.9M
    0.46551f, 0.46733f, 0.46914f, 0.47095f,
198
50.9M
    0.47275f, 0.47454f, 0.47633f, 0.47811f,
199
50.9M
    0.47989f, 0.48166f, 0.48342f, 0.48518f,
200
50.9M
    0.48693f, 0.48867f, 0.49041f, 0.49214f,
201
50.9M
    0.49387f, 0.49559f, 0.49730f, 0.49901f,
202
50.9M
    0.50072f, 0.50241f, 0.50410f, 0.50579f,
203
50.9M
    0.50747f, 0.50914f, 0.51081f, 0.51247f,
204
50.9M
    0.51413f, 0.51578f, 0.51742f, 0.51906f,
205
50.9M
    0.52069f, 0.52232f, 0.52394f, 0.52556f,
206
50.9M
    0.52717f, 0.52878f, 0.53038f, 0.53197f,
207
50.9M
    0.53356f, 0.53514f, 0.53672f, 0.53829f,
208
50.9M
    0.53986f, 0.54142f, 0.54297f, 0.54452f,
209
50.9M
    0.54607f, 0.54761f, 0.54914f, 0.55067f,
210
50.9M
    0.55220f, 0.55371f, 0.55523f, 0.55673f,
211
50.9M
    0.55824f, 0.55973f, 0.56123f, 0.56271f,
212
50.9M
    0.56420f, 0.56567f, 0.56715f, 0.56861f,
213
50.9M
    0.57007f, 0.57153f, 0.57298f, 0.57443f,
214
50.9M
    0.57587f, 0.57731f, 0.57874f, 0.58017f,
215
50.9M
    0.58159f, 0.58301f, 0.58443f, 0.58583f,
216
50.9M
    0.58724f, 0.58864f, 0.59003f, 0.59142f,
217
50.9M
    0.59281f, 0.59419f, 0.59556f, 0.59694f,
218
50.9M
    0.59830f, 0.59966f, 0.60102f, 0.60238f,
219
50.9M
    0.60373f, 0.60507f, 0.60641f, 0.60775f,
220
50.9M
    0.60908f, 0.61040f, 0.61173f, 0.61305f,
221
50.9M
    0.61436f, 0.61567f, 0.61698f, 0.61828f,
222
50.9M
    0.61957f, 0.62087f, 0.62216f, 0.62344f,
223
50.9M
    0.62472f, 0.62600f, 0.62727f, 0.62854f,
224
50.9M
    0.62980f, 0.63106f, 0.63232f, 0.63357f,
225
50.9M
    0.63482f, 0.63606f, 0.63730f, 0.63854f,
226
50.9M
    0.63977f, 0.64100f, 0.64222f, 0.64344f,
227
50.9M
    0.64466f, 0.64587f, 0.64708f, 0.64829f,
228
50.9M
    0.64949f, 0.65069f, 0.65188f, 0.65307f,
229
50.9M
    0.65426f, 0.65544f, 0.65662f, 0.65779f,
230
50.9M
    0.65897f, 0.66013f, 0.66130f, 0.66246f,
231
50.9M
    0.66362f, 0.66477f, 0.66592f, 0.66707f,
232
50.9M
    0.66821f, 0.66935f, 0.67048f, 0.67162f,
233
50.9M
    0.67275f, 0.67387f, 0.67499f, 0.67611f,
234
50.9M
    0.67723f, 0.67834f, 0.67945f, 0.68055f,
235
50.9M
    0.68165f, 0.68275f, 0.68385f, 0.68494f,
236
50.9M
    0.68603f, 0.68711f, 0.68819f, 0.68927f,
237
50.9M
    0.69035f, 0.69142f, 0.69249f, 0.69355f,
238
50.9M
    0.69461f, 0.69567f, 0.69673f, 0.69778f,
239
50.9M
    0.69883f, 0.69988f, 0.70092f, 0.70196f,
240
50.9M
    0.70300f, 0.70403f, 0.70506f, 0.70609f,
241
50.9M
    0.70711f, 0.70813f, 0.70915f, 0.71017f,
242
50.9M
    0.71118f, 0.71219f, 0.71319f, 0.71420f,
243
50.9M
    0.71520f, 0.71620f, 0.71719f, 0.71818f,
244
50.9M
    0.71917f, 0.72016f, 0.72114f, 0.72212f,
245
50.9M
    0.72309f, 0.72407f, 0.72504f, 0.72601f,
246
50.9M
    0.72697f, 0.72794f, 0.72890f, 0.72985f,
247
50.9M
    0.73081f, 0.73176f, 0.73271f, 0.73365f,
248
50.9M
    0.73460f, 0.73554f, 0.73647f, 0.73741f,
249
50.9M
    0.73834f, 0.73927f, 0.74020f, 0.74112f,
250
50.9M
    0.74204f, 0.74296f, 0.74388f, 0.74479f,
251
50.9M
    0.74570f, 0.74661f, 0.74751f, 0.74842f,
252
50.9M
    0.74932f, 0.75021f, 0.75111f, 0.75200f,
253
50.9M
    0.75289f, 0.75378f, 0.75466f, 0.75555f,
254
50.9M
    0.75643f, 0.75730f, 0.75818f, 0.75905f,
255
50.9M
    0.75992f, 0.76079f, 0.76165f, 0.76251f,
256
50.9M
    0.76337f, 0.76423f, 0.76508f, 0.76594f,
257
50.9M
    0.76679f, 0.76763f, 0.76848f, 0.76932f,
258
50.9M
    0.77016f, 0.77100f, 0.77183f, 0.77267f,
259
50.9M
    0.77350f, 0.77432f, 0.77515f, 0.77597f,
260
50.9M
    0.77680f, 0.77761f, 0.77843f, 0.77924f,
261
50.9M
    0.78006f, 0.78087f, 0.78167f, 0.78248f,
262
50.9M
    0.78328f, 0.78408f, 0.78488f, 0.78568f,
263
50.9M
    0.78647f, 0.78726f, 0.78805f, 0.78884f,
264
50.9M
    0.78962f, 0.79040f, 0.79118f, 0.79196f,
265
50.9M
    0.79274f, 0.79351f, 0.79428f, 0.79505f,
266
50.9M
    0.79582f, 0.79658f, 0.79735f, 0.79811f,
267
50.9M
    0.79887f, 0.79962f, 0.80038f, 0.80113f,
268
50.9M
    0.80188f, 0.80263f, 0.80337f, 0.80412f,
269
50.9M
    0.80486f, 0.80560f, 0.80634f, 0.80707f,
270
50.9M
    0.80780f, 0.80854f, 0.80926f, 0.80999f,
271
50.9M
    0.81072f, 0.81144f, 0.81216f, 0.81288f,
272
50.9M
    0.81360f, 0.81431f, 0.81503f, 0.81574f,
273
50.9M
    0.81645f, 0.81715f, 0.81786f, 0.81856f,
274
50.9M
    0.81926f, 0.81996f, 0.82066f, 0.82135f,
275
50.9M
    0.82205f, 0.82274f, 0.82343f, 0.82412f,
276
50.9M
    0.82480f, 0.82549f, 0.82617f, 0.82685f,
277
50.9M
    0.82753f, 0.82820f, 0.82888f, 0.82955f,
278
50.9M
    0.83022f, 0.83089f, 0.83155f, 0.83222f,
279
50.9M
    0.83288f, 0.83354f, 0.83420f, 0.83486f,
280
50.9M
    0.83552f, 0.83617f, 0.83682f, 0.83747f,
281
50.9M
    0.83812f, 0.83877f, 0.83941f, 0.84005f,
282
50.9M
    0.84069f, 0.84133f, 0.84197f, 0.84261f,
283
50.9M
    0.84324f, 0.84387f, 0.84450f, 0.84513f,
284
50.9M
    0.84576f, 0.84639f, 0.84701f, 0.84763f,
285
50.9M
    0.84825f, 0.84887f, 0.84949f, 0.85010f,
286
50.9M
    0.85071f, 0.85132f, 0.85193f, 0.85254f,
287
50.9M
    0.85315f, 0.85375f, 0.85436f, 0.85496f,
288
50.9M
    0.85556f, 0.85615f, 0.85675f, 0.85735f,
289
50.9M
    0.85794f, 0.85853f, 0.85912f, 0.85971f,
290
50.9M
    0.86029f, 0.86088f, 0.86146f, 0.86204f,
291
50.9M
    0.86262f, 0.86320f, 0.86378f, 0.86435f,
292
50.9M
    0.86493f, 0.86550f, 0.86607f, 0.86664f,
293
50.9M
    0.86720f, 0.86777f, 0.86833f, 0.86889f,
294
50.9M
    0.86945f, 0.87001f, 0.87057f, 0.87113f,
295
50.9M
    0.87168f, 0.87223f, 0.87278f, 0.87333f,
296
50.9M
    0.87388f, 0.87443f, 0.87497f, 0.87552f,
297
50.9M
    0.87606f, 0.87660f, 0.87714f, 0.87768f,
298
50.9M
    0.87821f, 0.87875f, 0.87928f, 0.87981f,
299
50.9M
    0.88034f, 0.88087f, 0.88140f, 0.88192f,
300
50.9M
    0.88244f, 0.88297f, 0.88349f, 0.88401f,
301
50.9M
    0.88453f, 0.88504f, 0.88556f, 0.88607f,
302
50.9M
    0.88658f, 0.88709f, 0.88760f, 0.88811f,
303
50.9M
    0.88862f, 0.88912f, 0.88963f, 0.89013f,
304
50.9M
    0.89063f, 0.89113f, 0.89163f, 0.89212f,
305
50.9M
    0.89262f, 0.89311f, 0.89360f, 0.89409f,
306
50.9M
    0.89458f, 0.89507f, 0.89556f, 0.89604f,
307
50.9M
    0.89653f, 0.89701f, 0.89749f, 0.89797f,
308
50.9M
    0.89845f, 0.89892f, 0.89940f, 0.89987f,
309
50.9M
    0.90035f, 0.90082f, 0.90129f, 0.90176f,
310
50.9M
    0.90222f, 0.90269f, 0.90316f, 0.90362f,
311
50.9M
    0.90408f, 0.90454f, 0.90500f, 0.90546f,
312
50.9M
    0.90592f, 0.90637f, 0.90683f, 0.90728f,
313
50.9M
    0.90773f, 0.90818f, 0.90863f, 0.90908f,
314
50.9M
    0.90952f, 0.90997f, 0.91041f, 0.91085f,
315
50.9M
    0.91130f, 0.91173f, 0.91217f, 0.91261f,
316
50.9M
    0.91305f, 0.91348f, 0.91392f, 0.91435f,
317
50.9M
    0.91478f, 0.91521f, 0.91564f, 0.91606f,
318
50.9M
    0.91649f, 0.91691f, 0.91734f, 0.91776f,
319
50.9M
    0.91818f, 0.91860f, 0.91902f, 0.91944f,
320
50.9M
    0.91985f, 0.92027f, 0.92068f, 0.92109f,
321
50.9M
    0.92150f, 0.92191f, 0.92232f, 0.92273f,
322
50.9M
    0.92314f, 0.92354f, 0.92395f, 0.92435f,
323
50.9M
    0.92475f, 0.92515f, 0.92555f, 0.92595f,
324
50.9M
    0.92634f, 0.92674f, 0.92713f, 0.92753f,
325
50.9M
    0.92792f, 0.92831f, 0.92870f, 0.92909f,
326
50.9M
    0.92947f, 0.92986f, 0.93025f, 0.93063f,
327
50.9M
    0.93101f, 0.93139f, 0.93177f, 0.93215f,
328
50.9M
    0.93253f, 0.93291f, 0.93328f, 0.93366f,
329
50.9M
    0.93403f, 0.93440f, 0.93478f, 0.93515f,
330
50.9M
    0.93551f, 0.93588f, 0.93625f, 0.93661f,
331
50.9M
    0.93698f, 0.93734f, 0.93770f, 0.93807f,
332
50.9M
    0.93843f, 0.93878f, 0.93914f, 0.93950f,
333
50.9M
    0.93986f, 0.94021f, 0.94056f, 0.94092f,
334
50.9M
    0.94127f, 0.94162f, 0.94197f, 0.94231f,
335
50.9M
    0.94266f, 0.94301f, 0.94335f, 0.94369f,
336
50.9M
    0.94404f, 0.94438f, 0.94472f, 0.94506f,
337
50.9M
    0.94540f, 0.94573f, 0.94607f, 0.94641f,
338
50.9M
    0.94674f, 0.94707f, 0.94740f, 0.94774f,
339
50.9M
    0.94807f, 0.94839f, 0.94872f, 0.94905f,
340
50.9M
    0.94937f, 0.94970f, 0.95002f, 0.95035f,
341
50.9M
    0.95067f, 0.95099f, 0.95131f, 0.95163f,
342
50.9M
    0.95194f, 0.95226f, 0.95257f, 0.95289f,
343
50.9M
    0.95320f, 0.95351f, 0.95383f, 0.95414f,
344
50.9M
    0.95445f, 0.95475f, 0.95506f, 0.95537f,
345
50.9M
    0.95567f, 0.95598f, 0.95628f, 0.95658f,
346
50.9M
    0.95688f, 0.95718f, 0.95748f, 0.95778f,
347
50.9M
    0.95808f, 0.95838f, 0.95867f, 0.95897f,
348
50.9M
    0.95926f, 0.95955f, 0.95984f, 0.96013f,
349
50.9M
    0.96042f, 0.96071f, 0.96100f, 0.96129f,
350
50.9M
    0.96157f, 0.96186f, 0.96214f, 0.96242f,
351
50.9M
    0.96271f, 0.96299f, 0.96327f, 0.96355f,
352
50.9M
    0.96382f, 0.96410f, 0.96438f, 0.96465f,
353
50.9M
    0.96493f, 0.96520f, 0.96547f, 0.96574f,
354
50.9M
    0.96602f, 0.96629f, 0.96655f, 0.96682f,
355
50.9M
    0.96709f, 0.96735f, 0.96762f, 0.96788f,
356
50.9M
    0.96815f, 0.96841f, 0.96867f, 0.96893f,
357
50.9M
    0.96919f, 0.96945f, 0.96971f, 0.96996f,
358
50.9M
    0.97022f, 0.97047f, 0.97073f, 0.97098f,
359
50.9M
    0.97123f, 0.97149f, 0.97174f, 0.97199f,
360
50.9M
    0.97223f, 0.97248f, 0.97273f, 0.97297f,
361
50.9M
    0.97322f, 0.97346f, 0.97371f, 0.97395f,
362
50.9M
    0.97419f, 0.97443f, 0.97467f, 0.97491f,
363
50.9M
    0.97515f, 0.97539f, 0.97562f, 0.97586f,
364
50.9M
    0.97609f, 0.97633f, 0.97656f, 0.97679f,
365
50.9M
    0.97702f, 0.97725f, 0.97748f, 0.97771f,
366
50.9M
    0.97794f, 0.97817f, 0.97839f, 0.97862f,
367
50.9M
    0.97884f, 0.97907f, 0.97929f, 0.97951f,
368
50.9M
    0.97973f, 0.97995f, 0.98017f, 0.98039f,
369
50.9M
    0.98061f, 0.98082f, 0.98104f, 0.98125f,
370
50.9M
    0.98147f, 0.98168f, 0.98189f, 0.98211f,
371
50.9M
    0.98232f, 0.98253f, 0.98274f, 0.98295f,
372
50.9M
    0.98315f, 0.98336f, 0.98357f, 0.98377f,
373
50.9M
    0.98398f, 0.98418f, 0.98438f, 0.98458f,
374
50.9M
    0.98478f, 0.98498f, 0.98518f, 0.98538f,
375
50.9M
    0.98558f, 0.98578f, 0.98597f, 0.98617f,
376
50.9M
    0.98636f, 0.98656f, 0.98675f, 0.98694f,
377
50.9M
    0.98714f, 0.98733f, 0.98752f, 0.98771f,
378
50.9M
    0.98789f, 0.98808f, 0.98827f, 0.98845f,
379
50.9M
    0.98864f, 0.98882f, 0.98901f, 0.98919f,
380
50.9M
    0.98937f, 0.98955f, 0.98973f, 0.98991f,
381
50.9M
    0.99009f, 0.99027f, 0.99045f, 0.99063f,
382
50.9M
    0.99080f, 0.99098f, 0.99115f, 0.99133f,
383
50.9M
    0.99150f, 0.99167f, 0.99184f, 0.99201f,
384
50.9M
    0.99218f, 0.99235f, 0.99252f, 0.99269f,
385
50.9M
    0.99285f, 0.99302f, 0.99319f, 0.99335f,
386
50.9M
    0.99351f, 0.99368f, 0.99384f, 0.99400f,
387
50.9M
    0.99416f, 0.99432f, 0.99448f, 0.99464f,
388
50.9M
    0.99480f, 0.99495f, 0.99511f, 0.99527f,
389
50.9M
    0.99542f, 0.99558f, 0.99573f, 0.99588f,
390
50.9M
    0.99603f, 0.99619f, 0.99634f, 0.99649f,
391
50.9M
    0.99664f, 0.99678f, 0.99693f, 0.99708f,
392
50.9M
    0.99722f, 0.99737f, 0.99751f, 0.99766f,
393
50.9M
    0.99780f, 0.99794f, 0.99809f, 0.99823f,
394
50.9M
    0.99837f, 0.99851f, 0.99865f, 0.99879f,
395
50.9M
    0.99892f, 0.99906f, 0.99920f, 0.99933f,
396
50.9M
    0.99947f, 0.99960f, 0.99974f, 0.99987f,
397
50.9M
    1.00000f
398
50.9M
    };
399
    
400
50.9M
  const uint32 kTableSize = sizeof (kTable    ) /
401
50.9M
                sizeof (kTable [0]);
402
    
403
50.9M
  real32 y = (real32) x * (real32) (kTableSize - 1);
404
  
405
50.9M
  int32 index = Pin_int32 (0, (int32) y, kTableSize - 2);
406
  
407
50.9M
  real32 fract = y - (real32) index;
408
  
409
50.9M
  return kTable [index    ] * (1.0f - fract) +
410
50.9M
       kTable [index + 1] * (       fract);
411
  
412
50.9M
  }
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.4k
  {
698
  
699
13.4k
  static dng_tone_curve_acr3_default static_dng_tone_curve_acr3_default;
700
  
701
13.4k
  return static_dng_tone_curve_acr3_default;
702
  
703
13.4k
  }
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
12.8k
  : dng_filter_task (srcImage,
771
12.8k
             dstImage)
772
             
773
12.8k
  , fNegative  (negative )
774
12.8k
  , fParams    (params   )
775
12.8k
  , fSrcOffset (srcOffset)
776
  
777
12.8k
  , fCameraWhite ()
778
12.8k
  , fCameraToRGB ()
779
  
780
12.8k
  , fHueSatMap ()
781
  
782
12.8k
  , fExposureRamp ()
783
  
784
12.8k
  , fLookTable ()
785
  
786
12.8k
  , fToneCurve ()
787
  
788
12.8k
  , fRGBtoFinal ()
789
  
790
12.8k
  , fEncodeGamma ()
791
792
12.8k
  , fHueSatMapEncode ()
793
12.8k
  , fHueSatMapDecode ()
794
795
12.8k
  , fLookTableEncode ()
796
12.8k
  , fLookTableDecode ()
797
  
798
12.8k
  {
799
  
800
12.8k
  fSrcPixelType = ttFloat;
801
12.8k
  fDstPixelType = ttFloat;
802
  
803
12.8k
  }
804
      
805
/*****************************************************************************/
806
807
dng_rect dng_render_task::SrcArea (const dng_rect &dstArea)
808
712k
  {
809
  
810
712k
  return dstArea + fSrcOffset;
811
  
812
712k
  }
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
12.8k
  {
821
  
822
12.8k
  dng_filter_task::Start (threadCount,
823
12.8k
              tileSize,
824
12.8k
              allocator,
825
12.8k
              sniffer);
826
              
827
  // Compute camera space to linear ProPhoto RGB parameters.
828
  
829
12.8k
  dng_camera_profile_id profileID;  // Default profile ID.
830
    
831
12.8k
  if (!fNegative.IsMonochrome ())
832
2.84k
    {
833
    
834
2.84k
    AutoPtr<dng_color_spec> spec (fNegative.MakeColorSpec (profileID));
835
    
836
2.84k
    if (fParams.WhiteXY ().IsValid ())
837
0
      {
838
      
839
0
      spec->SetWhiteXY (fParams.WhiteXY ());
840
      
841
0
      }
842
               
843
2.84k
    else if (fNegative.HasCameraNeutral ())
844
287
      {
845
      
846
287
      spec->SetWhiteXY (spec->NeutralToXY (fNegative.CameraNeutral ()));
847
      
848
287
      }
849
      
850
2.56k
    else if (fNegative.HasCameraWhiteXY ())
851
265
      {
852
      
853
265
      spec->SetWhiteXY (fNegative.CameraWhiteXY ());
854
      
855
265
      }
856
      
857
2.29k
    else
858
2.29k
      {
859
      
860
2.29k
      spec->SetWhiteXY (D55_xy_coord ());
861
      
862
2.29k
      }
863
      
864
2.84k
    fCameraWhite = spec->CameraWhite ();
865
    
866
2.84k
    fCameraToRGB = dng_space_ProPhoto::Get ().MatrixFromPCS () *
867
2.84k
             spec->CameraToPCS ();
868
             
869
    // Find Hue/Sat table, if any.
870
    
871
2.84k
    const dng_camera_profile *profile = fNegative.ProfileByID (profileID);
872
    
873
2.84k
    if (profile)
874
2.80k
      {
875
      
876
2.80k
      fHueSatMap.Reset (profile->HueSatMapForWhite (spec->WhiteXY ()));
877
      
878
2.80k
      if (profile->HasLookTable ())
879
0
        {
880
        
881
0
        fLookTable.Reset (new dng_hue_sat_map (profile->LookTable ()));
882
        
883
0
        }
884
885
2.80k
      if (profile->HueSatMapEncoding () != encoding_Linear)
886
27
        {
887
          
888
27
        BuildHueSatMapEncodingTable (*allocator,
889
27
                       profile->HueSatMapEncoding (),
890
27
                       fHueSatMapEncode,
891
27
                       fHueSatMapDecode,
892
27
                       false);
893
          
894
27
        }
895
      
896
2.80k
      if (profile->LookTableEncoding () != encoding_Linear)
897
110
        {
898
          
899
110
        BuildHueSatMapEncodingTable (*allocator,
900
110
                       profile->LookTableEncoding (),
901
110
                       fLookTableEncode,
902
110
                       fLookTableDecode,
903
110
                       false);
904
          
905
110
        }
906
      
907
2.80k
      }
908
    
909
2.84k
    }
910
    
911
  // Compute exposure/shadows ramp.
912
913
12.8k
  real64 exposure = fParams.Exposure () +
914
12.8k
            fNegative.TotalBaselineExposure (profileID) -
915
12.8k
            (log (fNegative.Stage3Gain ()) / log (2.0));
916
  
917
12.8k
    {
918
    
919
12.8k
    real64 white = 1.0 / pow (2.0, Max_real64 (0.0, exposure));
920
    
921
12.8k
    real64 black = fParams.Shadows () *
922
12.8k
             fNegative.ShadowScale () *
923
12.8k
             fNegative.Stage3Gain () *
924
12.8k
             0.001;
925
             
926
12.8k
    black = Min_real64 (black, 0.99 * white);
927
  
928
12.8k
    dng_function_exposure_ramp rampFunction (white,
929
12.8k
                         black,
930
12.8k
                         black);
931
                         
932
12.8k
    fExposureRamp.Initialize (*allocator, rampFunction);
933
934
12.8k
    }
935
    
936
  // Compute tone curve.
937
  
938
12.8k
    {
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
12.8k
    dng_function_exposure_tone exposureTone (exposure);
945
    
946
12.8k
    dng_1d_concatenate totalTone (exposureTone,
947
12.8k
                    fParams.ToneCurve ());
948
    
949
12.8k
    fToneCurve.Initialize (*allocator, totalTone);
950
        
951
12.8k
    }
952
    
953
  // Compute linear ProPhoto RGB to final space parameters.
954
  
955
12.8k
    {
956
    
957
12.8k
    const dng_color_space &finalSpace = fParams.FinalSpace ();
958
    
959
12.8k
    fRGBtoFinal = finalSpace.MatrixFromPCS () *
960
12.8k
            dng_space_ProPhoto::Get ().MatrixToPCS ();
961
            
962
12.8k
    fEncodeGamma.Initialize (*allocator, finalSpace.GammaFunction ());
963
    
964
12.8k
    }
965
966
  // Allocate temp buffer to hold one row of RGB data.
967
              
968
12.8k
  uint32 tempBufferSize = 0;
969
  
970
12.8k
  if (!SafeUint32Mult (tileSize.h, (uint32) sizeof (real32), &tempBufferSize) ||
971
12.7k
     !SafeUint32Mult (tempBufferSize, 3, &tempBufferSize))
972
0
    {
973
    
974
0
    ThrowMemoryFull("Arithmetic overflow computing buffer size.");
975
    
976
0
    }
977
  
978
25.6k
  for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
979
12.7k
    {
980
    
981
12.7k
    fTempBuffer [threadIndex] . Reset (allocator->Allocate (tempBufferSize));
982
    
983
12.7k
    }
984
985
12.8k
  }
986
              
987
/*****************************************************************************/
988
989
void dng_render_task::ProcessArea (uint32 threadIndex,
990
                   dng_pixel_buffer &srcBuffer,
991
                   dng_pixel_buffer &dstBuffer)
992
699k
  {
993
  
994
699k
  dng_rect srcArea = srcBuffer.fArea;
995
699k
  dng_rect dstArea = dstBuffer.fArea;
996
  
997
699k
  uint32 srcCols = srcArea.W ();
998
  
999
699k
  real32 *tPtrR = fTempBuffer [threadIndex]->Buffer_real32 ();
1000
  
1001
699k
  real32 *tPtrG = tPtrR + srcCols;
1002
699k
  real32 *tPtrB = tPtrG + srcCols;
1003
  
1004
46.0M
  for (int32 srcRow = srcArea.t; srcRow < srcArea.b; srcRow++)
1005
45.3M
    {
1006
    
1007
    // First convert from camera native space to linear PhotoRGB,
1008
    // applying the white balance and camera profile.
1009
    
1010
45.3M
      {
1011
    
1012
45.3M
      const real32 *sPtrA = (const real32 *)
1013
45.3M
                  srcBuffer.ConstPixel (srcRow,
1014
45.3M
                              srcArea.l,
1015
45.3M
                              0);
1016
                             
1017
45.3M
      if (fSrcPlanes == 1)
1018
44.5M
        {
1019
        
1020
        // For monochrome cameras, this just requires copying
1021
        // the data into all three color channels.
1022
        
1023
44.5M
        DoCopyBytes (sPtrA, tPtrR, srcCols * (uint32) sizeof (real32));
1024
44.5M
        DoCopyBytes (sPtrA, tPtrG, srcCols * (uint32) sizeof (real32));
1025
44.5M
        DoCopyBytes (sPtrA, tPtrB, srcCols * (uint32) sizeof (real32));
1026
        
1027
44.5M
        }
1028
        
1029
867k
      else
1030
867k
        {
1031
        
1032
867k
        const real32 *sPtrB = sPtrA + srcBuffer.fPlaneStep;
1033
867k
        const real32 *sPtrC = sPtrB + srcBuffer.fPlaneStep;
1034
        
1035
867k
        if (fSrcPlanes == 3)
1036
638k
          {
1037
          
1038
638k
          DoBaselineABCtoRGB (sPtrA,
1039
638k
                      sPtrB,
1040
638k
                      sPtrC,
1041
638k
                      tPtrR,
1042
638k
                      tPtrG,
1043
638k
                      tPtrB,
1044
638k
                      srcCols,
1045
638k
                      fCameraWhite,
1046
638k
                      fCameraToRGB);
1047
          
1048
638k
          }
1049
          
1050
229k
        else
1051
229k
          {
1052
          
1053
229k
          const real32 *sPtrD = sPtrC + srcBuffer.fPlaneStep;
1054
        
1055
229k
          DoBaselineABCDtoRGB (sPtrA,
1056
229k
                       sPtrB,
1057
229k
                       sPtrC,
1058
229k
                       sPtrD,
1059
229k
                       tPtrR,
1060
229k
                       tPtrG,
1061
229k
                       tPtrB,
1062
229k
                       srcCols,
1063
229k
                       fCameraWhite,
1064
229k
                       fCameraToRGB);
1065
          
1066
229k
          }
1067
          
1068
        // Apply Hue/Sat map, if any.
1069
        
1070
867k
        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
867k
        }
1087
        
1088
45.3M
      }
1089
      
1090
    // Apply exposure curve.
1091
    
1092
45.3M
    DoBaseline1DTable (tPtrR,
1093
45.3M
               tPtrR,
1094
45.3M
               srcCols,
1095
45.3M
               fExposureRamp);
1096
                
1097
45.3M
    DoBaseline1DTable (tPtrG,
1098
45.3M
               tPtrG,
1099
45.3M
               srcCols,
1100
45.3M
               fExposureRamp);
1101
                
1102
45.3M
    DoBaseline1DTable (tPtrB,
1103
45.3M
               tPtrB,
1104
45.3M
               srcCols,
1105
45.3M
               fExposureRamp);
1106
    
1107
    // Apply look table, if any.
1108
    
1109
45.3M
    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
45.3M
    DoBaselineRGBTone (tPtrR,
1128
45.3M
                 tPtrG,
1129
45.3M
               tPtrB,
1130
45.3M
               tPtrR,
1131
45.3M
                 tPtrG,
1132
45.3M
               tPtrB,
1133
45.3M
               srcCols,
1134
45.3M
               fToneCurve);
1135
               
1136
    // Convert to final color space.
1137
    
1138
45.3M
    int32 dstRow = srcRow + (dstArea.t - srcArea.t);
1139
    
1140
45.3M
    if (fDstPlanes == 1)
1141
7.29M
      {
1142
      
1143
7.29M
      real32 *dPtrG = dstBuffer.DirtyPixel_real32 (dstRow,
1144
7.29M
                             dstArea.l,
1145
7.29M
                             0);
1146
1147
7.29M
      DoBaselineRGBtoGray (tPtrR,
1148
7.29M
                 tPtrG,
1149
7.29M
                 tPtrB,
1150
7.29M
                 dPtrG,
1151
7.29M
                 srcCols,
1152
7.29M
                 fRGBtoFinal);
1153
      
1154
7.29M
      DoBaseline1DTable (dPtrG,
1155
7.29M
                 dPtrG,
1156
7.29M
                 srcCols,
1157
7.29M
                 fEncodeGamma);
1158
                
1159
7.29M
      }
1160
    
1161
38.0M
    else
1162
38.0M
      {
1163
      
1164
38.0M
      real32 *dPtrR = dstBuffer.DirtyPixel_real32 (dstRow,
1165
38.0M
                             dstArea.l,
1166
38.0M
                             0);
1167
    
1168
38.0M
      real32 *dPtrG = dPtrR + dstBuffer.fPlaneStep;
1169
38.0M
      real32 *dPtrB = dPtrG + dstBuffer.fPlaneStep;
1170
      
1171
38.0M
      DoBaselineRGBtoRGB (tPtrR,
1172
38.0M
                tPtrG,
1173
38.0M
                tPtrB,
1174
38.0M
                dPtrR,
1175
38.0M
                dPtrG,
1176
38.0M
                dPtrB,
1177
38.0M
                srcCols,
1178
38.0M
                fRGBtoFinal);
1179
                
1180
38.0M
      DoBaseline1DTable (dPtrR,
1181
38.0M
                 dPtrR,
1182
38.0M
                 srcCols,
1183
38.0M
                 fEncodeGamma);
1184
                
1185
38.0M
      DoBaseline1DTable (dPtrG,
1186
38.0M
                 dPtrG,
1187
38.0M
                 srcCols,
1188
38.0M
                 fEncodeGamma);
1189
                
1190
38.0M
      DoBaseline1DTable (dPtrB,
1191
38.0M
                 dPtrB,
1192
38.0M
                 srcCols,
1193
38.0M
                 fEncodeGamma);
1194
                 
1195
38.0M
      }
1196
    
1197
45.3M
    }
1198
  
1199
699k
  }
1200
    
1201
/*****************************************************************************/
1202
1203
dng_render::dng_render (dng_host &host,
1204
            const dng_negative &negative)
1205
1206
13.4k
  : fHost     (host)
1207
13.4k
  , fNegative   (negative)
1208
  
1209
13.4k
  , fWhiteXY    ()
1210
  
1211
13.4k
  , fExposure   (0.0)
1212
13.4k
  , fShadows    (5.0)
1213
  
1214
13.4k
  , fToneCurve    (&dng_tone_curve_acr3_default::Get ())
1215
  
1216
13.4k
  , fFinalSpace   (&dng_space_sRGB::Get ())
1217
13.4k
  , fFinalPixelType (ttByte)
1218
  
1219
13.4k
  , fMaximumSize  (0)
1220
  
1221
13.4k
  , fProfileToneCurve ()
1222
  
1223
13.4k
  {
1224
  
1225
  // Switch to NOP default parameters for non-scene referred data.
1226
  
1227
13.4k
  if (fNegative.ColorimetricReference () != crSceneReferred)
1228
321
    {
1229
    
1230
321
    fShadows = 0.0;
1231
    
1232
321
    fToneCurve = &dng_1d_identity::Get ();
1233
    
1234
321
    }
1235
    
1236
  // Use default tone curve from profile if any.
1237
  
1238
13.4k
  const dng_camera_profile *profile = fNegative.ProfileByID (dng_camera_profile_id ());
1239
  
1240
13.4k
  if (profile && profile->ToneCurve ().IsValid ())
1241
52
    {
1242
    
1243
52
    fProfileToneCurve.Reset (new dng_spline_solver);
1244
    
1245
52
    profile->ToneCurve ().Solve (*fProfileToneCurve.Get ());
1246
    
1247
52
    fToneCurve = fProfileToneCurve.Get ();
1248
    
1249
52
    }
1250
1251
  // Turn off default shadow mapping if requested by profile.
1252
1253
13.4k
  if (profile && (profile->DefaultBlackRender () == defaultBlackRender_None))
1254
17
    {
1255
    
1256
17
    fShadows = 0.0;
1257
    
1258
17
    }
1259
  
1260
13.4k
  }
1261
1262
/*****************************************************************************/
1263
1264
dng_image * dng_render::Render ()
1265
13.4k
  {
1266
  
1267
13.4k
  const dng_image *srcImage = fNegative.Stage3Image ();
1268
  
1269
13.4k
  dng_rect srcBounds = fNegative.DefaultCropArea ();
1270
  
1271
13.4k
  dng_point dstSize;
1272
  
1273
13.4k
  dstSize.h = fNegative.DefaultFinalWidth  ();
1274
13.4k
  dstSize.v = fNegative.DefaultFinalHeight ();
1275
                   
1276
13.4k
  if (MaximumSize ())
1277
9.42k
    {
1278
    
1279
9.42k
    if (Max_uint32 (dstSize.h, dstSize.v) > MaximumSize ())
1280
4.26k
      {
1281
      
1282
4.26k
      real64 ratio = fNegative.AspectRatio ();
1283
      
1284
4.26k
      if (ratio >= 1.0)
1285
2.16k
        {
1286
2.16k
        dstSize.h = MaximumSize ();
1287
2.16k
        dstSize.v = Max_uint32 (1, Round_uint32 (dstSize.h / ratio));
1288
2.16k
        }
1289
        
1290
2.09k
      else
1291
2.09k
        {
1292
2.09k
        dstSize.v = MaximumSize ();
1293
2.09k
        dstSize.h = Max_uint32 (1, Round_uint32 (dstSize.v * ratio));
1294
2.09k
        }
1295
      
1296
4.26k
      }
1297
    
1298
9.42k
    }
1299
    
1300
13.4k
  AutoPtr<dng_image> tempImage;
1301
  
1302
13.4k
  if (srcBounds.Size () != dstSize)
1303
5.27k
    {
1304
1305
5.27k
    tempImage.Reset (fHost.Make_dng_image (dstSize,
1306
5.27k
                         srcImage->Planes    (),
1307
5.27k
                         srcImage->PixelType ()));
1308
                       
1309
5.27k
    ResampleImage (fHost,
1310
5.27k
             *srcImage,
1311
5.27k
             *tempImage.Get (),
1312
5.27k
             srcBounds,
1313
5.27k
             tempImage->Bounds (),
1314
5.27k
             dng_resample_bicubic::Get ());
1315
               
1316
5.27k
    srcImage = tempImage.Get ();
1317
    
1318
5.27k
    srcBounds = tempImage->Bounds ();
1319
    
1320
5.27k
    }
1321
  
1322
13.4k
  uint32 dstPlanes = FinalSpace ().IsMonochrome () ? 1 : 3;
1323
  
1324
13.4k
  AutoPtr<dng_image> dstImage (fHost.Make_dng_image (srcBounds.Size (),
1325
13.4k
                             dstPlanes,
1326
13.4k
                             FinalPixelType ()));
1327
                           
1328
13.4k
  dng_render_task task (*srcImage,
1329
13.4k
              *dstImage.Get (),
1330
13.4k
              fNegative,
1331
13.4k
              *this,
1332
13.4k
              srcBounds.TL ());
1333
              
1334
13.4k
  fHost.PerformAreaTask (task,
1335
13.4k
               dstImage->Bounds ());
1336
              
1337
13.4k
  return dstImage.Release ();
1338
  
1339
13.4k
  }
1340
1341
/*****************************************************************************/