Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/dng_sdk/source/dng_host.h
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.h#2 $ */ 
10
/* $DateTime: 2012/06/14 20:24:41 $ */
11
/* $Change: 835078 $ */
12
/* $Author: tknoll $ */
13
14
/** \file
15
 * Class definition for dng_host, initial point of contact and control between
16
 * host application and DNG SDK.
17
 */
18
19
/*****************************************************************************/
20
21
#ifndef __dng_host__
22
#define __dng_host__
23
24
/*****************************************************************************/
25
26
#include "dng_auto_ptr.h"
27
#include "dng_classes.h"
28
#include "dng_errors.h"
29
#include "dng_types.h"
30
31
/*****************************************************************************/
32
33
/// \brief The main class for communication between the application and the 
34
/// DNG SDK. Used to customize memory allocation and other behaviors.
35
///
36
/// dng_host allows setting parameters for the DNG conversion, mediates callback
37
/// style interactions between the host application and the DNG SDK, and allows
38
/// controlling certain internal behavior of the SDK such as memory allocation.
39
/// Many applications will be able to use the default implementation of dng_host
40
/// by just setting the dng_memory_allocator and dng_abort_sniffer in the 
41
/// constructor. More complex interactions will require deriving a class from
42
/// dng_host.
43
///
44
/// Multiple dng_host objects can be allocated in a single process. This may
45
/// be useful for DNG processing on separate threads. (Distinct dng_host objects
46
/// are completely threadsafe for read/write. The application is responsible for
47
/// establishing mutual exclusion for read/write access to a single dng_host 
48
/// object if it is used in multiple threads.)
49
50
class dng_host
51
  {
52
  
53
  private:
54
  
55
    dng_memory_allocator *fAllocator;
56
    
57
    dng_abort_sniffer *fSniffer;
58
  
59
    // Does the host require all the image metadata (vs. just checking
60
    // to see if the file is readable)?
61
  
62
    bool fNeedsMeta;
63
    
64
    // Does the host require actual image data (vs. just getting metadata
65
    // or just checking to see if the file is readable)?
66
    
67
    bool fNeedsImage;
68
    
69
    // If we need the image data, can it be read at preview quality?
70
    
71
    bool fForPreview;
72
    
73
    // If non-zero, the minimum size (longer of the two pixel dimensions)
74
    // image to read.  If zero, or if the full size image is smaller than
75
    // this, read the full size image.
76
    
77
    uint32 fMinimumSize;
78
    
79
    // What is the preferred size for a preview image?  This can
80
    // be slightly larger than the minimum size.  Zero if we want
81
    // the full resolution image.
82
    
83
    uint32 fPreferredSize;
84
    
85
    // What is the maximum size for a preview image?  Zero if there
86
    // is no maximum size limit.
87
    
88
    uint32 fMaximumSize;
89
    
90
    // The fraction of the image kept after a crop.  This is used to
91
    // adjust the sizes to take into account the cropping that
92
    // will be peformed.
93
    
94
    real64 fCropFactor;
95
    
96
    // What DNG version should we keep enough data to save?
97
    
98
    uint32 fSaveDNGVersion;
99
    
100
    // Do we want to force saving to a linear DNG?
101
    
102
    bool fSaveLinearDNG;
103
    
104
    // Keep the original raw file data block?
105
    
106
    bool fKeepOriginalFile;
107
  
108
  public:
109
  
110
    /// Allocate a dng_host object, possiblly with custom allocator and sniffer.
111
    /// \param allocator Allows controlling all memory allocation done via this
112
    /// dng_host. Defaults to singleton global dng_memory_allocator, which calls
113
    /// new/delete dng_malloc_block for appropriate size.
114
    /// \param sniffer Used to periodically check if pending DNG conversions 
115
    /// should be aborted and to communicate progress updates. Defaults to singleton
116
    /// global dng_abort_sniffer, which never aborts and ignores progress updated.
117
118
    dng_host (dng_memory_allocator *allocator = NULL,
119
          dng_abort_sniffer *sniffer = NULL);
120
    
121
    /// Clean up direct memory for dng_host. Memory allocator and abort sniffer 
122
    /// are not deleted. Objects such as dng_image and others returned from
123
    /// host can still be used after host is deleted.
124
125
    virtual ~dng_host ();
126
    
127
    /// Getter for host's memory allocator.
128
129
    dng_memory_allocator & Allocator ();
130
    
131
    /// Alocate a new dng_memory_block using the host's memory allocator.
132
    /// Uses the Allocator() property of host to allocate a new block of memory. 
133
    /// Will call ThrowMemoryFull if block cannot be allocated.
134
    /// \param logicalSize Number of usable bytes returned dng_memory_block
135
    /// must contain.
136
137
    virtual dng_memory_block * Allocate (uint32 logicalSize);
138
    
139
    /// Setter for host's abort sniffer.
140
    
141
    void SetSniffer (dng_abort_sniffer *sniffer)
142
0
      {
143
0
      fSniffer = sniffer;
144
0
      }
145
    
146
    /// Getter for host's abort sniffer.
147
148
    dng_abort_sniffer * Sniffer ()
149
0
      {
150
0
      return fSniffer;
151
0
      }
152
    
153
    /// Check for pending abort. Should call ThrowUserCanceled if an abort
154
    /// is pending.
155
156
    virtual void SniffForAbort ();
157
    
158
    /// Setter for flag determining whether all XMP metadata should be parsed. 
159
    /// Defaults to true. One might not want metadata when doing a quick check
160
    /// to see if a file is readable.
161
    /// \param needs If true, metadata is needed.
162
163
    void SetNeedsMeta (bool needs)
164
0
      {
165
0
      fNeedsMeta = needs;
166
0
      }
167
168
    /// Getter for flag determining whether all XMP metadata should be parsed. 
169
170
    bool NeedsMeta () const
171
0
      {
172
0
      return fNeedsMeta;
173
0
      }
174
175
    /// Setter for flag determining whether DNG image data is needed. Defaults 
176
    /// to true. Image data might not be needed for applications which only
177
    /// manipulate metadata.
178
    /// \param needs If true, image data is needed.
179
180
    void SetNeedsImage (bool needs)
181
0
      {
182
0
      fNeedsImage = needs;
183
0
      }
184
185
    /// Setter for flag determining whether DNG image data is needed. 
186
187
    bool NeedsImage () const
188
0
      {
189
0
      return fNeedsImage;
190
0
      }
191
192
    /// Setter for flag determining whether image should be preview quality, 
193
    /// or full quality. 
194
    /// \param preview If true, rendered images are for preview.
195
196
    void SetForPreview (bool preview)
197
0
      {
198
0
      fForPreview = preview;
199
0
      }
200
201
    /// Getter for flag determining whether image should be preview quality.
202
    /// Preview quality images may be rendered more quickly. Current DNG SDK
203
    /// does not change rendering behavior based on this flag, but derived
204
    /// versions may use this getter to choose between a slower more accurate path
205
    /// and a faster "good enough for preview" one. Data produce with ForPreview set
206
    /// to true should not be written back to a DNG file, except as a preview image. 
207
208
    bool ForPreview () const
209
0
      {
210
0
      return fForPreview;
211
0
      }
212
213
    /// Setter for the minimum preview size.
214
    /// \param size Minimum pixel size (long side of image).
215
    
216
    void SetMinimumSize (uint32 size)
217
7.07k
      {
218
7.07k
      fMinimumSize = size;
219
7.07k
      }
220
221
    /// Getter for the minimum preview size.
222
223
    uint32 MinimumSize () const
224
7.07k
      {
225
7.07k
      return fMinimumSize;
226
7.07k
      }
227
228
    /// Setter for the preferred preview size.
229
    /// \param size Preferred pixel size (long side of image).
230
    
231
    void SetPreferredSize (uint32 size)
232
0
      {
233
0
      fPreferredSize = size;
234
0
      }
235
    
236
    /// Getter for the preferred preview size.
237
238
    uint32 PreferredSize () const
239
49.5k
      {
240
49.5k
      return fPreferredSize;
241
49.5k
      }
242
      
243
    /// Setter for the maximum preview size.
244
    /// \param size Maximum pixel size (long side of image).
245
      
246
    void SetMaximumSize (uint32 size)
247
0
      {
248
0
      fMaximumSize = size;
249
0
      }
250
      
251
    /// Getter for the maximum preview size.
252
    
253
    uint32 MaximumSize () const
254
14.1k
      {
255
14.1k
      return fMaximumSize;
256
14.1k
      }
257
      
258
    /// Setter for the cropping factor.
259
    /// \param cropFactor Fraction of image to be used after crop.
260
    
261
    void SetCropFactor (real64 cropFactor)
262
0
      {
263
0
      fCropFactor = cropFactor;
264
0
      }
265
      
266
    /// Getter for the cropping factor.
267
    
268
    real64 CropFactor () const
269
0
      {
270
0
      return fCropFactor;
271
0
      }
272
      
273
    /// Makes sures minimum, preferred, and maximum sizes are reasonable.
274
      
275
    void ValidateSizes ();
276
            
277
    /// Setter for what version to save DNG file compatible with. 
278
    /// \param version What version to save DNG file compatible with.
279
280
    void SetSaveDNGVersion (uint32 version)
281
0
      {
282
0
      fSaveDNGVersion = version;
283
0
      }
284
      
285
    /// Getter for what version to save DNG file compatible with. 
286
287
    virtual uint32 SaveDNGVersion () const;
288
289
    /// Setter for flag determining whether to force saving a linear DNG file.  
290
    /// \param linear If true, we should force saving a linear DNG file.
291
292
    void SetSaveLinearDNG (bool linear)
293
0
      {
294
0
      fSaveLinearDNG = linear;
295
0
      }
296
      
297
    /// Getter for flag determining whether to save a linear DNG file.  
298
299
    virtual bool SaveLinearDNG (const dng_negative &negative) const;
300
      
301
    /// Setter for flag determining whether to keep original RAW file data. 
302
    /// \param keep If true, origianl RAW data will be kept.
303
304
    void SetKeepOriginalFile (bool keep)
305
0
      {
306
0
      fKeepOriginalFile = keep;
307
0
      }
308
309
    /// Getter for flag determining whether to keep original RAW file data. 
310
311
    bool KeepOriginalFile ()
312
0
      {
313
0
      return fKeepOriginalFile;
314
0
      }
315
316
    /// Determine if an error is the result of a temporary, but planned-for
317
    /// occurence such as user cancellation or memory exhaustion. This method is
318
    /// sometimes used to determine whether to try and continue processing a DNG
319
    /// file despite errors in the file format, etc. In such cases, processing will 
320
    /// be continued if IsTransientError returns false. This is so that user cancellation
321
    /// and memory exhaustion always terminate processing.
322
    /// \param code Error to test for transience.
323
324
    virtual bool IsTransientError (dng_error_code code);
325
326
    /// General top-level botttleneck for image processing tasks.
327
    /// Default implementation calls dng_area_task::PerformAreaTask method on 
328
    /// task. Can be overridden in derived classes to support multiprocessing, 
329
    /// for example.
330
    /// \param task Image processing task to perform on area.
331
    /// \param area Rectangle over which to perform image processing task.
332
333
    virtual void PerformAreaTask (dng_area_task &task,
334
                    const dng_rect &area);
335
                    
336
    /// How many multiprocessing threads does PerformAreaTask use?
337
    /// Default implementation always returns 1 since it is single threaded.
338
    
339
    virtual uint32 PerformAreaTaskThreads ();
340
341
    /// Factory method for dng_exif class. Can be used to customize allocation or 
342
    /// to ensure a derived class is used instead of dng_exif.
343
344
    virtual dng_exif * Make_dng_exif ();
345
346
    /// Factory method for dng_xmp class. Can be used to customize allocation or 
347
    /// to ensure a derived class is used instead of dng_xmp.
348
349
    #if qDNGUseXMP
350
    
351
    virtual dng_xmp * Make_dng_xmp ();
352
    
353
    #endif
354
355
    /// Factory method for dng_shared class. Can be used to customize allocation 
356
    /// or to ensure a derived class is used instead of dng_shared.
357
358
    virtual dng_shared * Make_dng_shared ();
359
360
    /// Factory method for dng_ifd class. Can be used to customize allocation or
361
    /// to ensure a derived class is used instead of dng_ifd.
362
363
    virtual dng_ifd * Make_dng_ifd ();
364
    
365
    /// Factory method for dng_negative class. Can be used to customize allocation
366
    /// or to ensure a derived class is used instead of dng_negative.
367
368
    virtual dng_negative * Make_dng_negative ();
369
    
370
    /// Factory method for dng_image class. Can be used to customize allocation
371
    /// or to ensure a derived class is used instead of dng_simple_image.
372
    
373
    virtual dng_image * Make_dng_image (const dng_rect &bounds,
374
                      uint32 planes,
375
                      uint32 pixelType);
376
                     
377
    /// Factory method for parsing dng_opcode based classs. Can be used to 
378
    /// override opcode implementations.
379
    
380
    virtual dng_opcode * Make_dng_opcode (uint32 opcodeID,
381
                        dng_stream &stream);
382
                        
383
    /// Factory method to apply a dng_opcode_list. Can be used to override
384
    /// opcode list applications.
385
    
386
    virtual void ApplyOpcodeList (dng_opcode_list &list,
387
                    dng_negative &negative,
388
                    AutoPtr<dng_image> &image);
389
                    
390
    /// Factory method to resample an image.  Can be used to override
391
    /// image method used to resample images.
392
    
393
    virtual void ResampleImage (const dng_image &srcImage,
394
                  dng_image &dstImage);
395
    
396
  private:
397
  
398
    // Hidden copy constructor and assignment operator.
399
  
400
    dng_host (const dng_host &host);
401
    
402
    dng_host & operator= (const dng_host &host);
403
    
404
  };
405
  
406
/*****************************************************************************/
407
408
#endif
409
  
410
/*****************************************************************************/