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_VERSION_H
37 #define INCLUDED_IMF_VERSION_H
38 
39 //-----------------------------------------------------------------------------
40 //
41 //	Magic and version number.
42 //
43 //-----------------------------------------------------------------------------
44 
45 
46 namespace Imf {
47 
48 
49 //
50 // The MAGIC number is stored in the first four bytes of every
51 // OpenEXR image file.  This can be used to quickly test whether
52 // a given file is an OpenEXR image file (see isImfMagic(), below).
53 //
54 
55 const int MAGIC = 20000630;
56 
57 
58 //
59 // The second item in each OpenEXR image file, right after the
60 // magic number, is a four-byte file version identifier.  Depending
61 // on a file's version identifier, a file reader can enable various
62 // backwards-compatibility switches, or it can quickly reject files
63 // that it cannot read.
64 //
65 // The version identifier is split into an 8-bit version number,
66 // and a 24-bit flags field.
67 //
68 
69 const int VERSION_NUMBER_FIELD	= 0x000000ff;
70 const int VERSION_FLAGS_FIELD	= 0xffffff00;
71 
72 
73 //
74 // Value that goes into VERSION_NUMBER_FIELD.
75 //
76 
77 const int EXR_VERSION		= 2;
78 
79 
80 //
81 // Flags that can go into VERSION_FLAGS_FIELD.
82 // Flags can only occupy the 1 bits in VERSION_FLAGS_FIELD.
83 //
84 
85 const int TILED_FLAG		= 0x00000200;   // File is tiled
86 
87 const int LONG_NAMES_FLAG       = 0x00000400;   // File contains long
88                                                 // attribute or channel
89                                                 // names
90 
91 //
92 // Bitwise OR of all known flags.
93 //
94 
95 const int ALL_FLAGS		= TILED_FLAG | LONG_NAMES_FLAG;
96 
97 
98 //
99 // Utility functions
100 //
101 
isTiled(int version)102 inline bool  isTiled (int version)	{return !!(version & TILED_FLAG);}
makeTiled(int version)103 inline int   makeTiled (int version)	{return version | TILED_FLAG;}
makeNotTiled(int version)104 inline int   makeNotTiled (int version) {return version & ~TILED_FLAG;}
getVersion(int version)105 inline int   getVersion (int version)	{return version & VERSION_NUMBER_FIELD;}
getFlags(int version)106 inline int   getFlags (int version)	{return version & VERSION_FLAGS_FIELD;}
supportsFlags(int flags)107 inline bool  supportsFlags (int flags)	{return !(flags & ~ALL_FLAGS);}
108 
109 
110 //
111 // Given the first four bytes of a file, returns true if the
112 // file is probably an OpenEXR image file, false if not.
113 //
114 
115 bool	     isImfMagic (const char bytes[4]);
116 
117 
118 } // namespace Imf
119 
120 #endif
121