Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/IlmImf/ImfCompressor.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_COMPRESSOR_H
38
#define INCLUDED_IMF_COMPRESSOR_H
39
40
//-----------------------------------------------------------------------------
41
//
42
// class Compressor
43
//
44
//-----------------------------------------------------------------------------
45
46
#include <ImfCompression.h>
47
#include "ImathBox.h"
48
#include <stdlib.h>
49
50
namespace Imf {
51
52
class Header;
53
54
55
class Compressor
56
{
57
public:
58
59
//---------------------------------------------
60
// Constructor -- hdr is the header of the file
61
// that will be compressed or uncompressed
62
//---------------------------------------------
63
64
Compressor (const Header &hdr);
65
66
67
//-----------
68
// Destructor
69
//-----------
70
71
virtual ~Compressor ();
72
73
74
//----------------------------------------------
75
// Maximum number of scan lines processed by
76
// a single call to compress() and uncompress().
77
//----------------------------------------------
78
79
virtual int numScanLines () const = 0;
80
81
82
//--------------------------------------------
83
// Format of the pixel data read and written
84
// by the compress() and uncompress() methods.
85
// The default implementation of format()
86
// returns XDR.
87
//--------------------------------------------
88
89
enum Format
90
{
91
NATIVE, // the machine's native format
92
XDR // Xdr format
93
};
94
95
virtual Format format () const;
96
97
98
//----------------------------
99
// Access to the file's header
100
//----------------------------
101
102
const Header & header () const {return _header;}
103
104
105
//-------------------------------------------------------------------------
106
// Compress an array of bytes that represents the contents of up to
107
// numScanLines() scan lines:
108
//
109
// inPtr Input buffer (uncompressed data).
110
//
111
// inSize Number of bytes in the input buffer
112
//
113
// minY Minimum y coordinate of the scan lines to
114
// be compressed
115
//
116
// outPtr Pointer to output buffer
117
//
118
// return value Size of compressed data in output buffer
119
//
120
// Arrangement of uncompressed pixel data in the input buffer:
121
//
122
// Before calling
123
//
124
// compress (buf, size, minY, ...);
125
//
126
// the InputFile::writePixels() method gathers pixel data from the
127
// frame buffer, fb, and places them in buffer buf, like this:
128
//
129
// char *endOfBuf = buf;
130
//
131
// for (int y = minY;
132
// y <= min (minY + numScanLines() - 1, header().dataWindow().max.y);
133
// ++y)
134
// {
135
// for (ChannelList::ConstIterator c = header().channels().begin();
136
// c != header().channels().end();
137
// ++c)
138
// {
139
// if (modp (y, c.channel().ySampling) != 0)
140
// continue;
141
//
142
// for (int x = header().dataWindow().min.x;
143
// x <= header().dataWindow().max.x;
144
// ++x)
145
// {
146
// if (modp (x, c.channel().xSampling) != 0)
147
// continue;
148
//
149
// Xdr::write<CharPtrIO> (endOfBuf, fb.pixel (c, x, y));
150
// }
151
// }
152
// }
153
//
154
// int size = endOfBuf - buf;
155
//
156
//-------------------------------------------------------------------------
157
158
virtual int compress (const char *inPtr,
159
int inSize,
160
int minY,
161
const char *&outPtr) = 0;
162
163
virtual int compressTile (const char *inPtr,
164
int inSize,
165
Imath::Box2i range,
166
const char *&outPtr);
167
168
//-------------------------------------------------------------------------
169
// Uncompress an array of bytes that has been compressed by compress():
170
//
171
// inPtr Input buffer (compressed data).
172
//
173
// inSize Number of bytes in the input buffer
174
//
175
// minY Minimum y coordinate of the scan lines to
176
// be uncompressed
177
//
178
// outPtr Pointer to output buffer
179
//
180
// return value Size of uncompressed data in output buffer
181
//
182
//-------------------------------------------------------------------------
183
184
virtual int uncompress (const char *inPtr,
185
int inSize,
186
int minY,
187
const char *&outPtr) = 0;
188
189
virtual int uncompressTile (const char *inPtr,
190
int inSize,
191
Imath::Box2i range,
192
const char *&outPtr);
193
194
private:
195
196
const Header & _header;
197
};
198
199
200
//--------------------------------------
201
// Test if c is a valid compression type
202
//--------------------------------------
203
204
bool isValidCompression (Compression c);
205
206
207
//-----------------------------------------------------------------
208
// Construct a Compressor for compression type c:
209
//
210
// maxScanLineSize Maximum number of bytes per uncompressed
211
// scan line.
212
//
213
// header Header of the input or output file whose
214
// pixels will be compressed or uncompressed.
215
//
216
// return value A pointer to a new Compressor object (it
217
// is the caller's responsibility to delete
218
// the object), or 0 (if c is NO_COMPRESSION).
219
//
220
//-----------------------------------------------------------------
221
222
Compressor * newCompressor (Compression c,
223
size_t maxScanLineSize,
224
const Header &hdr);
225
226
227
//-----------------------------------------------------------------
228
// Construct a Compressor for compression type c for a tiled image:
229
//
230
// tileLineSize Maximum number of bytes per uncompressed
231
// line in a tile.
232
//
233
// numTileLines Maximum number of lines in a tile.
234
//
235
// header Header of the input or output file whose
236
// pixels will be compressed or uncompressed.
237
//
238
// return value A pointer to a new Compressor object (it
239
// is the caller's responsibility to delete
240
// the object), or 0 (if c is NO_COMPRESSION).
241
//
242
//-----------------------------------------------------------------
243
244
Compressor * newTileCompressor (Compression c,
245
size_t tileLineSize,
246
size_t numTileLines,
247
const Header &hdr);
248
249
250
} // namespace Imf
251
252
#endif
253
254