/src/openexr/src/lib/OpenEXR/ImfOpaqueAttribute.cpp
Line | Count | Source |
1 | | // |
2 | | // SPDX-License-Identifier: BSD-3-Clause |
3 | | // Copyright (c) Contributors to the OpenEXR Project. |
4 | | // |
5 | | |
6 | | //----------------------------------------------------------------------------- |
7 | | // |
8 | | // class OpaqueAttribute |
9 | | // |
10 | | //----------------------------------------------------------------------------- |
11 | | |
12 | | #include "Iex.h" |
13 | | #include "ImfNamespace.h" |
14 | | #include <ImfOpaqueAttribute.h> |
15 | | #include <string.h> |
16 | | |
17 | | OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER |
18 | | |
19 | | #if defined(_MSC_VER) |
20 | | // suppress warning about non-exported base classes |
21 | | # pragma warning(disable : 4251) |
22 | | # pragma warning(disable : 4275) |
23 | | #endif |
24 | | |
25 | | OpaqueAttribute::OpaqueAttribute (const char typeName[]) |
26 | 0 | : _typeName (typeName), _dataSize (0) |
27 | 0 | {} |
28 | | |
29 | | OpaqueAttribute::OpaqueAttribute (const char typeName[], |
30 | | long dataSize, |
31 | | const void* data) |
32 | 58.8k | : _typeName (typeName), _dataSize (dataSize) |
33 | 58.8k | { |
34 | 58.8k | _data.resizeErase (dataSize); |
35 | 58.8k | memcpy ((char*) _data, (const char*) data, dataSize); |
36 | 58.8k | } |
37 | | |
38 | | OpaqueAttribute::OpaqueAttribute (const OpaqueAttribute& other) |
39 | 58.8k | : _typeName (other._typeName) |
40 | 58.8k | , _dataSize (other._dataSize) |
41 | 58.8k | , _data (other._dataSize) |
42 | 58.8k | { |
43 | 58.8k | _data.resizeErase (other._dataSize); |
44 | 58.8k | memcpy ((char*) _data, (const char*) other._data, other._dataSize); |
45 | 58.8k | } |
46 | | |
47 | | OpaqueAttribute::~OpaqueAttribute () |
48 | 117k | { |
49 | | // empty |
50 | 117k | } |
51 | | |
52 | | const char* |
53 | | OpaqueAttribute::typeName () const |
54 | 349 | { |
55 | 349 | return _typeName.c_str (); |
56 | 349 | } |
57 | | |
58 | | Attribute* |
59 | | OpaqueAttribute::copy () const |
60 | 58.8k | { |
61 | 58.8k | return new OpaqueAttribute (*this); |
62 | 58.8k | } |
63 | | |
64 | | void |
65 | | OpaqueAttribute::writeValueTo ( |
66 | | OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, int version) const |
67 | 0 | { |
68 | 0 | Xdr::write<StreamIO> (os, _data, _dataSize); |
69 | 0 | } |
70 | | |
71 | | void |
72 | | OpaqueAttribute::readValueFrom ( |
73 | | OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int size, int version) |
74 | 0 | { |
75 | 0 | _data.resizeErase (size); |
76 | 0 | _dataSize = size; |
77 | 0 | Xdr::read<StreamIO> (is, _data, size); |
78 | 0 | } |
79 | | |
80 | | void |
81 | | OpaqueAttribute::copyValueFrom (const Attribute& other) |
82 | 0 | { |
83 | 0 | const OpaqueAttribute* oa = dynamic_cast<const OpaqueAttribute*> (&other); |
84 | |
|
85 | 0 | if (oa == 0 || _typeName != oa->_typeName) |
86 | 0 | { |
87 | 0 | THROW ( |
88 | 0 | IEX_NAMESPACE::TypeExc, |
89 | 0 | "Cannot copy the value of an " |
90 | 0 | "image file attribute of type " |
91 | 0 | "\"" << other.typeName () |
92 | 0 | << "\" " |
93 | 0 | "to an attribute of type " |
94 | 0 | "\"" |
95 | 0 | << _typeName << "\"."); |
96 | 0 | } |
97 | | |
98 | 0 | _data.resizeErase (oa->_dataSize); |
99 | 0 | _dataSize = oa->_dataSize; |
100 | 0 | memcpy ((char*) _data, (const char*) oa->_data, oa->_dataSize); |
101 | 0 | } |
102 | | |
103 | | OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT |