Coverage Report

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