HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ImfChannelList.h
Go to the documentation of this file.
1 //
2 // SPDX-License-Identifier: BSD-3-Clause
3 // Copyright (c) Contributors to the OpenEXR Project.
4 //
5 
6 #ifndef INCLUDED_IMF_CHANNEL_LIST_H
7 #define INCLUDED_IMF_CHANNEL_LIST_H
8 
9 //-----------------------------------------------------------------------------
10 //
11 // class Channel
12 // class ChannelList
13 //
14 //-----------------------------------------------------------------------------
15 
16 #include "ImfForward.h"
17 
18 #include "ImfName.h"
19 #include "ImfPixelType.h"
20 
21 #include <map>
22 #include <set>
23 #include <string>
24 
26 
28 {
29  //------------------------------
30  // Data type; see ImfPixelType.h
31  //------------------------------
32 
34 
35  //--------------------------------------------
36  // Subsampling: pixel (x, y) is present in the
37  // channel only if
38  //
39  // x % xSampling == 0 && y % ySampling == 0
40  //
41  //--------------------------------------------
42 
43  int xSampling;
44  int ySampling;
45 
46  //--------------------------------------------------------------
47  // Hint to lossy compression methods that indicates whether
48  // human perception of the quantity represented by this channel
49  // is closer to linear or closer to logarithmic. Compression
50  // methods may optimize image quality by adjusting pixel data
51  // quantization according to this hint.
52  // For example, perception of red, green, blue and luminance is
53  // approximately logarithmic; the difference between 0.1 and 0.2
54  // is perceived to be roughly the same as the difference between
55  // 1.0 and 2.0. Perception of chroma coordinates tends to be
56  // closer to linear than logarithmic; the difference between 0.1
57  // and 0.2 is perceived to be roughly the same as the difference
58  // between 1.0 and 1.1.
59  //--------------------------------------------------------------
60 
61  bool pLinear;
62 
63  //------------
64  // Constructor
65  //------------
66 
68  Channel (
70  int xSampling = 1,
71  int ySampling = 1,
72  bool pLinear = false);
73 
74  //------------
75  // Operator ==
76  //------------
77 
79  bool operator== (const Channel& other) const;
80 };
81 
83 {
84 public:
85  //--------------
86  // Add a channel
87  //--------------
88 
90  void insert (const char name[], const Channel& channel);
91 
93  void insert (const std::string& name, const Channel& channel);
94 
95  //------------------------------------------------------------------
96  // Access to existing channels:
97  //
98  // [n] Returns a reference to the channel with name n.
99  // If no channel with name n exists, an IEX_NAMESPACE::ArgExc
100  // is thrown.
101  //
102  // findChannel(n) Returns a pointer to the channel with name n,
103  // or 0 if no channel with name n exists.
104  //
105  //------------------------------------------------------------------
106 
107  IMF_EXPORT
108  Channel& operator[] (const char name[]);
109  IMF_EXPORT
110  const Channel& operator[] (const char name[]) const;
111 
112  IMF_EXPORT
113  Channel& operator[] (const std::string& name);
114  IMF_EXPORT
115  const Channel& operator[] (const std::string& name) const;
116 
117  IMF_EXPORT
118  Channel* findChannel (const char name[]);
119  IMF_EXPORT
120  const Channel* findChannel (const char name[]) const;
121 
122  IMF_EXPORT
123  Channel* findChannel (const std::string& name);
124  IMF_EXPORT
125  const Channel* findChannel (const std::string& name) const;
126 
127  //-------------------------------------------
128  // Iterator-style access to existing channels
129  //-------------------------------------------
130 
131  typedef std::map<Name, Channel> ChannelMap;
132 
133  class Iterator;
134  class ConstIterator;
135 
136  IMF_EXPORT
137  Iterator begin ();
138  IMF_EXPORT
139  ConstIterator begin () const;
140 
141  IMF_EXPORT
142  Iterator end ();
143  IMF_EXPORT
144  ConstIterator end () const;
145 
146  IMF_EXPORT
147  Iterator find (const char name[]);
148  IMF_EXPORT
149  ConstIterator find (const char name[]) const;
150 
151  IMF_EXPORT
152  Iterator find (const std::string& name);
153  IMF_EXPORT
154  ConstIterator find (const std::string& name) const;
155 
156  //-----------------------------------------------------------------
157  // Support for image layers:
158  //
159  // In an image file with many channels it is sometimes useful to
160  // group the channels into "layers", that is, into sets of channels
161  // that logically belong together. Grouping channels into layers
162  // is done using a naming convention: channel C in layer L is
163  // called "L.C".
164  //
165  // For example, a computer graphic image may contain separate
166  // R, G and B channels for light that originated at each of
167  // several different virtual light sources. The channels in
168  // this image might be called "light1.R", "light1.G", "light1.B",
169  // "light2.R", "light2.G", "light2.B", etc.
170  //
171  // Note that this naming convention allows layers to be nested;
172  // for example, "light1.specular.R" identifies the "R" channel
173  // in the "specular" sub-layer of layer "light1".
174  //
175  // Channel names that don't contain a "." or that contain a
176  // "." only at the beginning or at the end are not considered
177  // to be part of any layer.
178  //
179  // layers(lns) sorts the channels in this ChannelList
180  // into layers and stores the names of
181  // all layers, sorted alphabetically,
182  // into string set lns.
183  //
184  // channelsInLayer(ln,f,l) stores a pair of iterators in f and l
185  // such that the loop
186  //
187  // for (ConstIterator i = f; i != l; ++i)
188  // ...
189  //
190  // iterates over all channels in layer ln.
191  // channelsInLayer (ln, l, p) calls
192  // channelsWithPrefix (ln + ".", l, p).
193  //
194  //-----------------------------------------------------------------
195 
196  IMF_EXPORT
197  void layers (std::set<std::string>& layerNames) const;
198 
199  IMF_EXPORT
200  void channelsInLayer (
201  const std::string& layerName, Iterator& first, Iterator& last);
202 
203  IMF_EXPORT
204  void channelsInLayer (
205  const std::string& layerName,
206  ConstIterator& first,
207  ConstIterator& last) const;
208 
209  //-------------------------------------------------------------------
210  // Find all channels whose name begins with a given prefix:
211  //
212  // channelsWithPrefix(p,f,l) stores a pair of iterators in f and l
213  // such that the following loop iterates over all channels whose name
214  // begins with string p:
215  //
216  // for (ConstIterator i = f; i != l; ++i)
217  // ...
218  //
219  //-------------------------------------------------------------------
220 
221  IMF_EXPORT
222  void
223  channelsWithPrefix (const char prefix[], Iterator& first, Iterator& last);
224 
225  IMF_EXPORT
226  void channelsWithPrefix (
227  const char prefix[], ConstIterator& first, ConstIterator& last) const;
228 
229  IMF_EXPORT
230  void channelsWithPrefix (
231  const std::string& prefix, Iterator& first, Iterator& last);
232 
233  IMF_EXPORT
234  void channelsWithPrefix (
235  const std::string& prefix,
236  ConstIterator& first,
237  ConstIterator& last) const;
238 
239  //------------
240  // Operator ==
241  //------------
242 
243  IMF_EXPORT
244  bool operator== (const ChannelList& other) const;
245 
246 private:
247  ChannelMap _map;
248 };
249 
250 //----------
251 // Iterators
252 //----------
253 
254 class IMF_EXPORT_TYPE ChannelList::Iterator
255 {
256 public:
257  IMF_EXPORT
258  Iterator ();
259  IMF_EXPORT
260  Iterator (const ChannelList::ChannelMap::iterator& i);
261 
262  IMF_EXPORT
263  Iterator& operator++ ();
264  IMF_EXPORT
265  Iterator operator++ (int);
266 
267  IMF_EXPORT
268  const char* name () const;
269  IMF_EXPORT
270  Channel& channel () const;
271 
272 private:
274 
275  ChannelList::ChannelMap::iterator _i;
276 };
277 
278 class IMF_EXPORT_TYPE ChannelList::ConstIterator
279 {
280 public:
281  IMF_EXPORT
282  ConstIterator ();
283  IMF_EXPORT
284  ConstIterator (const ChannelList::ChannelMap::const_iterator& i);
285  IMF_EXPORT
286  ConstIterator (const ChannelList::Iterator& other);
287 
288  IMF_EXPORT
289  ConstIterator& operator++ ();
290  IMF_EXPORT
291  ConstIterator operator++ (int);
292 
293  IMF_EXPORT
294  const char* name () const;
295  IMF_EXPORT
296  const Channel& channel () const;
297 
298 private:
299  friend bool operator== (const ConstIterator&, const ConstIterator&);
300  friend bool operator!= (const ConstIterator&, const ConstIterator&);
301 
302  ChannelList::ChannelMap::const_iterator _i;
303 };
304 
305 //-----------------
306 // Inline Functions
307 //-----------------
308 
309 inline ChannelList::Iterator::Iterator () : _i ()
310 {
311  // empty
312 }
313 
314 inline ChannelList::Iterator::Iterator (
315  const ChannelList::ChannelMap::iterator& i)
316  : _i (i)
317 {
318  // empty
319 }
320 
321 inline ChannelList::Iterator&
322 ChannelList::Iterator::operator++ ()
323 {
324  ++_i;
325  return *this;
326 }
327 
329 ChannelList::Iterator::operator++ (int)
330 {
331  Iterator tmp = *this;
332  ++_i;
333  return tmp;
334 }
335 
336 inline const char*
338 {
339  return *_i->first;
340 }
341 
342 inline Channel&
343 ChannelList::Iterator::channel () const
344 {
345  return _i->second;
346 }
347 
348 inline ChannelList::ConstIterator::ConstIterator () : _i ()
349 {
350  // empty
351 }
352 
353 inline ChannelList::ConstIterator::ConstIterator (
354  const ChannelList::ChannelMap::const_iterator& i)
355  : _i (i)
356 {
357  // empty
358 }
359 
360 inline ChannelList::ConstIterator::ConstIterator (
361  const ChannelList::Iterator& other)
362  : _i (other._i)
363 {
364  // empty
365 }
366 
368 ChannelList::ConstIterator::operator++ ()
369 {
370  ++_i;
371  return *this;
372 }
373 
375 ChannelList::ConstIterator::operator++ (int)
376 {
377  ConstIterator tmp = *this;
378  ++_i;
379  return tmp;
380 }
381 
382 inline const char*
384 {
385  return *_i->first;
386 }
387 
388 inline const Channel&
389 ChannelList::ConstIterator::channel () const
390 {
391  return _i->second;
392 }
393 
394 inline bool
397 {
398  return x._i == y._i;
399 }
400 
401 inline bool
404 {
405  return !(x == y);
406 }
407 
409 
410 #endif
GLint first
Definition: glcorearb.h:405
#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
Definition: ImfNamespace.h:83
HALF
Definition: ImfPixelType.h:23
IMF_EXPORT Iterator()
GLsizei const GLchar *const * string
Definition: glcorearb.h:814
bool pLinear
GLint y
Definition: glcorearb.h:103
PixelType type
OIIO_FORCEINLINE vbool4 insert(const vbool4 &a, bool val)
Helper: substitute val for a[i].
Definition: simd.h:3436
int ySampling
int xSampling
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum IMF_EXPORT_ENUM PixelType
Definition: ImfPixelType.h:20
GLuint GLuint end
Definition: glcorearb.h:475
bool operator!=(const ChannelList::ConstIterator &x, const ChannelList::ConstIterator &y)
IMF_EXPORT ConstIterator()
bool operator!=(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat3.h:556
std::map< Name, Channel > ChannelMap
#define IMF_EXPORT
Definition: ImfExport.h:54
GLuint const GLchar * name
Definition: glcorearb.h:786
GLint GLenum GLint x
Definition: glcorearb.h:409
__hostdev__ uint64_t last(uint32_t i) const
Definition: NanoVDB.h:5976
#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
Definition: ImfNamespace.h:80
type
Definition: core.h:1059
#define IMF_EXPORT_TYPE
Definition: ImfExport.h:57
struct IMF_EXPORT_TYPE Channel
Definition: ImfForward.h:23
bool operator==(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat3.h:542
bool operator==(const ChannelList::ConstIterator &x, const ChannelList::ConstIterator &y)
FMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr &out) -> bool
Definition: core.h:2089
PcpNodeRef_ChildrenIterator begin(const PcpNodeRef::child_const_range &r)
Support for range-based for loops for PcpNodeRef children ranges.
Definition: node.h:558