Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/dng_sdk/source/dng_opcodes.h
Line
Count
Source (jump to first uncovered line)
1
/*****************************************************************************/
2
// Copyright 2008 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_opcodes.h#2 $ */ 
10
/* $DateTime: 2012/08/02 06:09:06 $ */
11
/* $Change: 841096 $ */
12
/* $Author: erichan $ */
13
14
/** \file
15
 * Base class and common data structures for opcodes (introduced in DNG 1.3).
16
 */
17
18
/*****************************************************************************/
19
20
#ifndef __dng_opcodes__
21
#define __dng_opcodes__
22
23
/*****************************************************************************/
24
25
#include "dng_auto_ptr.h"
26
#include "dng_classes.h"
27
#include "dng_rect.h"
28
#include "dng_types.h"
29
30
/*****************************************************************************/
31
32
/// \brief List of supported opcodes (by ID).
33
34
enum dng_opcode_id
35
  {
36
  
37
  // Internal use only opcode.  Never written to DNGs.
38
  
39
  dngOpcode_Private       = 0,
40
  
41
  // Warp image to correct distortion and lateral chromatic aberration for
42
  // rectilinear lenses.
43
  
44
  dngOpcode_WarpRectilinear     = 1,
45
  
46
  // Warp image to correction distortion for fisheye lenses (i.e., map the
47
  // fisheye projection to a perspective projection).
48
  
49
  dngOpcode_WarpFisheye     = 2,
50
51
  // Radial vignette correction.
52
  
53
  dngOpcode_FixVignetteRadial   = 3,
54
  
55
  // Patch bad Bayer pixels which are marked with a special value in the image.
56
  
57
  dngOpcode_FixBadPixelsConstant  = 4,
58
  
59
  // Patch bad Bayer pixels/rectangles at a list of specified coordinates.
60
  
61
  dngOpcode_FixBadPixelsList    = 5,
62
  
63
  // Trim image to specified bounds.
64
  
65
  dngOpcode_TrimBounds      = 6,
66
  
67
  // Map an area through a 16-bit LUT.
68
  
69
  dngOpcode_MapTable        = 7,
70
  
71
  // Map an area using a polynomial function.
72
  
73
  dngOpcode_MapPolynomial     = 8,
74
  
75
  // Apply a gain map to an area.
76
  
77
  dngOpcode_GainMap       = 9,
78
  
79
  // Apply a per-row delta to an area.
80
  
81
  dngOpcode_DeltaPerRow     = 10,
82
  
83
  // Apply a per-column delta to an area.
84
  
85
  dngOpcode_DeltaPerColumn    = 11,
86
  
87
  // Apply a per-row scale to an area.
88
  
89
  dngOpcode_ScalePerRow     = 12,
90
  
91
  // Apply a per-column scale to an area.
92
  
93
  dngOpcode_ScalePerColumn    = 13
94
  
95
  };
96
97
/*****************************************************************************/
98
99
/// \brief Virtual base class for opcode.
100
101
class dng_opcode
102
  {
103
  
104
  public:
105
106
    /// Opcode flags.
107
  
108
    enum
109
      {
110
      kFlag_None      = 0,  //!< No flag.
111
      kFlag_Optional      = 1,  //!< This opcode is optional.
112
      kFlag_SkipIfPreview = 2   //!< May skip opcode for preview images.
113
      };
114
  
115
  private:
116
  
117
    uint32 fOpcodeID;
118
    
119
    uint32 fMinVersion;
120
    
121
    uint32 fFlags;
122
    
123
    bool fWasReadFromStream;
124
    
125
    uint32 fStage;
126
  
127
  protected:
128
  
129
    dng_opcode (uint32 opcodeID,
130
          uint32 minVersion,
131
          uint32 flags);
132
          
133
    dng_opcode (uint32 opcodeID,
134
          dng_stream &stream,
135
          const char *name);
136
          
137
  public:
138
    
139
    virtual ~dng_opcode ();
140
141
    /// The ID of this opcode.
142
    
143
    uint32 OpcodeID () const
144
0
      {
145
0
      return fOpcodeID;
146
0
      }
147
148
    /// The first DNG version that supports this opcode.
149
      
150
    uint32 MinVersion () const
151
0
      {
152
0
      return fMinVersion;
153
0
      }
154
155
    /// The flags for this opcode.
156
      
157
    uint32 Flags () const
158
0
      {
159
0
      return fFlags;
160
0
      }
161
      
162
    /// Is this opcode optional?
163
      
164
    bool Optional () const
165
0
      {
166
0
      return (Flags () & kFlag_Optional) != 0;
167
0
      }
168
      
169
    /// Should the opcode be skipped when rendering preview images?
170
      
171
    bool SkipIfPreview () const
172
0
      {
173
0
      return (Flags () & kFlag_SkipIfPreview) != 0;
174
0
      }
175
176
    /// Was this opcode read from a data stream?
177
      
178
    bool WasReadFromStream () const
179
0
      {
180
0
      return fWasReadFromStream;
181
0
      }
182
183
    /// Which image processing stage (1, 2, 3) is associated with this
184
    /// opcode?
185
      
186
    uint32 Stage () const
187
0
      {
188
0
      return fStage;
189
0
      }
190
191
    /// Set the image processing stage (1, 2, 3) for this opcode. Stage 1 is
192
    /// the original image data, including masked areas. Stage 2 is
193
    /// linearized image data and trimmed to the active area. Stage 3 is
194
    /// demosaiced and trimmed to the active area.
195
      
196
    void SetStage (uint32 stage)
197
0
      {
198
0
      fStage = stage;
199
0
      }
200
201
    /// Is the opcode a NOP (i.e., does nothing)? An opcode could be a NOP
202
    /// for some specific parameters. 
203
204
    virtual bool IsNOP () const
205
0
      {
206
0
      return false;
207
0
      }
208
209
    /// Is this opcode valid for the specified negative?
210
  
211
    virtual bool IsValidForNegative (const dng_negative & /* negative */) const
212
0
      {
213
0
      return true;
214
0
      }
215
216
    /// Write opcode to a stream.
217
    /// \param stream The stream to which to write the opcode data.
218
  
219
    virtual void PutData (dng_stream &stream) const;
220
221
    /// Perform error checking prior to applying this opcode to the
222
    /// specified negative. Returns true if this opcode should be applied to
223
    /// the negative, false otherwise.
224
    
225
    bool AboutToApply (dng_host &host,
226
               dng_negative &negative);
227
228
    /// Apply this opcode to the specified image with associated negative.
229
230
    virtual void Apply (dng_host &host,
231
              dng_negative &negative,
232
              AutoPtr<dng_image> &image) = 0;
233
              
234
  };
235
236
/*****************************************************************************/
237
238
/// \brief Class to represent unknown opcodes (e.g, opcodes defined in future
239
/// DNG versions).
240
241
class dng_opcode_Unknown: public dng_opcode
242
  {
243
  
244
  private:
245
  
246
    AutoPtr<dng_memory_block> fData;
247
  
248
  public:
249
  
250
    dng_opcode_Unknown (dng_host &host,
251
              uint32 opcodeID,
252
              dng_stream &stream);
253
  
254
    virtual void PutData (dng_stream &stream) const;
255
256
    virtual void Apply (dng_host &host,
257
              dng_negative &negative,
258
              AutoPtr<dng_image> &image);
259
260
  };
261
262
/*****************************************************************************/
263
264
/// \brief Class to represent a filter opcode, such as a convolution.
265
266
class dng_filter_opcode: public dng_opcode
267
  {
268
  
269
  protected:
270
  
271
    dng_filter_opcode (uint32 opcodeID,
272
               uint32 minVersion,
273
               uint32 flags);
274
          
275
    dng_filter_opcode (uint32 opcodeID,
276
               dng_stream &stream,
277
               const char *name);
278
          
279
  public:
280
  
281
    /// The pixel data type of this opcode.
282
283
    virtual uint32 BufferPixelType (uint32 imagePixelType)
284
0
      {
285
0
      return imagePixelType;
286
0
      }
287
  
288
    /// The adjusted bounds (processing area) of this opcode. It is limited to
289
    /// the intersection of the specified image area and the GainMap area.
290
291
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds)
292
0
      {
293
0
      return imageBounds;
294
0
      }
295
      
296
    /// Returns the width and height (in pixels) of the repeating mosaic pattern.
297
298
    virtual dng_point SrcRepeat ()
299
0
      {
300
0
      return dng_point (1, 1);
301
0
      }
302
  
303
    /// Returns the source pixel area needed to process a destination pixel area
304
    /// that lies within the specified bounds.
305
    /// \param dstArea The destination pixel area to be computed.
306
    /// \param imageBounds The overall image area (dstArea will lie within these
307
    /// bounds).
308
    /// \retval The source pixel area needed to process the specified dstArea.
309
310
    virtual dng_rect SrcArea (const dng_rect &dstArea,
311
                  const dng_rect & /* imageBounds */)
312
0
      {
313
0
      return dstArea;
314
0
      }
315
316
    /// Given a destination tile size, calculate input tile size. Simlar to
317
    /// SrcArea, and should seldom be overridden.
318
    ///
319
    /// \param dstTileSize The destination tile size that is targeted for output.
320
    ///
321
    /// \param imageBounds The image bounds (the destination tile will
322
    /// always lie within these bounds).
323
    ///
324
    /// \retval The source tile size needed to compute a tile of the destination
325
    /// size.
326
327
    virtual dng_point SrcTileSize (const dng_point &dstTileSize,
328
                     const dng_rect &imageBounds)
329
0
      {
330
0
      return SrcArea (dng_rect (dstTileSize),
331
0
              imageBounds).Size ();
332
0
      }
333
334
    /// Startup method called before any processing is performed on pixel areas.
335
    /// It can be used to allocate (per-thread) memory and setup tasks.
336
    ///
337
    /// \param negative The negative object to be processed.
338
    ///
339
    /// \param threadCount The number of threads to be used to perform the
340
    /// processing.
341
    ///
342
    /// \param threadCount Total number of threads that will be used for
343
    /// processing. Less than or equal to MaxThreads.
344
    ///
345
    /// \param tileSize Size of source tiles which will be processed. (Not all
346
    /// tiles will be this size due to edge conditions.)
347
    ///
348
    /// \param imageBounds Total size of image to be processed.
349
    ///
350
    /// \param imagePlanes Number of planes in the image. Less than or equal to
351
    /// kMaxColorPlanes.
352
    ///
353
    /// \param bufferPixelType Pixel type of image buffer (see dng_tag_types.h).
354
    ///
355
    /// \param allocator dng_memory_allocator to use for allocating temporary
356
    /// buffers, etc.
357
358
    virtual void Prepare (dng_negative & /* negative */,
359
                uint32 /* threadCount */,
360
                const dng_point & /* tileSize */,
361
                const dng_rect & /* imageBounds */,
362
                uint32 /* imagePlanes */,
363
                uint32 /* bufferPixelType */,
364
                dng_memory_allocator & /* allocator */)
365
0
      {
366
0
      }
367
368
    /// Implements filtering operation from one buffer to another. Source
369
    /// and destination pixels are set up in member fields of this class.
370
    /// Ideally, no allocation should be done in this routine.
371
    ///
372
    /// \param negative The negative associated with the pixels to be
373
    /// processed.
374
    ///
375
    /// \param threadIndex The thread on which this routine is being called,
376
    /// between 0 and threadCount - 1 for the threadCount passed to Prepare
377
    /// method.
378
    ///
379
    /// \param srcBuffer Input area and source pixels.
380
    ///
381
    /// \param dstBuffer Destination pixels.
382
    ///
383
    /// \param dstArea Destination pixel processing area.
384
    ///
385
    /// \param imageBounds Total image area to be processed; dstArea will
386
    /// always lie within these bounds.
387
388
    virtual void ProcessArea (dng_negative &negative,
389
                  uint32 threadIndex,
390
                  dng_pixel_buffer &srcBuffer,
391
                  dng_pixel_buffer &dstBuffer,
392
                  const dng_rect &dstArea,
393
                  const dng_rect &imageBounds) = 0;
394
395
    virtual void Apply (dng_host &host,
396
              dng_negative &negative,
397
              AutoPtr<dng_image> &image);
398
    
399
  };
400
401
/*****************************************************************************/
402
403
/// \brief Class to represent an in-place (i.e., pointwise, per-pixel) opcode,
404
/// such as a global tone curve.
405
406
class dng_inplace_opcode: public dng_opcode
407
  {
408
  
409
  protected:
410
  
411
    dng_inplace_opcode (uint32 opcodeID,
412
                uint32 minVersion,
413
                uint32 flags);
414
          
415
    dng_inplace_opcode (uint32 opcodeID,
416
                dng_stream &stream,
417
                const char *name);
418
          
419
  public:
420
  
421
    /// The pixel data type of this opcode.
422
423
    virtual uint32 BufferPixelType (uint32 imagePixelType)
424
0
      {
425
0
      return imagePixelType;
426
0
      }
427
      
428
    /// The adjusted bounds (processing area) of this opcode. It is limited to
429
    /// the intersection of the specified image area and the GainMap area.
430
431
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds)
432
0
      {
433
0
      return imageBounds;
434
0
      }
435
  
436
    /// Startup method called before any processing is performed on pixel areas.
437
    /// It can be used to allocate (per-thread) memory and setup tasks.
438
    ///
439
    /// \param negative The negative object to be processed.
440
    ///
441
    /// \param threadCount The number of threads to be used to perform the
442
    /// processing.
443
    ///
444
    /// \param threadCount Total number of threads that will be used for
445
    /// processing. Less than or equal to MaxThreads.
446
    ///
447
    /// \param tileSize Size of source tiles which will be processed. (Not all
448
    /// tiles will be this size due to edge conditions.)
449
    ///
450
    /// \param imageBounds Total size of image to be processed.
451
    ///
452
    /// \param imagePlanes Number of planes in the image. Less than or equal to
453
    /// kMaxColorPlanes.
454
    ///
455
    /// \param bufferPixelType Pixel type of image buffer (see dng_tag_types.h).
456
    ///
457
    /// \param allocator dng_memory_allocator to use for allocating temporary
458
    /// buffers, etc.
459
460
    virtual void Prepare (dng_negative & /* negative */,
461
                uint32 /* threadCount */,
462
                const dng_point & /* tileSize */,
463
                const dng_rect & /* imageBounds */,
464
                uint32 /* imagePlanes */,
465
                uint32 /* bufferPixelType */,
466
                dng_memory_allocator & /* allocator */)
467
0
      {
468
0
      }
469
470
    /// Implements image processing operation in a single buffer. The source
471
    /// pixels are provided as input to the buffer, and this routine
472
    /// calculates and writes the destination pixels to the same buffer.
473
    /// Ideally, no allocation should be done in this routine.
474
    ///
475
    /// \param negative The negative associated with the pixels to be
476
    /// processed.
477
    ///
478
    /// \param threadIndex The thread on which this routine is being called,
479
    /// between 0 and threadCount - 1 for the threadCount passed to Prepare
480
    /// method.
481
    ///
482
    /// \param srcBuffer Input area and source pixels.
483
    ///
484
    /// \param dstBuffer Destination pixels.
485
    ///
486
    /// \param dstArea Destination pixel processing area.
487
    ///
488
    /// \param imageBounds Total image area to be processed; dstArea will
489
    /// always lie within these bounds.
490
491
    virtual void ProcessArea (dng_negative &negative,
492
                  uint32 threadIndex,
493
                  dng_pixel_buffer &buffer,
494
                  const dng_rect &dstArea,
495
                  const dng_rect &imageBounds) = 0;
496
497
    virtual void Apply (dng_host &host,
498
              dng_negative &negative,
499
              AutoPtr<dng_image> &image);
500
    
501
  };
502
503
/*****************************************************************************/
504
505
#endif
506
  
507
/*****************************************************************************/