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