• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MISC_H
38 #define INCLUDED_IMF_MISC_H
39 
40 //-----------------------------------------------------------------------------
41 //
42 //	Miscellaneous helper functions for OpenEXR image file I/O
43 //
44 //-----------------------------------------------------------------------------
45 
46 #include <ImfPixelType.h>
47 #include <vector>
48 #include <ImfCompressor.h>
49 
50 namespace Imf {
51 
52 class Header;
53 
54 //
55 // Return the size of a single value of the indicated type,
56 // in the machine's native format.
57 //
58 
59 int	pixelTypeSize (PixelType type);
60 
61 
62 //
63 // Return the number of samples a channel with subsampling rate
64 // s has in the interval [a, b].  For example, a channel with
65 // subsampling rate 2 (and samples at 0, 2, 4, 6, 8, etc.) has
66 // 2 samples in the interval [1, 5] and three samples in the
67 // interval [2, 6].
68 //
69 
70 int	numSamples (int s, int a, int b);
71 
72 
73 //
74 // Build a table that lists, for each scanline in a file's
75 // data window, how many bytes are required to store all
76 // pixels in all channels in that scanline (assuming that
77 // the pixel data are tightly packed).
78 //
79 
80 size_t	bytesPerLineTable (const Header &header,
81                    std::vector<size_t> &bytesPerLine);
82 
83 //
84 // For scanline-based files, pixels are read or written in
85 // in multi-scanline blocks.  Internally, class OutputFile
86 // and class ScanLineInputFile store a block of scan lines
87 // in a "line buffer".  Function offsetInLineBufferTable()
88 // builds a table that lists, for each scan line in a file's
89 // data window, the location of the pixel data for the scanline
90 // relative to the beginning of the line buffer.
91 //
92 
93 void	offsetInLineBufferTable (const std::vector<size_t> &bytesPerLine,
94                  int linesInLineBuffer,
95                  std::vector<size_t> &offsetInLineBuffer);
96 
97 //
98 // For a scanline-based file, compute the range of scanlines
99 // that occupy the same line buffer as a given scanline, y.
100 // (minY is the minimum y coordinate of the file's data window.)
101 //
102 
103 int	lineBufferMinY (int y, int minY, int linesInLineBuffer);
104 int	lineBufferMaxY (int y, int minY, int linesInLineBuffer);
105 
106 
107 //
108 // Return a compressor's data format (Compressor::NATIVE or Compressor::XDR).
109 // If compressor is 0, return Compressor::XDR.
110 //
111 
112 Compressor::Format defaultFormat (Compressor *compressor);
113 
114 
115 //
116 // Return the number of scan lines a compressor wants to compress
117 // or uncompress at once.  If compressor is 0, return 1.
118 //
119 
120 int     numLinesInBuffer (Compressor *compressor);
121 
122 
123 //
124 // Copy a single channel of a horizontal row of pixels from an
125 // input file's internal line buffer or tile buffer into a
126 // frame buffer slice.  If necessary, perform on-the-fly data
127 // type conversion.
128 //
129 //    readPtr		initially points to the beginning of the
130 //			data in the line or tile buffer. readPtr
131 //			is advanced as the pixel data are copied;
132 //			when copyIntoFrameBuffer() returns,
133 //			readPtr points just past the end of the
134 //			copied data.
135 //
136 //    writePtr, endPtr	point to the lefmost and rightmost pixels
137 //			in the frame buffer slice
138 //
139 //    xStride		the xStride for the frame buffer slice
140 //
141 //    format		indicates if the line or tile buffer is
142 //			in NATIVE or XDR format.
143 //
144 //    typeInFrameBuffer the pixel data type of the frame buffer slice
145 //
146 //    typeInFile        the pixel data type in the input file's channel
147 //
148 
149 void    copyIntoFrameBuffer (const char *&readPtr,
150                  char *writePtr,
151                              char *endPtr,
152                  size_t xStride,
153                  bool fill,
154                              double fillValue,
155                  Compressor::Format format,
156                              PixelType typeInFrameBuffer,
157                              PixelType typeInFile);
158 
159 //
160 // Given a pointer into a an input file's line buffer or tile buffer,
161 // skip over the data for xSize pixels of type typeInFile.
162 // readPtr initially points to the beginning of the data to be skipped;
163 // when skipChannel() returns, readPtr points just past the end of the
164 // skipped data.
165 //
166 
167 void    skipChannel (const char *&readPtr,
168              PixelType typeInFile,
169              size_t xSize);
170 
171 //
172 // Convert an array of pixel data from the machine's native
173 // representation to XDR format.
174 //
175 //    toPtr, fromPtr	initially point to the beginning of the input
176 //			and output pixel data arrays; when convertInPlace()
177 //			returns, toPtr and fromPtr point just past the
178 //			end of the input and output arrays.
179 // 			If the native representation of the data has the
180 //			same size as the XDR data, then the conversion
181 //			can take in place, without an intermediate
182 //			temporary buffer (toPtr and fromPtr can point
183 //			to the same location).
184 //
185 //    type		the pixel data type
186 //
187 //    numPixels		number of pixels in the input and output arrays
188 //
189 
190 void    convertInPlace (char *&toPtr,
191             const char *&fromPtr,
192             PixelType type,
193                         size_t numPixels);
194 
195 //
196 // Copy a single channel of a horizontal row of pixels from a
197 // a frame buffer into an output file's internal line buffer or
198 // tile buffer.
199 //
200 //    writePtr		initially points to the beginning of the
201 //			data in the line or tile buffer. writePtr
202 //			is advanced as the pixel data are copied;
203 //			when copyFromFrameBuffer() returns,
204 //			writePtr points just past the end of the
205 //			copied data.
206 //
207 //    readPtr, endPtr	point to the lefmost and rightmost pixels
208 //			in the frame buffer slice
209 //
210 //    xStride		the xStride for the frame buffer slice
211 //
212 //    format		indicates if the line or tile buffer is
213 //			in NATIVE or XDR format.
214 //
215 //    type              the pixel data type in the frame buffer
216 //			and in the output file's channel (function
217 //			copyFromFrameBuffer() doesn't do on-the-fly
218 //			data type conversion)
219 //
220 
221 void    copyFromFrameBuffer (char *&writePtr,
222                  const char *&readPtr,
223                              const char *endPtr,
224                  size_t xStride,
225                              Compressor::Format format,
226                  PixelType type);
227 
228 //
229 // Fill part of an output file's line buffer or tile buffer with
230 // zeroes.  This routine is called when an output file contains
231 // a channel for which the frame buffer contains no corresponding
232 // slice.
233 //
234 //    writePtr		initially points to the beginning of the
235 //			data in the line or tile buffer.  When
236 //			fillChannelWithZeroes() returns, writePtr
237 //			points just past the end of the zeroed
238 //			data.
239 //
240 //    format		indicates if the line or tile buffer is
241 //			in NATIVE or XDR format.
242 //
243 //    type              the pixel data type in the line or frame buffer.
244 //
245 //    xSize             number of pixels to be filled with zeroes.
246 //
247 
248 void    fillChannelWithZeroes (char *&writePtr,
249                    Compressor::Format format,
250                    PixelType type,
251                    size_t xSize);
252 
253 } // namespace Imf
254 
255 #endif
256