Coverage Report

Created: 2026-03-07 06:12

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