1 //
2 // SPDX-License-Identifier: BSD-3-Clause
3 // Copyright (c) Contributors to the OpenEXR Project.
4 //
5
6 #include "ImfGenericOutputFile.h"
7
8 #include "ImfVersion.h"
9 #include "ImfIO.h"
10 #include "ImfXdr.h"
11 #include "ImfHeader.h"
12 #include "ImfBoxAttribute.h"
13 #include "ImfFloatAttribute.h"
14 #include "ImfTimeCodeAttribute.h"
15 #include "ImfChromaticitiesAttribute.h"
16
17 #include "ImfMisc.h"
18 #include "ImfPartType.h"
19
20
21 OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
22
23
24 using namespace std;
25
~GenericOutputFile()26 GenericOutputFile::~GenericOutputFile ()
27 {}
28
GenericOutputFile()29 GenericOutputFile::GenericOutputFile ()
30 {}
31
32 void
writeMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::OStream & os,const Header & header)33 GenericOutputFile::writeMagicNumberAndVersionField (
34 OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header& header)
35 {
36 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, MAGIC);
37
38 int version = EXR_VERSION;
39
40 if (header.hasType() && isDeepData(header.type()))
41 {
42 version |= NON_IMAGE_FLAG;
43 }
44 else
45 {
46 // (TODO) we may want to check something else in function signature
47 // instead of hasTileDescription()?
48 if (header.hasTileDescription())
49 version |= TILED_FLAG;
50 }
51
52 if (usesLongNames (header))
53 version |= LONG_NAMES_FLAG;
54
55 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, version);
56 }
57
58 void
writeMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::OStream & os,const Header * headers,int parts)59 GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os,
60 const Header * headers,
61 int parts)
62 {
63 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, MAGIC);
64
65 int version = EXR_VERSION;
66
67 if (parts == 1)
68 {
69 if (headers[0].type() == TILEDIMAGE)
70 version |= TILED_FLAG;
71 }
72 else
73 {
74 version |= MULTI_PART_FILE_FLAG;
75 }
76
77 for (int i = 0; i < parts; i++)
78 {
79 if (usesLongNames (headers[i]))
80 version |= LONG_NAMES_FLAG;
81
82 if (headers[i].hasType() && isImage(headers[i].type()) == false)
83 version |= NON_IMAGE_FLAG;
84 }
85
86 OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, version);
87 }
88
89 OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT
90