1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2011, 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 #include "ImfGenericOutputFile.h"
36
37 #include <ImfBoxAttribute.h>
38 #include <ImfFloatAttribute.h>
39 #include <ImfTimeCodeAttribute.h>
40 #include <ImfChromaticitiesAttribute.h>
41
42 #include <ImfMisc.h>
43 #include <ImfPartType.h>
44
45 #include "ImfNamespace.h"
46
47
48 OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
49
50
51 using namespace std;
52
53
54
55 void
writeMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::OStream & os,const Header & header)56 GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os,
57 const Header& header)
58 {
59 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, MAGIC);
60
61 int version = EXR_VERSION;
62
63 if (header.hasType() && isDeepData(header.type()))
64 {
65 version |= NON_IMAGE_FLAG;
66 }
67 else
68 {
69 // (TODO) we may want to check something else in function signature
70 // instead of hasTileDescription()?
71 if (header.hasTileDescription())
72 version |= TILED_FLAG;
73 }
74
75 if (usesLongNames (header))
76 version |= LONG_NAMES_FLAG;
77
78 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, version);
79 }
80
81 void
writeMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::OStream & os,const Header * headers,int parts)82 GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os,
83 const Header * headers,
84 int parts)
85 {
86 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, MAGIC);
87
88 int version = EXR_VERSION;
89
90 if (parts == 1)
91 {
92 if (headers[0].type() == TILEDIMAGE)
93 version |= TILED_FLAG;
94 }
95 else
96 {
97 version |= MULTI_PART_FILE_FLAG;
98 }
99
100 for (int i = 0; i < parts; i++)
101 {
102 if (usesLongNames (headers[i]))
103 version |= LONG_NAMES_FLAG;
104
105 if (headers[i].hasType() && isImage(headers[i].type()) == false)
106 version |= NON_IMAGE_FLAG;
107 }
108
109 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, version);
110 }
111
112 OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT
113