Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/dng_sdk/source/dng_misc_opcodes.h
Line
Count
Source (jump to first uncovered line)
1
/*****************************************************************************/
2
// Copyright 2008-2009 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_misc_opcodes.h#2 $ */ 
10
/* $DateTime: 2012/08/02 06:09:06 $ */
11
/* $Change: 841096 $ */
12
/* $Author: erichan $ */
13
14
/** \file
15
 * Miscellaneous DNG opcodes.
16
 */
17
18
/*****************************************************************************/
19
20
#ifndef __dng_misc_opcodes__
21
#define __dng_misc_opcodes__
22
23
/*****************************************************************************/
24
25
#include "dng_opcodes.h"
26
27
/*****************************************************************************/
28
29
/// \brief Opcode to trim image to a specified rectangle.
30
31
class dng_opcode_TrimBounds: public dng_opcode
32
  {
33
  
34
  private:
35
  
36
    dng_rect fBounds;
37
  
38
  public:
39
40
    /// Create opcode to trim image to the specified bounds.
41
  
42
    dng_opcode_TrimBounds (const dng_rect &bounds);
43
    
44
    dng_opcode_TrimBounds (dng_stream &stream);
45
  
46
    virtual void PutData (dng_stream &stream) const;
47
48
    virtual void Apply (dng_host &host,
49
              dng_negative &negative,
50
              AutoPtr<dng_image> &image);
51
    
52
  };
53
54
/*****************************************************************************/
55
56
/// \brief A class to describe an area of an image, including a pixel subrectangle,
57
/// plane range, and row/column pitch (e.g., for mosaic images). Useful for
58
/// specifying opcodes that only apply to specific color planes or pixel types (e.g.,
59
/// only one of the two green Bayer pixels).
60
61
class dng_area_spec
62
  {
63
  
64
  public:
65
  
66
    enum
67
      {
68
      kDataSize = 32
69
      };
70
  
71
  private:
72
  
73
    dng_rect fArea;
74
    
75
    uint32 fPlane;
76
    uint32 fPlanes;
77
    
78
    uint32 fRowPitch;
79
    uint32 fColPitch;
80
    
81
  public:
82
83
    /// Create an empty area.
84
  
85
    dng_area_spec (const dng_rect &area = dng_rect (),
86
             uint32 plane = 0,
87
             uint32 planes = 1,
88
             uint32 rowPitch = 1,
89
             uint32 colPitch = 1)
90
             
91
      : fArea     (area)
92
      , fPlane    (plane)
93
      , fPlanes   (planes)
94
      , fRowPitch (rowPitch)
95
      , fColPitch (colPitch)
96
      
97
0
      {
98
0
      }
99
100
    /// The pixel area.
101
      
102
    const dng_rect & Area () const
103
0
      {
104
0
      return fArea;
105
0
      }
106
107
    /// The first plane.
108
    
109
    const uint32 Plane () const
110
0
      {
111
0
      return fPlane;
112
0
      }
113
114
    /// The total number of planes.
115
    
116
    const uint32 Planes () const
117
0
      {
118
0
      return fPlanes;
119
0
      }
120
121
    /// The row pitch (i.e., stride). A pitch of 1 means all rows.
122
    
123
    const uint32 RowPitch () const
124
0
      {
125
0
      return fRowPitch;
126
0
      }
127
    
128
    /// The column pitch (i.e., stride). A pitch of 1 means all columns.
129
    
130
    const uint32 ColPitch () const
131
0
      {
132
0
      return fColPitch;
133
0
      }
134
135
    /// Read area data from the specified stream.
136
      
137
    void GetData (dng_stream &stream);
138
    
139
    /// Write area data to the specified stream.
140
      
141
    void PutData (dng_stream &stream) const;
142
143
    /// Compute and return pixel area overlap (i.e., intersection) between this
144
    /// area and the specified tile.
145
    
146
    dng_rect Overlap (const dng_rect &tile) const;
147
148
  };
149
150
/*****************************************************************************/
151
152
/// \brief An opcode to apply a 1D function (represented as a 16-bit table) to an
153
/// image area.
154
155
class dng_opcode_MapTable: public dng_inplace_opcode
156
  {
157
  
158
  private:
159
  
160
    dng_area_spec fAreaSpec;
161
    
162
    AutoPtr<dng_memory_block> fTable;
163
    
164
    uint32 fCount;
165
    
166
  public:
167
168
    /// Create a MapTable opcode with the specified area, table, and number of
169
    /// table entries.
170
  
171
    dng_opcode_MapTable (dng_host &host,
172
               const dng_area_spec &areaSpec,
173
               const uint16 *table,
174
               uint32 count = 0x10000);
175
176
    dng_opcode_MapTable (dng_host &host,
177
               dng_stream &stream);
178
  
179
    virtual void PutData (dng_stream &stream) const;
180
181
    virtual uint32 BufferPixelType (uint32 imagePixelType);
182
      
183
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
184
  
185
    virtual void ProcessArea (dng_negative &negative,
186
                  uint32 threadIndex,
187
                  dng_pixel_buffer &buffer,
188
                  const dng_rect &dstArea,
189
                  const dng_rect &imageBounds);
190
                  
191
  private:
192
  
193
    void ReplicateLastEntry ();
194
195
  };
196
197
/*****************************************************************************/
198
199
/// \brief An opcode to apply a 1D function (represented as a polynomial) to an
200
/// image area.
201
202
class dng_opcode_MapPolynomial: public dng_inplace_opcode
203
  {
204
  
205
  public:
206
  
207
    enum
208
      {
209
      kMaxDegree = 8
210
      };
211
  
212
  private:
213
  
214
    dng_area_spec fAreaSpec;
215
    
216
    uint32 fDegree;
217
    
218
    real64 fCoefficient [kMaxDegree + 1];
219
    
220
    real32 fCoefficient32 [kMaxDegree + 1];
221
    
222
  public:
223
  
224
    /// Create a MapPolynomial opcode with the specified area, polynomial
225
    /// degree, and polynomial coefficients. The function that will be
226
    /// applied to each pixel x is:
227
    ///
228
    /// f (x) = coefficient [0] + ((x * coefficient [1]) +
229
    ///                (x^2 * coefficient [2]) +
230
    ///                (x^3 * coefficient [3]) +
231
    ///                (x^4 * coefficient [4]) ...
232
  
233
    dng_opcode_MapPolynomial (const dng_area_spec &areaSpec,
234
                  uint32 degree,
235
                  const real64 *coefficient);
236
  
237
    dng_opcode_MapPolynomial (dng_stream &stream);
238
  
239
    virtual void PutData (dng_stream &stream) const;
240
241
    virtual uint32 BufferPixelType (uint32 imagePixelType);
242
      
243
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
244
  
245
    virtual void ProcessArea (dng_negative &negative,
246
                  uint32 threadIndex,
247
                  dng_pixel_buffer &buffer,
248
                  const dng_rect &dstArea,
249
                  const dng_rect &imageBounds);
250
                  
251
  };
252
253
/*****************************************************************************/
254
255
/// \brief An opcode to apply a delta (i.e., offset) that varies per row. Within
256
/// a row, the same delta value is applied to all specified pixels.
257
258
class dng_opcode_DeltaPerRow: public dng_inplace_opcode
259
  {
260
  
261
  private:
262
  
263
    dng_area_spec fAreaSpec;
264
    
265
    AutoPtr<dng_memory_block> fTable;
266
    
267
    real32 fScale;
268
269
  public:
270
271
    /// Create a DeltaPerRow opcode with the specified area and row deltas
272
    /// (specified as a table of 32-bit floats).
273
  
274
    dng_opcode_DeltaPerRow (const dng_area_spec &areaSpec,
275
                AutoPtr<dng_memory_block> &table);
276
  
277
    dng_opcode_DeltaPerRow (dng_host &host,
278
                dng_stream &stream);
279
  
280
    virtual void PutData (dng_stream &stream) const;
281
282
    virtual uint32 BufferPixelType (uint32 imagePixelType);
283
      
284
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
285
  
286
    virtual void ProcessArea (dng_negative &negative,
287
                  uint32 threadIndex,
288
                  dng_pixel_buffer &buffer,
289
                  const dng_rect &dstArea,
290
                  const dng_rect &imageBounds);
291
                  
292
  };
293
294
/*****************************************************************************/
295
296
/// \brief An opcode to apply a delta (i.e., offset) that varies per column.
297
/// Within a column, the same delta value is applied to all specified pixels.
298
299
class dng_opcode_DeltaPerColumn: public dng_inplace_opcode
300
  {
301
  
302
  private:
303
  
304
    dng_area_spec fAreaSpec;
305
    
306
    AutoPtr<dng_memory_block> fTable;
307
    
308
    real32 fScale;
309
310
  public:
311
  
312
    /// Create a DeltaPerColumn opcode with the specified area and column
313
    /// deltas (specified as a table of 32-bit floats).
314
  
315
    dng_opcode_DeltaPerColumn (const dng_area_spec &areaSpec,
316
                   AutoPtr<dng_memory_block> &table);
317
  
318
    dng_opcode_DeltaPerColumn (dng_host &host,
319
                   dng_stream &stream);
320
  
321
    virtual void PutData (dng_stream &stream) const;
322
323
    virtual uint32 BufferPixelType (uint32 imagePixelType);
324
      
325
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
326
  
327
    virtual void ProcessArea (dng_negative &negative,
328
                  uint32 threadIndex,
329
                  dng_pixel_buffer &buffer,
330
                  const dng_rect &dstArea,
331
                  const dng_rect &imageBounds);
332
                  
333
  };
334
335
/*****************************************************************************/
336
337
/// \brief An opcode to apply a scale factor that varies per row. Within a row,
338
/// the same scale factor is applied to all specified pixels.
339
340
class dng_opcode_ScalePerRow: public dng_inplace_opcode
341
  {
342
  
343
  private:
344
  
345
    dng_area_spec fAreaSpec;
346
    
347
    AutoPtr<dng_memory_block> fTable;
348
349
  public:
350
  
351
    /// Create a ScalePerRow opcode with the specified area and row scale
352
    /// factors (specified as a table of 32-bit floats).
353
  
354
    dng_opcode_ScalePerRow (const dng_area_spec &areaSpec,
355
                AutoPtr<dng_memory_block> &table);
356
  
357
    dng_opcode_ScalePerRow (dng_host &host,
358
                dng_stream &stream);
359
  
360
    virtual void PutData (dng_stream &stream) const;
361
362
    virtual uint32 BufferPixelType (uint32 imagePixelType);
363
      
364
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
365
  
366
    virtual void ProcessArea (dng_negative &negative,
367
                  uint32 threadIndex,
368
                  dng_pixel_buffer &buffer,
369
                  const dng_rect &dstArea,
370
                  const dng_rect &imageBounds);
371
                  
372
  };
373
374
/*****************************************************************************/
375
376
/// \brief An opcode to apply a scale factor that varies per column. Within a
377
/// column, the same scale factor is applied to all specified pixels.
378
379
class dng_opcode_ScalePerColumn: public dng_inplace_opcode
380
  {
381
  
382
  private:
383
  
384
    dng_area_spec fAreaSpec;
385
    
386
    AutoPtr<dng_memory_block> fTable;
387
388
  public:
389
  
390
    /// Create a ScalePerColumn opcode with the specified area and column
391
    /// scale factors (specified as a table of 32-bit floats).
392
  
393
    dng_opcode_ScalePerColumn (const dng_area_spec &areaSpec,
394
                   AutoPtr<dng_memory_block> &table);
395
  
396
    dng_opcode_ScalePerColumn (dng_host &host,
397
                   dng_stream &stream);
398
  
399
    virtual void PutData (dng_stream &stream) const;
400
401
    virtual uint32 BufferPixelType (uint32 imagePixelType);
402
      
403
    virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
404
  
405
    virtual void ProcessArea (dng_negative &negative,
406
                  uint32 threadIndex,
407
                  dng_pixel_buffer &buffer,
408
                  const dng_rect &dstArea,
409
                  const dng_rect &imageBounds);
410
                  
411
  };
412
413
/*****************************************************************************/
414
415
#endif
416
  
417
/*****************************************************************************/