Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/IlmImf/ImfChannelList.cpp
16337 views
1
///////////////////////////////////////////////////////////////////////////
2
//
3
// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
4
// Digital Ltd. LLC
5
//
6
// All rights reserved.
7
//
8
// Redistribution and use in source and binary forms, with or without
9
// modification, are permitted provided that the following conditions are
10
// met:
11
// * Redistributions of source code must retain the above copyright
12
// notice, this list of conditions and the following disclaimer.
13
// * Redistributions in binary form must reproduce the above
14
// copyright notice, this list of conditions and the following disclaimer
15
// in the documentation and/or other materials provided with the
16
// distribution.
17
// * Neither the name of Industrial Light & Magic nor the names of
18
// its contributors may be used to endorse or promote products derived
19
// from this software without specific prior written permission.
20
//
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
//
33
///////////////////////////////////////////////////////////////////////////
34
35
36
37
//-----------------------------------------------------------------------------
38
//
39
// class Channel
40
// class ChannelList
41
//
42
//-----------------------------------------------------------------------------
43
44
#include <ImfChannelList.h>
45
#include <Iex.h>
46
47
48
using std::string;
49
using std::set;
50
51
namespace Imf {
52
53
54
Channel::Channel (PixelType t, int xs, int ys, bool pl):
55
type (t),
56
xSampling (xs),
57
ySampling (ys),
58
pLinear (pl)
59
{
60
// empty
61
}
62
63
64
bool
65
Channel::operator == (const Channel &other) const
66
{
67
return type == other.type &&
68
xSampling == other.xSampling &&
69
ySampling == other.ySampling &&
70
pLinear == other.pLinear;
71
}
72
73
74
void
75
ChannelList::insert (const char name[], const Channel &channel)
76
{
77
if (name[0] == 0)
78
THROW (Iex::ArgExc, "Image channel name cannot be an empty string.");
79
80
_map[name] = channel;
81
}
82
83
84
void
85
ChannelList::insert (const string &name, const Channel &channel)
86
{
87
insert (name.c_str(), channel);
88
}
89
90
91
Channel &
92
ChannelList::operator [] (const char name[])
93
{
94
ChannelMap::iterator i = _map.find (name);
95
96
if (i == _map.end())
97
THROW (Iex::ArgExc, "Cannot find image channel \"" << name << "\".");
98
99
return i->second;
100
}
101
102
103
const Channel &
104
ChannelList::operator [] (const char name[]) const
105
{
106
ChannelMap::const_iterator i = _map.find (name);
107
108
if (i == _map.end())
109
THROW (Iex::ArgExc, "Cannot find image channel \"" << name << "\".");
110
111
return i->second;
112
}
113
114
115
Channel &
116
ChannelList::operator [] (const string &name)
117
{
118
return this->operator[] (name.c_str());
119
}
120
121
122
const Channel &
123
ChannelList::operator [] (const string &name) const
124
{
125
return this->operator[] (name.c_str());
126
}
127
128
129
Channel *
130
ChannelList::findChannel (const char name[])
131
{
132
ChannelMap::iterator i = _map.find (name);
133
return (i == _map.end())? 0: &i->second;
134
}
135
136
137
const Channel *
138
ChannelList::findChannel (const char name[]) const
139
{
140
ChannelMap::const_iterator i = _map.find (name);
141
return (i == _map.end())? 0: &i->second;
142
}
143
144
145
Channel *
146
ChannelList::findChannel (const string &name)
147
{
148
return findChannel (name.c_str());
149
}
150
151
152
const Channel *
153
ChannelList::findChannel (const string &name) const
154
{
155
return findChannel (name.c_str());
156
}
157
158
159
ChannelList::Iterator
160
ChannelList::begin ()
161
{
162
return _map.begin();
163
}
164
165
166
ChannelList::ConstIterator
167
ChannelList::begin () const
168
{
169
return _map.begin();
170
}
171
172
173
ChannelList::Iterator
174
ChannelList::end ()
175
{
176
return _map.end();
177
}
178
179
180
ChannelList::ConstIterator
181
ChannelList::end () const
182
{
183
return _map.end();
184
}
185
186
187
ChannelList::Iterator
188
ChannelList::find (const char name[])
189
{
190
return _map.find (name);
191
}
192
193
194
ChannelList::ConstIterator
195
ChannelList::find (const char name[]) const
196
{
197
return _map.find (name);
198
}
199
200
201
ChannelList::Iterator
202
ChannelList::find (const string &name)
203
{
204
return find (name.c_str());
205
}
206
207
208
ChannelList::ConstIterator
209
ChannelList::find (const string &name) const
210
{
211
return find (name.c_str());
212
}
213
214
215
void
216
ChannelList::layers (set <string> &layerNames) const
217
{
218
layerNames.clear();
219
220
for (ConstIterator i = begin(); i != end(); ++i)
221
{
222
string layerName = i.name();
223
size_t pos = layerName.rfind ('.');
224
225
if (pos != string::npos && pos != 0 && pos + 1 < layerName.size())
226
{
227
layerName.erase (pos);
228
layerNames.insert (layerName);
229
}
230
}
231
}
232
233
234
void
235
ChannelList::channelsInLayer (const string &layerName,
236
Iterator &first,
237
Iterator &last)
238
{
239
channelsWithPrefix (layerName + '.', first, last);
240
}
241
242
243
void
244
ChannelList::channelsInLayer (const string &layerName,
245
ConstIterator &first,
246
ConstIterator &last) const
247
{
248
channelsWithPrefix (layerName + '.', first, last);
249
}
250
251
252
void
253
ChannelList::channelsWithPrefix (const char prefix[],
254
Iterator &first,
255
Iterator &last)
256
{
257
first = last = _map.lower_bound (prefix);
258
int n = strlen (prefix);
259
260
while (last != Iterator (_map.end()) &&
261
strncmp (last.name(), prefix, n) <= 0)
262
{
263
++last;
264
}
265
}
266
267
268
void
269
ChannelList::channelsWithPrefix (const char prefix[],
270
ConstIterator &first,
271
ConstIterator &last) const
272
{
273
first = last = _map.lower_bound (prefix);
274
int n = strlen (prefix);
275
276
while (last != ConstIterator (_map.end()) &&
277
strncmp (last.name(), prefix, n) <= 0)
278
{
279
++last;
280
}
281
}
282
283
284
void
285
ChannelList::channelsWithPrefix (const string &prefix,
286
Iterator &first,
287
Iterator &last)
288
{
289
return channelsWithPrefix (prefix.c_str(), first, last);
290
}
291
292
293
void
294
ChannelList::channelsWithPrefix (const string &prefix,
295
ConstIterator &first,
296
ConstIterator &last) const
297
{
298
return channelsWithPrefix (prefix.c_str(), first, last);
299
}
300
301
302
bool
303
ChannelList::operator == (const ChannelList &other) const
304
{
305
ConstIterator i = begin();
306
ConstIterator j = other.begin();
307
308
while (i != end() && j != other.end())
309
{
310
if (!(i.channel() == j.channel()))
311
return false;
312
313
++i;
314
++j;
315
}
316
317
return i == end() && j == other.end();
318
}
319
320
321
} // namespace Imf
322
323