Coverage Report

Created: 2026-07-25 06:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dng_sdk/source/dng_host.cpp
Line
Count
Source
1
/*****************************************************************************/
2
// Copyright 2006-2012 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_host.cpp#2 $ */ 
10
/* $DateTime: 2012/06/14 20:24:41 $ */
11
/* $Change: 835078 $ */
12
/* $Author: tknoll $ */
13
14
/*****************************************************************************/
15
16
#include "dng_host.h"
17
18
#include "dng_abort_sniffer.h"
19
#include "dng_area_task.h"
20
#include "dng_bad_pixels.h"
21
#include "dng_exceptions.h"
22
#include "dng_exif.h"
23
#include "dng_gain_map.h"
24
#include "dng_ifd.h"
25
#include "dng_lens_correction.h"
26
#include "dng_memory.h"
27
#include "dng_misc_opcodes.h"
28
#include "dng_negative.h"
29
#include "dng_resample.h"
30
#include "dng_shared.h"
31
#include "dng_simple_image.h"
32
33
#if qDNGUseXMP
34
#include "dng_xmp.h"
35
#endif
36
37
/*****************************************************************************/
38
39
dng_host::dng_host (dng_memory_allocator *allocator,
40
          dng_abort_sniffer *sniffer)
41
42
111k
  : fAllocator  (allocator)
43
111k
  , fSniffer  (sniffer)
44
  
45
111k
  , fNeedsMeta      (true)
46
111k
  , fNeedsImage     (true)
47
111k
  , fForPreview     (false)
48
111k
  , fMinimumSize    (0)
49
111k
  , fPreferredSize      (0)
50
111k
  , fMaximumSize      (0)
51
111k
  , fCropFactor     (1.0)
52
111k
  , fSaveDNGVersion   (dngVersion_None)
53
111k
  , fSaveLinearDNG    (false)
54
111k
  , fKeepOriginalFile (false)
55
  
56
111k
  {
57
  
58
111k
  }
59
  
60
/*****************************************************************************/
61
62
dng_host::~dng_host ()
63
111k
  {
64
  
65
111k
  }
66
  
67
/*****************************************************************************/
68
69
dng_memory_allocator & dng_host::Allocator ()
70
636k
  {
71
  
72
636k
  if (fAllocator)
73
0
    {
74
    
75
0
    return *fAllocator;
76
    
77
0
    }
78
    
79
636k
  else
80
636k
    {
81
    
82
636k
    return gDefaultDNGMemoryAllocator;
83
    
84
636k
    }
85
  
86
636k
  }
87
88
/*****************************************************************************/
89
90
dng_memory_block * dng_host::Allocate (uint32 logicalSize)
91
244k
  {
92
  
93
244k
  return Allocator ().Allocate (logicalSize);
94
    
95
244k
  }
96
    
97
/*****************************************************************************/
98
99
void dng_host::SniffForAbort ()
100
1.12M
  {
101
  
102
1.12M
  dng_abort_sniffer::SniffForAbort (Sniffer ());
103
  
104
1.12M
  }
105
    
106
/*****************************************************************************/
107
108
void dng_host::ValidateSizes ()
109
110k
  {
110
  
111
  // The maximum size limits the other two sizes.
112
  
113
110k
  if (MaximumSize ())
114
7.64k
    {
115
7.64k
    SetMinimumSize   (Min_uint32 (MinimumSize   (), MaximumSize ()));
116
7.64k
    SetPreferredSize (Min_uint32 (PreferredSize (), MaximumSize ()));
117
7.64k
    }
118
    
119
  // If we have a preferred size, it limits the minimum size.
120
  
121
110k
  if (PreferredSize ())
122
7.60k
    {
123
7.60k
    SetMinimumSize (Min_uint32 (MinimumSize (), PreferredSize ()));
124
7.60k
    }
125
    
126
  // Else find default value for preferred size.
127
  
128
102k
  else
129
102k
    {
130
    
131
    // If preferred size is zero, then we want the maximim
132
    // size image.
133
    
134
102k
    if (MaximumSize ())
135
734
      {
136
734
      SetPreferredSize (MaximumSize ());
137
734
      }
138
    
139
102k
    }
140
    
141
  // If we don't have a minimum size, find default.
142
  
143
110k
  if (!MinimumSize ())
144
102k
    {
145
  
146
    // A common size for embedded thumbnails is 120 by 160 pixels,
147
    // So allow 120 by 160 pixels to be used for thumbnails when the
148
    // preferred size is 256 pixel.
149
    
150
102k
    if (PreferredSize () >= 160 && PreferredSize () <= 256)
151
78
      {
152
78
      SetMinimumSize (160);
153
78
      }
154
      
155
    // Many sensors are near a multiple of 1024 pixels in size, but after
156
    // the default crop, they are a just under.  We can get an extra factor
157
    // of size reduction if we allow a slight undershoot in the final size
158
    // when computing large previews.
159
    
160
102k
    else if (PreferredSize () >= 490 && PreferredSize () <= 512)
161
12
      {
162
12
      SetMinimumSize (490);
163
12
      }
164
165
102k
    else if (PreferredSize () >= 980 && PreferredSize () <= 1024)
166
14
      {
167
14
      SetMinimumSize (980);
168
14
      }
169
170
102k
    else if (PreferredSize () >= 1470 && PreferredSize () <= 1536)
171
3
      {
172
3
      SetMinimumSize (1470);
173
3
      }
174
175
102k
    else if (PreferredSize () >= 1960 && PreferredSize () <= 2048)
176
6
      {
177
6
      SetMinimumSize (1960);
178
6
      }
179
180
    // Else minimum size is same as preferred size.
181
      
182
102k
    else
183
102k
      {
184
102k
      SetMinimumSize (PreferredSize ());
185
102k
      }
186
      
187
102k
    }
188
  
189
110k
  }
190
191
/*****************************************************************************/
192
193
uint32 dng_host::SaveDNGVersion () const
194
133k
  {
195
196
133k
  return fSaveDNGVersion;
197
198
133k
  }
199
200
/*****************************************************************************/
201
202
bool dng_host::SaveLinearDNG (const dng_negative & /* negative */) const
203
17.6k
  {
204
205
17.6k
  return fSaveLinearDNG;
206
207
17.6k
  }
208
209
/*****************************************************************************/
210
211
bool dng_host::IsTransientError (dng_error_code code)
212
28.2k
  {
213
  
214
28.2k
  switch (code)
215
28.2k
    {
216
    
217
14
    case dng_error_memory:
218
14
    case dng_error_user_canceled:
219
14
      {
220
14
      return true;
221
14
      }
222
      
223
28.2k
    default:
224
28.2k
      break;
225
      
226
28.2k
    }
227
    
228
28.2k
  return false;
229
  
230
28.2k
  }
231
    
232
/*****************************************************************************/
233
234
void dng_host::PerformAreaTask (dng_area_task &task,
235
                const dng_rect &area)
236
72.1k
  {
237
  
238
72.1k
  dng_area_task::Perform (task,
239
72.1k
              area,
240
72.1k
              &Allocator (),
241
72.1k
              Sniffer ());
242
  
243
72.1k
  }
244
    
245
/*****************************************************************************/
246
247
uint32 dng_host::PerformAreaTaskThreads ()
248
16.9k
  {
249
  
250
16.9k
  return 1;
251
  
252
16.9k
  }
253
254
/*****************************************************************************/
255
256
dng_exif * dng_host::Make_dng_exif ()
257
161k
  {
258
  
259
161k
  dng_exif *result = new dng_exif ();
260
  
261
161k
  if (!result)
262
0
    {
263
    
264
0
    ThrowMemoryFull ();
265
266
0
    }
267
  
268
161k
  return result;
269
  
270
161k
  }
271
272
/*****************************************************************************/
273
274
#if qDNGUseXMP
275
276
dng_xmp * dng_host::Make_dng_xmp ()
277
  {
278
    
279
  dng_xmp *result = new dng_xmp (Allocator ());
280
  
281
  if (!result)
282
    {
283
    
284
    ThrowMemoryFull ();
285
    
286
    }
287
  
288
  return result;
289
  
290
  }
291
292
#endif
293
294
/*****************************************************************************/
295
296
dng_shared * dng_host::Make_dng_shared ()
297
110k
  {
298
  
299
110k
  dng_shared *result = new dng_shared ();
300
  
301
110k
  if (!result)
302
0
    {
303
    
304
0
    ThrowMemoryFull ();
305
306
0
    }
307
  
308
110k
  return result;
309
  
310
110k
  }
311
312
/*****************************************************************************/
313
314
dng_ifd * dng_host::Make_dng_ifd ()
315
312k
  {
316
  
317
312k
  dng_ifd *result = new dng_ifd ();
318
  
319
312k
  if (!result)
320
0
    {
321
    
322
0
    ThrowMemoryFull ();
323
324
0
    }
325
  
326
312k
  return result;
327
  
328
312k
  }
329
330
/*****************************************************************************/
331
332
dng_negative * dng_host::Make_dng_negative ()
333
51.2k
  {
334
  
335
51.2k
  return dng_negative::Make (*this);
336
  
337
51.2k
  }
338
339
/*****************************************************************************/
340
341
dng_image * dng_host::Make_dng_image (const dng_rect &bounds,
342
                    uint32 planes,
343
                    uint32 pixelType)
344
90.2k
  {
345
  
346
90.2k
  dng_image *result = new dng_simple_image (bounds,
347
90.2k
                        planes,
348
90.2k
                        pixelType,
349
90.2k
                        Allocator ());
350
  
351
90.2k
  if (!result)
352
0
    {
353
    
354
0
    ThrowMemoryFull ();
355
356
0
    }
357
  
358
90.2k
  return result;
359
  
360
90.2k
  }
361
    
362
/*****************************************************************************/
363
364
dng_opcode * dng_host::Make_dng_opcode (uint32 opcodeID,
365
                    dng_stream &stream)
366
215k
  {
367
  
368
215k
  dng_opcode *result = NULL;
369
  
370
215k
  switch (opcodeID)
371
215k
    {
372
    
373
473
    case dngOpcode_WarpRectilinear:
374
473
      {
375
      
376
473
      result = new dng_opcode_WarpRectilinear (stream);
377
      
378
473
      break;
379
      
380
0
      }
381
      
382
496
    case dngOpcode_WarpFisheye:
383
496
      {
384
      
385
496
      result = new dng_opcode_WarpFisheye (stream);
386
      
387
496
      break;
388
      
389
0
      }
390
      
391
547
    case dngOpcode_FixVignetteRadial:
392
547
      {
393
      
394
547
      result = new dng_opcode_FixVignetteRadial (stream);
395
      
396
547
      break;
397
      
398
0
      }
399
      
400
169
    case dngOpcode_FixBadPixelsConstant:
401
169
      {
402
      
403
169
      result = new dng_opcode_FixBadPixelsConstant (stream);
404
      
405
169
      break;
406
      
407
0
      }
408
      
409
6.56k
    case dngOpcode_FixBadPixelsList:
410
6.56k
      {
411
      
412
6.56k
      result = new dng_opcode_FixBadPixelsList (stream);
413
      
414
6.56k
      break;
415
      
416
0
      }
417
418
363
    case dngOpcode_TrimBounds:
419
363
      {
420
      
421
363
      result = new dng_opcode_TrimBounds (stream);
422
      
423
363
      break;
424
      
425
0
      }
426
      
427
203
    case dngOpcode_MapTable:
428
203
      {
429
      
430
203
      result = new dng_opcode_MapTable (*this,
431
203
                        stream);
432
      
433
203
      break;
434
      
435
0
      }
436
437
2.21k
    case dngOpcode_MapPolynomial:
438
2.21k
      {
439
      
440
2.21k
      result = new dng_opcode_MapPolynomial (stream);
441
      
442
2.21k
      break;
443
      
444
0
      }
445
446
750
    case dngOpcode_GainMap:
447
750
      {
448
      
449
750
      result = new dng_opcode_GainMap (*this,
450
750
                       stream);
451
      
452
750
      break;
453
      
454
0
      }
455
      
456
178
    case dngOpcode_DeltaPerRow:
457
178
      {
458
      
459
178
      result = new dng_opcode_DeltaPerRow (*this,
460
178
                           stream);
461
      
462
178
      break;
463
      
464
0
      }
465
      
466
263
    case dngOpcode_DeltaPerColumn:
467
263
      {
468
      
469
263
      result = new dng_opcode_DeltaPerColumn (*this,
470
263
                              stream);
471
      
472
263
      break;
473
      
474
0
      }
475
      
476
228
    case dngOpcode_ScalePerRow:
477
228
      {
478
      
479
228
      result = new dng_opcode_ScalePerRow (*this,
480
228
                           stream);
481
      
482
228
      break;
483
      
484
0
      }
485
      
486
280
    case dngOpcode_ScalePerColumn:
487
280
      {
488
      
489
280
      result = new dng_opcode_ScalePerColumn (*this,
490
280
                              stream);
491
      
492
280
      break;
493
      
494
0
      }
495
      
496
202k
    default:
497
202k
      {
498
      
499
202k
      result = new dng_opcode_Unknown (*this,
500
202k
                       opcodeID,
501
202k
                       stream);
502
      
503
202k
      }
504
    
505
215k
    }
506
507
210k
  if (!result)
508
0
    {
509
    
510
0
    ThrowMemoryFull ();
511
512
0
    }
513
  
514
210k
  return result;
515
  
516
215k
  }
517
    
518
/*****************************************************************************/
519
520
void dng_host::ApplyOpcodeList (dng_opcode_list &list,
521
                dng_negative &negative,
522
                AutoPtr<dng_image> &image)
523
63.1k
  {
524
  
525
63.1k
  list.Apply (*this,
526
63.1k
        negative,
527
63.1k
        image);
528
  
529
63.1k
  }
530
    
531
/*****************************************************************************/
532
533
void dng_host::ResampleImage (const dng_image &srcImage,
534
                dng_image &dstImage)
535
3.53k
  {
536
  
537
3.53k
  ::ResampleImage (*this,
538
3.53k
           srcImage,
539
3.53k
           dstImage,
540
3.53k
           srcImage.Bounds (),
541
3.53k
           dstImage.Bounds (),
542
3.53k
           dng_resample_bicubic::Get ());
543
  
544
3.53k
  }
545
546
/*****************************************************************************/