Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/dng_sdk/source/dng_hue_sat_map.h
Line
Count
Source (jump to first uncovered line)
1
/*****************************************************************************/
2
// Copyright 2007 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_hue_sat_map.h#2 $ */ 
10
/* $DateTime: 2012/07/31 22:04:34 $ */
11
/* $Change: 840853 $ */
12
/* $Author: tknoll $ */
13
14
/** \file
15
 * Table-based color correction data structure.
16
 */
17
18
/*****************************************************************************/
19
20
#ifndef __dng_hue_sat_map__
21
#define __dng_hue_sat_map__
22
23
/*****************************************************************************/
24
25
#include "dng_classes.h"
26
#include "dng_exceptions.h"
27
#include "dng_ref_counted_block.h"
28
#include "dng_safe_arithmetic.h"
29
#include "dng_types.h"
30
31
/*****************************************************************************/
32
33
/// \brief A 3D table that maps HSV (hue, saturation, and value) floating-point
34
/// input coordinates in the range [0,1] to delta signals. The table must have at
35
/// least 1 sample in the hue dimension, at least 2 samples in the saturation
36
/// dimension, and at least 1 sample in the value dimension. Tables are stored in
37
/// value-hue-saturation order.
38
39
class dng_hue_sat_map
40
  {
41
42
  public:
43
44
    /// HSV delta signal. \param fHueShift is a delta value specified in degrees.
45
    /// This parameter, added to the original hue, determines the output hue. A
46
    /// value of 0 means no change. \param fSatScale and \param fValScale are
47
    /// scale factors that are applied to saturation and value components,
48
    /// respectively. These scale factors, multiplied by the original saturation
49
    /// and value, determine the output saturation and value. A scale factor of
50
    /// 1.0 means no change.
51
52
    struct HSBModify
53
      {
54
      real32 fHueShift;
55
      real32 fSatScale;
56
      real32 fValScale;
57
      };
58
59
  private:
60
61
    uint32 fHueDivisions;
62
    uint32 fSatDivisions;
63
    uint32 fValDivisions;
64
    
65
    uint32 fHueStep;
66
    uint32 fValStep;
67
68
    dng_ref_counted_block fDeltas;
69
70
    HSBModify *SafeGetDeltas ()
71
0
      {
72
0
      return (HSBModify *) fDeltas.Buffer_real32 ();
73
0
      }
74
75
  public:
76
77
    /// Construct an empty (and invalid) hue sat map.
78
79
    dng_hue_sat_map ();
80
81
    /// Copy an existing hue sat map.
82
83
    dng_hue_sat_map (const dng_hue_sat_map &src);
84
85
    /// Copy an existing hue sat map.
86
87
    dng_hue_sat_map & operator= (const dng_hue_sat_map &rhs);
88
89
    /// Destructor.
90
91
    virtual ~dng_hue_sat_map ();
92
93
    /// Is this hue sat map invalid?
94
95
    bool IsNull () const
96
0
      {
97
0
      return !IsValid ();
98
0
      }
99
100
    /// Is this hue sat map valid?
101
102
    bool IsValid () const
103
0
      {
104
      
105
0
      return fHueDivisions > 0 &&
106
0
           fSatDivisions > 1 &&
107
0
           fValDivisions > 0 &&
108
0
           fDeltas.Buffer ();
109
           
110
0
      }
111
112
    /// Clear the hue sat map, making it invalid.
113
114
    void SetInvalid ()
115
0
      {
116
117
0
      fHueDivisions = 0;
118
0
      fSatDivisions = 0;
119
0
      fValDivisions = 0;
120
      
121
0
      fHueStep = 0;
122
0
      fValStep = 0;
123
124
0
      fDeltas.Clear ();
125
126
0
      }
127
128
    /// Get the table dimensions (number of samples in each dimension).
129
130
    void GetDivisions (uint32 &hueDivisions,
131
               uint32 &satDivisions,
132
               uint32 &valDivisions) const
133
0
      {
134
0
      hueDivisions = fHueDivisions;
135
0
      satDivisions = fSatDivisions;
136
0
      valDivisions = fValDivisions;
137
0
      }
138
      
139
    /// Set the table dimensions (number of samples in each dimension). This
140
    /// erases any existing table data.
141
142
    void SetDivisions (uint32 hueDivisions,
143
               uint32 satDivisions,
144
               uint32 valDivisions = 1);  
145
146
    /// Get a specific table entry, specified by table indices.
147
148
    void GetDelta (uint32 hueDiv,
149
             uint32 satDiv,
150
             uint32 valDiv,
151
             HSBModify &modify) const;
152
153
    /// Make sure the table is writeable.
154
155
    void EnsureWriteable ()
156
0
      {
157
0
      fDeltas.EnsureWriteable ();
158
0
      }
159
    
160
    /// Set a specific table entry, specified by table indices.
161
162
    void SetDelta (uint32 hueDiv,
163
             uint32 satDiv,
164
             uint32 valDiv,
165
             const HSBModify &modify)
166
0
      {
167
      
168
0
      EnsureWriteable ();
169
      
170
0
      SetDeltaKnownWriteable (hueDiv,
171
0
                  satDiv,
172
0
                  valDiv,
173
0
                  modify);
174
      
175
0
      }
176
    
177
    /// Same as SetDelta, without checking that the table is writeable.
178
179
    void SetDeltaKnownWriteable (uint32 hueDiv,
180
                   uint32 satDiv,
181
                   uint32 valDiv,
182
                   const HSBModify &modify);
183
    
184
    /// Get the total number of samples (across all dimensions).
185
186
    uint32 DeltasCount () const
187
0
      {
188
0
      uint32 deltaCount;
189
0
      if (!SafeUint32Mult(fValDivisions, fHueDivisions, &deltaCount) ||
190
0
               !SafeUint32Mult(deltaCount, fSatDivisions, &deltaCount))
191
0
        {
192
0
        ThrowMemoryFull("Arithmetic overflow computing delta count");
193
0
        }
194
  
195
0
      return deltaCount;
196
0
      }
197
    
198
    /// Direct read/write access to table entries. The entries are stored in
199
    /// value-hue-saturation order (outer to inner).
200
201
    HSBModify *GetDeltas ()
202
0
      {
203
0
        
204
0
      EnsureWriteable ();
205
0
206
0
      return (HSBModify *) fDeltas.Buffer_real32 ();
207
0
208
0
      }
209
210
    /// Direct read-only access to table entries. The entries are stored in
211
    /// value-hue-saturation order (outer to inner).
212
213
    const HSBModify *GetConstDeltas () const
214
0
      {
215
0
      return (const HSBModify *) fDeltas.Buffer_real32 ();
216
0
      }
217
218
    /// Equality test.
219
220
    bool operator== (const dng_hue_sat_map &rhs) const;
221
    
222
    /// Compute a linearly-interpolated hue sat map (i.e., delta and scale factors)
223
    /// from the specified tables, with the specified weight. map1 and map2 must
224
    /// have the same dimensions.
225
226
    static dng_hue_sat_map * Interpolate (const dng_hue_sat_map &map1,
227
                        const dng_hue_sat_map &map2,
228
                        real64 weight1);
229
230
  };
231
232
/*****************************************************************************/
233
234
#endif
235
236
/*****************************************************************************/