Coverage Report

Created: 2026-07-25 06:54

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