Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/IlmImf/ImfFrameBuffer.h
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
#ifndef INCLUDED_IMF_FRAME_BUFFER_H
38
#define INCLUDED_IMF_FRAME_BUFFER_H
39
40
//-----------------------------------------------------------------------------
41
//
42
// class Slice
43
// class FrameBuffer
44
//
45
//-----------------------------------------------------------------------------
46
47
#include <ImfName.h>
48
#include <ImfPixelType.h>
49
#include <map>
50
#include <string>
51
52
53
namespace Imf {
54
55
56
//-------------------------------------------------------
57
// Description of a single slice of the frame buffer:
58
//
59
// Note -- terminology: as part of a file, a component of
60
// an image (e.g. red, green, blue, depth etc.) is called
61
// a "channel". As part of a frame buffer, an image
62
// component is called a "slice".
63
//-------------------------------------------------------
64
65
struct Slice
66
{
67
//------------------------------
68
// Data type; see ImfPixelType.h
69
//------------------------------
70
71
PixelType type;
72
73
74
//---------------------------------------------------------------------
75
// Memory layout: The address of pixel (x, y) is
76
//
77
// base + (xp / xSampling) * xStride + (yp / ySampling) * yStride
78
//
79
// where xp and yp are computed as follows:
80
//
81
// * If we are reading or writing a scanline-based file:
82
//
83
// xp = x
84
// yp = y
85
//
86
// * If we are reading a tile whose upper left coorner is at (xt, yt):
87
//
88
// if xTileCoords is true then xp = x - xt, else xp = x
89
// if yTileCoords is true then yp = y - yt, else yp = y
90
//
91
//---------------------------------------------------------------------
92
93
char * base;
94
size_t xStride;
95
size_t yStride;
96
97
98
//--------------------------------------------
99
// Subsampling: pixel (x, y) is present in the
100
// slice only if
101
//
102
// x % xSampling == 0 && y % ySampling == 0
103
//
104
//--------------------------------------------
105
106
int xSampling;
107
int ySampling;
108
109
110
//----------------------------------------------------------
111
// Default value, used to fill the slice when a file without
112
// a channel that corresponds to this slice is read.
113
//----------------------------------------------------------
114
115
double fillValue;
116
117
118
//-------------------------------------------------------
119
// For tiled files, the xTileCoords and yTileCoords flags
120
// determine whether pixel addressing is performed using
121
// absolute coordinates or coordinates relative to a
122
// tile's upper left corner. (See the comment on base,
123
// xStride and yStride, above.)
124
//
125
// For scanline-based files these flags have no effect;
126
// pixel addressing is always done using absolute
127
// coordinates.
128
//-------------------------------------------------------
129
130
bool xTileCoords;
131
bool yTileCoords;
132
133
134
//------------
135
// Constructor
136
//------------
137
138
Slice (PixelType type = HALF,
139
char * base = 0,
140
size_t xStride = 0,
141
size_t yStride = 0,
142
int xSampling = 1,
143
int ySampling = 1,
144
double fillValue = 0.0,
145
bool xTileCoords = false,
146
bool yTileCoords = false);
147
};
148
149
150
class FrameBuffer
151
{
152
public:
153
154
//------------
155
// Add a slice
156
//------------
157
158
void insert (const char name[],
159
const Slice &slice);
160
161
void insert (const std::string &name,
162
const Slice &slice);
163
164
//----------------------------------------------------------------
165
// Access to existing slices:
166
//
167
// [n] Returns a reference to the slice with name n.
168
// If no slice with name n exists, an Iex::ArgExc
169
// is thrown.
170
//
171
// findSlice(n) Returns a pointer to the slice with name n,
172
// or 0 if no slice with name n exists.
173
//
174
//----------------------------------------------------------------
175
176
Slice & operator [] (const char name[]);
177
const Slice & operator [] (const char name[]) const;
178
179
Slice & operator [] (const std::string &name);
180
const Slice & operator [] (const std::string &name) const;
181
182
Slice * findSlice (const char name[]);
183
const Slice * findSlice (const char name[]) const;
184
185
Slice * findSlice (const std::string &name);
186
const Slice * findSlice (const std::string &name) const;
187
188
189
//-----------------------------------------
190
// Iterator-style access to existing slices
191
//-----------------------------------------
192
193
typedef std::map <Name, Slice> SliceMap;
194
195
class Iterator;
196
class ConstIterator;
197
198
Iterator begin ();
199
ConstIterator begin () const;
200
201
Iterator end ();
202
ConstIterator end () const;
203
204
Iterator find (const char name[]);
205
ConstIterator find (const char name[]) const;
206
207
Iterator find (const std::string &name);
208
ConstIterator find (const std::string &name) const;
209
210
private:
211
212
SliceMap _map;
213
};
214
215
216
//----------
217
// Iterators
218
//----------
219
220
class FrameBuffer::Iterator
221
{
222
public:
223
224
Iterator ();
225
Iterator (const FrameBuffer::SliceMap::iterator &i);
226
227
Iterator & operator ++ ();
228
Iterator operator ++ (int);
229
230
const char * name () const;
231
Slice & slice () const;
232
233
private:
234
235
friend class FrameBuffer::ConstIterator;
236
237
FrameBuffer::SliceMap::iterator _i;
238
};
239
240
241
class FrameBuffer::ConstIterator
242
{
243
public:
244
245
ConstIterator ();
246
ConstIterator (const FrameBuffer::SliceMap::const_iterator &i);
247
ConstIterator (const FrameBuffer::Iterator &other);
248
249
ConstIterator & operator ++ ();
250
ConstIterator operator ++ (int);
251
252
const char * name () const;
253
const Slice & slice () const;
254
255
private:
256
257
friend bool operator == (const ConstIterator &, const ConstIterator &);
258
friend bool operator != (const ConstIterator &, const ConstIterator &);
259
260
FrameBuffer::SliceMap::const_iterator _i;
261
};
262
263
264
//-----------------
265
// Inline Functions
266
//-----------------
267
268
inline
269
FrameBuffer::Iterator::Iterator (): _i()
270
{
271
// empty
272
}
273
274
275
inline
276
FrameBuffer::Iterator::Iterator (const FrameBuffer::SliceMap::iterator &i):
277
_i (i)
278
{
279
// empty
280
}
281
282
283
inline FrameBuffer::Iterator &
284
FrameBuffer::Iterator::operator ++ ()
285
{
286
++_i;
287
return *this;
288
}
289
290
291
inline FrameBuffer::Iterator
292
FrameBuffer::Iterator::operator ++ (int)
293
{
294
Iterator tmp = *this;
295
++_i;
296
return tmp;
297
}
298
299
300
inline const char *
301
FrameBuffer::Iterator::name () const
302
{
303
return *_i->first;
304
}
305
306
307
inline Slice &
308
FrameBuffer::Iterator::slice () const
309
{
310
return _i->second;
311
}
312
313
314
inline
315
FrameBuffer::ConstIterator::ConstIterator (): _i()
316
{
317
// empty
318
}
319
320
inline
321
FrameBuffer::ConstIterator::ConstIterator
322
(const FrameBuffer::SliceMap::const_iterator &i): _i (i)
323
{
324
// empty
325
}
326
327
328
inline
329
FrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::Iterator &other):
330
_i (other._i)
331
{
332
// empty
333
}
334
335
inline FrameBuffer::ConstIterator &
336
FrameBuffer::ConstIterator::operator ++ ()
337
{
338
++_i;
339
return *this;
340
}
341
342
343
inline FrameBuffer::ConstIterator
344
FrameBuffer::ConstIterator::operator ++ (int)
345
{
346
ConstIterator tmp = *this;
347
++_i;
348
return tmp;
349
}
350
351
352
inline const char *
353
FrameBuffer::ConstIterator::name () const
354
{
355
return *_i->first;
356
}
357
358
inline const Slice &
359
FrameBuffer::ConstIterator::slice () const
360
{
361
return _i->second;
362
}
363
364
365
inline bool
366
operator == (const FrameBuffer::ConstIterator &x,
367
const FrameBuffer::ConstIterator &y)
368
{
369
return x._i == y._i;
370
}
371
372
373
inline bool
374
operator != (const FrameBuffer::ConstIterator &x,
375
const FrameBuffer::ConstIterator &y)
376
{
377
return !(x == y);
378
}
379
380
381
} // namespace Imf
382
383
#endif
384
385