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//
37//	Utility routines to test quickly if a given
38//	file is an OpenEXR file, and whether the
39//	file is scanline-based or tiled.
40//
41//-----------------------------------------------------------------------------
42
43
44#include <ImfTestFile.h>
45#include <ImfStdIO.h>
46#include <ImfXdr.h>
47#include <ImfVersion.h>
48
49namespace Imf {
50
51
52bool
53isOpenExrFile (const char fileName[], bool &tiled)
54{
55    try
56    {
57	StdIFStream is (fileName);
58
59	int magic, version;
60	Xdr::read <StreamIO> (is, magic);
61	Xdr::read <StreamIO> (is, version);
62
63	tiled = isTiled (version);
64	return magic == MAGIC;
65    }
66    catch (...)
67    {
68	tiled = false;
69	return false;
70    }
71}
72
73
74bool
75isOpenExrFile (const char fileName[])
76{
77    bool tiled;
78    return isOpenExrFile (fileName, tiled);
79}
80
81
82bool
83isTiledOpenExrFile (const char fileName[])
84{
85    bool exr, tiled;
86    exr = isOpenExrFile (fileName, tiled);
87    return exr && tiled;
88}
89
90
91bool
92isOpenExrFile (IStream &is, bool &tiled)
93{
94    try
95    {
96	Int64 pos = is.tellg();
97
98	if (pos != 0)
99	    is.seekg (0);
100
101	int magic, version;
102	Xdr::read <StreamIO> (is, magic);
103	Xdr::read <StreamIO> (is, version);
104
105	is.seekg (pos);
106
107	tiled = isTiled (version);
108	return magic == MAGIC;
109    }
110    catch (...)
111    {
112	is.clear();
113	tiled = false;
114	return false;
115    }
116}
117
118
119bool
120isOpenExrFile (IStream &is)
121{
122    bool tiled;
123    return isOpenExrFile (is, tiled);
124}
125
126
127bool
128isTiledOpenExrFile (IStream &is)
129{
130    bool exr, tiled;
131    exr = isOpenExrFile (is, tiled);
132    return exr && tiled;
133}
134
135} // namespace Imf
136