• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004, 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 #ifndef INCLUDED_IMF_INPUT_FILE_H
37 #define INCLUDED_IMF_INPUT_FILE_H
38 
39 //-----------------------------------------------------------------------------
40 //
41 //	class InputFile -- a scanline-based interface that can be used
42 //	to read both scanline-based and tiled OpenEXR image files.
43 //
44 //-----------------------------------------------------------------------------
45 
46 #include <ImfHeader.h>
47 #include <ImfFrameBuffer.h>
48 #include <ImfTiledOutputFile.h>
49 #include <string>
50 #include <fstream>
51 #include <ImfThreading.h>
52 
53 namespace Imf {
54 
55 class TiledInputFile;
56 class ScanLineInputFile;
57 
58 
59 class InputFile
60 {
61   public:
62 
63     //-----------------------------------------------------------
64     // A constructor that opens the file with the specified name.
65     // Destroying the InputFile object will close the file.
66     //
67     // numThreads determines the number of threads that will be
68     // used to read the file (see ImfThreading.h).
69     //-----------------------------------------------------------
70 
71     InputFile (const char fileName[], int numThreads = globalThreadCount());
72 
73 
74     //-------------------------------------------------------------
75     // A constructor that attaches the new InputFile object to a
76     // file that has already been opened.  Destroying the InputFile
77     // object will not close the file.
78     //
79     // numThreads determines the number of threads that will be
80     // used to read the file (see ImfThreading.h).
81     //-------------------------------------------------------------
82 
83     InputFile (IStream &is, int numThreads = globalThreadCount());
84 
85 
86     //-----------
87     // Destructor
88     //-----------
89 
90     virtual ~InputFile ();
91 
92 
93     //------------------------
94     // Access to the file name
95     //------------------------
96 
97     const char *	fileName () const;
98 
99 
100     //--------------------------
101     // Access to the file header
102     //--------------------------
103 
104     const Header &	header () const;
105 
106 
107     //----------------------------------
108     // Access to the file format version
109     //----------------------------------
110 
111     int			version () const;
112 
113 
114     //-----------------------------------------------------------
115     // Set the current frame buffer -- copies the FrameBuffer
116     // object into the InputFile object.
117     //
118     // The current frame buffer is the destination for the pixel
119     // data read from the file.  The current frame buffer must be
120     // set at least once before readPixels() is called.
121     // The current frame buffer can be changed after each call
122     // to readPixels().
123     //-----------------------------------------------------------
124 
125     void		setFrameBuffer (const FrameBuffer &frameBuffer);
126 
127 
128     //-----------------------------------
129     // Access to the current frame buffer
130     //-----------------------------------
131 
132     const FrameBuffer &	frameBuffer () const;
133 
134 
135     //---------------------------------------------------------------
136     // Check if the file is complete:
137     //
138     // isComplete() returns true if all pixels in the data window are
139     // present in the input file, or false if any pixels are missing.
140     // (Another program may still be busy writing the file, or file
141     // writing may have been aborted prematurely.)
142     //---------------------------------------------------------------
143 
144     bool		isComplete () const;
145 
146 
147     //---------------------------------------------------------------
148     // Read pixel data:
149     //
150     // readPixels(s1,s2) reads all scan lines with y coordinates
151     // in the interval [min (s1, s2), max (s1, s2)] from the file,
152     // and stores them in the current frame buffer.
153     //
154     // Both s1 and s2 must be within the interval
155     // [header().dataWindow().min.y, header().dataWindow().max.y]
156     //
157     // The scan lines can be read from the file in random order, and
158     // individual scan lines may be skipped or read multiple times.
159     // For maximum efficiency, the scan lines should be read in the
160     // order in which they were written to the file.
161     //
162     // readPixels(s) calls readPixels(s,s).
163     //
164     //---------------------------------------------------------------
165 
166     void		readPixels (int scanLine1, int scanLine2);
167     void		readPixels (int scanLine);
168 
169 
170     //----------------------------------------------
171     // Read a block of raw pixel data from the file,
172     // without uncompressing it (this function is
173     // used to implement OutputFile::copyPixels()).
174     //----------------------------------------------
175 
176     void		rawPixelData (int firstScanLine,
177                       const char *&pixelData,
178                       int &pixelDataSize);
179 
180     //--------------------------------------------------
181     // Read a tile of raw pixel data from the file,
182     // without uncompressing it (this function is
183     // used to implement TiledOutputFile::copyPixels()).
184     //--------------------------------------------------
185 
186     void		rawTileData (int &dx, int &dy,
187                      int &lx, int &ly,
188                      const char *&pixelData,
189                      int &pixelDataSize);
190 
191     struct Data;
192 
193   private:
194 
195     InputFile (const InputFile &);			// not implemented
196     InputFile & operator = (const InputFile &);		// not implemented
197 
198     void		initialize ();
199     TiledInputFile *	tFile ();
200 
201     friend void TiledOutputFile::copyPixels (InputFile &);
202 
203     Data *		_data;
204 };
205 
206 
207 } // namespace Imf
208 
209 #endif
210