Coverage Report

Created: 2021-08-22 09:07

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