/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 | | /*****************************************************************************/ |