Coverage Report

Created: 2025-01-23 06:31

/src/dng_sdk/source/dng_host.cpp
Line
Count
Source (jump to first uncovered line)
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
131k
  : fAllocator  (allocator)
43
131k
  , fSniffer  (sniffer)
44
  
45
131k
  , fNeedsMeta      (true)
46
131k
  , fNeedsImage     (true)
47
131k
  , fForPreview     (false)
48
131k
  , fMinimumSize    (0)
49
131k
  , fPreferredSize      (0)
50
131k
  , fMaximumSize      (0)
51
131k
  , fCropFactor     (1.0)
52
131k
  , fSaveDNGVersion   (dngVersion_None)
53
131k
  , fSaveLinearDNG    (false)
54
131k
  , fKeepOriginalFile (false)
55
  
56
131k
  {
57
  
58
131k
  }
59
  
60
/*****************************************************************************/
61
62
dng_host::~dng_host ()
63
131k
  {
64
  
65
131k
  }
66
  
67
/*****************************************************************************/
68
69
dng_memory_allocator & dng_host::Allocator ()
70
545k
  {
71
  
72
545k
  if (fAllocator)
73
0
    {
74
    
75
0
    return *fAllocator;
76
    
77
0
    }
78
    
79
545k
  else
80
545k
    {
81
    
82
545k
    return gDefaultDNGMemoryAllocator;
83
    
84
545k
    }
85
  
86
545k
  }
87
88
/*****************************************************************************/
89
90
dng_memory_block * dng_host::Allocate (uint32 logicalSize)
91
202k
  {
92
  
93
202k
  return Allocator ().Allocate (logicalSize);
94
    
95
202k
  }
96
    
97
/*****************************************************************************/
98
99
void dng_host::SniffForAbort ()
100
1.69M
  {
101
  
102
1.69M
  dng_abort_sniffer::SniffForAbort (Sniffer ());
103
  
104
1.69M
  }
105
    
106
/*****************************************************************************/
107
108
void dng_host::ValidateSizes ()
109
126k
  {
110
  
111
  // The maximum size limits the other two sizes.
112
  
113
126k
  if (MaximumSize ())
114
4.23k
    {
115
4.23k
    SetMinimumSize   (Min_uint32 (MinimumSize   (), MaximumSize ()));
116
4.23k
    SetPreferredSize (Min_uint32 (PreferredSize (), MaximumSize ()));
117
4.23k
    }
118
    
119
  // If we have a preferred size, it limits the minimum size.
120
  
121
126k
  if (PreferredSize ())
122
4.27k
    {
123
4.27k
    SetMinimumSize (Min_uint32 (MinimumSize (), PreferredSize ()));
124
4.27k
    }
125
    
126
  // Else find default value for preferred size.
127
  
128
121k
  else
129
121k
    {
130
    
131
    // If preferred size is zero, then we want the maximim
132
    // size image.
133
    
134
121k
    if (MaximumSize ())
135
532
      {
136
532
      SetPreferredSize (MaximumSize ());
137
532
      }
138
    
139
121k
    }
140
    
141
  // If we don't have a minimum size, find default.
142
  
143
126k
  if (!MinimumSize ())
144
121k
    {
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
121k
    if (PreferredSize () >= 160 && PreferredSize () <= 256)
151
23
      {
152
23
      SetMinimumSize (160);
153
23
      }
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
121k
    else if (PreferredSize () >= 490 && PreferredSize () <= 512)
161
9
      {
162
9
      SetMinimumSize (490);
163
9
      }
164
165
121k
    else if (PreferredSize () >= 980 && PreferredSize () <= 1024)
166
5
      {
167
5
      SetMinimumSize (980);
168
5
      }
169
170
121k
    else if (PreferredSize () >= 1470 && PreferredSize () <= 1536)
171
1
      {
172
1
      SetMinimumSize (1470);
173
1
      }
174
175
121k
    else if (PreferredSize () >= 1960 && PreferredSize () <= 2048)
176
2
      {
177
2
      SetMinimumSize (1960);
178
2
      }
179
180
    // Else minimum size is same as preferred size.
181
      
182
121k
    else
183
121k
      {
184
121k
      SetMinimumSize (PreferredSize ());
185
121k
      }
186
      
187
121k
    }
188
  
189
126k
  }
190
191
/*****************************************************************************/
192
193
uint32 dng_host::SaveDNGVersion () const
194
119k
  {
195
196
119k
  return fSaveDNGVersion;
197
198
119k
  }
199
200
/*****************************************************************************/
201
202
bool dng_host::SaveLinearDNG (const dng_negative & /* negative */) const
203
16.9k
  {
204
205
16.9k
  return fSaveLinearDNG;
206
207
16.9k
  }
208
209
/*****************************************************************************/
210
211
bool dng_host::IsTransientError (dng_error_code code)
212
14.7k
  {
213
  
214
14.7k
  switch (code)
215
14.7k
    {
216
    
217
2
    case dng_error_memory:
218
2
    case dng_error_user_canceled:
219
2
      {
220
2
      return true;
221
2
      }
222
      
223
14.7k
    default:
224
14.7k
      break;
225
      
226
14.7k
    }
227
    
228
14.7k
  return false;
229
  
230
14.7k
  }
231
    
232
/*****************************************************************************/
233
234
void dng_host::PerformAreaTask (dng_area_task &task,
235
                const dng_rect &area)
236
61.1k
  {
237
  
238
61.1k
  dng_area_task::Perform (task,
239
61.1k
              area,
240
61.1k
              &Allocator (),
241
61.1k
              Sniffer ());
242
  
243
61.1k
  }
244
    
245
/*****************************************************************************/
246
247
uint32 dng_host::PerformAreaTaskThreads ()
248
16.3k
  {
249
  
250
16.3k
  return 1;
251
  
252
16.3k
  }
253
254
/*****************************************************************************/
255
256
dng_exif * dng_host::Make_dng_exif ()
257
174k
  {
258
  
259
174k
  dng_exif *result = new dng_exif ();
260
  
261
174k
  if (!result)
262
0
    {
263
    
264
0
    ThrowMemoryFull ();
265
266
0
    }
267
  
268
174k
  return result;
269
  
270
174k
  }
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
129k
  {
298
  
299
129k
  dng_shared *result = new dng_shared ();
300
  
301
129k
  if (!result)
302
0
    {
303
    
304
0
    ThrowMemoryFull ();
305
306
0
    }
307
  
308
129k
  return result;
309
  
310
129k
  }
311
312
/*****************************************************************************/
313
314
dng_ifd * dng_host::Make_dng_ifd ()
315
384k
  {
316
  
317
384k
  dng_ifd *result = new dng_ifd ();
318
  
319
384k
  if (!result)
320
0
    {
321
    
322
0
    ThrowMemoryFull ();
323
324
0
    }
325
  
326
384k
  return result;
327
  
328
384k
  }
329
330
/*****************************************************************************/
331
332
dng_negative * dng_host::Make_dng_negative ()
333
44.9k
  {
334
  
335
44.9k
  return dng_negative::Make (*this);
336
  
337
44.9k
  }
338
339
/*****************************************************************************/
340
341
dng_image * dng_host::Make_dng_image (const dng_rect &bounds,
342
                    uint32 planes,
343
                    uint32 pixelType)
344
74.7k
  {
345
  
346
74.7k
  dng_image *result = new dng_simple_image (bounds,
347
74.7k
                        planes,
348
74.7k
                        pixelType,
349
74.7k
                        Allocator ());
350
  
351
74.7k
  if (!result)
352
0
    {
353
    
354
0
    ThrowMemoryFull ();
355
356
0
    }
357
  
358
74.7k
  return result;
359
  
360
74.7k
  }
361
    
362
/*****************************************************************************/
363
364
dng_opcode * dng_host::Make_dng_opcode (uint32 opcodeID,
365
                    dng_stream &stream)
366
47.0k
  {
367
  
368
47.0k
  dng_opcode *result = NULL;
369
  
370
47.0k
  switch (opcodeID)
371
47.0k
    {
372
    
373
191
    case dngOpcode_WarpRectilinear:
374
191
      {
375
      
376
191
      result = new dng_opcode_WarpRectilinear (stream);
377
      
378
191
      break;
379
      
380
0
      }
381
      
382
91
    case dngOpcode_WarpFisheye:
383
91
      {
384
      
385
91
      result = new dng_opcode_WarpFisheye (stream);
386
      
387
91
      break;
388
      
389
0
      }
390
      
391
51
    case dngOpcode_FixVignetteRadial:
392
51
      {
393
      
394
51
      result = new dng_opcode_FixVignetteRadial (stream);
395
      
396
51
      break;
397
      
398
0
      }
399
      
400
43
    case dngOpcode_FixBadPixelsConstant:
401
43
      {
402
      
403
43
      result = new dng_opcode_FixBadPixelsConstant (stream);
404
      
405
43
      break;
406
      
407
0
      }
408
      
409
742
    case dngOpcode_FixBadPixelsList:
410
742
      {
411
      
412
742
      result = new dng_opcode_FixBadPixelsList (stream);
413
      
414
742
      break;
415
      
416
0
      }
417
418
111
    case dngOpcode_TrimBounds:
419
111
      {
420
      
421
111
      result = new dng_opcode_TrimBounds (stream);
422
      
423
111
      break;
424
      
425
0
      }
426
      
427
174
    case dngOpcode_MapTable:
428
174
      {
429
      
430
174
      result = new dng_opcode_MapTable (*this,
431
174
                        stream);
432
      
433
174
      break;
434
      
435
0
      }
436
437
1.67k
    case dngOpcode_MapPolynomial:
438
1.67k
      {
439
      
440
1.67k
      result = new dng_opcode_MapPolynomial (stream);
441
      
442
1.67k
      break;
443
      
444
0
      }
445
446
1.01k
    case dngOpcode_GainMap:
447
1.01k
      {
448
      
449
1.01k
      result = new dng_opcode_GainMap (*this,
450
1.01k
                       stream);
451
      
452
1.01k
      break;
453
      
454
0
      }
455
      
456
117
    case dngOpcode_DeltaPerRow:
457
117
      {
458
      
459
117
      result = new dng_opcode_DeltaPerRow (*this,
460
117
                           stream);
461
      
462
117
      break;
463
      
464
0
      }
465
      
466
98
    case dngOpcode_DeltaPerColumn:
467
98
      {
468
      
469
98
      result = new dng_opcode_DeltaPerColumn (*this,
470
98
                              stream);
471
      
472
98
      break;
473
      
474
0
      }
475
      
476
83
    case dngOpcode_ScalePerRow:
477
83
      {
478
      
479
83
      result = new dng_opcode_ScalePerRow (*this,
480
83
                           stream);
481
      
482
83
      break;
483
      
484
0
      }
485
      
486
103
    case dngOpcode_ScalePerColumn:
487
103
      {
488
      
489
103
      result = new dng_opcode_ScalePerColumn (*this,
490
103
                              stream);
491
      
492
103
      break;
493
      
494
0
      }
495
      
496
42.5k
    default:
497
42.5k
      {
498
      
499
42.5k
      result = new dng_opcode_Unknown (*this,
500
42.5k
                       opcodeID,
501
42.5k
                       stream);
502
      
503
42.5k
      }
504
    
505
47.0k
    }
506
507
43.8k
  if (!result)
508
0
    {
509
    
510
0
    ThrowMemoryFull ();
511
512
0
    }
513
  
514
43.8k
  return result;
515
  
516
47.0k
  }
517
    
518
/*****************************************************************************/
519
520
void dng_host::ApplyOpcodeList (dng_opcode_list &list,
521
                dng_negative &negative,
522
                AutoPtr<dng_image> &image)
523
58.1k
  {
524
  
525
58.1k
  list.Apply (*this,
526
58.1k
        negative,
527
58.1k
        image);
528
  
529
58.1k
  }
530
    
531
/*****************************************************************************/
532
533
void dng_host::ResampleImage (const dng_image &srcImage,
534
                dng_image &dstImage)
535
4.12k
  {
536
  
537
4.12k
  ::ResampleImage (*this,
538
4.12k
           srcImage,
539
4.12k
           dstImage,
540
4.12k
           srcImage.Bounds (),
541
4.12k
           dstImage.Bounds (),
542
4.12k
           dng_resample_bicubic::Get ());
543
  
544
4.12k
  }
545
546
/*****************************************************************************/