From 7d4a7e213d9c6c3f1f100a0a64915d6a873b806b Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 22 Nov 2020 22:39:43 +1300 Subject: [PATCH 01/23] This commit makes the default symbol visibility hidden for unixen builds This only applies when building shared libraries, but switches to a symbol management strategy which is more in line with Windows, where symbols must be explicitly exported (marked as default visibilty). This allows us to be much more explicit and careful about what symbols are being exposed, making our .so files tidier Signed-off-by: Kimball Thurston --- cmake/LibraryDefine.cmake | 2 + src/lib/Iex/IexBaseExc.h | 84 +++++++++++------------ src/lib/Iex/IexExport.h | 2 +- src/lib/IlmThread/IlmThread.h | 2 +- src/lib/IlmThread/IlmThreadExport.h | 18 ++--- src/lib/OpenEXR/ImfAttribute.h | 2 +- src/lib/OpenEXR/ImfExport.h | 18 ++--- src/lib/OpenEXR/ImfIO.h | 12 ++-- src/lib/OpenEXR/ImfOpaqueAttribute.h | 10 +-- src/lib/OpenEXR/ImfStdIO.h | 8 +-- src/lib/OpenEXRUtil/ImfDeepImage.h | 10 +-- src/lib/OpenEXRUtil/ImfDeepImageChannel.h | 16 ++--- src/lib/OpenEXRUtil/ImfFlatImage.h | 10 +-- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 2 +- src/lib/OpenEXRUtil/ImfImage.h | 27 +------- src/lib/OpenEXRUtil/ImfUtilExport.h | 18 ++--- 16 files changed, 97 insertions(+), 144 deletions(-) diff --git a/cmake/LibraryDefine.cmake b/cmake/LibraryDefine.cmake index 0942747daf..08ff9410fc 100644 --- a/cmake/LibraryDefine.cmake +++ b/cmake/LibraryDefine.cmake @@ -39,6 +39,8 @@ function(OPENEXR_DEFINE_LIBRARY libname) CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden ) if (_imath_extra_flags) target_compile_options(${objlib} PUBLIC ${_imath_extra_flags}) diff --git a/src/lib/Iex/IexBaseExc.h b/src/lib/Iex/IexBaseExc.h index bf57fbbfb3..e5fa40b126 100644 --- a/src/lib/Iex/IexBaseExc.h +++ b/src/lib/Iex/IexBaseExc.h @@ -27,7 +27,7 @@ IEX_INTERNAL_NAMESPACE_HEADER_ENTER // Our most basic exception class //------------------------------- -class BaseExc: public std::exception +class IEX_EXPORT BaseExc: public std::exception { public: @@ -35,34 +35,34 @@ class BaseExc: public std::exception // Constructors and destructor //---------------------------- - IEX_EXPORT BaseExc (const char *s = nullptr); - IEX_EXPORT BaseExc (const std::string &s); - IEX_EXPORT BaseExc (std::string &&s); // not noexcept because of stacktrace - IEX_EXPORT BaseExc (std::stringstream &s); + BaseExc (const char *s = nullptr); + BaseExc (const std::string &s); + BaseExc (std::string &&s); // not noexcept because of stacktrace + BaseExc (std::stringstream &s); - IEX_EXPORT BaseExc (const BaseExc &be); - IEX_EXPORT BaseExc (BaseExc &&be) noexcept; - IEX_EXPORT virtual ~BaseExc () noexcept; + BaseExc (const BaseExc &be); + BaseExc (BaseExc &&be) noexcept; + virtual ~BaseExc () noexcept; - IEX_EXPORT BaseExc & operator = (const BaseExc& be); - IEX_EXPORT BaseExc & operator = (BaseExc&& be) noexcept; + BaseExc & operator = (const BaseExc& be); + BaseExc & operator = (BaseExc&& be) noexcept; //--------------------------------------------------- // what() method -- e.what() returns _message.c_str() //--------------------------------------------------- - IEX_EXPORT virtual const char * what () const noexcept; + virtual const char * what () const noexcept; //-------------------------------------------------- // Convenient methods to change the exception's text //-------------------------------------------------- - IEX_EXPORT BaseExc & assign (std::stringstream &s); // assign (s.str()) - IEX_EXPORT BaseExc & operator = (std::stringstream &s); + BaseExc & assign (std::stringstream &s); // assign (s.str()) + BaseExc & operator = (std::stringstream &s); - IEX_EXPORT BaseExc & append (std::stringstream &s); // append (s.str()) - IEX_EXPORT BaseExc & operator += (std::stringstream &s); + BaseExc & append (std::stringstream &s); // append (s.str()) + BaseExc & operator += (std::stringstream &s); //-------------------------------------------------- @@ -70,17 +70,17 @@ class BaseExc: public std::exception // the definitions above. //-------------------------------------------------- - IEX_EXPORT BaseExc & assign (const char *s); - IEX_EXPORT BaseExc & operator = (const char *s); + BaseExc & assign (const char *s); + BaseExc & operator = (const char *s); - IEX_EXPORT BaseExc & append (const char *s); - IEX_EXPORT BaseExc & operator += (const char *s); + BaseExc & append (const char *s); + BaseExc & operator += (const char *s); //--------------------------------------------------- // Access to the string representation of the message //--------------------------------------------------- - IEX_EXPORT const std::string & message () const noexcept; + const std::string & message () const noexcept; //-------------------------------------------------- // Stack trace for the point at which the exception @@ -89,7 +89,7 @@ class BaseExc: public std::exception // has been installed (see below, setStackTracer()). //-------------------------------------------------- - IEX_EXPORT const std::string & stackTrace () const noexcept; + const std::string & stackTrace () const noexcept; private: @@ -104,32 +104,32 @@ class BaseExc: public std::exception //----------------------------------------------------- #define DEFINE_EXC_EXP(exp, name, base) \ - class name: public base \ + class exp name: public base \ { \ public: \ - exp name(); \ - exp name (const char* text); \ - exp name (const std::string &text); \ - exp name (std::string &&text); \ - exp name (std::stringstream &text); \ - exp name (const name &other); \ - exp name (name &&other) noexcept; \ - exp name& operator = (name &other); \ - exp name& operator = (name &&other) noexcept; \ - exp ~name() noexcept; \ + name(); \ + name (const char* text); \ + name (const std::string &text); \ + name (std::string &&text); \ + name (std::stringstream &text); \ + name (const name &other); \ + name (name &&other) noexcept; \ + name& operator = (name &other); \ + name& operator = (name &&other) noexcept; \ + ~name() noexcept; \ }; #define DEFINE_EXC_EXP_IMPL(exp, name, base) \ -exp name::name () : base () {} \ -exp name::name (const char* text) : base (text) {} \ -exp name::name (const std::string& text) : base (text) {} \ -exp name::name (std::string&& text) : base (std::move (text)) {} \ -exp name::name (std::stringstream& text) : base (text) {} \ -exp name::name (const name &other) : base (other) {} \ -exp name::name (name &&other) noexcept : base (other) {} \ -exp name& name::operator = (name &other) { base::operator=(other); return *this; } \ -exp name& name::operator = (name &&other) noexcept { base::operator=(other); return *this; } \ -exp name::~name () throw () {} +name::name () : base () {} \ +name::name (const char* text) : base (text) {} \ +name::name (const std::string& text) : base (text) {} \ +name::name (std::string&& text) : base (std::move (text)) {} \ +name::name (std::stringstream& text) : base (text) {} \ +name::name (const name &other) : base (other) {} \ +name::name (name &&other) noexcept : base (other) {} \ +name& name::operator = (name &other) { base::operator=(other); return *this; } \ +name& name::operator = (name &&other) noexcept { base::operator=(other); return *this; } \ +name::~name () noexcept {} // For backward compatibility. #define DEFINE_EXC(name, base) DEFINE_EXC_EXP(, name, base) diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index 980fd628f6..2d780db398 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -13,7 +13,7 @@ # define IEX_EXPORT __declspec(dllimport) # endif #else -# define IEX_EXPORT +# define IEX_EXPORT __attribute__ ((visibility ("default"))) #endif #ifndef IEX_EXPORT_TYPE # define IEX_EXPORT_TYPE diff --git a/src/lib/IlmThread/IlmThread.h b/src/lib/IlmThread/IlmThread.h index f2954b8029..4455b00c0f 100644 --- a/src/lib/IlmThread/IlmThread.h +++ b/src/lib/IlmThread/IlmThread.h @@ -79,7 +79,7 @@ ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER ILMTHREAD_EXPORT bool supportsThreads (); -class Thread +class ILMTHREAD_EXPORT Thread { public: diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index 75ad47cc5a..7a845d4837 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -4,14 +4,14 @@ // #if defined(OPENEXR_DLL) - #if defined(ILMTHREAD_EXPORTS) - #define ILMTHREAD_EXPORT __declspec(dllexport) - #define ILMTHREAD_EXPORT_CONST extern __declspec(dllexport) - #else - #define ILMTHREAD_EXPORT __declspec(dllimport) - #define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) - #endif +# if defined(ILMTHREAD_EXPORTS) +# define ILMTHREAD_EXPORT __declspec(dllexport) +# define ILMTHREAD_EXPORT_CONST extern __declspec(dllexport) +# else +# define ILMTHREAD_EXPORT __declspec(dllimport) +# define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) +# endif #else - #define ILMTHREAD_EXPORT - #define ILMTHREAD_EXPORT_CONST extern const +# define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) +# define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) #endif diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index a7e3d7fdc4..ddbb989fba 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -23,7 +23,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class Attribute +class IMF_EXPORT Attribute { public: diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index a2125943d5..daa6687c1d 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -4,14 +4,14 @@ // #if defined(OPENEXR_DLL) - #if defined(OPENEXR_EXPORTS) - #define IMF_EXPORT __declspec(dllexport) - #define IMF_EXPORT_CONST extern __declspec(dllexport) - #else - #define IMF_EXPORT __declspec(dllimport) - #define IMF_EXPORT_CONST extern __declspec(dllimport) - #endif +# if defined(OPENEXR_EXPORTS) +# define IMF_EXPORT __declspec(dllexport) +# define IMF_EXPORT_CONST extern __declspec(dllexport) +# else +# define IMF_EXPORT __declspec(dllimport) +# define IMF_EXPORT_CONST extern __declspec(dllimport) +# endif #else - #define IMF_EXPORT - #define IMF_EXPORT_CONST extern const +# define IMF_EXPORT __attribute__ ((visibility ("default"))) +# define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) #endif diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index ba27bb17af..593056e98d 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -25,7 +25,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class IStream -- an abstract base class for input streams. //----------------------------------------------------------- -class IStream +class IMF_EXPORT IStream { public: @@ -130,7 +130,7 @@ class IStream // class OStream -- an abstract base class for output streams //----------------------------------------------------------- -class OStream +class IMF_EXPORT OStream { public: @@ -200,13 +200,13 @@ class OStream struct StreamIO { - static void + static inline void writeChars (OStream &os, const char c[/*n*/], int n) { os.write (c, n); } - static bool + static inline bool readChars (IStream &is, char c[/*n*/], int n) { return is.read (c, n); @@ -216,14 +216,14 @@ struct StreamIO struct CharPtrIO { - static void + static inline void writeChars (char *&op, const char c[/*n*/], int n) { while (n--) *op++ = *c++; } - static bool + static inline bool readChars (const char *&ip, char c[/*n*/], int n) { while (n--) diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.h b/src/lib/OpenEXR/ImfOpaqueAttribute.h index 282af1c989..5dae262d79 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.h +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.h @@ -26,7 +26,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class OpaqueAttribute: public Attribute +class IMF_EXPORT OpaqueAttribute: public Attribute { public: @@ -34,11 +34,8 @@ class OpaqueAttribute: public Attribute // Constructors and destructor //---------------------------- - IMF_EXPORT OpaqueAttribute (const char typeName[]); - IMF_EXPORT OpaqueAttribute (const OpaqueAttribute &other); - IMF_EXPORT virtual ~OpaqueAttribute (); @@ -46,7 +43,6 @@ class OpaqueAttribute: public Attribute // Get this attribute's type name //------------------------------- - IMF_EXPORT virtual const char * typeName () const; @@ -54,7 +50,6 @@ class OpaqueAttribute: public Attribute // Make a copy of this attribute //------------------------------ - IMF_EXPORT virtual Attribute * copy () const; @@ -62,16 +57,13 @@ class OpaqueAttribute: public Attribute // I/O and copying //---------------- - IMF_EXPORT virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const; - IMF_EXPORT virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version); - IMF_EXPORT virtual void copyValueFrom (const Attribute &other); diff --git a/src/lib/OpenEXR/ImfStdIO.h b/src/lib/OpenEXR/ImfStdIO.h index bc012e5a2f..355d0e3aaa 100644 --- a/src/lib/OpenEXR/ImfStdIO.h +++ b/src/lib/OpenEXR/ImfStdIO.h @@ -28,7 +28,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class OPENEXR_IMF_INTERNAL_NAMESPACE::IStream based on class std::ifstream //------------------------------------------- -class StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: @@ -75,7 +75,7 @@ class StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // OPENEXR_IMF_INTERNAL_NAMESPACE::IStream, based on class std::istringstream //------------------------------------------------ -class StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: @@ -109,7 +109,7 @@ class StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // class OPENEXR_IMF_INTERNAL_NAMESPACE::OStream based on class std::ofstream //------------------------------------------- -class StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: @@ -154,7 +154,7 @@ class StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // OPENEXR_IMF_INTERNAL_NAMESPACE::OStream, based on class std::ostringstream //------------------------------------------------ -class StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: diff --git a/src/lib/OpenEXRUtil/ImfDeepImage.h b/src/lib/OpenEXRUtil/ImfDeepImage.h index 357aee08a3..26de69898e 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImage.h +++ b/src/lib/OpenEXRUtil/ImfDeepImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepImage : public Image +class IMFUTIL_EXPORT DeepImage : public Image { public: @@ -34,15 +34,12 @@ class DeepImage : public Image // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. // - IMFUTIL_EXPORT DeepImage(); - IMFUTIL_EXPORT DeepImage(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode = ONE_LEVEL, LevelRoundingMode levelRoundingMode = ROUND_DOWN); - IMFUTIL_EXPORT virtual ~DeepImage(); @@ -50,19 +47,14 @@ class DeepImage : public Image // Accessing image levels by level number // - IMFUTIL_EXPORT virtual DeepImageLevel & level(int l = 0); - IMFUTIL_EXPORT virtual const DeepImageLevel & level(int l = 0) const; - IMFUTIL_EXPORT virtual DeepImageLevel & level(int lx, int ly); - IMFUTIL_EXPORT virtual const DeepImageLevel & level(int lx, int ly) const; protected: - IMFUTIL_EXPORT virtual DeepImageLevel * newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); }; diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h index 72ad94670f..418835a4bd 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h @@ -39,7 +39,7 @@ class SampleCountChannel; // of the level. // -class DeepImageChannel: public ImageChannel +class IMFUTIL_EXPORT DeepImageChannel: public ImageChannel { public: @@ -55,24 +55,24 @@ class DeepImageChannel: public ImageChannel // Access to the image level to which this channel belongs. // - IMFUTIL_EXPORT DeepImageLevel & deepLevel(); - IMFUTIL_EXPORT const DeepImageLevel & deepLevel() const; + DeepImageLevel & deepLevel(); + const DeepImageLevel & deepLevel() const; // // Access to the sample count channel for this deep channel. // - IMFUTIL_EXPORT SampleCountChannel & sampleCounts(); - IMFUTIL_EXPORT const SampleCountChannel & sampleCounts() const; + SampleCountChannel & sampleCounts(); + const SampleCountChannel & sampleCounts() const; protected: friend class DeepImageLevel; - IMFUTIL_EXPORT DeepImageChannel (DeepImageLevel &level, bool pLinear); - IMFUTIL_EXPORT virtual ~DeepImageChannel(); + DeepImageChannel (DeepImageLevel &level, bool pLinear); + virtual ~DeepImageChannel(); DeepImageChannel (const DeepImageChannel& other) = delete; DeepImageChannel& operator = (const DeepImageChannel& other) = delete; @@ -97,7 +97,7 @@ class DeepImageChannel: public ImageChannel virtual void initializeSampleLists () = 0; - IMFUTIL_EXPORT virtual void resize (); + virtual void resize (); virtual void resetBasePointer () = 0; }; diff --git a/src/lib/OpenEXRUtil/ImfFlatImage.h b/src/lib/OpenEXRUtil/ImfFlatImage.h index c68e0b3d13..acef2d03d8 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImage.h +++ b/src/lib/OpenEXRUtil/ImfFlatImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class FlatImage : public Image +class IMFUTIL_EXPORT FlatImage : public Image { public: @@ -34,15 +34,12 @@ class FlatImage : public Image // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. // - IMFUTIL_EXPORT FlatImage(); - IMFUTIL_EXPORT FlatImage(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode = ONE_LEVEL, LevelRoundingMode levelRoundingMode = ROUND_DOWN); - IMFUTIL_EXPORT virtual ~FlatImage(); @@ -50,19 +47,14 @@ class FlatImage : public Image // Accessing image levels by level number // - IMFUTIL_EXPORT virtual FlatImageLevel & level(int l = 0); - IMFUTIL_EXPORT virtual const FlatImageLevel & level(int l = 0) const; - IMFUTIL_EXPORT virtual FlatImageLevel & level(int lx, int ly); - IMFUTIL_EXPORT virtual const FlatImageLevel & level(int lx, int ly) const; protected: - IMFUTIL_EXPORT virtual FlatImageLevel * newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); }; diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index 934ceba58b..e847da67a5 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -38,7 +38,7 @@ class FlatImageLevel; // only for pixels within the data window of the level. // -class FlatImageChannel: public ImageChannel +class IMFUTIL_EXPORT FlatImageChannel: public ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfImage.h b/src/lib/OpenEXRUtil/ImfImage.h index dc1d7c4915..7d6c861a1f 100644 --- a/src/lib/OpenEXRUtil/ImfImage.h +++ b/src/lib/OpenEXRUtil/ImfImage.h @@ -73,7 +73,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct Channel; -class Image +class IMFUTIL_EXPORT Image { public: @@ -81,9 +81,7 @@ class Image // Constructor and destructor // - IMFUTIL_EXPORT Image (); - IMFUTIL_EXPORT virtual ~Image (); @@ -91,9 +89,7 @@ class Image // Access to the image's level mode and level rounding mode. // - IMFUTIL_EXPORT LevelMode levelMode() const; - IMFUTIL_EXPORT LevelRoundingMode levelRoundingMode() const; @@ -135,11 +131,8 @@ class Image // a LogicExc exception is thrown // - IMFUTIL_EXPORT int numLevels() const; - IMFUTIL_EXPORT int numXLevels() const; - IMFUTIL_EXPORT int numYLevels() const; @@ -165,11 +158,8 @@ class Image // and MIPMAP_LEVELS files. It returns dataWindowForLevel(l,l)). // - IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow() const; - IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int l) const; - IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int lx, int ly) const; @@ -190,9 +180,7 @@ class Image // max (1, rfunc (h / pow (2, ly))) // - IMFUTIL_EXPORT int levelWidth (int lx) const; - IMFUTIL_EXPORT int levelHeight (int ly) const; @@ -211,10 +199,8 @@ class Image // resize(dw) is the same as resize(dw,levelMode(),levelRoundingMode()) // - IMFUTIL_EXPORT void resize(const IMATH_NAMESPACE::Box2i &dataWindow); - IMFUTIL_EXPORT virtual void resize(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode, LevelRoundingMode levelRoundingMode); @@ -232,7 +218,6 @@ class Image // shiftPixels() throws an ArgExc exception. // - IMFUTIL_EXPORT void shiftPixels(int dx, int dy); @@ -248,14 +233,12 @@ class Image // the new channel is added. // - IMFUTIL_EXPORT void insertChannel (const std::string &name, PixelType type, int xSampling = 1, int ySampling = 1, bool pLinear = false); - IMFUTIL_EXPORT void insertChannel (const std::string &name, const Channel &channel); @@ -266,9 +249,7 @@ class Image // clearChannels() erases all channels. // - IMFUTIL_EXPORT void eraseChannel(const std::string &name); - IMFUTIL_EXPORT void clearChannels(); @@ -287,7 +268,6 @@ class Image // channel that is being renamed, and throws an exception. // - IMFUTIL_EXPORT void renameChannel(const std::string &oldName, const std::string &newName); @@ -308,7 +288,6 @@ class Image // in the image and throws an exception. // - IMFUTIL_EXPORT void renameChannels(const RenamingMap &oldToNewNames); @@ -321,14 +300,10 @@ class Image // level(l) returns level(l,l). // - IMFUTIL_EXPORT virtual ImageLevel & level (int l = 0); - IMFUTIL_EXPORT virtual const ImageLevel & level (int l = 0) const; - IMFUTIL_EXPORT virtual ImageLevel & level (int lx, int ly); - IMFUTIL_EXPORT virtual const ImageLevel & level (int lx, int ly) const; diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 7c8ebff4a5..8aac3348a7 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -4,14 +4,14 @@ // #if defined(OPENEXR_DLL) - #if defined(OPENEXRUTIL_EXPORTS) - #define IMFUTIL_EXPORT __declspec(dllexport) - #define IMFUTIL_EXPORT_CONST extern __declspec(dllexport) - #else - #define IMFUTIL_EXPORT __declspec(dllimport) - #define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) - #endif +# if defined(OPENEXRUTIL_EXPORTS) +# define IMFUTIL_EXPORT __declspec(dllexport) +# define IMFUTIL_EXPORT_CONST extern __declspec(dllexport) +# else +# define IMFUTIL_EXPORT __declspec(dllimport) +# define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) +# endif #else - #define IMFUTIL_EXPORT - #define IMFUTIL_EXPORT_CONST extern const +# define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) +# define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) #endif From 2ffc4acb721d812d9593d37882d2ac90215a1988 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 22 Nov 2020 22:51:58 +1300 Subject: [PATCH 02/23] Remove extra export tag causing warning Signed-off-by: Kimball Thurston --- src/lib/OpenEXRUtil/ImfCheckFile.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/OpenEXRUtil/ImfCheckFile.cpp b/src/lib/OpenEXRUtil/ImfCheckFile.cpp index a5ed61f73c..b433f6c123 100644 --- a/src/lib/OpenEXRUtil/ImfCheckFile.cpp +++ b/src/lib/OpenEXRUtil/ImfCheckFile.cpp @@ -877,7 +877,6 @@ class PtrIStream: public IStream virtual bool isMemoryMapped () const { return false;} - IMFUTIL_EXPORT virtual char * readMemoryMapped (int n) { From 1e23e120a71e13bae302bebbb81f27ccc3a980c1 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 22 Nov 2020 23:06:40 +1300 Subject: [PATCH 03/23] Remove extra exports now that the class is exported Signed-off-by: Kimball Thurston --- src/lib/IlmThread/IlmThread.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/IlmThread/IlmThread.h b/src/lib/IlmThread/IlmThread.h index 4455b00c0f..8e4f083335 100644 --- a/src/lib/IlmThread/IlmThread.h +++ b/src/lib/IlmThread/IlmThread.h @@ -83,11 +83,11 @@ class ILMTHREAD_EXPORT Thread { public: - ILMTHREAD_EXPORT Thread (); - ILMTHREAD_EXPORT virtual ~Thread (); + Thread (); + virtual ~Thread (); - ILMTHREAD_EXPORT void start (); - ILMTHREAD_EXPORT virtual void run () = 0; + void start (); + virtual void run () = 0; // // wait for thread to exit - must be called before deleting thread From 2579b710dd86d169211a48443640cedaa46783a6 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 22 Nov 2020 23:50:03 +1300 Subject: [PATCH 04/23] Fix issue with msvc when building static only Signed-off-by: Kimball Thurston --- src/lib/Iex/IexExport.h | 6 +++++- src/lib/IlmThread/IlmThreadExport.h | 9 +++++++-- src/lib/OpenEXR/ImfExport.h | 9 +++++++-- src/lib/OpenEXRUtil/ImfUtilExport.h | 9 +++++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index 2d780db398..c1b00544f0 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -13,7 +13,11 @@ # define IEX_EXPORT __declspec(dllimport) # endif #else -# define IEX_EXPORT __attribute__ ((visibility ("default"))) +# ifndef _MSC_VER +# define IEX_EXPORT __attribute__ ((visibility ("default"))) +# else +# define IEX_EXPORT +# endif #endif #ifndef IEX_EXPORT_TYPE # define IEX_EXPORT_TYPE diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index 7a845d4837..d8b599fb88 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -12,6 +12,11 @@ # define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) # endif #else -# define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) -# define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# ifndef _MSC_VER +# define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) +# define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# else +# define ILMTHREAD_EXPORT +# define ILMTHREAD_EXPORT_CONST extern +# endif #endif diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index daa6687c1d..0c9f1b8f92 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -12,6 +12,11 @@ # define IMF_EXPORT_CONST extern __declspec(dllimport) # endif #else -# define IMF_EXPORT __attribute__ ((visibility ("default"))) -# define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# ifndef _MSC_VER +# define IMF_EXPORT __attribute__ ((visibility ("default"))) +# define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# else +# define IMF_EXPORT +# define IMF_EXPORT_CONST extern +# endif #endif diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 8aac3348a7..20e8190d2d 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -12,6 +12,11 @@ # define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) # endif #else -# define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) -# define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# ifndef _MSC_VER +# define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) +# define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# else +# define IMFUTIL_EXPORT +# define IMFUTIL_EXPORT_CONST extern +# endif #endif From 2ec3a4bfcc9f76eb9f761710c1850fe9416f2180 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 23 Nov 2020 00:00:21 +1300 Subject: [PATCH 05/23] Remove additional extra export tags Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfAttribute.h | 6 ------ src/lib/OpenEXR/ImfIO.h | 9 --------- src/lib/OpenEXR/ImfStdIO.h | 15 --------------- 3 files changed, 30 deletions(-) diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index ddbb989fba..d6293cb351 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -31,9 +31,7 @@ class IMF_EXPORT Attribute // Constructor and destructor //--------------------------- - IMF_EXPORT Attribute (); - IMF_EXPORT virtual ~Attribute (); @@ -69,7 +67,6 @@ class IMF_EXPORT Attribute // Attribute factory //------------------ - IMF_EXPORT static Attribute * newAttribute (const char typeName[]); @@ -77,7 +74,6 @@ class IMF_EXPORT Attribute // Test if a given attribute type has already been registered //----------------------------------------------------------- - IMF_EXPORT static bool knownType (const char typeName[]); @@ -88,7 +84,6 @@ class IMF_EXPORT Attribute // knows how to make objects of this type. //-------------------------------------------------- - IMF_EXPORT static void registerAttributeType (const char typeName[], Attribute *(*newAttribute)()); @@ -98,7 +93,6 @@ class IMF_EXPORT Attribute // debugging only). //------------------------------------------------------ - IMF_EXPORT static void unRegisterAttributeType (const char typeName[]); }; diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index 593056e98d..21ea5baf05 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -33,7 +33,6 @@ class IMF_EXPORT IStream // Destructor //----------- - IMF_EXPORT virtual ~IStream (); @@ -46,7 +45,6 @@ class IMF_EXPORT IStream // into a buffer supplied by the caller. //------------------------------------------------- - IMF_EXPORT virtual bool isMemoryMapped () const; @@ -74,7 +72,6 @@ class IMF_EXPORT IStream // mapped, readMemoryMapped(n) throws an exception. //--------------------------------------------------- - IMF_EXPORT virtual char * readMemoryMapped (int n); @@ -99,7 +96,6 @@ class IMF_EXPORT IStream // Clear error conditions after an operation has failed. //------------------------------------------------------ - IMF_EXPORT virtual void clear (); @@ -107,12 +103,10 @@ class IMF_EXPORT IStream // Get the name of the file associated with this stream. //------------------------------------------------------ - IMF_EXPORT const char * fileName () const; protected: - IMF_EXPORT IStream (const char fileName[]); private: @@ -138,7 +132,6 @@ class IMF_EXPORT OStream // Destructor //----------- - IMF_EXPORT virtual ~OStream (); @@ -175,12 +168,10 @@ class IMF_EXPORT OStream // Get the name of the file associated with this stream. //------------------------------------------------------ - IMF_EXPORT const char * fileName () const; protected: - IMF_EXPORT OStream (const char fileName[]); private: diff --git a/src/lib/OpenEXR/ImfStdIO.h b/src/lib/OpenEXR/ImfStdIO.h index 355d0e3aaa..adbe364d81 100644 --- a/src/lib/OpenEXR/ImfStdIO.h +++ b/src/lib/OpenEXR/ImfStdIO.h @@ -37,7 +37,6 @@ class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // The destructor will close the file. //------------------------------------------------------- - IMF_EXPORT StdIFStream (const char fileName[]); @@ -47,14 +46,11 @@ class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // will not close the std::ifstream. //--------------------------------------------------------- - IMF_EXPORT StdIFStream (std::ifstream &is, const char fileName[]); - IMF_EXPORT virtual ~StdIFStream (); - IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellg (); @@ -79,10 +75,8 @@ class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: - IMF_EXPORT StdISStream (); - IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellg (); @@ -91,10 +85,8 @@ class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream IMF_EXPORT virtual void clear (); - IMF_EXPORT std::string str () const; - IMF_EXPORT void str (const std::string &s); private: @@ -118,7 +110,6 @@ class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // The destructor will close the file. //------------------------------------------------------- - IMF_EXPORT StdOFStream (const char fileName[]); @@ -128,14 +119,11 @@ class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // will not close the std::ofstream. //--------------------------------------------------------- - IMF_EXPORT StdOFStream (std::ofstream &os, const char fileName[]); - IMF_EXPORT virtual ~StdOFStream (); - IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellp (); @@ -158,17 +146,14 @@ class IMF_EXPORT StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: - IMF_EXPORT StdOSStream (); - IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellp (); IMF_EXPORT virtual void seekp (uint64_t pos); - IMF_EXPORT std::string str () const; private: From 8728b35566db7e0ce95b7040b0c570bb9c5d537f Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 23 Nov 2020 00:10:12 +1300 Subject: [PATCH 06/23] Remove extra exports from util flat image channel Signed-off-by: Kimball Thurston --- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index e847da67a5..16a3b8c43b 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -55,22 +55,18 @@ class IMFUTIL_EXPORT FlatImageChannel: public ImageChannel // Access to the flat image level to which this channel belongs. // - IMFUTIL_EXPORT FlatImageLevel & flatLevel (); - IMFUTIL_EXPORT const FlatImageLevel & flatLevel () const; protected: friend class FlatImageLevel; - IMFUTIL_EXPORT FlatImageChannel (FlatImageLevel &level, int xSampling, int ySampling, bool pLinear); - IMFUTIL_EXPORT virtual ~FlatImageChannel(); FlatImageChannel (const FlatImageChannel& other) = delete; @@ -78,7 +74,6 @@ class IMFUTIL_EXPORT FlatImageChannel: public ImageChannel FlatImageChannel (FlatImageChannel&& other) = delete; FlatImageChannel& operator = (FlatImageChannel&& other) = delete; - IMFUTIL_EXPORT virtual void resize (); virtual void resetBasePointer () = 0; From eca13048d2220dc5200c7e20a307774171374bd6 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 15 Feb 2021 21:58:34 +1300 Subject: [PATCH 07/23] Add missing include Signed-off-by: Kimball Thurston --- src/examples/generalInterfaceExamples.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/examples/generalInterfaceExamples.cpp b/src/examples/generalInterfaceExamples.cpp index 37984cb99e..1f775599f6 100644 --- a/src/examples/generalInterfaceExamples.cpp +++ b/src/examples/generalInterfaceExamples.cpp @@ -21,6 +21,7 @@ #include "drawImage.h" +#include #include #include From df51009f9a1dd1dc9dda04bdbb84640d559fd978 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 15 Feb 2021 22:00:14 +1300 Subject: [PATCH 08/23] Restore individual function exports This removes the change to just export the classes for some classes where typeinfo is needed, and adds two new macros EXPORT_VAGUELINKAGE and EXPORT_LOCAL that expose the classes as needed for Unix builds which have visibility hidden set Signed-off-by: Kimball Thurston --- src/lib/Iex/IexBaseExc.h | 88 +++++++++++------------ src/lib/Iex/IexExport.h | 45 ++++++++++++ src/lib/IlmThread/IlmThread.h | 13 ++-- src/lib/IlmThread/IlmThreadExport.h | 13 +++- src/lib/OpenEXR/ImfAttribute.h | 16 ++--- src/lib/OpenEXR/ImfExport.h | 13 +++- src/lib/OpenEXR/ImfIO.h | 16 ++--- src/lib/OpenEXR/ImfOpaqueAttribute.h | 24 +++---- src/lib/OpenEXR/ImfStdIO.h | 34 +++++---- src/lib/OpenEXRUtil/ImfDeepImage.h | 16 +++-- src/lib/OpenEXRUtil/ImfDeepImageChannel.h | 16 ++--- src/lib/OpenEXRUtil/ImfFlatImage.h | 17 ++--- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 10 +-- src/lib/OpenEXRUtil/ImfImage.h | 53 +++++++------- src/lib/OpenEXRUtil/ImfImageChannel.h | 2 +- src/lib/OpenEXRUtil/ImfUtilExport.h | 9 +++ 16 files changed, 236 insertions(+), 149 deletions(-) diff --git a/src/lib/Iex/IexBaseExc.h b/src/lib/Iex/IexBaseExc.h index e5fa40b126..8e43e2f4f7 100644 --- a/src/lib/Iex/IexBaseExc.h +++ b/src/lib/Iex/IexBaseExc.h @@ -27,7 +27,7 @@ IEX_INTERNAL_NAMESPACE_HEADER_ENTER // Our most basic exception class //------------------------------- -class IEX_EXPORT BaseExc: public std::exception +class IEX_EXPORT_VAGUELINKAGE BaseExc: public std::exception { public: @@ -35,34 +35,34 @@ class IEX_EXPORT BaseExc: public std::exception // Constructors and destructor //---------------------------- - BaseExc (const char *s = nullptr); - BaseExc (const std::string &s); - BaseExc (std::string &&s); // not noexcept because of stacktrace - BaseExc (std::stringstream &s); + IEX_EXPORT BaseExc (const char *s = nullptr); + IEX_EXPORT BaseExc (const std::string &s); + IEX_EXPORT BaseExc (std::string &&s); // not noexcept because of stacktrace + IEX_EXPORT BaseExc (std::stringstream &s); - BaseExc (const BaseExc &be); - BaseExc (BaseExc &&be) noexcept; - virtual ~BaseExc () noexcept; + IEX_EXPORT BaseExc (const BaseExc &be); + IEX_EXPORT BaseExc (BaseExc &&be) noexcept; + IEX_EXPORT virtual ~BaseExc () noexcept; - BaseExc & operator = (const BaseExc& be); - BaseExc & operator = (BaseExc&& be) noexcept; + IEX_EXPORT BaseExc & operator = (const BaseExc& be); + IEX_EXPORT BaseExc & operator = (BaseExc&& be) noexcept; //--------------------------------------------------- // what() method -- e.what() returns _message.c_str() //--------------------------------------------------- - virtual const char * what () const noexcept; + IEX_EXPORT virtual const char * what () const noexcept; //-------------------------------------------------- // Convenient methods to change the exception's text //-------------------------------------------------- - BaseExc & assign (std::stringstream &s); // assign (s.str()) - BaseExc & operator = (std::stringstream &s); + IEX_EXPORT BaseExc & assign (std::stringstream &s); // assign (s.str()) + IEX_EXPORT BaseExc & operator = (std::stringstream &s); - BaseExc & append (std::stringstream &s); // append (s.str()) - BaseExc & operator += (std::stringstream &s); + IEX_EXPORT BaseExc & append (std::stringstream &s); // append (s.str()) + IEX_EXPORT BaseExc & operator += (std::stringstream &s); //-------------------------------------------------- @@ -70,17 +70,17 @@ class IEX_EXPORT BaseExc: public std::exception // the definitions above. //-------------------------------------------------- - BaseExc & assign (const char *s); - BaseExc & operator = (const char *s); + IEX_EXPORT BaseExc & assign (const char *s); + IEX_EXPORT BaseExc & operator = (const char *s); - BaseExc & append (const char *s); - BaseExc & operator += (const char *s); + IEX_EXPORT BaseExc & append (const char *s); + IEX_EXPORT BaseExc & operator += (const char *s); //--------------------------------------------------- // Access to the string representation of the message //--------------------------------------------------- - const std::string & message () const noexcept; + IEX_EXPORT const std::string & message () const noexcept; //-------------------------------------------------- // Stack trace for the point at which the exception @@ -89,12 +89,12 @@ class IEX_EXPORT BaseExc: public std::exception // has been installed (see below, setStackTracer()). //-------------------------------------------------- - const std::string & stackTrace () const noexcept; + IEX_EXPORT const std::string & stackTrace () const noexcept; private: - std::string _message; - std::string _stackTrace; + std::string _message; + std::string _stackTrace; }; @@ -104,32 +104,32 @@ class IEX_EXPORT BaseExc: public std::exception //----------------------------------------------------- #define DEFINE_EXC_EXP(exp, name, base) \ - class exp name: public base \ + class IEX_EXPORT_VAGUELINKAGE name: public base \ { \ public: \ - name(); \ - name (const char* text); \ - name (const std::string &text); \ - name (std::string &&text); \ - name (std::stringstream &text); \ - name (const name &other); \ - name (name &&other) noexcept; \ - name& operator = (name &other); \ - name& operator = (name &&other) noexcept; \ - ~name() noexcept; \ + exp name(); \ + exp name (const char* text); \ + exp name (const std::string &text); \ + exp name (std::string &&text); \ + exp name (std::stringstream &text); \ + exp name (const name &other); \ + exp name (name &&other) noexcept; \ + exp name& operator = (name &other); \ + exp name& operator = (name &&other) noexcept; \ + exp ~name() noexcept; \ }; #define DEFINE_EXC_EXP_IMPL(exp, name, base) \ -name::name () : base () {} \ -name::name (const char* text) : base (text) {} \ -name::name (const std::string& text) : base (text) {} \ -name::name (std::string&& text) : base (std::move (text)) {} \ -name::name (std::stringstream& text) : base (text) {} \ -name::name (const name &other) : base (other) {} \ -name::name (name &&other) noexcept : base (other) {} \ -name& name::operator = (name &other) { base::operator=(other); return *this; } \ -name& name::operator = (name &&other) noexcept { base::operator=(other); return *this; } \ -name::~name () noexcept {} +exp name::name () : base () {} \ +exp name::name (const char* text) : base (text) {} \ +exp name::name (const std::string& text) : base (text) {} \ +exp name::name (std::string&& text) : base (std::move (text)) {} \ +exp name::name (std::stringstream& text) : base (text) {} \ +exp name::name (const name &other) : base (other) {} \ +exp name::name (name &&other) noexcept : base (other) {} \ +exp name& name::operator = (name &other) { base::operator=(other); return *this; } \ +exp name& name::operator = (name &&other) noexcept { base::operator=(other); return *this; } \ +exp name::~name () noexcept {} // For backward compatibility. #define DEFINE_EXC(name, base) DEFINE_EXC_EXP(, name, base) diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index c1b00544f0..6a8fab606c 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -6,19 +6,62 @@ #ifndef IEXEXPORT_H #define IEXEXPORT_H +/// \defgroup ExportMacros Macros to manage symbol visibility +/// +/// In order to produce tidy symbol tables in shared objects, one must +/// manage symbol visibility. This is required under Windows for DLLs, +/// and has been well documented in terms of export / import +/// swapping. However, under Unixen or other similar platforms, there +/// is a different mechanism of specifying the visibility. So to +/// achieve nearly the same results, without requiring every single +/// function be tagged, one can tell the compiler to mark all symbols +/// as hidden by default, then only export the specific symbols in +/// question. +/// +/// However, this is not so easy for C++. There are what are called +/// 'vague' linkage objects, which are often the typeinfo / vtable +/// type objects, although templates and a few other items fall into +/// this category. In order to enable dynamic_cast and similar +/// behavior, we must export the typeinfo and such. This is done at +/// the class level, but if we were to do this under Windows, then the +/// class member data types also end up being exported, which leaks +/// STL details. So, to differentiate this, we use +/// IMF_EXPORT_VAGUELINKAGE at the class level, and continue to use +/// IMF_EXPORT on the public function symbols. Unfortunately, by +/// putting the export at the class level, that means that private +/// functions are then exported as well. Hence, we must force any of +/// these back to local using IMF_EXPORT_LOCAL. To avoid pollution of +/// the code, we should only apply this to classes which are used for +/// dynamic_cast, or otherwise require it. +/// +/// There may be more needed than have been tagged so far, if you +/// start receiving link errors about typeinfo, please look if it is +/// the symbol exports, and whether additional tagging is +/// needed. Having a goal to hide symbols should increase symbol +/// loading / resolution performance in aggregate, so is a desired end +/// goal. +/// +/// @{ #if defined(OPENEXR_DLL) # if defined(IEX_EXPORTS) # define IEX_EXPORT __declspec(dllexport) # else # define IEX_EXPORT __declspec(dllimport) # endif +# define IEX_EXPORT_VAGUELINKAGE +# define IEX_EXPORT_LOCAL #else # ifndef _MSC_VER # define IEX_EXPORT __attribute__ ((visibility ("default"))) +# define IEX_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IEX_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define IEX_EXPORT +# define IEX_EXPORT_VAGUELINKAGE +# define IEX_EXPORT_LOCAL # endif #endif + #ifndef IEX_EXPORT_TYPE # define IEX_EXPORT_TYPE #endif @@ -26,5 +69,7 @@ # define IEX_EXPORT_ENUM #endif +/// @} + #endif // #ifndef IEXEXPORT_H diff --git a/src/lib/IlmThread/IlmThread.h b/src/lib/IlmThread/IlmThread.h index 8e4f083335..b101332055 100644 --- a/src/lib/IlmThread/IlmThread.h +++ b/src/lib/IlmThread/IlmThread.h @@ -79,21 +79,22 @@ ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER ILMTHREAD_EXPORT bool supportsThreads (); -class ILMTHREAD_EXPORT Thread +class ILMTHREAD_EXPORT_VAGUELINKAGE Thread { public: - Thread (); - virtual ~Thread (); + ILMTHREAD_EXPORT Thread (); + ILMTHREAD_EXPORT virtual ~Thread (); + + ILMTHREAD_EXPORT void start (); - void start (); virtual void run () = 0; // // wait for thread to exit - must be called before deleting thread // - void join(); - bool joinable() const; + ILMTHREAD_EXPORT void join(); + ILMTHREAD_EXPORT bool joinable() const; private: diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index d8b599fb88..dd9b5fdf17 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -3,6 +3,8 @@ // Copyright (c) Contributors to the OpenEXR Project. // +/// \addtogroup ExportMacros +/// @{ #if defined(OPENEXR_DLL) # if defined(ILMTHREAD_EXPORTS) # define ILMTHREAD_EXPORT __declspec(dllexport) @@ -11,12 +13,19 @@ # define ILMTHREAD_EXPORT __declspec(dllimport) # define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) # endif +# define ILMTHREAD_EXPORT_VAGUELINKAGE +# define ILMTHREAD_EXPORT_LOCAL #else # ifndef _MSC_VER # define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) # define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# define ILMTHREAD_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define ILMTHREAD_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else -# define ILMTHREAD_EXPORT -# define ILMTHREAD_EXPORT_CONST extern +# define ILMTHREAD_EXPORT +# define ILMTHREAD_EXPORT_CONST extern +# define ILMTHREAD_EXPORT_VAGUELINKAGE +# define ILMTHREAD_EXPORT_LOCAL # endif #endif +/// @} diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index d6293cb351..16f1d4fde1 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -23,7 +23,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMF_EXPORT Attribute +class IMF_EXPORT_VAGUELINKAGE Attribute { public: @@ -31,8 +31,8 @@ class IMF_EXPORT Attribute // Constructor and destructor //--------------------------- - Attribute (); - virtual ~Attribute (); + IMF_EXPORT Attribute (); + IMF_EXPORT virtual ~Attribute (); //------------------------------- @@ -67,14 +67,14 @@ class IMF_EXPORT Attribute // Attribute factory //------------------ - static Attribute * newAttribute (const char typeName[]); + IMF_EXPORT static Attribute * newAttribute (const char typeName[]); //----------------------------------------------------------- // Test if a given attribute type has already been registered //----------------------------------------------------------- - static bool knownType (const char typeName[]); + IMF_EXPORT static bool knownType (const char typeName[]); protected: @@ -83,7 +83,7 @@ class IMF_EXPORT Attribute // Register an attribute type so that newAttribute() // knows how to make objects of this type. //-------------------------------------------------- - + IMF_EXPORT static void registerAttributeType (const char typeName[], Attribute *(*newAttribute)()); @@ -92,7 +92,7 @@ class IMF_EXPORT Attribute // no longer knows how to make objects of this type (for // debugging only). //------------------------------------------------------ - + IMF_EXPORT static void unRegisterAttributeType (const char typeName[]); }; @@ -102,7 +102,7 @@ class IMF_EXPORT Attribute //------------------------------------------------- template -class TypedAttribute: public Attribute +class TypedAttribute: public Attribute { public: diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index 0c9f1b8f92..1fef9accbb 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -3,6 +3,8 @@ // Copyright (c) Contributors to the OpenEXR Project. // +/// \addtogroup ExportMacros +/// @{ #if defined(OPENEXR_DLL) # if defined(OPENEXR_EXPORTS) # define IMF_EXPORT __declspec(dllexport) @@ -11,12 +13,19 @@ # define IMF_EXPORT __declspec(dllimport) # define IMF_EXPORT_CONST extern __declspec(dllimport) # endif +# define IMF_EXPORT_VAGUELINKAGE +# define IMF_EXPORT_LOCAL #else # ifndef _MSC_VER # define IMF_EXPORT __attribute__ ((visibility ("default"))) # define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# define IMF_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IMF_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else -# define IMF_EXPORT -# define IMF_EXPORT_CONST extern +# define IMF_EXPORT +# define IMF_EXPORT_CONST extern +# define IMF_EXPORT_VAGUELINKAGE +# define IMF_EXPORT_LOCAL # endif #endif +/// @} diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index 21ea5baf05..b524881930 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -25,7 +25,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class IStream -- an abstract base class for input streams. //----------------------------------------------------------- -class IMF_EXPORT IStream +class IMF_EXPORT_VAGUELINKAGE IStream { public: @@ -33,7 +33,7 @@ class IMF_EXPORT IStream // Destructor //----------- - virtual ~IStream (); + IMF_EXPORT virtual ~IStream (); //------------------------------------------------- @@ -45,7 +45,7 @@ class IMF_EXPORT IStream // into a buffer supplied by the caller. //------------------------------------------------- - virtual bool isMemoryMapped () const; + IMF_EXPORT virtual bool isMemoryMapped () const; //------------------------------------------------------ @@ -107,7 +107,7 @@ class IMF_EXPORT IStream protected: - IStream (const char fileName[]); + IMF_EXPORT IStream (const char fileName[]); private: @@ -124,7 +124,7 @@ class IMF_EXPORT IStream // class OStream -- an abstract base class for output streams //----------------------------------------------------------- -class IMF_EXPORT OStream +class IMF_EXPORT_VAGUELINKAGE OStream { public: @@ -132,7 +132,7 @@ class IMF_EXPORT OStream // Destructor //----------- - virtual ~OStream (); + IMF_EXPORT virtual ~OStream (); //---------------------------------------------------------- @@ -168,11 +168,11 @@ class IMF_EXPORT OStream // Get the name of the file associated with this stream. //------------------------------------------------------ - const char * fileName () const; + IMF_EXPORT const char * fileName () const; protected: - OStream (const char fileName[]); + IMF_EXPORT OStream (const char fileName[]); private: diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.h b/src/lib/OpenEXR/ImfOpaqueAttribute.h index 5dae262d79..fc714897a9 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.h +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.h @@ -26,7 +26,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMF_EXPORT OpaqueAttribute: public Attribute +class IMF_EXPORT_VAGUELINKAGE OpaqueAttribute: public Attribute { public: @@ -34,37 +34,37 @@ class IMF_EXPORT OpaqueAttribute: public Attribute // Constructors and destructor //---------------------------- - OpaqueAttribute (const char typeName[]); - OpaqueAttribute (const OpaqueAttribute &other); - virtual ~OpaqueAttribute (); + IMF_EXPORT OpaqueAttribute (const char typeName[]); + IMF_EXPORT OpaqueAttribute (const OpaqueAttribute &other); + IMF_EXPORT virtual ~OpaqueAttribute (); //------------------------------- // Get this attribute's type name //------------------------------- - virtual const char * typeName () const; + IMF_EXPORT virtual const char * typeName () const; //------------------------------ // Make a copy of this attribute //------------------------------ - virtual Attribute * copy () const; + IMF_EXPORT virtual Attribute * copy () const; //---------------- // I/O and copying //---------------- - virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, - int version) const; + IMF_EXPORT virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const; - virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, - int size, - int version); + IMF_EXPORT virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version); - virtual void copyValueFrom (const Attribute &other); + IMF_EXPORT virtual void copyValueFrom (const Attribute &other); int dataSize() const { return _dataSize; } diff --git a/src/lib/OpenEXR/ImfStdIO.h b/src/lib/OpenEXR/ImfStdIO.h index adbe364d81..3c79973b4c 100644 --- a/src/lib/OpenEXR/ImfStdIO.h +++ b/src/lib/OpenEXR/ImfStdIO.h @@ -28,7 +28,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class OPENEXR_IMF_INTERNAL_NAMESPACE::IStream based on class std::ifstream //------------------------------------------- -class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT_VAGUELINKAGE StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: @@ -37,7 +37,7 @@ class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // The destructor will close the file. //------------------------------------------------------- - StdIFStream (const char fileName[]); + IMF_EXPORT StdIFStream (const char fileName[]); //--------------------------------------------------------- @@ -46,11 +46,12 @@ class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // will not close the std::ifstream. //--------------------------------------------------------- - StdIFStream (std::ifstream &is, const char fileName[]); + IMF_EXPORT StdIFStream (std::ifstream &is, const char fileName[]); - virtual ~StdIFStream (); + IMF_EXPORT virtual ~StdIFStream (); + IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellg (); @@ -71,12 +72,13 @@ class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // OPENEXR_IMF_INTERNAL_NAMESPACE::IStream, based on class std::istringstream //------------------------------------------------ -class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT_VAGUELINKAGE StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: - StdISStream (); + IMF_EXPORT StdISStream (); + IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellg (); @@ -85,9 +87,9 @@ class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream IMF_EXPORT virtual void clear (); - std::string str () const; + IMF_EXPORT std::string str () const; - void str (const std::string &s); + IMF_EXPORT void str (const std::string &s); private: @@ -101,7 +103,7 @@ class IMF_EXPORT StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream // class OPENEXR_IMF_INTERNAL_NAMESPACE::OStream based on class std::ofstream //------------------------------------------- -class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT_VAGUELINKAGE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: @@ -110,7 +112,7 @@ class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // The destructor will close the file. //------------------------------------------------------- - StdOFStream (const char fileName[]); + IMF_EXPORT StdOFStream (const char fileName[]); //--------------------------------------------------------- @@ -119,11 +121,12 @@ class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // will not close the std::ofstream. //--------------------------------------------------------- - StdOFStream (std::ofstream &os, const char fileName[]); + IMF_EXPORT StdOFStream (std::ofstream &os, const char fileName[]); - virtual ~StdOFStream (); + IMF_EXPORT virtual ~StdOFStream (); + IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellp (); @@ -142,19 +145,20 @@ class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream // OPENEXR_IMF_INTERNAL_NAMESPACE::OStream, based on class std::ostringstream //------------------------------------------------ -class IMF_EXPORT StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT_VAGUELINKAGE StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: - StdOSStream (); + IMF_EXPORT StdOSStream (); + IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual uint64_t tellp (); IMF_EXPORT virtual void seekp (uint64_t pos); - std::string str () const; + IMF_EXPORT std::string str () const; private: diff --git a/src/lib/OpenEXRUtil/ImfDeepImage.h b/src/lib/OpenEXRUtil/ImfDeepImage.h index 26de69898e..d9711c10e3 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImage.h +++ b/src/lib/OpenEXRUtil/ImfDeepImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMFUTIL_EXPORT DeepImage : public Image +class IMFUTIL_EXPORT_VAGUELINKAGE DeepImage : public Image { public: @@ -34,27 +34,29 @@ class IMFUTIL_EXPORT DeepImage : public Image // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. // - DeepImage(); + IMFUTIL_EXPORT DeepImage(); + IMFUTIL_EXPORT DeepImage(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode = ONE_LEVEL, LevelRoundingMode levelRoundingMode = ROUND_DOWN); - virtual ~DeepImage(); + IMFUTIL_EXPORT virtual ~DeepImage(); // // Accessing image levels by level number // - virtual DeepImageLevel & level(int l = 0); - virtual const DeepImageLevel & level(int l = 0) const; + IMFUTIL_EXPORT virtual DeepImageLevel & level(int l = 0); + IMFUTIL_EXPORT virtual const DeepImageLevel & level(int l = 0) const; - virtual DeepImageLevel & level(int lx, int ly); - virtual const DeepImageLevel & level(int lx, int ly) const; + IMFUTIL_EXPORT virtual DeepImageLevel & level(int lx, int ly); + IMFUTIL_EXPORT virtual const DeepImageLevel & level(int lx, int ly) const; protected: + IMFUTIL_EXPORT virtual DeepImageLevel * newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); }; diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h index 418835a4bd..e7d2c03dde 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h @@ -39,7 +39,7 @@ class SampleCountChannel; // of the level. // -class IMFUTIL_EXPORT DeepImageChannel: public ImageChannel +class IMFUTIL_EXPORT_VAGUELINKAGE DeepImageChannel: public ImageChannel { public: @@ -55,24 +55,24 @@ class IMFUTIL_EXPORT DeepImageChannel: public ImageChannel // Access to the image level to which this channel belongs. // - DeepImageLevel & deepLevel(); - const DeepImageLevel & deepLevel() const; + IMFUTIL_EXPORT DeepImageLevel & deepLevel(); + IMFUTIL_EXPORT const DeepImageLevel & deepLevel() const; // // Access to the sample count channel for this deep channel. // - SampleCountChannel & sampleCounts(); - const SampleCountChannel & sampleCounts() const; + IMFUTIL_EXPORT SampleCountChannel & sampleCounts(); + IMFUTIL_EXPORT const SampleCountChannel & sampleCounts() const; protected: friend class DeepImageLevel; - DeepImageChannel (DeepImageLevel &level, bool pLinear); - virtual ~DeepImageChannel(); + IMFUTIL_EXPORT DeepImageChannel (DeepImageLevel &level, bool pLinear); + IMFUTIL_EXPORT virtual ~DeepImageChannel(); DeepImageChannel (const DeepImageChannel& other) = delete; DeepImageChannel& operator = (const DeepImageChannel& other) = delete; @@ -97,7 +97,7 @@ class IMFUTIL_EXPORT DeepImageChannel: public ImageChannel virtual void initializeSampleLists () = 0; - virtual void resize (); + IMFUTIL_EXPORT virtual void resize (); virtual void resetBasePointer () = 0; }; diff --git a/src/lib/OpenEXRUtil/ImfFlatImage.h b/src/lib/OpenEXRUtil/ImfFlatImage.h index acef2d03d8..e05cef1a5e 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImage.h +++ b/src/lib/OpenEXRUtil/ImfFlatImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMFUTIL_EXPORT FlatImage : public Image +class IMFUTIL_EXPORT_VAGUELINKAGE FlatImage : public Image { public: @@ -34,28 +34,29 @@ class IMFUTIL_EXPORT FlatImage : public Image // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. // - FlatImage(); + IMFUTIL_EXPORT FlatImage(); + IMFUTIL_EXPORT FlatImage(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode = ONE_LEVEL, LevelRoundingMode levelRoundingMode = ROUND_DOWN); - virtual ~FlatImage(); + IMFUTIL_EXPORT virtual ~FlatImage(); // // Accessing image levels by level number // - virtual FlatImageLevel & level(int l = 0); - virtual const FlatImageLevel & level(int l = 0) const; + IMFUTIL_EXPORT virtual FlatImageLevel & level(int l = 0); + IMFUTIL_EXPORT virtual const FlatImageLevel & level(int l = 0) const; - virtual FlatImageLevel & level(int lx, int ly); - virtual const FlatImageLevel & level(int lx, int ly) const; + IMFUTIL_EXPORT virtual FlatImageLevel & level(int lx, int ly); + IMFUTIL_EXPORT virtual const FlatImageLevel & level(int lx, int ly) const; protected: - virtual FlatImageLevel * + IMFUTIL_EXPORT virtual FlatImageLevel * newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); }; diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index 16a3b8c43b..bb41d2cb33 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -38,7 +38,7 @@ class FlatImageLevel; // only for pixels within the data window of the level. // -class IMFUTIL_EXPORT FlatImageChannel: public ImageChannel +class IMFUTIL_EXPORT_VAGUELINKAGE FlatImageChannel: public ImageChannel { public: @@ -55,25 +55,27 @@ class IMFUTIL_EXPORT FlatImageChannel: public ImageChannel // Access to the flat image level to which this channel belongs. // - FlatImageLevel & flatLevel (); - const FlatImageLevel & flatLevel () const; + IMFUTIL_EXPORT FlatImageLevel & flatLevel (); + IMFUTIL_EXPORT const FlatImageLevel & flatLevel () const; protected: friend class FlatImageLevel; + IMFUTIL_EXPORT FlatImageChannel (FlatImageLevel &level, int xSampling, int ySampling, bool pLinear); - virtual ~FlatImageChannel(); + IMFUTIL_EXPORT virtual ~FlatImageChannel(); FlatImageChannel (const FlatImageChannel& other) = delete; FlatImageChannel& operator = (const FlatImageChannel& other) = delete; FlatImageChannel (FlatImageChannel&& other) = delete; FlatImageChannel& operator = (FlatImageChannel&& other) = delete; + IMFUTIL_EXPORT virtual void resize (); virtual void resetBasePointer () = 0; diff --git a/src/lib/OpenEXRUtil/ImfImage.h b/src/lib/OpenEXRUtil/ImfImage.h index 7d6c861a1f..32555da1df 100644 --- a/src/lib/OpenEXRUtil/ImfImage.h +++ b/src/lib/OpenEXRUtil/ImfImage.h @@ -73,7 +73,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct Channel; -class IMFUTIL_EXPORT Image +class IMFUTIL_EXPORT_VAGUELINKAGE Image { public: @@ -81,16 +81,16 @@ class IMFUTIL_EXPORT Image // Constructor and destructor // - Image (); - virtual ~Image (); + IMFUTIL_EXPORT Image (); + IMFUTIL_EXPORT virtual ~Image (); // // Access to the image's level mode and level rounding mode. // - LevelMode levelMode() const; - LevelRoundingMode levelRoundingMode() const; + IMFUTIL_EXPORT LevelMode levelMode() const; + IMFUTIL_EXPORT LevelRoundingMode levelRoundingMode() const; // @@ -131,9 +131,9 @@ class IMFUTIL_EXPORT Image // a LogicExc exception is thrown // - int numLevels() const; - int numXLevels() const; - int numYLevels() const; + IMFUTIL_EXPORT int numLevels() const; + IMFUTIL_EXPORT int numXLevels() const; + IMFUTIL_EXPORT int numYLevels() const; // @@ -157,9 +157,11 @@ class IMFUTIL_EXPORT Image // dataWindowForLevel(l) is a convenience function used for ONE_LEVEL // and MIPMAP_LEVELS files. It returns dataWindowForLevel(l,l)). // - + IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow() const; + IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int l) const; + IMFUTIL_EXPORT const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int lx, int ly) const; @@ -180,7 +182,9 @@ class IMFUTIL_EXPORT Image // max (1, rfunc (h / pow (2, ly))) // + IMFUTIL_EXPORT int levelWidth (int lx) const; + IMFUTIL_EXPORT int levelHeight (int ly) const; @@ -198,9 +202,9 @@ class IMFUTIL_EXPORT Image // // resize(dw) is the same as resize(dw,levelMode(),levelRoundingMode()) // - + IMFUTIL_EXPORT void resize(const IMATH_NAMESPACE::Box2i &dataWindow); - + IMFUTIL_EXPORT virtual void resize(const IMATH_NAMESPACE::Box2i &dataWindow, LevelMode levelMode, LevelRoundingMode levelRoundingMode); @@ -217,7 +221,7 @@ class IMFUTIL_EXPORT Image // the x and y sampling rates of all image channels. If they are not, // shiftPixels() throws an ArgExc exception. // - + IMFUTIL_EXPORT void shiftPixels(int dx, int dy); @@ -232,13 +236,13 @@ class IMFUTIL_EXPORT Image // as the new name then the existing channel is deleted before // the new channel is added. // - + IMFUTIL_EXPORT void insertChannel (const std::string &name, PixelType type, int xSampling = 1, int ySampling = 1, bool pLinear = false); - + IMFUTIL_EXPORT void insertChannel (const std::string &name, const Channel &channel); @@ -248,8 +252,9 @@ class IMFUTIL_EXPORT Image // eraseChannel(n) erases the channel with name n. // clearChannels() erases all channels. // - + IMFUTIL_EXPORT void eraseChannel(const std::string &name); + IMFUTIL_EXPORT void clearChannels(); @@ -267,7 +272,7 @@ class IMFUTIL_EXPORT Image // the program to run out of memory, renameChannel() erases the // channel that is being renamed, and throws an exception. // - + IMFUTIL_EXPORT void renameChannel(const std::string &oldName, const std::string &newName); @@ -287,7 +292,7 @@ class IMFUTIL_EXPORT Image // program to run out of memory, renameChannels() erases all channels // in the image and throws an exception. // - + IMFUTIL_EXPORT void renameChannels(const RenamingMap &oldToNewNames); @@ -300,11 +305,11 @@ class IMFUTIL_EXPORT Image // level(l) returns level(l,l). // - virtual ImageLevel & level (int l = 0); - virtual const ImageLevel & level (int l = 0) const; + IMFUTIL_EXPORT virtual ImageLevel & level (int l = 0); + IMFUTIL_EXPORT virtual const ImageLevel & level (int l = 0) const; - virtual ImageLevel & level (int lx, int ly); - virtual const ImageLevel & level (int lx, int ly) const; + IMFUTIL_EXPORT virtual ImageLevel & level (int lx, int ly); + IMFUTIL_EXPORT virtual const ImageLevel & level (int lx, int ly) const; protected: @@ -314,10 +319,10 @@ class IMFUTIL_EXPORT Image private: - bool levelNumberIsValid (int lx, int ly) const; - void clearLevels (); + IMFUTIL_EXPORT_LOCAL bool levelNumberIsValid (int lx, int ly) const; + IMFUTIL_EXPORT_LOCAL void clearLevels (); - struct ChannelInfo + struct IMFUTIL_EXPORT_LOCAL ChannelInfo { ChannelInfo (PixelType type = HALF, int xSampling = 1, diff --git a/src/lib/OpenEXRUtil/ImfImageChannel.h b/src/lib/OpenEXRUtil/ImfImageChannel.h index 255899b43c..09739ddc3d 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfImageChannel.h @@ -37,7 +37,7 @@ class ImageLevel; class ImageLevel; -class ImageChannel +class IMFUTIL_EXPORT_VAGUELINKAGE ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 20e8190d2d..62e665958c 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -3,6 +3,8 @@ // Copyright (c) Contributors to the OpenEXR Project. // +/// \addtogroup ExportMacros +/// @{ #if defined(OPENEXR_DLL) # if defined(OPENEXRUTIL_EXPORTS) # define IMFUTIL_EXPORT __declspec(dllexport) @@ -11,12 +13,19 @@ # define IMFUTIL_EXPORT __declspec(dllimport) # define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) # endif +# define IMFUTIL_EXPORT_VAGUELINKAGE +# define IMFUTIL_EXPORT_LOCAL #else # ifndef _MSC_VER # define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) # define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) +# define IMFUTIL_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IMFUTIL_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define IMFUTIL_EXPORT # define IMFUTIL_EXPORT_CONST extern +# define IMFUTIL_EXPORT_VAGUELINKAGE +# define IMFUTIL_EXPORT_LOCAL # endif #endif +/// @} From 3d1ba0b87c138be593ac2df165f15f01fb175685 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 15 Feb 2021 22:17:11 +1300 Subject: [PATCH 09/23] Add symbols missed in previous commit to reinstate individual exports for Windows Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfIO.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index b524881930..8b16ef1215 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -72,7 +72,7 @@ class IMF_EXPORT_VAGUELINKAGE IStream // mapped, readMemoryMapped(n) throws an exception. //--------------------------------------------------- - virtual char * readMemoryMapped (int n); + IMF_EXPORT virtual char * readMemoryMapped (int n); //-------------------------------------------------------- @@ -96,14 +96,14 @@ class IMF_EXPORT_VAGUELINKAGE IStream // Clear error conditions after an operation has failed. //------------------------------------------------------ - virtual void clear (); + IMF_EXPORT virtual void clear (); //------------------------------------------------------ // Get the name of the file associated with this stream. //------------------------------------------------------ - const char * fileName () const; + IMF_EXPORT const char * fileName () const; protected: From 81fea3856fd46371ff66687e8e8dd537c086ae69 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 22:18:56 +1300 Subject: [PATCH 10/23] add custom dynamic_cast routines for types we mix across interfaces With symbol visibility=hidden, type erasure can happen much more readily, such that when we have a routine compiled into the library, it may have "different" types than the ones passed across the interface. These are semantics in some sense, and there is some disagreement between libstdc++ and libc++ how dynamic_cast works. To avoid issue, provide custom dynamic_cast functions for converting attributes and utility image channel types Signed-off-by: Kimball Thurston --- src/bin/exrheader/main.cpp | 46 +++++++------- src/lib/OpenEXR/ImfAttribute.h | 61 +++++++++++++++++-- src/lib/OpenEXR/ImfHeader.h | 9 +-- src/lib/OpenEXR/ImfOpaqueAttribute.cpp | 2 +- src/lib/OpenEXRUtil/ImfDeepImageLevel.h | 4 +- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 1 - src/lib/OpenEXRUtil/ImfFlatImageLevel.h | 4 +- src/lib/OpenEXRUtil/ImfImageChannel.h | 46 ++++++++++++++ src/test/OpenEXRTest/testAttributes.cpp | 2 +- .../testMultiPartSharedAttributes.cpp | 2 +- src/test/OpenEXRUtilTest/testDeepImage.cpp | 6 +- src/test/OpenEXRUtilTest/testFlatImage.cpp | 6 +- 12 files changed, 143 insertions(+), 46 deletions(-) diff --git a/src/bin/exrheader/main.cpp b/src/bin/exrheader/main.cpp index 56e72459ae..f10fb6ed61 100644 --- a/src/bin/exrheader/main.cpp +++ b/src/bin/exrheader/main.cpp @@ -306,24 +306,24 @@ printInfo (const char fileName[]) cout << i.name() << " (type " << a->typeName() << ")"; if (const Box2iAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value().min << " - " << ta->value().max; } else if (const Box2fAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value().min << " - " << ta->value().max; } else if (const ChannelListAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":"; printChannelList (ta->value()); } else if (const ChromaticitiesAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n" " red " << ta->value().red << "\n" @@ -332,34 +332,34 @@ printInfo (const char fileName[]) " white " << ta->value().white; } else if (const CompressionAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": "; printCompression (ta->value()); } else if (const DoubleAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const EnvmapAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": "; printEnvmap (ta->value()); } else if (const FloatAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const IntAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const KeyCodeAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n" " film manufacturer code " << @@ -378,13 +378,13 @@ printInfo (const char fileName[]) ta->value().perfsPerCount(); } else if (const LineOrderAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": "; printLineOrder (ta->value()); } else if (const M33fAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n" " (" << @@ -399,7 +399,7 @@ printInfo (const char fileName[]) ta->value()[2][2] << ")"; } else if (const M44fAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n" " (" << @@ -421,19 +421,19 @@ printInfo (const char fileName[]) ta->value()[3][3] << ")"; } else if (const PreviewImageAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value().width() << " by " << ta->value().height() << " pixels"; } else if (const StringAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": \"" << ta->value() << "\""; } else if (const StringVectorAttribute * ta = - dynamic_cast(a)) + dynamic_cast_attr (a)) { cout << ":"; @@ -445,13 +445,13 @@ printInfo (const char fileName[]) } } else if (const RationalAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value().n << "/" << ta->value().d << " (" << double (ta->value()) << ")"; } else if (const TileDescriptionAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n "; @@ -468,28 +468,28 @@ printInfo (const char fileName[]) } } else if (const TimeCodeAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ":\n"; printTimeCode (ta->value()); } else if (const V2iAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const V2fAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const V3iAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } else if (const V3fAttribute *ta = - dynamic_cast (a)) + dynamic_cast_attr (a)) { cout << ": " << ta->value(); } diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index 16f1d4fde1..fb0ecf927d 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -13,7 +13,7 @@ // //----------------------------------------------------------------------------- -#include "IexBaseExc.h" +#include #include "ImfIO.h" #include "ImfXdr.h" #include "ImfForward.h" @@ -22,7 +22,6 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER - class IMF_EXPORT_VAGUELINKAGE Attribute { public: @@ -76,7 +75,6 @@ class IMF_EXPORT_VAGUELINKAGE Attribute IMF_EXPORT static bool knownType (const char typeName[]); - protected: //-------------------------------------------------- @@ -96,6 +94,59 @@ class IMF_EXPORT_VAGUELINKAGE Attribute static void unRegisterAttributeType (const char typeName[]); }; +/// \defgroup TypeConversion type conversion helpers +/// +/// We define these here for systems such as libc++ where the typeinfo +/// may not be the same between what is compiled into the library, and +/// the one used in code put into applications, especially with hidden +/// visibility enabled by default. The internal type checks as one +/// sets attributes into headers would then fail. As a result, we use +/// these where the types are more loosely defined to only include the +/// hash and name. With our custom, versioned namespace, this should +/// be safe, and allows us to have hidden visibility on symbols and +/// make a tidy shared object. +/// +/// @{ + +template +static U *dynamic_cast_attr (Attribute *a) +{ + if (!a) + return nullptr; + const auto &aid = typeid(*a); + const auto &uid = typeid(U); + // check the fast tests first before comparing names... + if (aid == uid || + (aid.hash_code() == uid.hash_code() && + aid.name() == uid.name())) + { + return static_cast( a ); + } + return nullptr; +} +template +static const U *dynamic_cast_attr (const Attribute *a) +{ + return dynamic_cast_attr ( const_cast ( a ) ); +} +template +static U &dynamic_cast_attr (Attribute &a) +{ + U *ret = dynamic_cast_attr (&a); + if ( ! ret ) + throw IEX_NAMESPACE::TypeExc ("Mismatched attribute type."); + return *ret; +} +template +static const U &dynamic_cast_attr (const Attribute &a) +{ + const U *ret = dynamic_cast_attr (&a); + if ( ! ret ) + throw IEX_NAMESPACE::TypeExc ("Mismatched attribute type."); + return *ret; +} + +/// @} //------------------------------------------------- // Class template for attributes of a specific type @@ -296,7 +347,7 @@ TypedAttribute * TypedAttribute::cast (Attribute *attribute) { TypedAttribute *t = - dynamic_cast *> (attribute); + dynamic_cast_attr > (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -310,7 +361,7 @@ const TypedAttribute * TypedAttribute::cast (const Attribute *attribute) { const TypedAttribute *t = - dynamic_cast *> (attribute); + dynamic_cast_attr > (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); diff --git a/src/lib/OpenEXR/ImfHeader.h b/src/lib/OpenEXR/ImfHeader.h index 886846b447..32b4057ba3 100644 --- a/src/lib/OpenEXR/ImfHeader.h +++ b/src/lib/OpenEXR/ImfHeader.h @@ -24,6 +24,7 @@ #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfAttribute.h" #include #include @@ -677,7 +678,7 @@ T & Header::typedAttribute (const char name[]) { Attribute *attr = &(*this)[name]; - T *tattr = dynamic_cast (attr); + T *tattr = dynamic_cast_attr (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -691,7 +692,7 @@ const T & Header::typedAttribute (const char name[]) const { const Attribute *attr = &(*this)[name]; - const T *tattr = dynamic_cast (attr); + const T *tattr = dynamic_cast_attr (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -721,7 +722,7 @@ T * Header::findTypedAttribute (const char name[]) { AttributeMap::iterator i = _map.find (name); - return (i == _map.end())? 0: dynamic_cast (i->second); + return (i == _map.end())? 0: dynamic_cast_attr (i->second); } @@ -730,7 +731,7 @@ const T * Header::findTypedAttribute (const char name[]) const { AttributeMap::const_iterator i = _map.find (name); - return (i == _map.end())? 0: dynamic_cast (i->second); + return (i == _map.end())? 0: dynamic_cast_attr (i->second); } diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.cpp b/src/lib/OpenEXR/ImfOpaqueAttribute.cpp index f6fb334755..17e5e20aac 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.cpp +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.cpp @@ -74,7 +74,7 @@ OpaqueAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int void OpaqueAttribute::copyValueFrom (const Attribute &other) { - const OpaqueAttribute *oa = dynamic_cast (&other); + const OpaqueAttribute *oa = dynamic_cast_attr (&other); if (oa == 0 || _typeName != oa->_typeName) { diff --git a/src/lib/OpenEXRUtil/ImfDeepImageLevel.h b/src/lib/OpenEXRUtil/ImfDeepImageLevel.h index e9275fd134..685002596a 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageLevel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageLevel.h @@ -263,7 +263,7 @@ template TypedDeepImageChannel * DeepImageLevel::findTypedChannel (const std::string& name) { - return dynamic_cast *> (findChannel (name)); + return dynamic_cast_channel > (findChannel (name)); } @@ -271,7 +271,7 @@ template const TypedDeepImageChannel * DeepImageLevel::findTypedChannel (const std::string& name) const { - return dynamic_cast *> (findChannel (name)); + return dynamic_cast_channel > (findChannel (name)); } diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index bb41d2cb33..08bdf75412 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -81,7 +81,6 @@ class IMFUTIL_EXPORT_VAGUELINKAGE FlatImageChannel: public ImageChannel virtual void resetBasePointer () = 0; }; - template class TypedFlatImageChannel: public FlatImageChannel { diff --git a/src/lib/OpenEXRUtil/ImfFlatImageLevel.h b/src/lib/OpenEXRUtil/ImfFlatImageLevel.h index ec81610b4f..f6df521e6c 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageLevel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageLevel.h @@ -237,7 +237,7 @@ template TypedFlatImageChannel * FlatImageLevel::findTypedChannel (const std::string& name) { - return dynamic_cast *> (findChannel (name)); + return dynamic_cast_channel > (findChannel (name)); } @@ -245,7 +245,7 @@ template const TypedFlatImageChannel * FlatImageLevel::findTypedChannel (const std::string& name) const { - return dynamic_cast *> (findChannel (name)); + return dynamic_cast_channel > (findChannel (name)); } diff --git a/src/lib/OpenEXRUtil/ImfImageChannel.h b/src/lib/OpenEXRUtil/ImfImageChannel.h index 09739ddc3d..6a126d3585 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfImageChannel.h @@ -17,6 +17,7 @@ #include "ImfUtilExport.h" +#include #include #include #include @@ -106,6 +107,51 @@ class IMFUTIL_EXPORT_VAGUELINKAGE ImageChannel size_t _numPixels; }; +/// \addtogroup TypeConversion +/// +/// @{ + +/// similar to ImfAttribute, we may have type-erased image channels we use internally. +template +static U *dynamic_cast_channel (ImageChannel *a) +{ + if (!a) + return nullptr; + const auto &aid = typeid(*a); + const auto &uid = typeid(U); + // check the fast tests first before comparing names... + if (aid == uid || + (aid.hash_code() == uid.hash_code() && + aid.name() == uid.name())) + { + return static_cast( a ); + } + return nullptr; +} +template +static const U *dynamic_cast_channel (const ImageChannel *a) +{ + return dynamic_cast_channel ( const_cast ( a ) ); +} +template +static U &dynamic_cast_channel (ImageChannel &a) +{ + U *ret = dynamic_cast_channel (&a); + if ( ! ret ) + throw IEX_NAMESPACE::TypeExc ("Mismatched image channel type."); + return *ret; +} +template +static const U &dynamic_cast_channel (const ImageChannel &a) +{ + const U *ret = dynamic_cast_channel (&a); + if ( ! ret ) + throw IEX_NAMESPACE::TypeExc ("Mismatched image channel type."); + return *ret; +} + +/// @} + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/test/OpenEXRTest/testAttributes.cpp b/src/test/OpenEXRTest/testAttributes.cpp index 99a335b245..5879374999 100644 --- a/src/test/OpenEXRTest/testAttributes.cpp +++ b/src/test/OpenEXRTest/testAttributes.cpp @@ -290,7 +290,7 @@ writeReadAttr (const Array2D &pf1, // const Attribute& a = hdr["a24"]; - const OpaqueAttribute* oa = dynamic_cast (&a); + const OpaqueAttribute* oa = dynamic_cast_attr (&a); assert (oa); assert (!strcmp (a.typeName(), "testOpaque")); diff --git a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp index d05783d795..90d5441192 100644 --- a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp +++ b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp @@ -300,7 +300,7 @@ void testDiskAttrValue (const Header & diskHeader, const T & testAttribute) { const string & attrName = testAttribute.typeName(); - const T & diskAttr = dynamic_cast (diskHeader[attrName]); + const T & diskAttr = dynamic_cast_attr (diskHeader[attrName]); if (diskAttr.value() != testAttribute.value()) { throw IEX_NAMESPACE::InputExc ("incorrect value from disk"); diff --git a/src/test/OpenEXRUtilTest/testDeepImage.cpp b/src/test/OpenEXRUtilTest/testDeepImage.cpp index 46b7ef2e08..26fbda9e5b 100644 --- a/src/test/OpenEXRUtilTest/testDeepImage.cpp +++ b/src/test/OpenEXRUtilTest/testDeepImage.cpp @@ -34,10 +34,10 @@ verifyPixelsAreEqual int dy) { const TypedDeepImageChannel &tc1 = - dynamic_cast &> (c1); + dynamic_cast_channel > (c1); const TypedDeepImageChannel &tc2 = - dynamic_cast &> (c2); + dynamic_cast_channel > (c2); const Box2i &dataWindow = c1.level().dataWindow(); const SampleCountChannel &scc1 = c1.deepLevel().sampleCounts(); @@ -221,7 +221,7 @@ fillChannel (Rand48 &random, DeepImageChannel &c) // TypedDeepImageChannel &tc = - dynamic_cast &> (c); + dynamic_cast_channel > (c); const Box2i &dataWindow = tc.level().dataWindow(); const SampleCountChannel &scc = c.deepLevel().sampleCounts(); diff --git a/src/test/OpenEXRUtilTest/testFlatImage.cpp b/src/test/OpenEXRUtilTest/testFlatImage.cpp index 0f1e8dc07a..7f87ed881d 100644 --- a/src/test/OpenEXRUtilTest/testFlatImage.cpp +++ b/src/test/OpenEXRUtilTest/testFlatImage.cpp @@ -34,10 +34,10 @@ verifyPixelsAreEqual int dy) { const TypedFlatImageChannel &tc1 = - dynamic_cast &> (c1); + dynamic_cast_channel > (c1); const TypedFlatImageChannel &tc2 = - dynamic_cast &> (c2); + dynamic_cast_channel > (c2); const Box2i &dataWindow = c1.level().dataWindow(); int xStep = c1.xSampling(); @@ -192,7 +192,7 @@ fillChannel (Rand48 &random, FlatImageChannel &c) // TypedFlatImageChannel &tc = - dynamic_cast &> (c); + dynamic_cast_channel > (c); const Box2i &dataWindow = tc.level().dataWindow(); int xStep = tc.xSampling(); From d519dfb59193b8945a78a0511e8eee678b0b2306 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 22:26:22 +1300 Subject: [PATCH 11/23] Simplify vague linkage export macro the VAGUELINKAGE was deemed a bit too vague, and not particularly indicative, where it is really the type information that needs to be exported. Given that this macro will have to be used on enum and other things eventually if we want full hiding and to still retain RTTI information accurately, call the macro EXPORT_TYPE Signed-off-by: Kimball Thurston --- src/lib/Iex/IexBaseExc.h | 4 ++-- src/lib/Iex/IexExport.h | 8 ++++---- src/lib/IlmThread/IlmThread.h | 2 +- src/lib/IlmThread/IlmThreadExport.h | 6 +++--- src/lib/OpenEXR/ImfAttribute.h | 2 +- src/lib/OpenEXR/ImfExport.h | 6 +++--- src/lib/OpenEXR/ImfIO.h | 4 ++-- src/lib/OpenEXR/ImfOpaqueAttribute.h | 2 +- src/lib/OpenEXR/ImfStdIO.h | 8 ++++---- src/lib/OpenEXRUtil/ImfDeepImage.h | 2 +- src/lib/OpenEXRUtil/ImfDeepImageChannel.h | 2 +- src/lib/OpenEXRUtil/ImfFlatImage.h | 2 +- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 2 +- src/lib/OpenEXRUtil/ImfImage.h | 2 +- src/lib/OpenEXRUtil/ImfImageChannel.h | 2 +- src/lib/OpenEXRUtil/ImfUtilExport.h | 6 +++--- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/lib/Iex/IexBaseExc.h b/src/lib/Iex/IexBaseExc.h index 8e43e2f4f7..68eaf357de 100644 --- a/src/lib/Iex/IexBaseExc.h +++ b/src/lib/Iex/IexBaseExc.h @@ -27,7 +27,7 @@ IEX_INTERNAL_NAMESPACE_HEADER_ENTER // Our most basic exception class //------------------------------- -class IEX_EXPORT_VAGUELINKAGE BaseExc: public std::exception +class IEX_EXPORT_TYPE BaseExc: public std::exception { public: @@ -104,7 +104,7 @@ class IEX_EXPORT_VAGUELINKAGE BaseExc: public std::exception //----------------------------------------------------- #define DEFINE_EXC_EXP(exp, name, base) \ - class IEX_EXPORT_VAGUELINKAGE name: public base \ + class IEX_EXPORT_TYPE name: public base \ { \ public: \ exp name(); \ diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index 6a8fab606c..52bc755626 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -26,7 +26,7 @@ /// the class level, but if we were to do this under Windows, then the /// class member data types also end up being exported, which leaks /// STL details. So, to differentiate this, we use -/// IMF_EXPORT_VAGUELINKAGE at the class level, and continue to use +/// IMF_EXPORT_TYPE at the class level, and continue to use /// IMF_EXPORT on the public function symbols. Unfortunately, by /// putting the export at the class level, that means that private /// functions are then exported as well. Hence, we must force any of @@ -48,16 +48,16 @@ # else # define IEX_EXPORT __declspec(dllimport) # endif -# define IEX_EXPORT_VAGUELINKAGE +# define IEX_EXPORT_TYPE # define IEX_EXPORT_LOCAL #else # ifndef _MSC_VER # define IEX_EXPORT __attribute__ ((visibility ("default"))) -# define IEX_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IEX_EXPORT_TYPE __attribute__ ((visibility ("default"))) # define IEX_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define IEX_EXPORT -# define IEX_EXPORT_VAGUELINKAGE +# define IEX_EXPORT_TYPE # define IEX_EXPORT_LOCAL # endif #endif diff --git a/src/lib/IlmThread/IlmThread.h b/src/lib/IlmThread/IlmThread.h index b101332055..ecb5168912 100644 --- a/src/lib/IlmThread/IlmThread.h +++ b/src/lib/IlmThread/IlmThread.h @@ -79,7 +79,7 @@ ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER ILMTHREAD_EXPORT bool supportsThreads (); -class ILMTHREAD_EXPORT_VAGUELINKAGE Thread +class ILMTHREAD_EXPORT_TYPE Thread { public: diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index dd9b5fdf17..933fc97f23 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -13,18 +13,18 @@ # define ILMTHREAD_EXPORT __declspec(dllimport) # define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) # endif -# define ILMTHREAD_EXPORT_VAGUELINKAGE +# define ILMTHREAD_EXPORT_TYPE # define ILMTHREAD_EXPORT_LOCAL #else # ifndef _MSC_VER # define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) # define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define ILMTHREAD_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define ILMTHREAD_EXPORT_TYPE __attribute__ ((visibility ("default"))) # define ILMTHREAD_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define ILMTHREAD_EXPORT # define ILMTHREAD_EXPORT_CONST extern -# define ILMTHREAD_EXPORT_VAGUELINKAGE +# define ILMTHREAD_EXPORT_TYPE # define ILMTHREAD_EXPORT_LOCAL # endif #endif diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index fb0ecf927d..a789465d73 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -22,7 +22,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMF_EXPORT_VAGUELINKAGE Attribute +class IMF_EXPORT_TYPE Attribute { public: diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index 1fef9accbb..e058ff8a61 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -13,18 +13,18 @@ # define IMF_EXPORT __declspec(dllimport) # define IMF_EXPORT_CONST extern __declspec(dllimport) # endif -# define IMF_EXPORT_VAGUELINKAGE +# define IMF_EXPORT_TYPE # define IMF_EXPORT_LOCAL #else # ifndef _MSC_VER # define IMF_EXPORT __attribute__ ((visibility ("default"))) # define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define IMF_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IMF_EXPORT_TYPE __attribute__ ((visibility ("default"))) # define IMF_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define IMF_EXPORT # define IMF_EXPORT_CONST extern -# define IMF_EXPORT_VAGUELINKAGE +# define IMF_EXPORT_TYPE # define IMF_EXPORT_LOCAL # endif #endif diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index 8b16ef1215..c8229a3cfe 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -25,7 +25,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class IStream -- an abstract base class for input streams. //----------------------------------------------------------- -class IMF_EXPORT_VAGUELINKAGE IStream +class IMF_EXPORT_TYPE IStream { public: @@ -124,7 +124,7 @@ class IMF_EXPORT_VAGUELINKAGE IStream // class OStream -- an abstract base class for output streams //----------------------------------------------------------- -class IMF_EXPORT_VAGUELINKAGE OStream +class IMF_EXPORT_TYPE OStream { public: diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.h b/src/lib/OpenEXR/ImfOpaqueAttribute.h index fc714897a9..a0da25d509 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.h +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.h @@ -26,7 +26,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMF_EXPORT_VAGUELINKAGE OpaqueAttribute: public Attribute +class IMF_EXPORT_TYPE OpaqueAttribute: public Attribute { public: diff --git a/src/lib/OpenEXR/ImfStdIO.h b/src/lib/OpenEXR/ImfStdIO.h index 3c79973b4c..5866e495ed 100644 --- a/src/lib/OpenEXR/ImfStdIO.h +++ b/src/lib/OpenEXR/ImfStdIO.h @@ -28,7 +28,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // class OPENEXR_IMF_INTERNAL_NAMESPACE::IStream based on class std::ifstream //------------------------------------------- -class IMF_EXPORT_VAGUELINKAGE StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT_TYPE StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: @@ -72,7 +72,7 @@ class IMF_EXPORT_VAGUELINKAGE StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE // OPENEXR_IMF_INTERNAL_NAMESPACE::IStream, based on class std::istringstream //------------------------------------------------ -class IMF_EXPORT_VAGUELINKAGE StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +class IMF_EXPORT_TYPE StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: @@ -103,7 +103,7 @@ class IMF_EXPORT_VAGUELINKAGE StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE // class OPENEXR_IMF_INTERNAL_NAMESPACE::OStream based on class std::ofstream //------------------------------------------- -class IMF_EXPORT_VAGUELINKAGE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT_TYPE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: @@ -145,7 +145,7 @@ class IMF_EXPORT_VAGUELINKAGE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE // OPENEXR_IMF_INTERNAL_NAMESPACE::OStream, based on class std::ostringstream //------------------------------------------------ -class IMF_EXPORT_VAGUELINKAGE StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +class IMF_EXPORT_TYPE StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: diff --git a/src/lib/OpenEXRUtil/ImfDeepImage.h b/src/lib/OpenEXRUtil/ImfDeepImage.h index d9711c10e3..d675cfd66d 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImage.h +++ b/src/lib/OpenEXRUtil/ImfDeepImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMFUTIL_EXPORT_VAGUELINKAGE DeepImage : public Image +class IMFUTIL_EXPORT_TYPE DeepImage : public Image { public: diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h index e7d2c03dde..35a9d37e7c 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h @@ -39,7 +39,7 @@ class SampleCountChannel; // of the level. // -class IMFUTIL_EXPORT_VAGUELINKAGE DeepImageChannel: public ImageChannel +class IMFUTIL_EXPORT_TYPE DeepImageChannel: public ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfFlatImage.h b/src/lib/OpenEXRUtil/ImfFlatImage.h index e05cef1a5e..7eb50305fa 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImage.h +++ b/src/lib/OpenEXRUtil/ImfFlatImage.h @@ -24,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IMFUTIL_EXPORT_VAGUELINKAGE FlatImage : public Image +class IMFUTIL_EXPORT_TYPE FlatImage : public Image { public: diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index 08bdf75412..d115c876b2 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -38,7 +38,7 @@ class FlatImageLevel; // only for pixels within the data window of the level. // -class IMFUTIL_EXPORT_VAGUELINKAGE FlatImageChannel: public ImageChannel +class IMFUTIL_EXPORT_TYPE FlatImageChannel: public ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfImage.h b/src/lib/OpenEXRUtil/ImfImage.h index 32555da1df..708eb36cac 100644 --- a/src/lib/OpenEXRUtil/ImfImage.h +++ b/src/lib/OpenEXRUtil/ImfImage.h @@ -73,7 +73,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct Channel; -class IMFUTIL_EXPORT_VAGUELINKAGE Image +class IMFUTIL_EXPORT_TYPE Image { public: diff --git a/src/lib/OpenEXRUtil/ImfImageChannel.h b/src/lib/OpenEXRUtil/ImfImageChannel.h index 6a126d3585..5414d44138 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfImageChannel.h @@ -38,7 +38,7 @@ class ImageLevel; class ImageLevel; -class IMFUTIL_EXPORT_VAGUELINKAGE ImageChannel +class IMFUTIL_EXPORT_TYPE ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 62e665958c..3101de697f 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -13,18 +13,18 @@ # define IMFUTIL_EXPORT __declspec(dllimport) # define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) # endif -# define IMFUTIL_EXPORT_VAGUELINKAGE +# define IMFUTIL_EXPORT_TYPE # define IMFUTIL_EXPORT_LOCAL #else # ifndef _MSC_VER # define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) # define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define IMFUTIL_EXPORT_VAGUELINKAGE __attribute__ ((visibility ("default"))) +# define IMFUTIL_EXPORT_TYPE __attribute__ ((visibility ("default"))) # define IMFUTIL_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) # else # define IMFUTIL_EXPORT # define IMFUTIL_EXPORT_CONST extern -# define IMFUTIL_EXPORT_VAGUELINKAGE +# define IMFUTIL_EXPORT_TYPE # define IMFUTIL_EXPORT_LOCAL # endif #endif From ecd683e190dcb2842aa14d5818dc2d683bdebdb8 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 22:53:54 +1300 Subject: [PATCH 12/23] strings from typeid are const char *, not std::string Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfAttribute.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index a789465d73..c9e6bc086c 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -116,9 +116,7 @@ static U *dynamic_cast_attr (Attribute *a) const auto &aid = typeid(*a); const auto &uid = typeid(U); // check the fast tests first before comparing names... - if (aid == uid || - (aid.hash_code() == uid.hash_code() && - aid.name() == uid.name())) + if (aid == uid || !strcmp(aid.name(), uid.name())) { return static_cast( a ); } From b72161c9a40ae71fdcbfa44fadb182c6442ec89b Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 22:59:55 +1300 Subject: [PATCH 13/23] Add include for strcmp definition on systems where it's not pre-included Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfIO.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index c8229a3cfe..c1dd985d2b 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -17,7 +17,7 @@ #include #include - +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER From bb445d57a72a7d289cc7a72b2caf07fb3377aa4c Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 23:07:55 +1300 Subject: [PATCH 14/23] Add typeinfo include for some flavors c++ which don't include that with other headers Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfAttribute.h | 3 +++ src/lib/OpenEXR/ImfIO.h | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index c9e6bc086c..e1fe3d627d 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -20,6 +20,9 @@ #include "ImfExport.h" #include "ImfNamespace.h" +#include +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class IMF_EXPORT_TYPE Attribute diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index c1dd985d2b..cd3047841a 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -17,7 +17,6 @@ #include #include -#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER From e846fc547f8681f8baf8509b71762699e61c1f9c Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Tue, 16 Feb 2021 23:23:11 +1300 Subject: [PATCH 15/23] Fix includes and test to match ImfAttribute Signed-off-by: Kimball Thurston --- src/lib/OpenEXRUtil/ImfImageChannel.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/OpenEXRUtil/ImfImageChannel.h b/src/lib/OpenEXRUtil/ImfImageChannel.h index 5414d44138..3d026f5d94 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfImageChannel.h @@ -24,6 +24,9 @@ #include #include +#include +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class ImageLevel; @@ -120,9 +123,7 @@ static U *dynamic_cast_channel (ImageChannel *a) const auto &aid = typeid(*a); const auto &uid = typeid(U); // check the fast tests first before comparing names... - if (aid == uid || - (aid.hash_code() == uid.hash_code() && - aid.name() == uid.name())) + if (aid == uid || !strcmp(aid.name(), uid.name())) { return static_cast( a ); } From 22a6116221b9dfd648cefd8569427a1708316210 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 13:47:36 +1300 Subject: [PATCH 16/23] Clean up headers, fix symbol visibility changes This changes the headers such that all the ImfForward-declared things have ImfForward.h included first, such that ImfForward is truly ahead of all of them, which allows us to tag the symbol visibility correctly and avoid warnings. This also reduces header bloat throughout the library. Further, this change documents a more proper path for controlling symbol visibility. It switches things to using extern template instantiation for the attribute types, which should lower code bloat overall. The OpenEXR libraries are now compiled fully with hidden symbols by default as well as hidden inlines by default per the generally recommended behavior (-fvisibility=hidden -fvisibility-inlines-hidden via cmake). Signed-off-by: Kimball Thurston --- cmake/LibraryDefine.cmake | 7 +- docs/SymbolVisibility.md | 103 +++++++ src/bin/exrheader/main.cpp | 46 +-- src/bin/exrmaketiled/main.cpp | 2 + src/lib/Iex/IexExport.h | 43 +-- src/lib/IlmThread/IlmThreadExport.h | 16 +- src/lib/IlmThread/IlmThreadMutex.h | 2 +- src/lib/IlmThread/IlmThreadPool.h | 44 +-- src/lib/IlmThread/IlmThreadSemaphore.h | 14 +- src/lib/OpenEXR/ImfAcesFile.h | 8 +- src/lib/OpenEXR/ImfArray.h | 4 +- src/lib/OpenEXR/ImfAttribute.h | 113 +++----- src/lib/OpenEXR/ImfAutoArray.h | 5 +- src/lib/OpenEXR/ImfB44Compressor.h | 13 +- src/lib/OpenEXR/ImfBoxAttribute.cpp | 16 +- src/lib/OpenEXR/ImfBoxAttribute.h | 34 +-- src/lib/OpenEXR/ImfChannelList.h | 12 +- src/lib/OpenEXR/ImfChannelListAttribute.cpp | 17 +- src/lib/OpenEXR/ImfChannelListAttribute.h | 21 +- src/lib/OpenEXR/ImfCheckedArithmetic.h | 16 +- src/lib/OpenEXR/ImfChromaticities.h | 9 +- .../OpenEXR/ImfChromaticitiesAttribute.cpp | 11 +- src/lib/OpenEXR/ImfChromaticitiesAttribute.h | 18 +- src/lib/OpenEXR/ImfCompositeDeepScanLine.h | 7 +- src/lib/OpenEXR/ImfCompression.h | 3 +- src/lib/OpenEXR/ImfCompressionAttribute.cpp | 10 +- src/lib/OpenEXR/ImfCompressionAttribute.h | 10 +- src/lib/OpenEXR/ImfCompressor.h | 14 +- src/lib/OpenEXR/ImfConvert.h | 3 +- src/lib/OpenEXR/ImfDeepCompositing.h | 5 +- src/lib/OpenEXR/ImfDeepFrameBuffer.h | 12 +- src/lib/OpenEXR/ImfDeepImageState.h | 4 +- .../OpenEXR/ImfDeepImageStateAttribute.cpp | 15 +- src/lib/OpenEXR/ImfDeepImageStateAttribute.h | 15 +- src/lib/OpenEXR/ImfDeepScanLineInputFile.h | 9 +- src/lib/OpenEXR/ImfDeepScanLineInputPart.cpp | 5 +- src/lib/OpenEXR/ImfDeepScanLineInputPart.h | 12 +- src/lib/OpenEXR/ImfDeepTiledInputFile.cpp | 34 +-- src/lib/OpenEXR/ImfDeepTiledInputFile.h | 19 +- src/lib/OpenEXR/ImfDeepTiledInputPart.cpp | 3 +- src/lib/OpenEXR/ImfDeepTiledInputPart.h | 11 +- src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp | 2 + src/lib/OpenEXR/ImfDeepTiledOutputFile.h | 15 +- src/lib/OpenEXR/ImfDeepTiledOutputPart.cpp | 5 +- src/lib/OpenEXR/ImfDeepTiledOutputPart.h | 8 +- src/lib/OpenEXR/ImfDoubleAttribute.cpp | 7 +- src/lib/OpenEXR/ImfDoubleAttribute.h | 5 +- src/lib/OpenEXR/ImfDwaCompressor.h | 15 +- src/lib/OpenEXR/ImfEnvmap.h | 9 +- src/lib/OpenEXR/ImfEnvmapAttribute.cpp | 13 +- src/lib/OpenEXR/ImfEnvmapAttribute.h | 16 +- src/lib/OpenEXR/ImfExport.h | 55 +++- src/lib/OpenEXR/ImfFastHuf.h | 5 - src/lib/OpenEXR/ImfFloatAttribute.cpp | 6 +- src/lib/OpenEXR/ImfFloatAttribute.h | 8 +- src/lib/OpenEXR/ImfFloatVectorAttribute.cpp | 9 +- src/lib/OpenEXR/ImfFloatVectorAttribute.h | 20 +- src/lib/OpenEXR/ImfForward.h | 91 +++--- src/lib/OpenEXR/ImfFrameBuffer.h | 15 +- src/lib/OpenEXR/ImfFramesPerSecond.h | 5 +- src/lib/OpenEXR/ImfGenericInputFile.cpp | 1 + src/lib/OpenEXR/ImfGenericInputFile.h | 8 +- src/lib/OpenEXR/ImfGenericOutputFile.cpp | 20 +- src/lib/OpenEXR/ImfGenericOutputFile.h | 9 +- src/lib/OpenEXR/ImfHeader.h | 21 +- src/lib/OpenEXR/ImfIDManifest.h | 23 +- src/lib/OpenEXR/ImfIDManifestAttribute.cpp | 8 +- src/lib/OpenEXR/ImfIDManifestAttribute.h | 22 +- src/lib/OpenEXR/ImfIO.h | 3 +- src/lib/OpenEXR/ImfInputFile.cpp | 16 +- src/lib/OpenEXR/ImfInputFile.h | 30 +- src/lib/OpenEXR/ImfInputPart.cpp | 1 + src/lib/OpenEXR/ImfInputPart.h | 10 +- src/lib/OpenEXR/ImfInputPartData.h | 5 +- src/lib/OpenEXR/ImfInputStreamMutex.h | 3 +- src/lib/OpenEXR/ImfInt64.h | 3 +- src/lib/OpenEXR/ImfIntAttribute.cpp | 14 +- src/lib/OpenEXR/ImfIntAttribute.h | 9 +- src/lib/OpenEXR/ImfKeyCode.h | 4 +- src/lib/OpenEXR/ImfKeyCodeAttribute.cpp | 10 +- src/lib/OpenEXR/ImfKeyCodeAttribute.h | 21 +- src/lib/OpenEXR/ImfLineOrder.h | 3 +- src/lib/OpenEXR/ImfLineOrderAttribute.cpp | 8 +- src/lib/OpenEXR/ImfLineOrderAttribute.h | 24 +- src/lib/OpenEXR/ImfLut.cpp | 4 +- src/lib/OpenEXR/ImfLut.h | 11 +- src/lib/OpenEXR/ImfMatrixAttribute.cpp | 33 ++- src/lib/OpenEXR/ImfMatrixAttribute.h | 30 +- src/lib/OpenEXR/ImfMisc.h | 5 +- src/lib/OpenEXR/ImfMultiPartInputFile.h | 15 +- src/lib/OpenEXR/ImfMultiPartOutputFile.h | 12 +- src/lib/OpenEXR/ImfMultiView.h | 5 +- src/lib/OpenEXR/ImfName.h | 68 +++-- src/lib/OpenEXR/ImfOpaqueAttribute.cpp | 2 +- src/lib/OpenEXR/ImfOpaqueAttribute.h | 4 +- src/lib/OpenEXR/ImfOptimizedPixelReading.h | 2 + src/lib/OpenEXR/ImfOutputFile.cpp | 27 +- src/lib/OpenEXR/ImfOutputFile.h | 16 +- src/lib/OpenEXR/ImfOutputPart.cpp | 4 +- src/lib/OpenEXR/ImfOutputPart.h | 6 +- src/lib/OpenEXR/ImfOutputPartData.h | 6 +- src/lib/OpenEXR/ImfOutputStreamMutex.h | 4 +- src/lib/OpenEXR/ImfPartHelper.h | 8 +- src/lib/OpenEXR/ImfPartType.h | 13 +- src/lib/OpenEXR/ImfPixelType.h | 3 +- src/lib/OpenEXR/ImfPizCompressor.h | 13 +- src/lib/OpenEXR/ImfPreviewImage.h | 7 +- src/lib/OpenEXR/ImfPreviewImageAttribute.cpp | 11 +- src/lib/OpenEXR/ImfPreviewImageAttribute.h | 19 +- src/lib/OpenEXR/ImfPxr24Compressor.h | 11 - src/lib/OpenEXR/ImfRational.h | 2 +- src/lib/OpenEXR/ImfRationalAttribute.cpp | 12 +- src/lib/OpenEXR/ImfRationalAttribute.h | 16 +- src/lib/OpenEXR/ImfRgba.h | 6 +- src/lib/OpenEXR/ImfRgbaFile.h | 20 +- src/lib/OpenEXR/ImfRgbaYca.h | 4 +- src/lib/OpenEXR/ImfRleCompressor.h | 8 +- src/lib/OpenEXR/ImfScanLineInputFile.cpp | 15 +- src/lib/OpenEXR/ImfScanLineInputFile.h | 18 +- src/lib/OpenEXR/ImfStdIO.cpp | 7 + src/lib/OpenEXR/ImfStdIO.h | 69 ++--- src/lib/OpenEXR/ImfStringAttribute.cpp | 26 +- src/lib/OpenEXR/ImfStringAttribute.h | 20 +- src/lib/OpenEXR/ImfStringVectorAttribute.cpp | 12 +- src/lib/OpenEXR/ImfStringVectorAttribute.h | 20 +- src/lib/OpenEXR/ImfSystemSpecific.h | 4 +- src/lib/OpenEXR/ImfTestFile.h | 2 - src/lib/OpenEXR/ImfTileDescription.h | 9 +- .../OpenEXR/ImfTileDescriptionAttribute.cpp | 11 +- src/lib/OpenEXR/ImfTileDescriptionAttribute.h | 22 +- src/lib/OpenEXR/ImfTileOffsets.h | 13 +- src/lib/OpenEXR/ImfTiledInputFile.cpp | 3 + src/lib/OpenEXR/ImfTiledInputFile.h | 26 +- src/lib/OpenEXR/ImfTiledInputPart.cpp | 4 +- src/lib/OpenEXR/ImfTiledInputPart.h | 9 +- src/lib/OpenEXR/ImfTiledMisc.cpp | 3 +- src/lib/OpenEXR/ImfTiledMisc.h | 7 +- src/lib/OpenEXR/ImfTiledOutputFile.cpp | 2 + src/lib/OpenEXR/ImfTiledOutputFile.h | 20 +- src/lib/OpenEXR/ImfTiledOutputPart.cpp | 4 +- src/lib/OpenEXR/ImfTiledOutputPart.h | 7 +- src/lib/OpenEXR/ImfTiledRgbaFile.h | 20 +- src/lib/OpenEXR/ImfTimeCode.h | 4 +- src/lib/OpenEXR/ImfTimeCodeAttribute.cpp | 12 +- src/lib/OpenEXR/ImfTimeCodeAttribute.h | 19 +- src/lib/OpenEXR/ImfVecAttribute.cpp | 46 +-- src/lib/OpenEXR/ImfVecAttribute.h | 48 +--- src/lib/OpenEXR/ImfVersion.h | 18 +- src/lib/OpenEXR/ImfXdr.h | 6 +- src/lib/OpenEXR/ImfZip.h | 7 - src/lib/OpenEXR/ImfZipCompressor.h | 9 +- src/lib/OpenEXRUtil/ImfCheckFile.cpp | 5 + src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp | 251 +++++++++++++++++ src/lib/OpenEXRUtil/ImfDeepImageChannel.h | 264 ++---------------- src/lib/OpenEXRUtil/ImfDeepImageIO.h | 4 +- src/lib/OpenEXRUtil/ImfDeepImageLevel.h | 28 +- src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 6 +- src/lib/OpenEXRUtil/ImfFlatImageLevel.h | 20 +- src/lib/OpenEXRUtil/ImfImage.h | 11 +- src/lib/OpenEXRUtil/ImfImageChannel.h | 49 +--- src/lib/OpenEXRUtil/ImfImageChannelRenaming.h | 13 +- src/lib/OpenEXRUtil/ImfImageDataWindow.h | 2 +- src/lib/OpenEXRUtil/ImfImageIO.h | 3 +- src/lib/OpenEXRUtil/ImfImageLevel.h | 2 +- src/lib/OpenEXRUtil/ImfSampleCountChannel.h | 4 +- src/lib/OpenEXRUtil/ImfUtilExport.h | 47 +++- src/test/OpenEXRTest/TestUtilFStream.h | 4 +- src/test/OpenEXRTest/testAttributes.cpp | 12 +- .../OpenEXRTest/testBadTypeAttributes.cpp | 5 + src/test/OpenEXRTest/testChannels.cpp | 2 + src/test/OpenEXRTest/testCompression.cpp | 4 +- src/test/OpenEXRTest/testConversion.cpp | 4 +- src/test/OpenEXRTest/testCopyDeepTiled.cpp | 6 +- .../OpenEXRTest/testCopyMultiPartFile.cpp | 2 + src/test/OpenEXRTest/testCopyPixels.cpp | 2 + src/test/OpenEXRTest/testCustomAttributes.cpp | 2 + src/test/OpenEXRTest/testDeepTiledBasic.cpp | 5 +- src/test/OpenEXRTest/testFutureProofing.cpp | 6 + src/test/OpenEXRTest/testIDManifest.cpp | 1 + src/test/OpenEXRTest/testInputPart.cpp | 3 + .../testLargeDataWindowOffsets.cpp | 2 + src/test/OpenEXRTest/testLineOrder.cpp | 2 + src/test/OpenEXRTest/testMultiPartApi.cpp | 2 + .../testMultiPartFileMixingBasic.cpp | 8 + .../testMultiPartSharedAttributes.cpp | 9 +- .../OpenEXRTest/testMultiPartThreading.cpp | 2 + .../testMultiScanlinePartThreading.cpp | 2 + .../testMultiTiledPartThreading.cpp | 2 + src/test/OpenEXRTest/testOptimized.cpp | 2 + .../testOptimizedInterleavePatterns.cpp | 1 + src/test/OpenEXRTest/testTiledCompression.cpp | 4 +- src/test/OpenEXRTest/testTiledCopyPixels.cpp | 4 +- src/test/OpenEXRTest/testTiledLineOrder.cpp | 4 +- src/test/OpenEXRTest/testTiledRgba.cpp | 3 +- src/test/OpenEXRUtilTest/testDeepImage.cpp | 6 +- src/test/OpenEXRUtilTest/testFlatImage.cpp | 6 +- 196 files changed, 1605 insertions(+), 1500 deletions(-) create mode 100644 docs/SymbolVisibility.md diff --git a/cmake/LibraryDefine.cmake b/cmake/LibraryDefine.cmake index 08ff9410fc..14ca5933c0 100644 --- a/cmake/LibraryDefine.cmake +++ b/cmake/LibraryDefine.cmake @@ -10,7 +10,7 @@ function(OPENEXR_DEFINE_LIBRARY libname) cmake_parse_arguments(OPENEXR_CURLIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (MSVC) - set(_imath_extra_flags "/EHsc") + set(_openexr_extra_flags "/EHsc") endif() set(objlib ${libname}) add_library(${objlib} @@ -41,9 +41,10 @@ function(OPENEXR_DEFINE_LIBRARY libname) POSITION_INDEPENDENT_CODE ON C_VISIBILITY_PRESET hidden CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON ) - if (_imath_extra_flags) - target_compile_options(${objlib} PUBLIC ${_imath_extra_flags}) + if (_openexr_extra_flags) + target_compile_options(${objlib} PUBLIC ${_openexr_extra_flags}) endif() set_property(TARGET ${objlib} PROPERTY PUBLIC_HEADER ${OPENEXR_CURLIB_HEADERS}) diff --git a/docs/SymbolVisibility.md b/docs/SymbolVisibility.md new file mode 100644 index 0000000000..f29ea20c14 --- /dev/null +++ b/docs/SymbolVisibility.md @@ -0,0 +1,103 @@ +# Symbol Visibility in OpenEXR + +## Overview + +Managing symbol visibility in a C++ library can reduce library sizes, +and with the extra information, the optimizer may produce faster +code. To take advantage of this, OpenEXR 3.0 is switching to +explicitly manage symbols on all platforms, with a hidden-by-default +behavior on unix-based platforms. Managing symbols has always been +required for Windows DLLs, where one must explicitly tag functions for +import and export as appropriate. + +For C, this is trivial: just tag public functions or global variable +as default visibility and leave everything else defaulting to +hidden. However, in C++, this is not exactly the same story. Functions +and globals are of course the same. And class member functions are +largely the same, and other than the attribute specification +mechanics, follow the same rules between gcc, clang, and +msvc. However, types have richer information than they do in C. So, +unless extra work is done, concepts for RTTI like the typeinfo and the +vtable for virtual classes will be hidden, and not visible. These are +referred to as "vague" linkage objects in some discussions. + +It is with the "vague" linkage objects where different properties +arise. For example, if you have a template, it is happily instantiated +in multiple compile units. If the typeinfo is hidden for one library, +then this may cause things like dynamic_cast to fail because then the +same typeinfo is not used, and even though one might think that +ImfAttribute are the same in two places, because they +are instantiated in separate places, they may be considered different +types. To compound the issue, there are different rules for this in +different implementations. For example, a default gcc under linux +allows one to link against otherwise private "vague" linkage objects +such that the typeinfo ends up as the same entity. clang, for MacOS +anyway, follows a stricter approach and keeps those types separate, +perhaps due to the two level namespace they maintain for symbols. + +Unfortunately, this is not clearly discussed as an overview of the +differences between platforms, hence this document to add +clarity. Each compiler / platform describes their own behavior, but +not how that behaves relative to +others. [libc++](https://libcxx.llvm.org/docs/DesignDocs/VisibilityMacros.html) +from the llvm project is the closest to providing comparitive +information, where by looking at how they define their macros and the +comments surrounding, one can infer the behavior among at least +windows DLL mode, then gcc vs. clang for unixen. Other compilers, for +example, Intel's icc, tend to adopt the behavior of the predominant +compiler for that platform (i.e. msvc under windows, gcc under linux), +and so can generally adopt that behavior and are ignored here. If this +is not true, the ifdef rules in the various library *Export.h headers +within OpenEXR may need to be adjusted, and this table updated. + +As a summary, below is a table of the attribute or declspec that needs +to be used for a particular C++ entity to be properly exported. This +does not address weak symbols, ABI versioning, and only focusing on +visibility. Under Windows DLL rules, if one exports the entire class, +it also exports the types for the member types as well, which is not +desired, so these are marked as N/A even though the compiler does +allow that to happen. + + +| C++ vs Compiler | MSVC | mingw | gcc | clang | +|-----------------|---------------------|---------------------|-----------------------|----------------------------| +| function | dllexport/dllimport | dllexport/dllimport | visibility("default") | visibility("default") | +| hide a function | N/A | N/A | visibility("hidden") | visibility("hidden") | +| class(typeinfo) | N/A | N/A | visibility("default") | visibility("default") | +| template class | N/A | N/A | visibility("default") | type_visibility("default") | +| template data | N/A | N/A | visibility("default") | visibility("default") | +| class template
instantiation | dllexport/dllimport | N/A | N/A | N/A | +| enum | N/A | N/A | auto unhides (N/A) | type_visibility("default") | +| extern template | N/A | dllexport/dllimport | visibility("default") | visibility("default") | + +With this matrix in mind, we can see the maximal set of macros we need to +provide throughout the code. *NB*: This does not mean that we need to +declare all of these, just that they might be needed. `XXX` should be +substituted for the particular library name being compiled. + +| macro name | purpose | +|--------------------------------|------------------------------------------------------------------| +| `XXX_EXPORT` | one of export or import for windows, visibility for others | +| `XXX_EXPORT_TYPE` | for declaring a class / struct as public (for typeinfo / vtable) | +| `XXX_HIDDEN` | used to explicitly hide, especially members of types | +| `XXX_EXPORT_TEMPLATE_TYPE` | stating the template type should be visible | +| `XXX_EXPORT_EXTERN_TEMPLATE` | exporting template types (i.e. extern side of extern template) | +| `XXX_EXPORT_TEMPLATE_INSTANCE` | exporting specific template instantiations (in cpp code) | +| `XXX_EXPORT_TEMPLATE_DATA` | exporting templated data blocks | +| `XXX_EXPORT_ENUM` | exporting enum types | + +For a new library, the preference might be to call `XXX_EXPORT` +something like `XXX_FUNC`, and rename things such as `XXX_EXPORT_TYPE` +to `XXX_TYPE` for simplicity. However, historically, OpenEXR has used +the `_EXPORT` tag, and so that is preserved for consistency. + +## References + +LLVM libc++ visibility macros: +https://libcxx.llvm.org/docs/DesignDocs/VisibilityMacros.html + +GCC visibility wiki: +https://gcc.gnu.org/wiki/Visibility + +Apple library design docs: +https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html diff --git a/src/bin/exrheader/main.cpp b/src/bin/exrheader/main.cpp index f10fb6ed61..f115b993f3 100644 --- a/src/bin/exrheader/main.cpp +++ b/src/bin/exrheader/main.cpp @@ -306,24 +306,24 @@ printInfo (const char fileName[]) cout << i.name() << " (type " << a->typeName() << ")"; if (const Box2iAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value().min << " - " << ta->value().max; } else if (const Box2fAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value().min << " - " << ta->value().max; } else if (const ChannelListAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":"; printChannelList (ta->value()); } else if (const ChromaticitiesAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n" " red " << ta->value().red << "\n" @@ -332,34 +332,34 @@ printInfo (const char fileName[]) " white " << ta->value().white; } else if (const CompressionAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": "; printCompression (ta->value()); } else if (const DoubleAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const EnvmapAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": "; printEnvmap (ta->value()); } else if (const FloatAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const IntAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const KeyCodeAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n" " film manufacturer code " << @@ -378,13 +378,13 @@ printInfo (const char fileName[]) ta->value().perfsPerCount(); } else if (const LineOrderAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": "; printLineOrder (ta->value()); } else if (const M33fAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n" " (" << @@ -399,7 +399,7 @@ printInfo (const char fileName[]) ta->value()[2][2] << ")"; } else if (const M44fAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n" " (" << @@ -421,19 +421,19 @@ printInfo (const char fileName[]) ta->value()[3][3] << ")"; } else if (const PreviewImageAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value().width() << " by " << ta->value().height() << " pixels"; } else if (const StringAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": \"" << ta->value() << "\""; } else if (const StringVectorAttribute * ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":"; @@ -445,13 +445,13 @@ printInfo (const char fileName[]) } } else if (const RationalAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value().n << "/" << ta->value().d << " (" << double (ta->value()) << ")"; } else if (const TileDescriptionAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n "; @@ -468,28 +468,28 @@ printInfo (const char fileName[]) } } else if (const TimeCodeAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ":\n"; printTimeCode (ta->value()); } else if (const V2iAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const V2fAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const V3iAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } else if (const V3fAttribute *ta = - dynamic_cast_attr (a)) + dynamic_cast (a)) { cout << ": " << ta->value(); } diff --git a/src/bin/exrmaketiled/main.cpp b/src/bin/exrmaketiled/main.cpp index 1399961264..b78da6ef32 100644 --- a/src/bin/exrmaketiled/main.cpp +++ b/src/bin/exrmaketiled/main.cpp @@ -13,6 +13,8 @@ #include "makeTiled.h" +#include + #include #include #include diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index 52bc755626..c9af965b92 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -8,39 +8,11 @@ /// \defgroup ExportMacros Macros to manage symbol visibility /// -/// In order to produce tidy symbol tables in shared objects, one must -/// manage symbol visibility. This is required under Windows for DLLs, -/// and has been well documented in terms of export / import -/// swapping. However, under Unixen or other similar platforms, there -/// is a different mechanism of specifying the visibility. So to -/// achieve nearly the same results, without requiring every single -/// function be tagged, one can tell the compiler to mark all symbols -/// as hidden by default, then only export the specific symbols in -/// question. -/// -/// However, this is not so easy for C++. There are what are called -/// 'vague' linkage objects, which are often the typeinfo / vtable -/// type objects, although templates and a few other items fall into -/// this category. In order to enable dynamic_cast and similar -/// behavior, we must export the typeinfo and such. This is done at -/// the class level, but if we were to do this under Windows, then the -/// class member data types also end up being exported, which leaks -/// STL details. So, to differentiate this, we use -/// IMF_EXPORT_TYPE at the class level, and continue to use -/// IMF_EXPORT on the public function symbols. Unfortunately, by -/// putting the export at the class level, that means that private -/// functions are then exported as well. Hence, we must force any of -/// these back to local using IMF_EXPORT_LOCAL. To avoid pollution of -/// the code, we should only apply this to classes which are used for -/// dynamic_cast, or otherwise require it. -/// -/// There may be more needed than have been tagged so far, if you -/// start receiving link errors about typeinfo, please look if it is -/// the symbol exports, and whether additional tagging is -/// needed. Having a goal to hide symbols should increase symbol -/// loading / resolution performance in aggregate, so is a desired end -/// goal. +/// See docs/SymbolVisibility.md for more discussion /// +/// Iex is simple and does not need to do more than expose class types +/// and functions, and does not have any private members to hide +/// /// @{ #if defined(OPENEXR_DLL) # if defined(IEX_EXPORTS) @@ -49,16 +21,13 @@ # define IEX_EXPORT __declspec(dllimport) # endif # define IEX_EXPORT_TYPE -# define IEX_EXPORT_LOCAL #else # ifndef _MSC_VER -# define IEX_EXPORT __attribute__ ((visibility ("default"))) -# define IEX_EXPORT_TYPE __attribute__ ((visibility ("default"))) -# define IEX_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) +# define IEX_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IEX_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) # else # define IEX_EXPORT # define IEX_EXPORT_TYPE -# define IEX_EXPORT_LOCAL # endif #endif diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index 933fc97f23..d979b928a8 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -3,29 +3,27 @@ // Copyright (c) Contributors to the OpenEXR Project. // +// See docs/SymbolVisibility.md for more discussion + /// \addtogroup ExportMacros /// @{ #if defined(OPENEXR_DLL) # if defined(ILMTHREAD_EXPORTS) # define ILMTHREAD_EXPORT __declspec(dllexport) -# define ILMTHREAD_EXPORT_CONST extern __declspec(dllexport) # else # define ILMTHREAD_EXPORT __declspec(dllimport) -# define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) # endif # define ILMTHREAD_EXPORT_TYPE -# define ILMTHREAD_EXPORT_LOCAL +# define ILMTHREAD_HIDDEN #else # ifndef _MSC_VER -# define ILMTHREAD_EXPORT __attribute__ ((visibility ("default"))) -# define ILMTHREAD_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define ILMTHREAD_EXPORT_TYPE __attribute__ ((visibility ("default"))) -# define ILMTHREAD_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) +# define ILMTHREAD_EXPORT __attribute__ ((__visibility__ ("default"))) +# define ILMTHREAD_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) +# define ILMTHREAD_HIDDEN __attribute__ ((__visibility__ ("hidden"))) # else # define ILMTHREAD_EXPORT -# define ILMTHREAD_EXPORT_CONST extern # define ILMTHREAD_EXPORT_TYPE -# define ILMTHREAD_EXPORT_LOCAL +# define ILMTHREAD_HIDDEN # endif #endif /// @} diff --git a/src/lib/IlmThread/IlmThreadMutex.h b/src/lib/IlmThread/IlmThreadMutex.h index b4222ee079..5f9f721cf2 100644 --- a/src/lib/IlmThread/IlmThreadMutex.h +++ b/src/lib/IlmThread/IlmThreadMutex.h @@ -29,7 +29,7 @@ using Mutex ILMTHREAD_DEPRECATED ("replace with std::mutex") = std::mutex; // unfortunately we can't use std::unique_lock as a replacement for Lock since // they have different API. Let us deprecate for now and give people a chance // to clean up their code. -class ILMTHREAD_EXPORT Lock +class Lock { public: diff --git a/src/lib/IlmThread/IlmThreadPool.h b/src/lib/IlmThread/IlmThreadPool.h index b510cb99b8..a0ae9835cd 100644 --- a/src/lib/IlmThread/IlmThreadPool.h +++ b/src/lib/IlmThread/IlmThreadPool.h @@ -47,11 +47,11 @@ class Task; // the implementation of the processing of tasks // is implemented //------------------------------------------------------- -class ILMTHREAD_EXPORT ThreadPoolProvider +class ILMTHREAD_EXPORT_TYPE ThreadPoolProvider { public: - ThreadPoolProvider(); - virtual ~ThreadPoolProvider(); + ILMTHREAD_EXPORT ThreadPoolProvider(); + ILMTHREAD_EXPORT virtual ~ThreadPoolProvider(); // as in ThreadPool below virtual int numThreads () const = 0; @@ -71,7 +71,7 @@ class ILMTHREAD_EXPORT ThreadPoolProvider ThreadPoolProvider &operator= (ThreadPoolProvider &&) = delete; }; -class ILMTHREAD_EXPORT ThreadPool +class ILMTHREAD_EXPORT_TYPE ThreadPool { public: //------------------------------------------------------- @@ -85,6 +85,7 @@ class ILMTHREAD_EXPORT ThreadPool // that we can query, this routine gives a place where we // can centralize that logic //------------------------------------------------------- + ILMTHREAD_EXPORT static unsigned estimateThreadCountForFileIO (); //------------------------------------------------------- @@ -93,7 +94,7 @@ class ILMTHREAD_EXPORT ThreadPool // using a default ThreadPoolProvider //------------------------------------------------------- - ThreadPool (unsigned numThreads = 0); + ILMTHREAD_EXPORT ThreadPool (unsigned numThreads = 0); //----------------------------------------------------------- @@ -101,7 +102,7 @@ class ILMTHREAD_EXPORT ThreadPool // the threads to the calling thread, and then destroys them. //----------------------------------------------------------- - virtual ~ThreadPool (); + ILMTHREAD_EXPORT virtual ~ThreadPool (); ThreadPool (const ThreadPool&) = delete; ThreadPool& operator= (const ThreadPool&) = delete; ThreadPool (ThreadPool&&) = delete; @@ -115,8 +116,8 @@ class ILMTHREAD_EXPORT ThreadPool // or crash. //-------------------------------------------------------- - int numThreads () const; - void setNumThreads (int count); + ILMTHREAD_EXPORT int numThreads () const; + ILMTHREAD_EXPORT void setNumThreads (int count); //-------------------------------------------------------- // Set the thread provider for the pool. @@ -129,7 +130,7 @@ class ILMTHREAD_EXPORT ThreadPool // thread as this will almost certainly cause a deadlock // or crash. //-------------------------------------------------------- - void setThreadProvider (ThreadPoolProvider *provider); + ILMTHREAD_EXPORT void setThreadProvider (ThreadPoolProvider *provider); //------------------------------------------------------------ // Add a task for processing. The ThreadPool can handle any @@ -138,17 +139,17 @@ class ILMTHREAD_EXPORT ThreadPool // by threads as they become available, in FIFO order. //------------------------------------------------------------ - void addTask (Task* task); + ILMTHREAD_EXPORT void addTask (Task* task); //------------------------------------------- // Access functions for the global threadpool //------------------------------------------- - static ThreadPool& globalThreadPool (); - static void addGlobalTask (Task* task); + ILMTHREAD_EXPORT static ThreadPool& globalThreadPool (); + ILMTHREAD_EXPORT static void addGlobalTask (Task* task); - struct Data; + struct ILMTHREAD_HIDDEN Data; protected: @@ -156,18 +157,19 @@ class ILMTHREAD_EXPORT ThreadPool }; -class ILMTHREAD_EXPORT Task +class ILMTHREAD_EXPORT_TYPE Task { public: - Task (TaskGroup* g); - virtual ~Task (); + ILMTHREAD_EXPORT Task (TaskGroup* g); + ILMTHREAD_EXPORT virtual ~Task (); Task (const Task&) = delete; Task &operator= (const Task&) = delete; Task (Task&&) = delete; Task& operator= (Task&&) = delete; virtual void execute () = 0; + ILMTHREAD_EXPORT TaskGroup * group(); protected: @@ -176,12 +178,12 @@ class ILMTHREAD_EXPORT Task }; -class ILMTHREAD_EXPORT TaskGroup +class ILMTHREAD_EXPORT_TYPE TaskGroup { public: - TaskGroup(); - ~TaskGroup(); + ILMTHREAD_EXPORT TaskGroup(); + ILMTHREAD_EXPORT ~TaskGroup(); TaskGroup (const TaskGroup& other) = delete; TaskGroup& operator = (const TaskGroup& other) = delete; @@ -191,9 +193,9 @@ class ILMTHREAD_EXPORT TaskGroup // marks one task as finished // should be used by the thread pool provider to notify // as it finishes tasks - void finishOneTask (); + ILMTHREAD_EXPORT void finishOneTask (); - struct Data; + struct ILMTHREAD_HIDDEN Data; Data* const _data; }; diff --git a/src/lib/IlmThread/IlmThreadSemaphore.h b/src/lib/IlmThread/IlmThreadSemaphore.h index a8dab51209..f26e48a09c 100644 --- a/src/lib/IlmThread/IlmThreadSemaphore.h +++ b/src/lib/IlmThread/IlmThreadSemaphore.h @@ -38,17 +38,17 @@ ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER -class ILMTHREAD_EXPORT Semaphore +class ILMTHREAD_EXPORT_TYPE Semaphore { public: - Semaphore (unsigned int value = 0); - virtual ~Semaphore(); + ILMTHREAD_EXPORT Semaphore (unsigned int value = 0); + ILMTHREAD_EXPORT virtual ~Semaphore(); - void wait(); - bool tryWait(); - void post(); - int value() const; + ILMTHREAD_EXPORT void wait(); + ILMTHREAD_EXPORT bool tryWait(); + ILMTHREAD_EXPORT void post(); + ILMTHREAD_EXPORT int value() const; private: diff --git a/src/lib/OpenEXR/ImfAcesFile.h b/src/lib/OpenEXR/ImfAcesFile.h index a631318d18..faecb10818 100644 --- a/src/lib/OpenEXR/ImfAcesFile.h +++ b/src/lib/OpenEXR/ImfAcesFile.h @@ -72,7 +72,7 @@ const Chromaticities & acesChromaticities (); // ACES output file. // -class AcesOutputFile +class IMF_EXPORT_TYPE AcesOutputFile { public: @@ -209,7 +209,7 @@ class AcesOutputFile AcesOutputFile (AcesOutputFile &&) = delete; AcesOutputFile & operator = (AcesOutputFile &&) = delete; - class Data; + class IMF_HIDDEN Data; Data * _data; }; @@ -219,7 +219,7 @@ class AcesOutputFile // ACES input file // -class AcesInputFile +class IMF_EXPORT_TYPE AcesInputFile { public: @@ -320,7 +320,7 @@ class AcesInputFile AcesInputFile (AcesInputFile &&) = delete; AcesInputFile & operator = (AcesInputFile &&) = delete; - class Data; + class IMF_HIDDEN Data; Data * _data; }; diff --git a/src/lib/OpenEXR/ImfArray.h b/src/lib/OpenEXR/ImfArray.h index 90d13db78d..37183a7e85 100644 --- a/src/lib/OpenEXR/ImfArray.h +++ b/src/lib/OpenEXR/ImfArray.h @@ -44,7 +44,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER template -class Array +class IMF_EXPORT_TEMPLATE_TYPE Array { public: @@ -101,7 +101,7 @@ class Array template -class Array2D +class IMF_EXPORT_TEMPLATE_TYPE Array2D { public: diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index e1fe3d627d..8ec4c26f25 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -13,12 +13,12 @@ // //----------------------------------------------------------------------------- -#include +#include "ImfForward.h" + #include "ImfIO.h" #include "ImfXdr.h" -#include "ImfForward.h" -#include "ImfExport.h" -#include "ImfNamespace.h" + +#include #include #include @@ -97,64 +97,12 @@ class IMF_EXPORT_TYPE Attribute static void unRegisterAttributeType (const char typeName[]); }; -/// \defgroup TypeConversion type conversion helpers -/// -/// We define these here for systems such as libc++ where the typeinfo -/// may not be the same between what is compiled into the library, and -/// the one used in code put into applications, especially with hidden -/// visibility enabled by default. The internal type checks as one -/// sets attributes into headers would then fail. As a result, we use -/// these where the types are more loosely defined to only include the -/// hash and name. With our custom, versioned namespace, this should -/// be safe, and allows us to have hidden visibility on symbols and -/// make a tidy shared object. -/// -/// @{ - -template -static U *dynamic_cast_attr (Attribute *a) -{ - if (!a) - return nullptr; - const auto &aid = typeid(*a); - const auto &uid = typeid(U); - // check the fast tests first before comparing names... - if (aid == uid || !strcmp(aid.name(), uid.name())) - { - return static_cast( a ); - } - return nullptr; -} -template -static const U *dynamic_cast_attr (const Attribute *a) -{ - return dynamic_cast_attr ( const_cast ( a ) ); -} -template -static U &dynamic_cast_attr (Attribute &a) -{ - U *ret = dynamic_cast_attr (&a); - if ( ! ret ) - throw IEX_NAMESPACE::TypeExc ("Mismatched attribute type."); - return *ret; -} -template -static const U &dynamic_cast_attr (const Attribute &a) -{ - const U *ret = dynamic_cast_attr (&a); - if ( ! ret ) - throw IEX_NAMESPACE::TypeExc ("Mismatched attribute type."); - return *ret; -} - -/// @} - //------------------------------------------------- // Class template for attributes of a specific type //------------------------------------------------- template -class TypedAttribute: public Attribute +class IMF_EXPORT_TEMPLATE_TYPE TypedAttribute: public Attribute { public: @@ -163,22 +111,29 @@ class TypedAttribute: public Attribute // that the type T is copyable/assignable/moveable. //------------------------------------------------------------ + IMF_EXPORT TypedAttribute () = default; TypedAttribute (const T &value); + IMF_EXPORT TypedAttribute (const TypedAttribute &other) = default; + IMF_EXPORT TypedAttribute (TypedAttribute &&other) = default; + //NB: if we use a default destructor, it wreaks havoc with where the vtable and such end up + //at least under mingw+windows, and since we are providing extern template instantiations + //this will be pretty trim and should reduce code bloat + virtual ~TypedAttribute (); - virtual ~TypedAttribute () = default; - + IMF_EXPORT TypedAttribute& operator = (const TypedAttribute& other) = default; + IMF_EXPORT TypedAttribute& operator = (TypedAttribute&& other) = default; //-------------------------------- // Access to the attribute's value //-------------------------------- - T & value (); - const T & value () const; + T & value (); + const T &value () const; //-------------------------------- @@ -215,24 +170,26 @@ class TypedAttribute: public Attribute // Depending on type T, these functions may have to be specialized. //----------------------------------------------------------------- - virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, - int version) const; + virtual void writeValueTo ( + OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const; - virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, - int size, - int version); + virtual void readValueFrom ( + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version); - virtual void copyValueFrom (const Attribute &other); + virtual void copyValueFrom (const Attribute &other); //------------------------------------------------------------ // Dynamic casts that throw exceptions instead of returning 0. //------------------------------------------------------------ - static TypedAttribute * cast (Attribute *attribute); - static const TypedAttribute * cast (const Attribute *attribute); - static TypedAttribute & cast (Attribute &attribute); - static const TypedAttribute & cast (const Attribute &attribute); + static TypedAttribute * cast (Attribute *attribute); + static const TypedAttribute * cast (const Attribute *attribute); + static TypedAttribute & cast (Attribute &attribute); + static const TypedAttribute & cast (const Attribute &attribute); //--------------------------------------------------------------- @@ -247,14 +204,14 @@ class TypedAttribute: public Attribute // //--------------------------------------------------------------- - static void registerAttributeType (); + static void registerAttributeType (); //----------------------------------------------------- // Un-register this attribute type (for debugging only) //----------------------------------------------------- - static void unRegisterAttributeType (); + static void unRegisterAttributeType (); private: @@ -274,6 +231,12 @@ TypedAttribute::TypedAttribute (const T & value): // empty } +template +TypedAttribute::~TypedAttribute () +{ + // empty +} + template inline T & TypedAttribute::value () @@ -348,7 +311,7 @@ TypedAttribute * TypedAttribute::cast (Attribute *attribute) { TypedAttribute *t = - dynamic_cast_attr > (attribute); + dynamic_cast *> (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -362,7 +325,7 @@ const TypedAttribute * TypedAttribute::cast (const Attribute *attribute) { const TypedAttribute *t = - dynamic_cast_attr > (attribute); + dynamic_cast *> (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); diff --git a/src/lib/OpenEXR/ImfAutoArray.h b/src/lib/OpenEXR/ImfAutoArray.h index 78cf081f73..8aaebb6724 100644 --- a/src/lib/OpenEXR/ImfAutoArray.h +++ b/src/lib/OpenEXR/ImfAutoArray.h @@ -12,10 +12,13 @@ // class AutoArray -- a workaround for systems with // insufficient stack space for large auto arrays. // +// NB: internal, so not exported at all +// //----------------------------------------------------------------------------- #include "ImfNamespace.h" -#include + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfB44Compressor.h b/src/lib/OpenEXR/ImfB44Compressor.h index a469c39f47..29e3f9548f 100644 --- a/src/lib/OpenEXR/ImfB44Compressor.h +++ b/src/lib/OpenEXR/ImfB44Compressor.h @@ -12,11 +12,10 @@ // //----------------------------------------------------------------------------- -#include "ImfCompressor.h" -#include "ImfNamespace.h" -#include "ImfExport.h" #include "ImfForward.h" +#include "ImfCompressor.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -24,13 +23,11 @@ class B44Compressor: public Compressor { public: - IMF_EXPORT B44Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines, bool optFlatFields); - IMF_EXPORT virtual ~B44Compressor (); B44Compressor (const B44Compressor& other) = delete; @@ -38,31 +35,25 @@ class B44Compressor: public Compressor B44Compressor (B44Compressor&& other) = delete; B44Compressor& operator = (B44Compressor&& other) = delete; - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual Format format () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, diff --git a/src/lib/OpenEXR/ImfBoxAttribute.cpp b/src/lib/OpenEXR/ImfBoxAttribute.cpp index e20e118f42..cec12a971a 100644 --- a/src/lib/OpenEXR/ImfBoxAttribute.cpp +++ b/src/lib/OpenEXR/ImfBoxAttribute.cpp @@ -10,6 +10,7 @@ // class Box2fAttribute // //----------------------------------------------------------------------------- +#define COMPILING_IMF_BOX_ATTRIBUTE #include @@ -19,7 +20,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * Box2iAttribute::staticTypeName () { return "box2i"; @@ -27,7 +28,7 @@ Box2iAttribute::staticTypeName () template <> -void +IMF_EXPORT void Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.min.x); @@ -38,7 +39,7 @@ Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int v template <> -void +IMF_EXPORT void Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.min.x); @@ -47,9 +48,11 @@ Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int Xdr::read (is, _value.max.y); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + template <> -const char * +IMF_EXPORT const char * Box2fAttribute::staticTypeName () { return "box2f"; @@ -57,7 +60,7 @@ Box2fAttribute::staticTypeName () template <> -void +IMF_EXPORT void Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.min.x); @@ -68,7 +71,7 @@ Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int v template <> -void +IMF_EXPORT void Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.min.x); @@ -77,5 +80,6 @@ Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int Xdr::read (is, _value.max.y); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfBoxAttribute.h b/src/lib/OpenEXR/ImfBoxAttribute.h index d68160a5ed..b1d63d58fa 100644 --- a/src/lib/OpenEXR/ImfBoxAttribute.h +++ b/src/lib/OpenEXR/ImfBoxAttribute.h @@ -22,35 +22,13 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER +using Box2iAttribute = TypedAttribute; +using Box2fAttribute = TypedAttribute; -typedef TypedAttribute Box2iAttribute; - -template <> -IMF_EXPORT -const char *Box2iAttribute::staticTypeName (); -template <> -IMF_EXPORT -void Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; -template <> -IMF_EXPORT -void Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); - - -typedef TypedAttribute Box2fAttribute; -template <> -IMF_EXPORT -const char *Box2fAttribute::staticTypeName (); -template <> -IMF_EXPORT -void Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; -template <> -IMF_EXPORT -void Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); - +#ifndef COMPILING_IMF_BOX_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfChannelList.h b/src/lib/OpenEXR/ImfChannelList.h index 8f28554ece..4a056cbd5e 100644 --- a/src/lib/OpenEXR/ImfChannelList.h +++ b/src/lib/OpenEXR/ImfChannelList.h @@ -14,11 +14,11 @@ // //----------------------------------------------------------------------------- +#include "ImfForward.h" + #include "ImfName.h" #include "ImfPixelType.h" -#include "ImfNamespace.h" -#include "ImfExport.h" #include #include @@ -27,7 +27,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -struct Channel +struct IMF_EXPORT_TYPE Channel { //------------------------------ // Data type; see ImfPixelType.h @@ -86,7 +86,7 @@ struct Channel }; -class ChannelList +class IMF_EXPORT_TYPE ChannelList { public: @@ -268,7 +268,7 @@ class ChannelList // Iterators //---------- -class ChannelList::Iterator +class IMF_EXPORT_TYPE ChannelList::Iterator { public: @@ -295,7 +295,7 @@ class ChannelList::Iterator }; -class ChannelList::ConstIterator +class IMF_EXPORT_TYPE ChannelList::ConstIterator { public: diff --git a/src/lib/OpenEXR/ImfChannelListAttribute.cpp b/src/lib/OpenEXR/ImfChannelListAttribute.cpp index f05d8def8a..b65f4d5e7a 100644 --- a/src/lib/OpenEXR/ImfChannelListAttribute.cpp +++ b/src/lib/OpenEXR/ImfChannelListAttribute.cpp @@ -10,10 +10,16 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_CHANNEL_LIST_ATTRIBUTE + +#include "ImfChannelListAttribute.h" + +#include "IexBaseExc.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + namespace { template @@ -33,16 +39,14 @@ void checkIsNullTerminated (const char (&str)[N], const char *what) template <> -const char * +IMF_EXPORT const char * ChannelListAttribute::staticTypeName () { return "chlist"; } -using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; - template <> -void +IMF_EXPORT void ChannelListAttribute::writeValueTo (OStream &os, int version) const { for (ChannelList::ConstIterator i = _value.begin(); @@ -75,7 +79,7 @@ ChannelListAttribute::writeValueTo (OStream &os, int version) const template <> -void +IMF_EXPORT void ChannelListAttribute::readValueFrom (IStream &is, int size, int version) @@ -129,5 +133,6 @@ ChannelListAttribute::readValueFrom (IStream &is, } } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfChannelListAttribute.h b/src/lib/OpenEXR/ImfChannelListAttribute.h index 1d0e1f30bd..40f7306c57 100644 --- a/src/lib/OpenEXR/ImfChannelListAttribute.h +++ b/src/lib/OpenEXR/ImfChannelListAttribute.h @@ -13,29 +13,20 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfChannelList.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute ChannelListAttribute; -template <> -IMF_EXPORT -const char *ChannelListAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void ChannelListAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void ChannelListAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); - +#ifndef COMPILING_IMF_CHANNEL_LIST_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfCheckedArithmetic.h b/src/lib/OpenEXR/ImfCheckedArithmetic.h index 20e50abdf4..fd5f477cc0 100644 --- a/src/lib/OpenEXR/ImfCheckedArithmetic.h +++ b/src/lib/OpenEXR/ImfCheckedArithmetic.h @@ -13,10 +13,12 @@ // //----------------------------------------------------------------------------- -#include -#include "IexMathExc.h" #include "ImfNamespace.h" +#include "IexMathExc.h" + +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER template struct StaticAssertionFailed; @@ -27,7 +29,7 @@ template <> struct StaticAssertionFailed {}; template -T +inline T uiMult (T a, T b) { // @@ -45,7 +47,7 @@ uiMult (T a, T b) template -T +inline T uiDiv (T a, T b) { // @@ -63,7 +65,7 @@ uiDiv (T a, T b) template -T +inline T uiAdd (T a, T b) { // @@ -81,7 +83,7 @@ uiAdd (T a, T b) template -T +inline T uiSub (T a, T b) { // @@ -99,7 +101,7 @@ uiSub (T a, T b) template -size_t +inline size_t checkArraySize (T n, size_t s) { // diff --git a/src/lib/OpenEXR/ImfChromaticities.h b/src/lib/OpenEXR/ImfChromaticities.h index af26acd58f..5667f20ac5 100644 --- a/src/lib/OpenEXR/ImfChromaticities.h +++ b/src/lib/OpenEXR/ImfChromaticities.h @@ -13,16 +13,17 @@ // //----------------------------------------------------------------------------- -#include "ImathVec.h" -#include "ImathMatrix.h" -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include "ImathMatrix.h" +#include "ImathVec.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -struct Chromaticities +struct IMF_EXPORT_TYPE Chromaticities { //----------------------------------------------- // The CIE x and y coordinates of the RGB triples diff --git a/src/lib/OpenEXR/ImfChromaticitiesAttribute.cpp b/src/lib/OpenEXR/ImfChromaticitiesAttribute.cpp index 6550e9a3bc..d75bfe3742 100644 --- a/src/lib/OpenEXR/ImfChromaticitiesAttribute.cpp +++ b/src/lib/OpenEXR/ImfChromaticitiesAttribute.cpp @@ -9,7 +9,9 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_CHROMATICITIES_ATTRIBUTE + +#include "ImfChromaticitiesAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -17,7 +19,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * ChromaticitiesAttribute::staticTypeName () { return "chromaticities"; @@ -25,7 +27,7 @@ ChromaticitiesAttribute::staticTypeName () template <> -void +IMF_EXPORT void ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.red.x); @@ -40,7 +42,7 @@ ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream & template <> -void +IMF_EXPORT void ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.red.x); @@ -53,5 +55,6 @@ ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream Xdr::read (is, _value.white.y); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfChromaticitiesAttribute.h b/src/lib/OpenEXR/ImfChromaticitiesAttribute.h index 86bbaa1d59..82cdb74631 100644 --- a/src/lib/OpenEXR/ImfChromaticitiesAttribute.h +++ b/src/lib/OpenEXR/ImfChromaticitiesAttribute.h @@ -21,21 +21,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute ChromaticitiesAttribute; -template <> -IMF_EXPORT -const char *ChromaticitiesAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, - int); - +#ifndef COMPILING_IMF_CHROMATICITIES_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfCompositeDeepScanLine.h b/src/lib/OpenEXR/ImfCompositeDeepScanLine.h index 4de9f29e15..b6718005af 100644 --- a/src/lib/OpenEXR/ImfCompositeDeepScanLine.h +++ b/src/lib/OpenEXR/ImfCompositeDeepScanLine.h @@ -32,13 +32,12 @@ //----------------------------------------------------------------------------- #include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" + #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class CompositeDeepScanLine +class IMF_EXPORT_TYPE CompositeDeepScanLine { public: IMF_EXPORT @@ -111,7 +110,7 @@ class CompositeDeepScanLine IMF_EXPORT void setCompositing(DeepCompositing *); - struct Data; + struct IMF_HIDDEN Data; private : struct Data *_Data; diff --git a/src/lib/OpenEXR/ImfCompression.h b/src/lib/OpenEXR/ImfCompression.h index feaf2684c5..8b0aff3048 100644 --- a/src/lib/OpenEXR/ImfCompression.h +++ b/src/lib/OpenEXR/ImfCompression.h @@ -12,11 +12,12 @@ // enum Compression // //----------------------------------------------------------------------------- +#include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum Compression +enum IMF_EXPORT_ENUM Compression { NO_COMPRESSION = 0, // no compression diff --git a/src/lib/OpenEXR/ImfCompressionAttribute.cpp b/src/lib/OpenEXR/ImfCompressionAttribute.cpp index 6904de18ee..e7b0b57678 100644 --- a/src/lib/OpenEXR/ImfCompressionAttribute.cpp +++ b/src/lib/OpenEXR/ImfCompressionAttribute.cpp @@ -10,6 +10,8 @@ // //----------------------------------------------------------------------------- +#define COMPILING_IMF_COMPRESSION_ATTRIBUTE + #include "ImfCompressionAttribute.h" @@ -19,7 +21,7 @@ using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * CompressionAttribute::staticTypeName () { return "compression"; @@ -27,7 +29,7 @@ CompressionAttribute::staticTypeName () template <> -void +IMF_EXPORT void CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { unsigned char tmp = _value; @@ -36,7 +38,7 @@ CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, template <> -void +IMF_EXPORT void CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; @@ -66,5 +68,7 @@ CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is _value = Compression (tmp); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfCompressionAttribute.h b/src/lib/OpenEXR/ImfCompressionAttribute.h index 998d3ef16f..739d5de6c1 100644 --- a/src/lib/OpenEXR/ImfCompressionAttribute.h +++ b/src/lib/OpenEXR/ImfCompressionAttribute.h @@ -20,12 +20,10 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute CompressionAttribute; -template <> IMF_EXPORT const char *CompressionAttribute::staticTypeName (); -template <> IMF_EXPORT void CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; -template <> IMF_EXPORT void CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, - int); + +#ifndef COMPILING_IMF_COMPRESSION_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfCompressor.h b/src/lib/OpenEXR/ImfCompressor.h index 0bba209401..19c92edd17 100644 --- a/src/lib/OpenEXR/ImfCompressor.h +++ b/src/lib/OpenEXR/ImfCompressor.h @@ -13,19 +13,19 @@ // //----------------------------------------------------------------------------- -#include "ImfCompression.h" -#include "ImathBox.h" -#include "ImfNamespace.h" -#include "ImfExport.h" #include "ImfForward.h" +#include "ImfCompression.h" + +#include + #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class Compressor +class IMF_EXPORT_TYPE Compressor { public: @@ -62,7 +62,7 @@ class Compressor // returns XDR. //-------------------------------------------- - enum Format + enum IMF_EXPORT_ENUM Format { NATIVE, // the machine's native format XDR // Xdr format @@ -132,7 +132,6 @@ class Compressor // //------------------------------------------------------------------------- - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, @@ -160,7 +159,6 @@ class Compressor // //------------------------------------------------------------------------- - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, diff --git a/src/lib/OpenEXR/ImfConvert.h b/src/lib/OpenEXR/ImfConvert.h index f8bfa7b54e..f3b2a83c8e 100644 --- a/src/lib/OpenEXR/ImfConvert.h +++ b/src/lib/OpenEXR/ImfConvert.h @@ -16,10 +16,11 @@ // //----------------------------------------------------------------------------- -#include "half.h" #include "ImfExport.h" #include "ImfNamespace.h" +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfDeepCompositing.h b/src/lib/OpenEXR/ImfDeepCompositing.h index 4cc70799c5..58f85650f7 100644 --- a/src/lib/OpenEXR/ImfDeepCompositing.h +++ b/src/lib/OpenEXR/ImfDeepCompositing.h @@ -17,12 +17,11 @@ //----------------------------------------------------------------------------- #include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepCompositing +class IMF_EXPORT_TYPE DeepCompositing { public: IMF_EXPORT diff --git a/src/lib/OpenEXR/ImfDeepFrameBuffer.h b/src/lib/OpenEXR/ImfDeepFrameBuffer.h index b088eab3b1..da7f242e2e 100644 --- a/src/lib/OpenEXR/ImfDeepFrameBuffer.h +++ b/src/lib/OpenEXR/ImfDeepFrameBuffer.h @@ -6,9 +6,9 @@ #ifndef IMFDEEPFRAMEBUFFER_H_ #define IMFDEEPFRAMEBUFFER_H_ +#include "ImfForward.h" + #include "ImfFrameBuffer.h" -#include "ImfNamespace.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -16,7 +16,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Description of a single deep slice of the frame buffer: //-------------------------------------------------------- -struct DeepSlice : public Slice +struct IMF_EXPORT_TYPE DeepSlice : public Slice { //--------------------------------------------------------------------- // The stride for each sample in this slice. @@ -62,7 +62,7 @@ struct DeepSlice : public Slice // DeepFrameBuffer. //----------------- -class DeepFrameBuffer +class IMF_EXPORT_TYPE DeepFrameBuffer { public: @@ -160,7 +160,7 @@ class DeepFrameBuffer // Iterators //---------- -class DeepFrameBuffer::Iterator +class IMF_EXPORT_TYPE DeepFrameBuffer::Iterator { public: @@ -187,7 +187,7 @@ class DeepFrameBuffer::Iterator }; -class DeepFrameBuffer::ConstIterator +class IMF_EXPORT_TYPE DeepFrameBuffer::ConstIterator { public: diff --git a/src/lib/OpenEXR/ImfDeepImageState.h b/src/lib/OpenEXR/ImfDeepImageState.h index e024ca3194..640bfea080 100644 --- a/src/lib/OpenEXR/ImfDeepImageState.h +++ b/src/lib/OpenEXR/ImfDeepImageState.h @@ -44,13 +44,13 @@ // //----------------------------------------------------------------------------- -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum DeepImageState : int +enum IMF_EXPORT_ENUM DeepImageState : int { DIS_MESSY = 0, DIS_SORTED = 1, diff --git a/src/lib/OpenEXR/ImfDeepImageStateAttribute.cpp b/src/lib/OpenEXR/ImfDeepImageStateAttribute.cpp index ef1818424c..6b1cbe7cfb 100644 --- a/src/lib/OpenEXR/ImfDeepImageStateAttribute.cpp +++ b/src/lib/OpenEXR/ImfDeepImageStateAttribute.cpp @@ -9,7 +9,9 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_DEEP_IMAGE_STATE_ATTRIBUTE + +#include "ImfDeepImageStateAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -17,7 +19,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * DeepImageStateAttribute::staticTypeName () { return "deepImageState"; @@ -25,7 +27,7 @@ DeepImageStateAttribute::staticTypeName () template <> -void +IMF_EXPORT void DeepImageStateAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { @@ -35,7 +37,7 @@ DeepImageStateAttribute::writeValueTo template <> -void +IMF_EXPORT void DeepImageStateAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { @@ -45,11 +47,14 @@ DeepImageStateAttribute::readValueFrom } template <> -void +IMF_EXPORT void DeepImageStateAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other) { _value = cast(other).value(); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfDeepImageStateAttribute.h b/src/lib/OpenEXR/ImfDeepImageStateAttribute.h index 65fad3e983..9a85dc4c4c 100644 --- a/src/lib/OpenEXR/ImfDeepImageStateAttribute.h +++ b/src/lib/OpenEXR/ImfDeepImageStateAttribute.h @@ -23,18 +23,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute DeepImageStateAttribute; -template <> IMF_EXPORT const char *DeepImageStateAttribute::staticTypeName (); - -template <> IMF_EXPORT -void DeepImageStateAttribute::writeValueTo - (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; - -template <> IMF_EXPORT -void DeepImageStateAttribute::readValueFrom - (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - -template <> IMF_EXPORT -void DeepImageStateAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other); +#ifndef COMPILING_IMF_DEEP_IMAGE_STATE_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfDeepScanLineInputFile.h b/src/lib/OpenEXR/ImfDeepScanLineInputFile.h index 32b57f1930..4fb67c1688 100644 --- a/src/lib/OpenEXR/ImfDeepScanLineInputFile.h +++ b/src/lib/OpenEXR/ImfDeepScanLineInputFile.h @@ -12,17 +12,16 @@ // //----------------------------------------------------------------------------- +#include "ImfForward.h" + #include "ImfThreading.h" #include "ImfGenericInputFile.h" -#include "ImfNamespace.h" -#include "ImfForward.h" -#include "ImfExport.h" #include "ImfDeepScanLineOutputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepScanLineInputFile : public GenericInputFile +class IMF_EXPORT_TYPE DeepScanLineInputFile : public GenericInputFile { public: @@ -250,7 +249,7 @@ class DeepScanLineInputFile : public GenericInputFile int scanLine1 , int scanLine2) const; - struct Data; + struct IMF_HIDDEN Data; private: diff --git a/src/lib/OpenEXR/ImfDeepScanLineInputPart.cpp b/src/lib/OpenEXR/ImfDeepScanLineInputPart.cpp index 7471c971d1..b4f0be803f 100644 --- a/src/lib/OpenEXR/ImfDeepScanLineInputPart.cpp +++ b/src/lib/OpenEXR/ImfDeepScanLineInputPart.cpp @@ -4,7 +4,10 @@ // #include "ImfDeepScanLineInputPart.h" -#include "ImfNamespace.h" + +#include "ImfMultiPartInputFile.h" +#include "ImfDeepScanLineInputFile.h" +#include "ImfDeepScanLineOutputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfDeepScanLineInputPart.h b/src/lib/OpenEXR/ImfDeepScanLineInputPart.h index d21ab241db..86e545944f 100644 --- a/src/lib/OpenEXR/ImfDeepScanLineInputPart.h +++ b/src/lib/OpenEXR/ImfDeepScanLineInputPart.h @@ -6,15 +6,13 @@ #ifndef IMFDEEPSCANLINEINPUTPART_H_ #define IMFDEEPSCANLINEINPUTPART_H_ -#include "ImfMultiPartInputFile.h" -#include "ImfDeepScanLineInputFile.h" -#include "ImfDeepScanLineOutputFile.h" -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfForward.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepScanLineInputPart +class IMF_EXPORT_TYPE DeepScanLineInputPart { public: @@ -155,7 +153,7 @@ class DeepScanLineInputPart DeepScanLineInputFile *file; // needed for copyPixels - friend void DeepScanLineOutputFile::copyPixels(DeepScanLineInputPart &); + friend class DeepScanLineOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfDeepTiledInputFile.cpp b/src/lib/OpenEXR/ImfDeepTiledInputFile.cpp index 725f6b84d5..15260246b0 100644 --- a/src/lib/OpenEXR/ImfDeepTiledInputFile.cpp +++ b/src/lib/OpenEXR/ImfDeepTiledInputFile.cpp @@ -9,21 +9,23 @@ // //----------------------------------------------------------------------------- -#include -#include -#include -#include -#include -#include -#include -#include "ImathBox.h" -#include -#include -#include -#include -#include -#include -#include +#include "ImfDeepTiledInputFile.h" + +#include "ImfDeepFrameBuffer.h" +#include "ImfTileDescriptionAttribute.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfTiledMisc.h" +#include "ImfStdIO.h" +#include "ImfCompressor.h" + +#include "ImfXdr.h" +#include "ImfConvert.h" +#include "ImfVersion.h" +#include "ImfTileOffsets.h" +#include "ImfThreading.h" +#include "ImfPartType.h" +#include "ImfMultiPartInputFile.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "ImfInputStreamMutex.h" @@ -37,8 +39,6 @@ #include #include -#include "ImfNamespace.h" - OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; diff --git a/src/lib/OpenEXR/ImfDeepTiledInputFile.h b/src/lib/OpenEXR/ImfDeepTiledInputFile.h index bce9067067..b01330f3b3 100644 --- a/src/lib/OpenEXR/ImfDeepTiledInputFile.h +++ b/src/lib/OpenEXR/ImfDeepTiledInputFile.h @@ -12,21 +12,18 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImathBox.h" -#include "ImfTileDescription.h" +#include "ImfForward.h" + #include "ImfThreading.h" #include "ImfGenericInputFile.h" -#include "ImfDeepFrameBuffer.h" -#include "ImfDeepTiledOutputFile.h" -#include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepTiledInputFile : public GenericInputFile +class IMF_EXPORT_TYPE DeepTiledInputFile : public GenericInputFile { public: @@ -436,7 +433,7 @@ class DeepTiledInputFile : public GenericInputFile // needed for copyPixels - friend void DeepTiledOutputFile::copyPixels(DeepTiledInputFile &); + friend class DeepTiledOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfDeepTiledInputPart.cpp b/src/lib/OpenEXR/ImfDeepTiledInputPart.cpp index 3b94c10f29..53b9f063bc 100644 --- a/src/lib/OpenEXR/ImfDeepTiledInputPart.cpp +++ b/src/lib/OpenEXR/ImfDeepTiledInputPart.cpp @@ -4,8 +4,9 @@ // #include "ImfDeepTiledInputPart.h" + #include "ImfMultiPartInputFile.h" -#include "ImfNamespace.h" +#include "ImfDeepTiledInputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfDeepTiledInputPart.h b/src/lib/OpenEXR/ImfDeepTiledInputPart.h index 62a809a241..e5f950a931 100644 --- a/src/lib/OpenEXR/ImfDeepTiledInputPart.h +++ b/src/lib/OpenEXR/ImfDeepTiledInputPart.h @@ -6,14 +6,15 @@ #ifndef IMFDEEPTILEDINPUTPART_H_ #define IMFDEEPTILEDINPUTPART_H_ -#include "ImfDeepTiledInputFile.h" -#include "ImfNamespace.h" #include "ImfForward.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepTiledInputPart +class IMF_EXPORT_TYPE DeepTiledInputPart { public: @@ -355,7 +356,7 @@ class DeepTiledInputPart private: DeepTiledInputFile* file; - friend void DeepTiledOutputFile::copyPixels(DeepTiledInputPart &); + friend class DeepTiledOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp b/src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp index 2ebbafa4ee..9d9e820ff7 100644 --- a/src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp +++ b/src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp @@ -10,6 +10,8 @@ //----------------------------------------------------------------------------- #include "ImfDeepTiledOutputFile.h" + +#include "ImfDeepFrameBuffer.h" #include "ImfDeepTiledInputFile.h" #include "ImfDeepTiledInputPart.h" #include "ImfInputFile.h" diff --git a/src/lib/OpenEXR/ImfDeepTiledOutputFile.h b/src/lib/OpenEXR/ImfDeepTiledOutputFile.h index 980e4dcb94..97a3aa04a1 100644 --- a/src/lib/OpenEXR/ImfDeepTiledOutputFile.h +++ b/src/lib/OpenEXR/ImfDeepTiledOutputFile.h @@ -12,19 +12,20 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImathBox.h" +#include "ImfForward.h" + #include "ImfThreading.h" #include "ImfGenericOutputFile.h" -#include "ImfNamespace.h" -#include "ImfForward.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" + +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepTiledOutputFile : public GenericOutputFile +class IMF_EXPORT_TYPE DeepTiledOutputFile : public GenericOutputFile { public: diff --git a/src/lib/OpenEXR/ImfDeepTiledOutputPart.cpp b/src/lib/OpenEXR/ImfDeepTiledOutputPart.cpp index 836861c24d..e76b3d0939 100644 --- a/src/lib/OpenEXR/ImfDeepTiledOutputPart.cpp +++ b/src/lib/OpenEXR/ImfDeepTiledOutputPart.cpp @@ -4,8 +4,11 @@ // #include "ImfDeepTiledOutputPart.h" + #include "ImfMultiPartOutputFile.h" -#include "ImfNamespace.h" + +#include "ImfDeepTiledOutputFile.h" +#include "ImfDeepTiledInputPart.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfDeepTiledOutputPart.h b/src/lib/OpenEXR/ImfDeepTiledOutputPart.h index 52a502836e..f42c78d832 100644 --- a/src/lib/OpenEXR/ImfDeepTiledOutputPart.h +++ b/src/lib/OpenEXR/ImfDeepTiledOutputPart.h @@ -7,15 +7,15 @@ #define IMFDEEPTILEDOUTPUTPART_H_ #include "ImfForward.h" -#include "ImfDeepTiledInputFile.h" -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfTileDescription.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class DeepTiledOutputPart +class IMF_EXPORT_TYPE DeepTiledOutputPart { public: diff --git a/src/lib/OpenEXR/ImfDoubleAttribute.cpp b/src/lib/OpenEXR/ImfDoubleAttribute.cpp index fdba3b6a9d..5758c935ab 100644 --- a/src/lib/OpenEXR/ImfDoubleAttribute.cpp +++ b/src/lib/OpenEXR/ImfDoubleAttribute.cpp @@ -10,18 +10,21 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_DOUBLE_ATTRIBUTE +#include "ImfDoubleAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER template <> -const char * +IMF_EXPORT const char * DoubleAttribute::staticTypeName () { return "double"; } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfDoubleAttribute.h b/src/lib/OpenEXR/ImfDoubleAttribute.h index a902247f19..f78a421b0d 100644 --- a/src/lib/OpenEXR/ImfDoubleAttribute.h +++ b/src/lib/OpenEXR/ImfDoubleAttribute.h @@ -20,7 +20,10 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute DoubleAttribute; -template <> IMF_EXPORT const char *DoubleAttribute::staticTypeName (); + +#ifndef COMPILING_IMF_DOUBLE_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfDwaCompressor.h b/src/lib/OpenEXR/ImfDwaCompressor.h index 33791079f2..adc735e360 100644 --- a/src/lib/OpenEXR/ImfDwaCompressor.h +++ b/src/lib/OpenEXR/ImfDwaCompressor.h @@ -12,12 +12,12 @@ // //------------------------------------------------------------------------------ -#include +#include "ImfCompressor.h" #include "ImfZip.h" #include "ImfChannelList.h" -#include "ImfCompressor.h" -#include "ImfNamespace.h" + +#include #include #include @@ -35,13 +35,11 @@ class DwaCompressor: public Compressor }; - IMF_EXPORT DwaCompressor (const Header &hdr, int maxScanLineSize, int numScanLines, // ideally is a multiple of 8 AcCompression acCompression); - IMF_EXPORT virtual ~DwaCompressor (); DwaCompressor (const DwaCompressor& other) = delete; @@ -49,37 +47,30 @@ class DwaCompressor: public Compressor DwaCompressor (DwaCompressor&& other) = delete; DwaCompressor& operator = (DwaCompressor&& other) = delete; - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual OPENEXR_IMF_NAMESPACE::Compressor::Format format () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); - IMF_EXPORT static void initializeFuncs (); private: diff --git a/src/lib/OpenEXR/ImfEnvmap.h b/src/lib/OpenEXR/ImfEnvmap.h index 41a4cd72d4..c2639aba6a 100644 --- a/src/lib/OpenEXR/ImfEnvmap.h +++ b/src/lib/OpenEXR/ImfEnvmap.h @@ -42,9 +42,10 @@ // //----------------------------------------------------------------------------- -#include "ImathBox.h" -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -53,7 +54,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Supported environment map types //-------------------------------- -enum Envmap : int +enum IMF_EXPORT_ENUM Envmap : int { ENVMAP_LATLONG = 0, // Latitude-longitude environment map ENVMAP_CUBE = 1, // Cube map @@ -222,7 +223,7 @@ namespace LatLongMap // Names for the six faces of the cube //------------------------------------ -enum CubeMapFace +enum IMF_EXPORT_ENUM CubeMapFace { CUBEFACE_POS_X, // +X face CUBEFACE_NEG_X, // -X face diff --git a/src/lib/OpenEXR/ImfEnvmapAttribute.cpp b/src/lib/OpenEXR/ImfEnvmapAttribute.cpp index 5f4f7de30f..f63fd532e6 100644 --- a/src/lib/OpenEXR/ImfEnvmapAttribute.cpp +++ b/src/lib/OpenEXR/ImfEnvmapAttribute.cpp @@ -9,6 +9,8 @@ // //----------------------------------------------------------------------------- +#define COMPILING_IMF_ENVMAP_ATTRIBUTE + #include @@ -17,7 +19,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * EnvmapAttribute::staticTypeName () { return "envmap"; @@ -25,7 +27,7 @@ EnvmapAttribute::staticTypeName () template <> -void +IMF_EXPORT void EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { unsigned char tmp = _value; @@ -34,7 +36,7 @@ EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int template <> -void +IMF_EXPORT void EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; @@ -43,11 +45,14 @@ EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int } template <> -void +IMF_EXPORT void EnvmapAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other) { _value = cast(other).value(); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfEnvmapAttribute.h b/src/lib/OpenEXR/ImfEnvmapAttribute.h index 4c1f741859..ae8528de49 100644 --- a/src/lib/OpenEXR/ImfEnvmapAttribute.h +++ b/src/lib/OpenEXR/ImfEnvmapAttribute.h @@ -22,19 +22,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute EnvmapAttribute; -template <> IMF_EXPORT const char *EnvmapAttribute::staticTypeName (); - -template <> IMF_EXPORT -void EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> IMF_EXPORT -void EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, - int); -template <> IMF_EXPORT -void -EnvmapAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other); +#ifndef COMPILING_IMF_ENVMAP_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index e058ff8a61..2405eff90e 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -7,25 +7,54 @@ /// @{ #if defined(OPENEXR_DLL) # if defined(OPENEXR_EXPORTS) -# define IMF_EXPORT __declspec(dllexport) -# define IMF_EXPORT_CONST extern __declspec(dllexport) +# define IMF_EXPORT __declspec(dllexport) +# if defined(__MINGW32__) +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT +# else +# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT +# endif # else -# define IMF_EXPORT __declspec(dllimport) -# define IMF_EXPORT_CONST extern __declspec(dllimport) +# define IMF_EXPORT __declspec(dllimport) +//# if defined(__MINGW32__) +//# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT +//# endif +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT # endif -# define IMF_EXPORT_TYPE -# define IMF_EXPORT_LOCAL #else # ifndef _MSC_VER -# define IMF_EXPORT __attribute__ ((visibility ("default"))) -# define IMF_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define IMF_EXPORT_TYPE __attribute__ ((visibility ("default"))) -# define IMF_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) +# define IMF_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IMF_EXPORT_TYPE IMF_EXPORT +# define IMF_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +# if __has_attribute(__type_visibility__) +# define IMF_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) +# define IMF_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) +# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT +# else +# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT +# endif +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT # else # define IMF_EXPORT -# define IMF_EXPORT_CONST extern -# define IMF_EXPORT_TYPE -# define IMF_EXPORT_LOCAL # endif #endif +#ifndef IMF_EXPORT_TYPE +# define IMF_EXPORT_TYPE +#endif +#ifndef IMF_EXPORT_TEMPLATE_TYPE +# define IMF_EXPORT_TEMPLATE_TYPE +#endif +#ifndef IMF_EXPORT_EXTERN_TEMPLATE +# define IMF_EXPORT_EXTERN_TEMPLATE +#endif +#ifndef IMF_EXPORT_TEMPLATE_INSTANCE +# define IMF_EXPORT_TEMPLATE_INSTANCE +#endif +#ifndef IMF_EXPORT_ENUM +# define IMF_EXPORT_ENUM +#endif +#ifndef IMF_HIDDEN +# define IMF_HIDDEN +#endif + /// @} diff --git a/src/lib/OpenEXR/ImfFastHuf.h b/src/lib/OpenEXR/ImfFastHuf.h index 886c904362..c2bfb26a76 100644 --- a/src/lib/OpenEXR/ImfFastHuf.h +++ b/src/lib/OpenEXR/ImfFastHuf.h @@ -7,7 +7,6 @@ #define INCLUDED_IMF_FAST_HUF_H #include "ImfNamespace.h" -#include "ImfExport.h" #include @@ -55,14 +54,12 @@ class FastHufDecoder static const int TABLE_LOOKUP_BITS = 12; - IMF_EXPORT FastHufDecoder (const char*& table, int numBytes, int minSymbol, int maxSymbol, int rleSymbol); - IMF_EXPORT ~FastHufDecoder (); FastHufDecoder (const FastHufDecoder& other) = delete; @@ -70,10 +67,8 @@ class FastHufDecoder FastHufDecoder (FastHufDecoder&& other) = delete; FastHufDecoder& operator = (FastHufDecoder&& other) = delete; - IMF_EXPORT static bool enabled (); - IMF_EXPORT void decode (const unsigned char *src, int numSrcBits, unsigned short *dst, diff --git a/src/lib/OpenEXR/ImfFloatAttribute.cpp b/src/lib/OpenEXR/ImfFloatAttribute.cpp index c76125c28f..40e30c16ff 100644 --- a/src/lib/OpenEXR/ImfFloatAttribute.cpp +++ b/src/lib/OpenEXR/ImfFloatAttribute.cpp @@ -10,6 +10,8 @@ // //----------------------------------------------------------------------------- +#define COMPILING_IMF_FLOAT_ATTRIBUTE + #include @@ -17,11 +19,13 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER template <> -const char * +IMF_EXPORT const char * FloatAttribute::staticTypeName () { return "float"; } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfFloatAttribute.h b/src/lib/OpenEXR/ImfFloatAttribute.h index 97decb34ad..65e95e794a 100644 --- a/src/lib/OpenEXR/ImfFloatAttribute.h +++ b/src/lib/OpenEXR/ImfFloatAttribute.h @@ -13,6 +13,9 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" @@ -20,7 +23,10 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute FloatAttribute; -template <> IMF_EXPORT const char *FloatAttribute::staticTypeName (); + +#ifndef COMPILING_IMF_FLOAT_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfFloatVectorAttribute.cpp b/src/lib/OpenEXR/ImfFloatVectorAttribute.cpp index d8570fa2b5..8f0b9b5d34 100644 --- a/src/lib/OpenEXR/ImfFloatVectorAttribute.cpp +++ b/src/lib/OpenEXR/ImfFloatVectorAttribute.cpp @@ -9,6 +9,7 @@ // //----------------------------------------------------------------------------- +#define COMPILING_IMF_FLOAT_VECTOR_ATTRIBUTE #include @@ -19,7 +20,7 @@ using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * FloatVectorAttribute::staticTypeName () { return "floatvector"; @@ -27,7 +28,7 @@ FloatVectorAttribute::staticTypeName () template <> -void +IMF_EXPORT void FloatVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { @@ -39,7 +40,7 @@ FloatVectorAttribute::writeValueTo template <> -void +IMF_EXPORT void FloatVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { @@ -50,5 +51,7 @@ FloatVectorAttribute::readValueFrom Xdr::read (is, _value[i]); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfFloatVectorAttribute.h b/src/lib/OpenEXR/ImfFloatVectorAttribute.h index 3f81d46220..4a1666300a 100644 --- a/src/lib/OpenEXR/ImfFloatVectorAttribute.h +++ b/src/lib/OpenEXR/ImfFloatVectorAttribute.h @@ -14,9 +14,11 @@ // //----------------------------------------------------------------------------- -#include "ImfAttribute.h" +#include "ImfExport.h" #include "ImfNamespace.h" +#include "ImfAttribute.h" + #include @@ -28,19 +30,9 @@ typedef std::vector typedef TypedAttribute FloatVectorAttribute; -template <> -IMF_EXPORT -const char *FloatVectorAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void FloatVectorAttribute::writeValueTo - (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; - -template <> -IMF_EXPORT -void FloatVectorAttribute::readValueFrom - (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); +#ifndef COMPILING_IMF_FLOAT_VECTOR_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfForward.h b/src/lib/OpenEXR/ImfForward.h index c0b5328956..1d7e2b407c 100644 --- a/src/lib/OpenEXR/ImfForward.h +++ b/src/lib/OpenEXR/ImfForward.h @@ -12,55 +12,56 @@ // //////////////////////////////////////////////////////////////////// +#include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // classes for basic types; -template class Array; -template class Array2D; -struct Channel; -class ChannelList; -struct Chromaticities; +template class IMF_EXPORT_TEMPLATE_TYPE Array; +template class IMF_EXPORT_TEMPLATE_TYPE Array2D; +struct IMF_EXPORT_TYPE Channel; +class IMF_EXPORT_TYPE ChannelList; +struct IMF_EXPORT_TYPE Chromaticities; // attributes used in headers are TypedAttributes -class Attribute; +class IMF_EXPORT_TYPE Attribute; -class Header; +class IMF_EXPORT_TYPE Header; // file handling classes -class OutputFile; -class TiledInputFile; -class ScanLineInputFile; -class InputFile; -class TiledOutputFile; -class DeepScanLineInputFile; -class DeepScanLineOutputFile; -class DeepTiledInputFile; -class DeepTiledOutputFile; -class AcesInputFile; -class AcesOutputFile; -class TiledInputPart; -class TiledInputFile; -class TileOffsets; +class IMF_EXPORT_TYPE OutputFile; +class IMF_EXPORT_TYPE TiledInputFile; +class IMF_EXPORT_TYPE ScanLineInputFile; +class IMF_EXPORT_TYPE InputFile; +class IMF_EXPORT_TYPE TiledOutputFile; +class IMF_EXPORT_TYPE DeepScanLineInputFile; +class IMF_EXPORT_TYPE DeepScanLineOutputFile; +class IMF_EXPORT_TYPE DeepTiledInputFile; +class IMF_EXPORT_TYPE DeepTiledOutputFile; +class IMF_EXPORT_TYPE AcesInputFile; +class IMF_EXPORT_TYPE AcesOutputFile; +class IMF_EXPORT_TYPE TiledInputPart; +class IMF_EXPORT_TYPE TiledInputFile; +class IMF_EXPORT_TYPE TileOffsets; // multipart file handling -class GenericInputFile; -class GenericOutputFile; -class MultiPartInputFile; -class MultiPartOutputFile; +class IMF_EXPORT_TYPE GenericInputFile; +class IMF_EXPORT_TYPE GenericOutputFile; +class IMF_EXPORT_TYPE MultiPartInputFile; +class IMF_EXPORT_TYPE MultiPartOutputFile; -class InputPart; -class TiledInputPart; -class DeepScanLineInputPart; -class DeepTiledInputPart; +class IMF_EXPORT_TYPE InputPart; +class IMF_EXPORT_TYPE TiledInputPart; +class IMF_EXPORT_TYPE DeepScanLineInputPart; +class IMF_EXPORT_TYPE DeepTiledInputPart; -class OutputPart; -class ScanLineOutputPart; -class TiledOutputPart; -class DeepScanLineOutputPart; -class DeepTiledOutputPart; +class IMF_EXPORT_TYPE OutputPart; +class IMF_EXPORT_TYPE ScanLineOutputPart; +class IMF_EXPORT_TYPE TiledOutputPart; +class IMF_EXPORT_TYPE DeepScanLineOutputPart; +class IMF_EXPORT_TYPE DeepTiledOutputPart; // internal use only @@ -71,24 +72,24 @@ struct InputStreamMutex; // frame buffers -class FrameBuffer; -class DeepFrameBuffer; -struct DeepSlice; +class IMF_EXPORT_TYPE FrameBuffer; +class IMF_EXPORT_TYPE DeepFrameBuffer; +struct IMF_EXPORT_TYPE DeepSlice; // compositing -class DeepCompositing; -class CompositeDeepScanLine; +class IMF_EXPORT_TYPE DeepCompositing; +class IMF_EXPORT_TYPE CompositeDeepScanLine; // preview image -class PreviewImage; -struct PreviewRgba; +class IMF_EXPORT_TYPE PreviewImage; +struct IMF_EXPORT_TYPE PreviewRgba; // streams -class OStream; -class IStream; +class IMF_EXPORT_TYPE OStream; +class IMF_EXPORT_TYPE IStream; -class IDManifest; -class CompressedIDManifest; +class IMF_EXPORT_TYPE IDManifest; +class IMF_EXPORT_TYPE CompressedIDManifest; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfFrameBuffer.h b/src/lib/OpenEXR/ImfFrameBuffer.h index ca22c83d90..b4350c4223 100644 --- a/src/lib/OpenEXR/ImfFrameBuffer.h +++ b/src/lib/OpenEXR/ImfFrameBuffer.h @@ -14,11 +14,12 @@ // //----------------------------------------------------------------------------- +#include "ImfForward.h" + #include "ImfName.h" #include "ImfPixelType.h" -#include "ImfExport.h" -#include "ImfNamespace.h" -#include "ImathBox.h" + +#include #include #include @@ -36,7 +37,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // component is called a "slice". //------------------------------------------------------- -struct Slice +struct IMF_EXPORT_TYPE Slice { //------------------------------ // Data type; see ImfPixelType.h @@ -154,7 +155,7 @@ struct Slice }; -class FrameBuffer +class IMF_EXPORT_TYPE FrameBuffer { public: @@ -242,7 +243,7 @@ class FrameBuffer // Iterators //---------- -class FrameBuffer::Iterator +class IMF_EXPORT_TYPE FrameBuffer::Iterator { public: @@ -269,7 +270,7 @@ class FrameBuffer::Iterator }; -class FrameBuffer::ConstIterator +class IMF_EXPORT_TYPE FrameBuffer::ConstIterator { public: diff --git a/src/lib/OpenEXR/ImfFramesPerSecond.h b/src/lib/OpenEXR/ImfFramesPerSecond.h index bb28471d9c..9426288dc4 100644 --- a/src/lib/OpenEXR/ImfFramesPerSecond.h +++ b/src/lib/OpenEXR/ImfFramesPerSecond.h @@ -35,9 +35,10 @@ // //----------------------------------------------------------------------------- -#include "ImfRational.h" -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include "ImfRational.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfGenericInputFile.cpp b/src/lib/OpenEXR/ImfGenericInputFile.cpp index bfb0bdc227..36ecb8291b 100644 --- a/src/lib/OpenEXR/ImfGenericInputFile.cpp +++ b/src/lib/OpenEXR/ImfGenericInputFile.cpp @@ -5,6 +5,7 @@ #include "ImfGenericInputFile.h" +#include #include #include #include diff --git a/src/lib/OpenEXR/ImfGenericInputFile.h b/src/lib/OpenEXR/ImfGenericInputFile.h index e436d49c8b..7d81eb4e95 100644 --- a/src/lib/OpenEXR/ImfGenericInputFile.h +++ b/src/lib/OpenEXR/ImfGenericInputFile.h @@ -6,14 +6,12 @@ #ifndef IMFGENERICINPUTFILE_H_ #define IMFGENERICINPUTFILE_H_ -#include "ImfIO.h" -#include "ImfHeader.h" -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfForward.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class GenericInputFile +class IMF_EXPORT_TYPE GenericInputFile { public: IMF_EXPORT diff --git a/src/lib/OpenEXR/ImfGenericOutputFile.cpp b/src/lib/OpenEXR/ImfGenericOutputFile.cpp index 5b9331e2ee..db68a34403 100644 --- a/src/lib/OpenEXR/ImfGenericOutputFile.cpp +++ b/src/lib/OpenEXR/ImfGenericOutputFile.cpp @@ -5,15 +5,17 @@ #include "ImfGenericOutputFile.h" -#include -#include -#include -#include - -#include -#include - -#include "ImfNamespace.h" +#include "ImfVersion.h" +#include "ImfIO.h" +#include "ImfXdr.h" +#include "ImfHeader.h" +#include "ImfBoxAttribute.h" +#include "ImfFloatAttribute.h" +#include "ImfTimeCodeAttribute.h" +#include "ImfChromaticitiesAttribute.h" + +#include "ImfMisc.h" +#include "ImfPartType.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfGenericOutputFile.h b/src/lib/OpenEXR/ImfGenericOutputFile.h index c78c1be15b..0c176ef166 100644 --- a/src/lib/OpenEXR/ImfGenericOutputFile.h +++ b/src/lib/OpenEXR/ImfGenericOutputFile.h @@ -6,17 +6,12 @@ #ifndef IMFGENERICOUTPUTFILE_H_ #define IMFGENERICOUTPUTFILE_H_ -#include "ImfVersion.h" -#include "ImfIO.h" -#include "ImfXdr.h" -#include "ImfHeader.h" -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class GenericOutputFile +class IMF_EXPORT_TYPE GenericOutputFile { public: IMF_EXPORT diff --git a/src/lib/OpenEXR/ImfHeader.h b/src/lib/OpenEXR/ImfHeader.h index 32b4057ba3..bcbd6dbbda 100644 --- a/src/lib/OpenEXR/ImfHeader.h +++ b/src/lib/OpenEXR/ImfHeader.h @@ -13,6 +13,8 @@ // //----------------------------------------------------------------------------- +#include "ImfForward.h" + #include "ImfLineOrder.h" #include "ImfCompression.h" #include "ImfName.h" @@ -21,9 +23,6 @@ #include "ImathBox.h" #include "IexBaseExc.h" -#include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" #include "ImfAttribute.h" #include @@ -37,7 +36,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using std::string; -class Header +class IMF_EXPORT_TYPE Header { public: @@ -479,7 +478,7 @@ class Header // Iterators //---------- -class Header::Iterator +class IMF_EXPORT_TYPE Header::Iterator { public: @@ -506,7 +505,7 @@ class Header::Iterator }; -class Header::ConstIterator +class IMF_EXPORT_TYPE Header::ConstIterator { public: @@ -550,7 +549,7 @@ class Header::ConstIterator // //------------------------------------------------------------------------ -void IMF_EXPORT staticInitialize (); +IMF_EXPORT void staticInitialize (); //----------------- @@ -678,7 +677,7 @@ T & Header::typedAttribute (const char name[]) { Attribute *attr = &(*this)[name]; - T *tattr = dynamic_cast_attr (attr); + T *tattr = dynamic_cast (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -692,7 +691,7 @@ const T & Header::typedAttribute (const char name[]) const { const Attribute *attr = &(*this)[name]; - const T *tattr = dynamic_cast_attr (attr); + const T *tattr = dynamic_cast (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); @@ -722,7 +721,7 @@ T * Header::findTypedAttribute (const char name[]) { AttributeMap::iterator i = _map.find (name); - return (i == _map.end())? 0: dynamic_cast_attr (i->second); + return (i == _map.end())? 0: dynamic_cast (i->second); } @@ -731,7 +730,7 @@ const T * Header::findTypedAttribute (const char name[]) const { AttributeMap::const_iterator i = _map.find (name); - return (i == _map.end())? 0: dynamic_cast_attr (i->second); + return (i == _map.end())? 0: dynamic_cast (i->second); } diff --git a/src/lib/OpenEXR/ImfIDManifest.h b/src/lib/OpenEXR/ImfIDManifest.h index bc06c44dea..2f361aa9da 100644 --- a/src/lib/OpenEXR/ImfIDManifest.h +++ b/src/lib/OpenEXR/ImfIDManifest.h @@ -9,28 +9,27 @@ // class IDManifest, to store a table mapping ID numbers to text // //----------------------------------------------------------------------------- -#include "ImfNamespace.h" +#include "ImfForward.h" + #include #include #include #include #include -#include "ImfForward.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class IDManifest +class IMF_EXPORT_TYPE IDManifest { public: // indication of how long a mapping between an ID number and the text holds for - typedef enum + enum IMF_EXPORT_ENUM IdLifetime { LIFETIME_FRAME, // The mapping may change every frame: LIFETIME_SHOT, // The mapping is consistent for every frame of a shot LIFETIME_STABLE // The mapping is consistent for all time. - } IdLifetime; + }; // // hashing scheme is stored as a string rather than an enum, to allow @@ -77,13 +76,13 @@ class IDManifest private : // internal helper function called by constructors - void init(const char* data,const char* end); + IMF_HIDDEN void init(const char* data,const char* end); public : // // Description of the information represented by a single group of channels // - class ChannelGroupManifest + class IMF_EXPORT_TYPE ChannelGroupManifest { private: std::set _channels; // group of channels this manifest represents @@ -128,20 +127,14 @@ public : IMF_EXPORT void setComponent(const std::string& component); - IMF_EXPORT IdLifetime getLifetime() const { return _lifeTime;} - IMF_EXPORT void setLifetime(const IdLifetime& lifeTime) { _lifeTime = lifeTime;} - IMF_EXPORT const std::string& getHashScheme() const { return _hashScheme;} - IMF_EXPORT void setHashScheme(const std::string& hashScheme) { _hashScheme = hashScheme;} - IMF_EXPORT const std::string& getEncodingScheme() const { return _encodingScheme;} - IMF_EXPORT void setEncodingScheme(const std::string& encodingScheme) { _encodingScheme = encodingScheme;} @@ -203,7 +196,7 @@ public : IMF_EXPORT bool operator==(const ChannelGroupManifest& other) const; - IMF_EXPORT + bool operator!=(const ChannelGroupManifest& other) const { return !(*this==other);} friend class IDManifest; diff --git a/src/lib/OpenEXR/ImfIDManifestAttribute.cpp b/src/lib/OpenEXR/ImfIDManifestAttribute.cpp index a703f77347..e49e38584e 100644 --- a/src/lib/OpenEXR/ImfIDManifestAttribute.cpp +++ b/src/lib/OpenEXR/ImfIDManifestAttribute.cpp @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright (c) Contributors to the OpenEXR Project. +#define COMPILING_IMF_IDMANIFEST_ATTRIBUTE #include "ImfIDManifestAttribute.h" #include @@ -11,7 +12,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char* +IMF_EXPORT const char* IDManifestAttribute::staticTypeName() { return "idmanifest"; @@ -19,7 +20,7 @@ IDManifestAttribute::staticTypeName() template <> -void +IMF_EXPORT void IDManifestAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { uint64_t uncompressedDataSize = _value._uncompressedDataSize; @@ -31,7 +32,7 @@ IDManifestAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, template <> -void +IMF_EXPORT void IDManifestAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { @@ -64,5 +65,6 @@ IDManifestAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, Xdr::read(is,input,_value._compressedDataSize); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfIDManifestAttribute.h b/src/lib/OpenEXR/ImfIDManifestAttribute.h index c9c2c9cfa0..ee15679f71 100644 --- a/src/lib/OpenEXR/ImfIDManifestAttribute.h +++ b/src/lib/OpenEXR/ImfIDManifestAttribute.h @@ -4,11 +4,11 @@ #ifndef INCLUDED_IMF_IDMANIFEST_ATTRIBUTE_H #define INCLUDED_IMF_IDMANIFEST_ATTRIBUTE_H -#include "ImfAttribute.h" +#include "ImfExport.h" #include "ImfNamespace.h" -#include "ImfIDManifest.h" -#include +#include "ImfAttribute.h" +#include "ImfIDManifest.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -17,19 +17,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute IDManifestAttribute; -template <> -IMF_EXPORT -const char *IDManifestAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void IDManifestAttribute::writeValueTo - (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; - -template <> -IMF_EXPORT -void IDManifestAttribute::readValueFrom - (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); +#ifndef COMPILING_IMF_IDMANIFEST_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfIO.h b/src/lib/OpenEXR/ImfIO.h index cd3047841a..6ed8ca03fd 100644 --- a/src/lib/OpenEXR/ImfIO.h +++ b/src/lib/OpenEXR/ImfIO.h @@ -12,8 +12,7 @@ // //----------------------------------------------------------------------------- -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfForward.h" #include #include diff --git a/src/lib/OpenEXR/ImfInputFile.cpp b/src/lib/OpenEXR/ImfInputFile.cpp index 29e7855ca0..c520c14e9f 100644 --- a/src/lib/OpenEXR/ImfInputFile.cpp +++ b/src/lib/OpenEXR/ImfInputFile.cpp @@ -9,11 +9,15 @@ // //----------------------------------------------------------------------------- -#include "ImfCheckedArithmetic.h" #include "ImfInputFile.h" + +#include "ImfCheckedArithmetic.h" + #include "ImfScanLineInputFile.h" #include "ImfTiledInputFile.h" #include "ImfChannelList.h" +#include "ImfInputPartData.h" +#include "ImfInputStreamMutex.h" #include "ImfMisc.h" #include "ImfStdIO.h" #include "ImfVersion.h" @@ -21,18 +25,16 @@ #include "ImfInputPartData.h" #include "ImfMultiPartInputFile.h" -#include -#include +#include "ImfCompositeDeepScanLine.h" +#include "ImfDeepScanLineInputFile.h" -#include "ImathFun.h" +#include #include "Iex.h" -#include "half.h" +#include #include #include -#include "ImfNamespace.h" - OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; diff --git a/src/lib/OpenEXR/ImfInputFile.h b/src/lib/OpenEXR/ImfInputFile.h index 3966b9e3dc..14542f92a6 100644 --- a/src/lib/OpenEXR/ImfInputFile.h +++ b/src/lib/OpenEXR/ImfInputFile.h @@ -13,22 +13,15 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImfTiledOutputFile.h" -#include "ImfThreading.h" -#include "ImfGenericInputFile.h" -#include "ImfNamespace.h" #include "ImfForward.h" -#include "ImfExport.h" - -#include +#include "ImfGenericInputFile.h" +#include "ImfThreading.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class InputFile : public GenericInputFile +class IMF_EXPORT_TYPE InputFile : public GenericInputFile { public: @@ -221,23 +214,24 @@ class InputFile : public GenericInputFile const char *&pixelData, int &pixelDataSize); - struct Data; + struct IMF_HIDDEN Data; private: - InputFile (InputPartData* part); + IMF_HIDDEN InputFile (InputPartData* part); InputFile (const InputFile &) = delete; InputFile & operator = (const InputFile &) = delete; InputFile (InputFile &&) = delete; InputFile & operator = (InputFile &&) = delete; - void initialize (); - void multiPartInitialize(InputPartData* part); - void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); - TiledInputFile * tFile (); - - friend void TiledOutputFile::copyPixels (InputFile &); + IMF_HIDDEN void initialize (); + IMF_HIDDEN void multiPartInitialize(InputPartData* part); + IMF_HIDDEN void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); + IMF_HIDDEN TiledInputFile * tFile (); + + // for copyPixels + friend class TiledOutputFile; Data * _data; diff --git a/src/lib/OpenEXR/ImfInputPart.cpp b/src/lib/OpenEXR/ImfInputPart.cpp index 0711735ba5..2c944d13db 100644 --- a/src/lib/OpenEXR/ImfInputPart.cpp +++ b/src/lib/OpenEXR/ImfInputPart.cpp @@ -7,6 +7,7 @@ #include "ImfNamespace.h" #include "ImfMultiPartInputFile.h" +#include "ImfInputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfInputPart.h b/src/lib/OpenEXR/ImfInputPart.h index e4f79153be..a989103876 100644 --- a/src/lib/OpenEXR/ImfInputPart.h +++ b/src/lib/OpenEXR/ImfInputPart.h @@ -6,11 +6,7 @@ #ifndef IMFINPUTPART_H_ #define IMFINPUTPART_H_ -#include "ImfInputFile.h" -#include "ImfOutputPart.h" #include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -20,7 +16,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Same interface as InputFile. Please refer to InputFile. //------------------------------------------------------------------- -class InputPart +class IMF_EXPORT_TYPE InputPart { public: IMF_EXPORT @@ -65,8 +61,8 @@ class InputPart private: InputFile* file; // for internal use - give OutputFile and TiledOutputFile access to file for copyPixels - friend void OutputFile::copyPixels(InputPart&); - friend void TiledOutputFile::copyPixels(InputPart&); + friend class OutputFile; + friend class TiledOutputFile; }; diff --git a/src/lib/OpenEXR/ImfInputPartData.h b/src/lib/OpenEXR/ImfInputPartData.h index 0a0aa4d9e9..bea26700b2 100644 --- a/src/lib/OpenEXR/ImfInputPartData.h +++ b/src/lib/OpenEXR/ImfInputPartData.h @@ -6,11 +6,11 @@ #ifndef IMFINPUTPARTDATA_H_ #define IMFINPUTPARTDATA_H_ +#include "ImfForward.h" + #include -#include "ImfInputStreamMutex.h" #include "ImfHeader.h" -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -25,7 +25,6 @@ struct InputPartData std::vector chunkOffsets; bool completed; - IMF_EXPORT InputPartData(InputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, int version); diff --git a/src/lib/OpenEXR/ImfInputStreamMutex.h b/src/lib/OpenEXR/ImfInputStreamMutex.h index 3d92ea3b91..7287dce0e7 100644 --- a/src/lib/OpenEXR/ImfInputStreamMutex.h +++ b/src/lib/OpenEXR/ImfInputStreamMutex.h @@ -6,8 +6,7 @@ #ifndef IMFINPUTSTREAMMUTEX_H_ #define IMFINPUTSTREAMMUTEX_H_ -#include "ImfIO.h" -#include "ImfNamespace.h" +#include "ImfForward.h" #include "IlmThreadConfig.h" diff --git a/src/lib/OpenEXR/ImfInt64.h b/src/lib/OpenEXR/ImfInt64.h index 842ce0bc49..7827adba79 100644 --- a/src/lib/OpenEXR/ImfInt64.h +++ b/src/lib/OpenEXR/ImfInt64.h @@ -15,6 +15,7 @@ #include "ImathInt64.h" #include "ImfNamespace.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -22,7 +23,7 @@ IMATH_DEPRECATED("use int64_t") typedef IMATH_NAMESPACE::Int64 Int64; IMATH_DEPRECATED("use sint64_t") -typedef IMATH_NAMESPACE::SInt64 Sint64; +typedef IMATH_NAMESPACE::SInt64 SInt64; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfIntAttribute.cpp b/src/lib/OpenEXR/ImfIntAttribute.cpp index 4ddbfe56ef..f8b4abdd8e 100644 --- a/src/lib/OpenEXR/ImfIntAttribute.cpp +++ b/src/lib/OpenEXR/ImfIntAttribute.cpp @@ -10,18 +10,28 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_INT_ATTRIBUTE +#include "ImfIntAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER +//#if defined(__MINGW32__) +//template <> +//IMF_EXPORT +//TypedAttribute::~TypedAttribute () +//{ +//} +//#endif template <> -const char * +IMF_EXPORT const char * IntAttribute::staticTypeName () { return "int"; } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfIntAttribute.h b/src/lib/OpenEXR/ImfIntAttribute.h index 86fb88c01d..14be86ffdf 100644 --- a/src/lib/OpenEXR/ImfIntAttribute.h +++ b/src/lib/OpenEXR/ImfIntAttribute.h @@ -13,14 +13,19 @@ // //----------------------------------------------------------------------------- -#include "ImfAttribute.h" +#include "ImfExport.h" #include "ImfNamespace.h" +#include "ImfAttribute.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute IntAttribute; -template <> IMF_EXPORT const char *IntAttribute::staticTypeName (); + +#ifndef COMPILING_IMF_INT_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfKeyCode.h b/src/lib/OpenEXR/ImfKeyCode.h index 20535ce549..15fc9c2466 100644 --- a/src/lib/OpenEXR/ImfKeyCode.h +++ b/src/lib/OpenEXR/ImfKeyCode.h @@ -65,13 +65,13 @@ // Latent Image Identification Information // //----------------------------------------------------------------------------- -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class KeyCode +class IMF_EXPORT_TYPE KeyCode { public: diff --git a/src/lib/OpenEXR/ImfKeyCodeAttribute.cpp b/src/lib/OpenEXR/ImfKeyCodeAttribute.cpp index e579a6619e..07d6737b4c 100644 --- a/src/lib/OpenEXR/ImfKeyCodeAttribute.cpp +++ b/src/lib/OpenEXR/ImfKeyCodeAttribute.cpp @@ -9,6 +9,8 @@ // //----------------------------------------------------------------------------- +#define COMPILING_IMF_KEYCODE_ATTRIBUTE + #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -16,7 +18,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * KeyCodeAttribute::staticTypeName () { return "keycode"; @@ -24,7 +26,7 @@ KeyCodeAttribute::staticTypeName () template <> -void +IMF_EXPORT void KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.filmMfcCode()); @@ -38,7 +40,7 @@ KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int template <> -void +IMF_EXPORT void KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int tmp; @@ -65,5 +67,7 @@ KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, in _value.setPerfsPerCount (tmp); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfKeyCodeAttribute.h b/src/lib/OpenEXR/ImfKeyCodeAttribute.h index 8578ac1451..f8ff48d057 100644 --- a/src/lib/OpenEXR/ImfKeyCodeAttribute.h +++ b/src/lib/OpenEXR/ImfKeyCodeAttribute.h @@ -13,9 +13,12 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" + #include "ImfKeyCode.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -23,19 +26,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute KeyCodeAttribute; -template <> -IMF_EXPORT -const char *KeyCodeAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_KEYCODE_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfLineOrder.h b/src/lib/OpenEXR/ImfLineOrder.h index 01c5fc94c5..746b63a243 100644 --- a/src/lib/OpenEXR/ImfLineOrder.h +++ b/src/lib/OpenEXR/ImfLineOrder.h @@ -12,12 +12,13 @@ // enum LineOrder // //----------------------------------------------------------------------------- +#include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum LineOrder +enum IMF_EXPORT_ENUM LineOrder { INCREASING_Y = 0, // first scan line has lowest y coordinate diff --git a/src/lib/OpenEXR/ImfLineOrderAttribute.cpp b/src/lib/OpenEXR/ImfLineOrderAttribute.cpp index df6ded11b6..a22481d3b2 100644 --- a/src/lib/OpenEXR/ImfLineOrderAttribute.cpp +++ b/src/lib/OpenEXR/ImfLineOrderAttribute.cpp @@ -10,6 +10,7 @@ // class LineOrderAttribute // //----------------------------------------------------------------------------- +#define COMPILING_IMF_LINE_ORDER_ATTRIBUTE #include "ImfLineOrderAttribute.h" @@ -19,7 +20,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * LineOrderAttribute::staticTypeName () { return "lineOrder"; @@ -27,7 +28,7 @@ LineOrderAttribute::staticTypeName () template <> -void +IMF_EXPORT void LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { unsigned char tmp = _value; @@ -36,7 +37,7 @@ LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, i template <> -void +IMF_EXPORT void LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; @@ -57,5 +58,6 @@ LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, _value = LineOrder (tmp); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfLineOrderAttribute.h b/src/lib/OpenEXR/ImfLineOrderAttribute.h index 6bb4e07e16..8f0748aa27 100644 --- a/src/lib/OpenEXR/ImfLineOrderAttribute.h +++ b/src/lib/OpenEXR/ImfLineOrderAttribute.h @@ -13,29 +13,19 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfLineOrder.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER +using LineOrderAttribute = TypedAttribute; -typedef TypedAttribute LineOrderAttribute; - -template <> -IMF_EXPORT -const char *LineOrderAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); - +#ifndef COMPILING_IMF_LINE_ORDER_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfLut.cpp b/src/lib/OpenEXR/ImfLut.cpp index a2fd0c334d..3408f0a1c8 100644 --- a/src/lib/OpenEXR/ImfLut.cpp +++ b/src/lib/OpenEXR/ImfLut.cpp @@ -12,10 +12,10 @@ // //----------------------------------------------------------------------------- -#include +#include "ImfLut.h" + #include #include -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfLut.h b/src/lib/OpenEXR/ImfLut.h index d61470d1ed..9bc3a2880c 100644 --- a/src/lib/OpenEXR/ImfLut.h +++ b/src/lib/OpenEXR/ImfLut.h @@ -15,12 +15,13 @@ // //----------------------------------------------------------------------------- -#include "ImfRgbaFile.h" -#include "ImfFrameBuffer.h" -#include "ImathBox.h" -#include "halfFunction.h" -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include "ImfRgbaFile.h" + +#include +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfMatrixAttribute.cpp b/src/lib/OpenEXR/ImfMatrixAttribute.cpp index 3d1e0c3551..bf5f958975 100644 --- a/src/lib/OpenEXR/ImfMatrixAttribute.cpp +++ b/src/lib/OpenEXR/ImfMatrixAttribute.cpp @@ -13,7 +13,9 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_MATRIX_ATTRIBUTE + +#include "ImfMatrixAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -23,7 +25,7 @@ using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * M33fAttribute::staticTypeName () { return "m33f"; @@ -31,7 +33,7 @@ M33fAttribute::staticTypeName () template <> -void +IMF_EXPORT void M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); @@ -49,7 +51,7 @@ M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ve template <> -void +IMF_EXPORT void M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); @@ -67,7 +69,7 @@ M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int s template <> -const char * +IMF_EXPORT const char * M33dAttribute::staticTypeName () { return "m33d"; @@ -75,7 +77,7 @@ M33dAttribute::staticTypeName () template <> -void +IMF_EXPORT void M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); @@ -93,7 +95,7 @@ M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ve template <> -void +IMF_EXPORT void M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); @@ -111,7 +113,7 @@ M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int s template <> -const char * +IMF_EXPORT const char * M44fAttribute::staticTypeName () { return "m44f"; @@ -119,7 +121,7 @@ M44fAttribute::staticTypeName () template <> -void +IMF_EXPORT void M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); @@ -145,7 +147,7 @@ M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ve template <> -void +IMF_EXPORT void M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); @@ -171,7 +173,7 @@ M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int s template <> -const char * +IMF_EXPORT const char * M44dAttribute::staticTypeName () { return "m44d"; @@ -179,7 +181,7 @@ M44dAttribute::staticTypeName () template <> -void +IMF_EXPORT void M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); @@ -205,7 +207,7 @@ M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ve template <> -void +IMF_EXPORT void M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); @@ -229,5 +231,10 @@ M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int s Xdr::read (is, _value[3][3]); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfMatrixAttribute.h b/src/lib/OpenEXR/ImfMatrixAttribute.h index 02efb843f6..b6f92563cd 100644 --- a/src/lib/OpenEXR/ImfMatrixAttribute.h +++ b/src/lib/OpenEXR/ImfMatrixAttribute.h @@ -16,37 +16,27 @@ // //----------------------------------------------------------------------------- -#include "ImfAttribute.h" -#include "ImathMatrix.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include "ImfAttribute.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute M33fAttribute; -template <> IMF_EXPORT const char *M33fAttribute::staticTypeName (); -template <> IMF_EXPORT void M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute M33dAttribute; -template <> IMF_EXPORT const char *M33dAttribute::staticTypeName (); -template <> IMF_EXPORT void M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute M44fAttribute; -template <> IMF_EXPORT const char *M44fAttribute::staticTypeName (); -template <> IMF_EXPORT void M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute M44dAttribute; -template <> IMF_EXPORT const char *M44dAttribute::staticTypeName (); -template <> IMF_EXPORT void M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); +#ifndef COMPILING_IMF_MATRIX_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfMisc.h b/src/lib/OpenEXR/ImfMisc.h index 4efc6d1339..f33219d2aa 100644 --- a/src/lib/OpenEXR/ImfMisc.h +++ b/src/lib/OpenEXR/ImfMisc.h @@ -13,12 +13,11 @@ // //----------------------------------------------------------------------------- +#include "ImfForward.h" + #include "ImfPixelType.h" #include "ImfCompressor.h" #include "ImfArray.h" -#include "ImfNamespace.h" -#include "ImfExport.h" -#include "ImfForward.h" #include #include diff --git a/src/lib/OpenEXR/ImfMultiPartInputFile.h b/src/lib/OpenEXR/ImfMultiPartInputFile.h index df13aea60f..b83ea9843b 100644 --- a/src/lib/OpenEXR/ImfMultiPartInputFile.h +++ b/src/lib/OpenEXR/ImfMultiPartInputFile.h @@ -6,16 +6,15 @@ #ifndef IMFMULTIPARTINPUTFILE_H_ #define IMFMULTIPARTINPUTFILE_H_ -#include "ImfGenericInputFile.h" -#include "ImfNamespace.h" #include "ImfForward.h" + +#include "ImfGenericInputFile.h" #include "ImfThreading.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class MultiPartInputFile : public GenericInputFile +class IMF_EXPORT_TYPE MultiPartInputFile : public GenericInputFile { public: IMF_EXPORT @@ -74,7 +73,7 @@ class MultiPartInputFile : public GenericInputFile IMF_EXPORT void flushPartCache(); - struct Data; + struct IMF_HIDDEN Data; private: @@ -89,10 +88,10 @@ class MultiPartInputFile : public GenericInputFile // // used internally by 'Part' types to access individual parts of the multipart file // - template T* getInputPart(int partNumber); - InputPartData* getPart(int); + template IMF_HIDDEN T* getInputPart(int partNumber); + IMF_HIDDEN InputPartData* getPart(int); - void initialize(); + IMF_HIDDEN void initialize(); diff --git a/src/lib/OpenEXR/ImfMultiPartOutputFile.h b/src/lib/OpenEXR/ImfMultiPartOutputFile.h index 78e833dbe8..0e59149d1b 100644 --- a/src/lib/OpenEXR/ImfMultiPartOutputFile.h +++ b/src/lib/OpenEXR/ImfMultiPartOutputFile.h @@ -6,12 +6,10 @@ #ifndef MULTIPARTOUTPUTFILE_H_ #define MULTIPARTOUTPUTFILE_H_ -#include "ImfHeader.h" -#include "ImfGenericOutputFile.h" #include "ImfForward.h" + +#include "ImfGenericOutputFile.h" #include "ImfThreading.h" -#include "ImfNamespace.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -36,7 +34,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // numThreads - number of threads that should be used in encoding the data. // -class MultiPartOutputFile : public GenericOutputFile +class IMF_EXPORT_TYPE MultiPartOutputFile : public GenericOutputFile { public: IMF_EXPORT @@ -74,12 +72,12 @@ class MultiPartOutputFile : public GenericOutputFile MultiPartOutputFile(MultiPartOutputFile&& other) = delete; MultiPartOutputFile& operator = (MultiPartOutputFile&& other) = delete; - struct Data; + struct IMF_HIDDEN Data; private: Data* _data; - template T* getOutputPart(int partNumber); + template IMF_HIDDEN T* getOutputPart(int partNumber); friend class OutputPart; diff --git a/src/lib/OpenEXR/ImfMultiView.h b/src/lib/OpenEXR/ImfMultiView.h index 30473f698f..177dce0cde 100644 --- a/src/lib/OpenEXR/ImfMultiView.h +++ b/src/lib/OpenEXR/ImfMultiView.h @@ -7,11 +7,12 @@ #ifndef INCLUDED_IMF_MULTIVIEW_H #define INCLUDED_IMF_MULTIVIEW_H -#include "ImfChannelList.h" -#include "ImfStringVectorAttribute.h" #include "ImfExport.h" #include "ImfNamespace.h" +#include "ImfChannelList.h" +#include "ImfStringVectorAttribute.h" + //----------------------------------------------------------------------------- // // Functions related to accessing channels and views in multi-view diff --git a/src/lib/OpenEXR/ImfName.h b/src/lib/OpenEXR/ImfName.h index 11def67aaf..409af5dd9a 100644 --- a/src/lib/OpenEXR/ImfName.h +++ b/src/lib/OpenEXR/ImfName.h @@ -14,14 +14,15 @@ // //----------------------------------------------------------------------------- -#include -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class Name +class IMF_EXPORT_TYPE Name { public: @@ -29,18 +30,20 @@ class Name // Constructors //------------- - IMF_EXPORT Name (); - IMF_EXPORT Name (const char text[]); + Name (const Name &) = default; + Name (Name &&) = default; + ~Name () = default; //-------------------- // Assignment operator //-------------------- - IMF_EXPORT - Name & operator = (const char text[]); + Name &operator = (const Name &) = default; + Name &operator = (Name &&) = default; + Name &operator = (const char text[]); //--------------------- @@ -64,15 +67,6 @@ class Name char _text[SIZE]; }; - -IMF_EXPORT -bool operator == (const Name &x, const Name &y); -IMF_EXPORT -bool operator != (const Name &x, const Name &y); -IMF_EXPORT -bool operator < (const Name &x, const Name &y); - - //----------------- // Inline functions //----------------- @@ -107,6 +101,20 @@ operator == (const Name &x, const Name &y) } +inline bool +operator == (const Name &x, const char text[]) +{ + return strcmp (*x, text) == 0; +} + + +inline bool +operator == (const char text[], const Name &y) +{ + return strcmp (text, *y) == 0; +} + + inline bool operator != (const Name &x, const Name &y) { @@ -114,6 +122,20 @@ operator != (const Name &x, const Name &y) } +inline bool +operator != (const Name &x, const char text[]) +{ + return !(x == text); +} + + +inline bool +operator != (const char text[], const Name &y) +{ + return !(text == y); +} + + inline bool operator < (const Name &x, const Name &y) { @@ -121,6 +143,20 @@ operator < (const Name &x, const Name &y) } +inline bool +operator < (const Name &x, const char text[]) +{ + return strcmp (*x, text) < 0; +} + + +inline bool +operator < (const char text[], const Name &y) +{ + return strcmp (text, *y) < 0; +} + + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.cpp b/src/lib/OpenEXR/ImfOpaqueAttribute.cpp index 17e5e20aac..f6fb334755 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.cpp +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.cpp @@ -74,7 +74,7 @@ OpaqueAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int void OpaqueAttribute::copyValueFrom (const Attribute &other) { - const OpaqueAttribute *oa = dynamic_cast_attr (&other); + const OpaqueAttribute *oa = dynamic_cast (&other); if (oa == 0 || _typeName != oa->_typeName) { diff --git a/src/lib/OpenEXR/ImfOpaqueAttribute.h b/src/lib/OpenEXR/ImfOpaqueAttribute.h index a0da25d509..4d6313d291 100644 --- a/src/lib/OpenEXR/ImfOpaqueAttribute.h +++ b/src/lib/OpenEXR/ImfOpaqueAttribute.h @@ -19,9 +19,11 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfArray.h" -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfOptimizedPixelReading.h b/src/lib/OpenEXR/ImfOptimizedPixelReading.h index 8a75b1c559..d433dc1186 100644 --- a/src/lib/OpenEXR/ImfOptimizedPixelReading.h +++ b/src/lib/OpenEXR/ImfOptimizedPixelReading.h @@ -8,6 +8,8 @@ #ifndef INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H #define INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H +#include "ImfNamespace.h" + #include "ImfSimd.h" #include "ImfSystemSpecific.h" #include diff --git a/src/lib/OpenEXR/ImfOutputFile.cpp b/src/lib/OpenEXR/ImfOutputFile.cpp index 46f86c145e..33cccce1cf 100644 --- a/src/lib/OpenEXR/ImfOutputFile.cpp +++ b/src/lib/OpenEXR/ImfOutputFile.cpp @@ -9,24 +9,27 @@ // //----------------------------------------------------------------------------- -#include -#include -#include -#include -#include -#include -#include "ImathBox.h" -#include "ImathFun.h" -#include +#include "ImfOutputFile.h" +#include "ImfInputFile.h" +#include "ImfChannelList.h" +#include "ImfHeader.h" + +#include "ImfMisc.h" +#include "ImfStdIO.h" +#include "ImfCompressor.h" +#include +#include +#include "ImfArray.h" +#include "ImfFrameBuffer.h" #include "ImfXdr.h" -#include -#include +#include "ImfPreviewImageAttribute.h" +#include "ImfPartType.h" #include "IlmThreadPool.h" #include "ImfOutputStreamMutex.h" #include "IlmThreadSemaphore.h" #include "Iex.h" #include "ImfInputPart.h" -#include "ImfNamespace.h" + #include "ImfOutputPartData.h" #include diff --git a/src/lib/OpenEXR/ImfOutputFile.h b/src/lib/OpenEXR/ImfOutputFile.h index 4f62c57121..fc240196d7 100644 --- a/src/lib/OpenEXR/ImfOutputFile.h +++ b/src/lib/OpenEXR/ImfOutputFile.h @@ -13,18 +13,16 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImfThreading.h" -#include "ImfGenericOutputFile.h" -#include "ImfNamespace.h" #include "ImfForward.h" -#include "ImfExport.h" + +#include "ImfGenericOutputFile.h" +#include "ImfThreading.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class OutputFile : public GenericOutputFile +class IMF_EXPORT_TYPE OutputFile : public GenericOutputFile { public: @@ -215,7 +213,7 @@ class OutputFile : public GenericOutputFile void breakScanLine (int y, int offset, int length, char c); - struct Data; + struct IMF_HIDDEN Data; private: @@ -225,7 +223,7 @@ class OutputFile : public GenericOutputFile // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. //------------------------------------------------------------ - OutputFile (const OutputPartData* part); + IMF_HIDDEN OutputFile (const OutputPartData* part); OutputFile (const OutputFile &) = delete; OutputFile & operator = (const OutputFile &) = delete; diff --git a/src/lib/OpenEXR/ImfOutputPart.cpp b/src/lib/OpenEXR/ImfOutputPart.cpp index 6b2a176d76..e8d7d3a49e 100644 --- a/src/lib/OpenEXR/ImfOutputPart.cpp +++ b/src/lib/OpenEXR/ImfOutputPart.cpp @@ -4,7 +4,9 @@ // #include "ImfOutputPart.h" -#include "ImfNamespace.h" + +#include "ImfMultiPartOutputFile.h" +#include "ImfOutputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfOutputPart.h b/src/lib/OpenEXR/ImfOutputPart.h index 19a4635465..3457f18da4 100644 --- a/src/lib/OpenEXR/ImfOutputPart.h +++ b/src/lib/OpenEXR/ImfOutputPart.h @@ -6,11 +6,7 @@ #ifndef IMFOUTPUTPART_H_ #define IMFOUTPUTPART_H_ -#include "ImfMultiPartOutputFile.h" -#include "ImfOutputFile.h" #include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -21,7 +17,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Same interface as OutputFile. Please refer to OutputFile. //--------------------------------------------------------------------- -class OutputPart +class IMF_EXPORT_TYPE OutputPart { public: IMF_EXPORT diff --git a/src/lib/OpenEXR/ImfOutputPartData.h b/src/lib/OpenEXR/ImfOutputPartData.h index aa60014d77..ad64f0100f 100644 --- a/src/lib/OpenEXR/ImfOutputPartData.h +++ b/src/lib/OpenEXR/ImfOutputPartData.h @@ -6,10 +6,9 @@ #ifndef IMFOUTPUTPARTDATA_H_ #define IMFOUTPUTPARTDATA_H_ -#include "ImfHeader.h" #include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" + +#include "ImfHeader.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -23,7 +22,6 @@ struct OutputPartData bool multipart; OutputStreamMutex* mutex; - IMF_EXPORT OutputPartData(OutputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, bool multipart); diff --git a/src/lib/OpenEXR/ImfOutputStreamMutex.h b/src/lib/OpenEXR/ImfOutputStreamMutex.h index 68750a259b..3d4aff9b5d 100644 --- a/src/lib/OpenEXR/ImfOutputStreamMutex.h +++ b/src/lib/OpenEXR/ImfOutputStreamMutex.h @@ -6,9 +6,7 @@ #ifndef IMFOUTPUTSTREAMMUTEX_H_ #define IMFOUTPUTSTREAMMUTEX_H_ -#include "ImfIO.h" -#include "ImfGenericOutputFile.h" -#include "ImfNamespace.h" +#include "ImfForward.h" #include "IlmThreadConfig.h" diff --git a/src/lib/OpenEXR/ImfPartHelper.h b/src/lib/OpenEXR/ImfPartHelper.h index 66e8a7e809..ba8c047e44 100644 --- a/src/lib/OpenEXR/ImfPartHelper.h +++ b/src/lib/OpenEXR/ImfPartHelper.h @@ -52,8 +52,6 @@ struct MultiViewChannelName{ int part_number; ///< part number: updated by SplitChannels std::string internal_name;///< name used in headers: in singlepart mode, may contain viewname - virtual ~MultiViewChannelName() {} - //return layer for this channel, or "" if no layer std::string getLayer() const { @@ -94,8 +92,8 @@ struct MultiViewChannelName{ /// @return total number of parts required // -template int -SplitChannels(const T & begin,const T & end,bool multipart=true,const std::string & heroView="") +template inline int +SplitChannels(const T & begin,const T & end,bool multipart=true,const std::string & heroView=std::string()) { if(!multipart) { @@ -186,7 +184,7 @@ SplitChannels(const T & begin,const T & end,bool multipart=true,const std::strin // populate the chans vector with a list of channels in the file // and their corresponding part number // -template void +template inline void GetChannelsInMultiPartFile(const MultiPartInputFile & file,T & chans) { bool has_multiview=false; diff --git a/src/lib/OpenEXR/ImfPartType.h b/src/lib/OpenEXR/ImfPartType.h index e836cc4da0..58a1bd1609 100644 --- a/src/lib/OpenEXR/ImfPartType.h +++ b/src/lib/OpenEXR/ImfPartType.h @@ -6,17 +6,18 @@ #ifndef IMFPARTTYPE_H_ #define IMFPARTTYPE_H_ -#include -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -const std::string SCANLINEIMAGE = "scanlineimage"; -const std::string TILEDIMAGE = "tiledimage"; -const std::string DEEPSCANLINE = "deepscanline"; -const std::string DEEPTILE = "deeptile"; +static const std::string SCANLINEIMAGE = "scanlineimage"; +static const std::string TILEDIMAGE = "tiledimage"; +static const std::string DEEPSCANLINE = "deepscanline"; +static const std::string DEEPTILE = "deeptile"; IMF_EXPORT bool isImage(const std::string& name); diff --git a/src/lib/OpenEXR/ImfPixelType.h b/src/lib/OpenEXR/ImfPixelType.h index b113b3f23a..df9fdadb1d 100644 --- a/src/lib/OpenEXR/ImfPixelType.h +++ b/src/lib/OpenEXR/ImfPixelType.h @@ -13,12 +13,13 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum PixelType +enum IMF_EXPORT_ENUM PixelType { UINT = 0, // unsigned int (32 bit) HALF = 1, // half (16 bit floating point) diff --git a/src/lib/OpenEXR/ImfPizCompressor.h b/src/lib/OpenEXR/ImfPizCompressor.h index 9c06e71ec2..c1c2fa0511 100644 --- a/src/lib/OpenEXR/ImfPizCompressor.h +++ b/src/lib/OpenEXR/ImfPizCompressor.h @@ -12,10 +12,9 @@ // //----------------------------------------------------------------------------- -#include "ImfCompressor.h" #include "ImfNamespace.h" -#include "ImfExport.h" -#include "ImfForward.h" + +#include "ImfCompressor.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -25,12 +24,10 @@ class PizCompressor: public Compressor { public: - IMF_EXPORT PizCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); - IMF_EXPORT virtual ~PizCompressor (); PizCompressor (const PizCompressor& other) = delete; @@ -38,31 +35,25 @@ class PizCompressor: public Compressor PizCompressor (PizCompressor&& other) = delete; PizCompressor& operator = (PizCompressor&& other) = delete; - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual Format format () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, diff --git a/src/lib/OpenEXR/ImfPreviewImage.h b/src/lib/OpenEXR/ImfPreviewImage.h index 954f841d68..bbd74dbd86 100644 --- a/src/lib/OpenEXR/ImfPreviewImage.h +++ b/src/lib/OpenEXR/ImfPreviewImage.h @@ -6,8 +6,7 @@ #ifndef INCLUDED_IMF_PREVIEW_IMAGE_H #define INCLUDED_IMF_PREVIEW_IMAGE_H -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfForward.h" //----------------------------------------------------------------------------- // @@ -22,7 +21,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -struct PreviewRgba +struct IMF_EXPORT_TYPE PreviewRgba { unsigned char r; // Red, green and blue components of unsigned char g; // the pixel's color; intensity is @@ -40,7 +39,7 @@ struct PreviewRgba }; -class PreviewImage +class IMF_EXPORT_TYPE PreviewImage { public: diff --git a/src/lib/OpenEXR/ImfPreviewImageAttribute.cpp b/src/lib/OpenEXR/ImfPreviewImageAttribute.cpp index d7600195e1..b15f311572 100644 --- a/src/lib/OpenEXR/ImfPreviewImageAttribute.cpp +++ b/src/lib/OpenEXR/ImfPreviewImageAttribute.cpp @@ -9,7 +9,8 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_PREVIEW_IMAGE_ATTRIBUTE +#include "ImfPreviewImageAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -17,7 +18,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * PreviewImageAttribute::staticTypeName () { return "preview"; @@ -25,7 +26,7 @@ PreviewImageAttribute::staticTypeName () template <> -void +IMF_EXPORT void PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.width()); @@ -45,7 +46,7 @@ PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os template <> -void +IMF_EXPORT void PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int width, height; @@ -80,5 +81,7 @@ PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &i _value = p; } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfPreviewImageAttribute.h b/src/lib/OpenEXR/ImfPreviewImageAttribute.h index ad51b3b997..f22502b331 100644 --- a/src/lib/OpenEXR/ImfPreviewImageAttribute.h +++ b/src/lib/OpenEXR/ImfPreviewImageAttribute.h @@ -12,6 +12,9 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfPreviewImage.h" @@ -20,19 +23,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute PreviewImageAttribute; -template <> -IMF_EXPORT -const char *PreviewImageAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_PREVIEW_IMAGE_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfPxr24Compressor.h b/src/lib/OpenEXR/ImfPxr24Compressor.h index 018f01ee6f..bc7448ebdd 100644 --- a/src/lib/OpenEXR/ImfPxr24Compressor.h +++ b/src/lib/OpenEXR/ImfPxr24Compressor.h @@ -14,9 +14,6 @@ //----------------------------------------------------------------------------- #include "ImfCompressor.h" -#include "ImfNamespace.h" -#include "ImfExport.h" -#include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -25,12 +22,10 @@ class Pxr24Compressor: public Compressor { public: - IMF_EXPORT Pxr24Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); - IMF_EXPORT virtual ~Pxr24Compressor (); Pxr24Compressor (const Pxr24Compressor& other) = delete; @@ -38,31 +33,25 @@ class Pxr24Compressor: public Compressor Pxr24Compressor (Pxr24Compressor&& other) = delete; Pxr24Compressor& operator = (Pxr24Compressor&& other) = delete; - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual Format format () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, diff --git a/src/lib/OpenEXR/ImfRational.h b/src/lib/OpenEXR/ImfRational.h index 2e2c39cae1..fd214fb83e 100644 --- a/src/lib/OpenEXR/ImfRational.h +++ b/src/lib/OpenEXR/ImfRational.h @@ -26,7 +26,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class Rational +class IMF_EXPORT_TYPE Rational { public: diff --git a/src/lib/OpenEXR/ImfRationalAttribute.cpp b/src/lib/OpenEXR/ImfRationalAttribute.cpp index c76073b272..16e0fbe2d9 100644 --- a/src/lib/OpenEXR/ImfRationalAttribute.cpp +++ b/src/lib/OpenEXR/ImfRationalAttribute.cpp @@ -9,7 +9,9 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_RATIONAL_ATTRIBUTE + +#include "ImfRationalAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -17,7 +19,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * RationalAttribute::staticTypeName () { return "rational"; @@ -25,7 +27,7 @@ RationalAttribute::staticTypeName () template <> -void +IMF_EXPORT void RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.n); @@ -34,12 +36,14 @@ RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, in template <> -void +IMF_EXPORT void RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.n); Xdr::read (is, _value.d); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfRationalAttribute.h b/src/lib/OpenEXR/ImfRationalAttribute.h index c5e9ec0992..cd0d4878d1 100644 --- a/src/lib/OpenEXR/ImfRationalAttribute.h +++ b/src/lib/OpenEXR/ImfRationalAttribute.h @@ -20,19 +20,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute RationalAttribute; -template <> -IMF_EXPORT -const char *RationalAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_RATIONAL_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfRgba.h b/src/lib/OpenEXR/ImfRgba.h index 3590e46e63..02ea88ebaf 100644 --- a/src/lib/OpenEXR/ImfRgba.h +++ b/src/lib/OpenEXR/ImfRgba.h @@ -12,9 +12,11 @@ // //----------------------------------------------------------------------------- -#include "half.h" +#include "ImfExport.h" #include "ImfNamespace.h" +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -38,7 +40,7 @@ struct Rgba // Channels in an RGBA file // -enum RgbaChannels +enum IMF_EXPORT_ENUM RgbaChannels { WRITE_R = 0x01, // Red WRITE_G = 0x02, // Green diff --git a/src/lib/OpenEXR/ImfRgbaFile.h b/src/lib/OpenEXR/ImfRgbaFile.h index 74c6d58327..fc4b2b7511 100644 --- a/src/lib/OpenEXR/ImfRgbaFile.h +++ b/src/lib/OpenEXR/ImfRgbaFile.h @@ -17,16 +17,18 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfRgba.h" -#include "ImathVec.h" -#include "ImathBox.h" -#include "half.h" + +#include +#include +#include #include "ImfThreading.h" #include -#include "ImfNamespace.h" -#include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -94,7 +96,7 @@ ComputeBasePointer (Rgba* ptr, const IMATH_NAMESPACE::Box2i& dataWindow) // RGBA output file. // -class RgbaOutputFile +class IMF_EXPORT_TYPE RgbaOutputFile { public: @@ -266,7 +268,7 @@ class RgbaOutputFile RgbaOutputFile (RgbaOutputFile &&) = delete; RgbaOutputFile & operator = (RgbaOutputFile &&) = delete; - class ToYca; + class IMF_HIDDEN ToYca; OutputFile * _outputFile; ToYca * _toYca; @@ -277,7 +279,7 @@ class RgbaOutputFile // RGBA input file // -class RgbaInputFile +class IMF_EXPORT_TYPE RgbaInputFile { public: @@ -405,7 +407,7 @@ class RgbaInputFile RgbaInputFile (RgbaInputFile &&) = delete; RgbaInputFile & operator = (RgbaInputFile &&) = delete; - class FromYca; + class IMF_HIDDEN FromYca; InputFile * _inputFile; FromYca * _fromYca; diff --git a/src/lib/OpenEXR/ImfRgbaYca.h b/src/lib/OpenEXR/ImfRgbaYca.h index 34e7dd9846..48a773a164 100644 --- a/src/lib/OpenEXR/ImfRgbaYca.h +++ b/src/lib/OpenEXR/ImfRgbaYca.h @@ -81,9 +81,11 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfRgba.h" #include "ImfChromaticities.h" -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfRleCompressor.h b/src/lib/OpenEXR/ImfRleCompressor.h index 8a145c269c..60622ec53e 100644 --- a/src/lib/OpenEXR/ImfRleCompressor.h +++ b/src/lib/OpenEXR/ImfRleCompressor.h @@ -13,9 +13,10 @@ // //----------------------------------------------------------------------------- -#include "ImfCompressor.h" #include "ImfNamespace.h" +#include "ImfCompressor.h" + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -23,9 +24,7 @@ class RleCompressor: public Compressor { public: - IMF_EXPORT RleCompressor (const Header &hdr, size_t maxScanLineSize); - IMF_EXPORT virtual ~RleCompressor (); RleCompressor (const RleCompressor& other) = delete; @@ -33,16 +32,13 @@ class RleCompressor: public Compressor RleCompressor (RleCompressor&& other) = delete; RleCompressor& operator = (RleCompressor&& other) = delete; - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, diff --git a/src/lib/OpenEXR/ImfScanLineInputFile.cpp b/src/lib/OpenEXR/ImfScanLineInputFile.cpp index 7efd0aaa9a..31600e977e 100644 --- a/src/lib/OpenEXR/ImfScanLineInputFile.cpp +++ b/src/lib/OpenEXR/ImfScanLineInputFile.cpp @@ -14,18 +14,19 @@ #include "ImfMisc.h" #include "ImfStdIO.h" #include "ImfCompressor.h" -#include "ImathBox.h" -#include "ImathFun.h" -#include -#include -#include -#include +#include +#include +#include "ImfXdr.h" +#include "ImfConvert.h" +#include "ImfInputPartData.h" +#include "ImfInputStreamMutex.h" +#include "ImfThreading.h" +#include "ImfPartType.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "Iex.h" #include "ImfVersion.h" #include "ImfOptimizedPixelReading.h" -#include "ImfNamespace.h" #include "ImfStandardAttributes.h" #include diff --git a/src/lib/OpenEXR/ImfScanLineInputFile.h b/src/lib/OpenEXR/ImfScanLineInputFile.h index c84e799473..e3aa420789 100644 --- a/src/lib/OpenEXR/ImfScanLineInputFile.h +++ b/src/lib/OpenEXR/ImfScanLineInputFile.h @@ -12,19 +12,15 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImfThreading.h" -#include "ImfInputStreamMutex.h" -#include "ImfInputPartData.h" +#include "ImfForward.h" + #include "ImfGenericInputFile.h" -#include "ImfExport.h" -#include "ImfNamespace.h" +#include "ImfThreading.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class ScanLineInputFile : public GenericInputFile +class IMF_EXPORT_TYPE ScanLineInputFile : public GenericInputFile { public: @@ -194,7 +190,7 @@ class ScanLineInputFile : public GenericInputFile int &pixelDataSize) const; - struct Data; + struct IMF_HIDDEN Data; private: @@ -202,9 +198,9 @@ class ScanLineInputFile : public GenericInputFile InputStreamMutex* _streamData; - ScanLineInputFile (InputPartData* part); + IMF_HIDDEN ScanLineInputFile (InputPartData* part); - void initialize(const Header& header); + IMF_HIDDEN void initialize (const Header& header); friend class MultiPartInputFile; friend class InputFile; diff --git a/src/lib/OpenEXR/ImfStdIO.cpp b/src/lib/OpenEXR/ImfStdIO.cpp index 97c98a2d9e..282a78990f 100644 --- a/src/lib/OpenEXR/ImfStdIO.cpp +++ b/src/lib/OpenEXR/ImfStdIO.cpp @@ -269,6 +269,10 @@ StdISStream::StdISStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::IStream ("(string)" // empty } +StdISStream::~StdISStream () +{ +} + bool StdISStream::read (char c[/*n*/], int n) { @@ -376,6 +380,9 @@ StdOSStream::StdOSStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::OStream ("(string)" // empty } +StdOSStream::~StdOSStream () +{ +} void StdOSStream::write (const char c[/*n*/], int n) diff --git a/src/lib/OpenEXR/ImfStdIO.h b/src/lib/OpenEXR/ImfStdIO.h index 5866e495ed..11d7127da2 100644 --- a/src/lib/OpenEXR/ImfStdIO.h +++ b/src/lib/OpenEXR/ImfStdIO.h @@ -13,9 +13,10 @@ // //----------------------------------------------------------------------------- -#include "ImfIO.h" -#include "ImfNamespace.h" #include "ImfExport.h" +#include "ImfNamespace.h" + +#include "ImfIO.h" #include #include @@ -50,15 +51,15 @@ class IMF_EXPORT_TYPE StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStrea IMF_EXPORT virtual ~StdIFStream (); + StdIFStream (const StdIFStream &) = delete; + StdIFStream (StdIFStream &&) = delete; + StdIFStream &operator=(const StdIFStream &) = delete; + StdIFStream &operator=(StdIFStream &&) = delete; - IMF_EXPORT - virtual bool read (char c[/*n*/], int n); - IMF_EXPORT - virtual uint64_t tellg (); - IMF_EXPORT - virtual void seekg (uint64_t pos); - IMF_EXPORT - virtual void clear (); + IMF_EXPORT virtual bool read (char c[/*n*/], int n); + IMF_EXPORT virtual uint64_t tellg (); + IMF_EXPORT virtual void seekg (uint64_t pos); + IMF_EXPORT virtual void clear (); private: @@ -77,15 +78,16 @@ class IMF_EXPORT_TYPE StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStrea public: IMF_EXPORT StdISStream (); + IMF_EXPORT ~StdISStream (); + StdISStream (const StdISStream &) = delete; + StdISStream (StdISStream &&) = delete; + StdISStream &operator=(const StdISStream &) = delete; + StdISStream &operator=(StdISStream &&) = delete; - IMF_EXPORT - virtual bool read (char c[/*n*/], int n); - IMF_EXPORT - virtual uint64_t tellg (); - IMF_EXPORT - virtual void seekg (uint64_t pos); - IMF_EXPORT - virtual void clear (); + IMF_EXPORT virtual bool read (char c[/*n*/], int n); + IMF_EXPORT virtual uint64_t tellg (); + IMF_EXPORT virtual void seekg (uint64_t pos); + IMF_EXPORT virtual void clear (); IMF_EXPORT std::string str () const; @@ -113,7 +115,7 @@ class IMF_EXPORT_TYPE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStrea //------------------------------------------------------- IMF_EXPORT StdOFStream (const char fileName[]); - + //--------------------------------------------------------- // A constructor that uses a std::ofstream that has already @@ -125,13 +127,14 @@ class IMF_EXPORT_TYPE StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStrea IMF_EXPORT virtual ~StdOFStream (); + StdOFStream (const StdOFStream &) = delete; + StdOFStream (StdOFStream &&) = delete; + StdOFStream &operator=(const StdOFStream &) = delete; + StdOFStream &operator=(StdOFStream &&) = delete; - IMF_EXPORT - virtual void write (const char c[/*n*/], int n); - IMF_EXPORT - virtual uint64_t tellp (); - IMF_EXPORT - virtual void seekp (uint64_t pos); + IMF_EXPORT virtual void write (const char c[/*n*/], int n); + IMF_EXPORT virtual uint64_t tellp (); + IMF_EXPORT virtual void seekp (uint64_t pos); private: @@ -150,15 +153,17 @@ class IMF_EXPORT_TYPE StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStrea public: IMF_EXPORT StdOSStream (); + IMF_EXPORT ~StdOSStream (); + StdOSStream (const StdOSStream &) = delete; + StdOSStream (StdOSStream &&) = delete; + StdOSStream &operator=(const StdOSStream &) = delete; + StdOSStream &operator=(StdOSStream &&) = delete; - IMF_EXPORT - virtual void write (const char c[/*n*/], int n); - IMF_EXPORT - virtual uint64_t tellp (); - IMF_EXPORT - virtual void seekp (uint64_t pos); + IMF_EXPORT virtual void write (const char c[/*n*/], int n); + IMF_EXPORT virtual uint64_t tellp (); + IMF_EXPORT virtual void seekp (uint64_t pos); - IMF_EXPORT std::string str () const; + IMF_EXPORT std::string str () const; private: diff --git a/src/lib/OpenEXR/ImfStringAttribute.cpp b/src/lib/OpenEXR/ImfStringAttribute.cpp index 7c472f3de4..248e30e37f 100644 --- a/src/lib/OpenEXR/ImfStringAttribute.cpp +++ b/src/lib/OpenEXR/ImfStringAttribute.cpp @@ -10,24 +10,34 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_STRING_ATTRIBUTE + +#include "ImfStringAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; +//#if defined(__MINGW32__) +//template <> +//IMF_EXPORT +//TypedAttribute::~TypedAttribute () +//{ +//} +//#endif + template <> -const char * -StringAttribute::staticTypeName () +IMF_EXPORT const char * +TypedAttribute::staticTypeName () { return "string"; } template <> -void -StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +IMF_EXPORT void +TypedAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { int size = _value.size(); @@ -37,8 +47,8 @@ StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int template <> -void -StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +IMF_EXPORT void +TypedAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { _value.resize (size); @@ -46,5 +56,7 @@ StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int Xdr::read (is, _value[i]); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfStringAttribute.h b/src/lib/OpenEXR/ImfStringAttribute.h index 9a34e3b47e..c30d7770e3 100644 --- a/src/lib/OpenEXR/ImfStringAttribute.h +++ b/src/lib/OpenEXR/ImfStringAttribute.h @@ -13,7 +13,11 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" + #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -21,19 +25,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute StringAttribute; -template <> -IMF_EXPORT -const char *StringAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_STRING_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfStringVectorAttribute.cpp b/src/lib/OpenEXR/ImfStringVectorAttribute.cpp index b8ab9cf3c1..61693e5434 100644 --- a/src/lib/OpenEXR/ImfStringVectorAttribute.cpp +++ b/src/lib/OpenEXR/ImfStringVectorAttribute.cpp @@ -10,7 +10,9 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_STRING_VECTOR_ATTRIBUTE + +#include "ImfStringVectorAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -20,7 +22,7 @@ using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * StringVectorAttribute::staticTypeName () { return "stringvector"; @@ -28,7 +30,7 @@ StringVectorAttribute::staticTypeName () template <> -void +IMF_EXPORT void StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { int size = _value.size(); @@ -43,7 +45,7 @@ StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os template <> -void +IMF_EXPORT void StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int read = 0; @@ -75,5 +77,7 @@ StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &i } } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfStringVectorAttribute.h b/src/lib/OpenEXR/ImfStringVectorAttribute.h index 169c8fc915..d0646291a1 100644 --- a/src/lib/OpenEXR/ImfStringVectorAttribute.h +++ b/src/lib/OpenEXR/ImfStringVectorAttribute.h @@ -14,9 +14,11 @@ // //----------------------------------------------------------------------------- -#include "ImfAttribute.h" +#include "ImfExport.h" #include "ImfNamespace.h" +#include "ImfAttribute.h" + #include #include @@ -26,19 +28,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef std::vector StringVector; typedef TypedAttribute StringVectorAttribute; -template <> -IMF_EXPORT -const char *StringVectorAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_STRING_VECTOR_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfSystemSpecific.h b/src/lib/OpenEXR/ImfSystemSpecific.h index 402410a181..98bbe03e92 100644 --- a/src/lib/OpenEXR/ImfSystemSpecific.h +++ b/src/lib/OpenEXR/ImfSystemSpecific.h @@ -89,10 +89,10 @@ EXRFreeAligned (void* ptr) // // Simple CPUID based runtime detection of various capabilities // -class IMF_EXPORT CpuId +class IMF_EXPORT_TYPE CpuId { public: - CpuId(); + IMF_EXPORT CpuId(); bool sse2; bool sse3; diff --git a/src/lib/OpenEXR/ImfTestFile.h b/src/lib/OpenEXR/ImfTestFile.h index 626a2a18a4..b8c32a32e8 100644 --- a/src/lib/OpenEXR/ImfTestFile.h +++ b/src/lib/OpenEXR/ImfTestFile.h @@ -15,8 +15,6 @@ //----------------------------------------------------------------------------- #include "ImfForward.h" -#include "ImfExport.h" -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfTileDescription.h b/src/lib/OpenEXR/ImfTileDescription.h index b870afc653..0a64291612 100644 --- a/src/lib/OpenEXR/ImfTileDescription.h +++ b/src/lib/OpenEXR/ImfTileDescription.h @@ -11,12 +11,13 @@ // class TileDescription and enum LevelMode // //----------------------------------------------------------------------------- +#include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum LevelMode +enum IMF_EXPORT_ENUM LevelMode { ONE_LEVEL = 0, MIPMAP_LEVELS = 1, @@ -26,7 +27,7 @@ enum LevelMode }; -enum LevelRoundingMode +enum IMF_EXPORT_ENUM LevelRoundingMode { ROUND_DOWN = 0, ROUND_UP = 1, @@ -35,7 +36,7 @@ enum LevelRoundingMode }; -class TileDescription +class IMF_EXPORT_TYPE TileDescription { public: @@ -43,7 +44,7 @@ class TileDescription unsigned int ySize; // size of a tile in the y dimension LevelMode mode; LevelRoundingMode roundingMode; - + TileDescription (unsigned int xs = 32, unsigned int ys = 32, LevelMode m = ONE_LEVEL, diff --git a/src/lib/OpenEXR/ImfTileDescriptionAttribute.cpp b/src/lib/OpenEXR/ImfTileDescriptionAttribute.cpp index 3f9ebfe25b..0ab5495cd9 100644 --- a/src/lib/OpenEXR/ImfTileDescriptionAttribute.cpp +++ b/src/lib/OpenEXR/ImfTileDescriptionAttribute.cpp @@ -9,7 +9,8 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_STRING_VECTOR_ATTRIBUTE +#include "ImfTileDescriptionAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -17,7 +18,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * TileDescriptionAttribute::staticTypeName () { return "tiledesc"; @@ -25,7 +26,7 @@ TileDescriptionAttribute::staticTypeName () template <> -void +IMF_EXPORT void TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.xSize); @@ -37,7 +38,7 @@ TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream template <> -void +IMF_EXPORT void TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) @@ -73,5 +74,7 @@ TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfTileDescriptionAttribute.h b/src/lib/OpenEXR/ImfTileDescriptionAttribute.h index 98274ded03..314660de03 100644 --- a/src/lib/OpenEXR/ImfTileDescriptionAttribute.h +++ b/src/lib/OpenEXR/ImfTileDescriptionAttribute.h @@ -12,6 +12,9 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfTileDescription.h" @@ -19,22 +22,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute TileDescriptionAttribute; -template <> -IMF_EXPORT -const char * -TileDescriptionAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void -TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void -TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_STRING_VECTOR_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfTileOffsets.h b/src/lib/OpenEXR/ImfTileOffsets.h index 1acae0ecf5..9e5ccfab51 100644 --- a/src/lib/OpenEXR/ImfTileOffsets.h +++ b/src/lib/OpenEXR/ImfTileOffsets.h @@ -12,18 +12,17 @@ // //----------------------------------------------------------------------------- -#include "ImfTileDescription.h" -#include -#include "ImfNamespace.h" #include "ImfForward.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" #include +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class TileOffsets +class IMF_EXPORT_TYPE TileOffsets { public: @@ -83,11 +82,15 @@ class TileOffsets private: + IMF_HIDDEN void findTiles (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool isMultiPartFile, bool isDeep, bool skipOnly); + IMF_HIDDEN void reconstructFromFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,bool isMultiPartFile,bool isDeep); + IMF_HIDDEN bool readTile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is); + IMF_HIDDEN bool anyOffsetsAreInvalid () const; LevelMode _mode; diff --git a/src/lib/OpenEXR/ImfTiledInputFile.cpp b/src/lib/OpenEXR/ImfTiledInputFile.cpp index 9a6d135932..49ad69be68 100644 --- a/src/lib/OpenEXR/ImfTiledInputFile.cpp +++ b/src/lib/OpenEXR/ImfTiledInputFile.cpp @@ -10,8 +10,11 @@ //----------------------------------------------------------------------------- #include "ImfTiledInputFile.h" + #include "ImfTileDescriptionAttribute.h" #include "ImfChannelList.h" +#include "ImfFrameBuffer.h" +#include "ImfHeader.h" #include "ImfMisc.h" #include "ImfTiledMisc.h" #include "ImfStdIO.h" diff --git a/src/lib/OpenEXR/ImfTiledInputFile.h b/src/lib/OpenEXR/ImfTiledInputFile.h index 66b0b1fbb8..146a179691 100644 --- a/src/lib/OpenEXR/ImfTiledInputFile.h +++ b/src/lib/OpenEXR/ImfTiledInputFile.h @@ -12,20 +12,18 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImathBox.h" -#include "ImfTileDescription.h" +#include "ImfForward.h" + #include "ImfThreading.h" #include "ImfGenericInputFile.h" -#include "ImfTiledOutputFile.h" -#include "ImfNamespace.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class TiledInputFile : public GenericInputFile +class IMF_EXPORT_TYPE TiledInputFile : public GenericInputFile { public: @@ -365,32 +363,40 @@ class TiledInputFile : public GenericInputFile const char *&pixelData, int &pixelDataSize); - struct Data; + struct IMF_HIDDEN Data; private: friend class InputFile; friend class MultiPartInputFile; + IMF_HIDDEN TiledInputFile (InputPartData* part); + IMF_HIDDEN TiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads); + IMF_HIDDEN void initialize (); + IMF_HIDDEN void multiPartInitialize(InputPartData* part); + IMF_HIDDEN void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); + IMF_HIDDEN bool isValidTile (int dx, int dy, int lx, int ly) const; + IMF_HIDDEN size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; + IMF_HIDDEN void tileOrder(int dx[],int dy[],int lx[],int ly[]) const; Data * _data; - friend void TiledOutputFile::copyPixels(TiledInputFile &); + friend class TiledOutputFile; }; diff --git a/src/lib/OpenEXR/ImfTiledInputPart.cpp b/src/lib/OpenEXR/ImfTiledInputPart.cpp index 67aa6809f3..ae0d703759 100644 --- a/src/lib/OpenEXR/ImfTiledInputPart.cpp +++ b/src/lib/OpenEXR/ImfTiledInputPart.cpp @@ -4,7 +4,9 @@ // #include "ImfTiledInputPart.h" -#include "ImfNamespace.h" + +#include "ImfMultiPartInputFile.h" +#include "ImfTiledInputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfTiledInputPart.h b/src/lib/OpenEXR/ImfTiledInputPart.h index 74f3744e05..244350c1a1 100644 --- a/src/lib/OpenEXR/ImfTiledInputPart.h +++ b/src/lib/OpenEXR/ImfTiledInputPart.h @@ -6,11 +6,10 @@ #ifndef IMFTILEDINPUTPART_H_ #define IMFTILEDINPUTPART_H_ -#include "ImfMultiPartInputFile.h" -#include "ImfTiledInputFile.h" -#include "ImfNamespace.h" #include "ImfForward.h" -#include "ImfExport.h" + +#include "ImfTileDescription.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -20,7 +19,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Same interface as TiledInputFile. Please have a reference to TiledInputFile. //----------------------------------------------------------------------------- -class TiledInputPart +class IMF_EXPORT_TYPE TiledInputPart { public: IMF_EXPORT diff --git a/src/lib/OpenEXR/ImfTiledMisc.cpp b/src/lib/OpenEXR/ImfTiledMisc.cpp index 46a9e8ec89..917e50dcb4 100644 --- a/src/lib/OpenEXR/ImfTiledMisc.cpp +++ b/src/lib/OpenEXR/ImfTiledMisc.cpp @@ -13,12 +13,11 @@ #include "Iex.h" #include #include +#include #include #include #include -#include "ImfNamespace.h" - OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; diff --git a/src/lib/OpenEXR/ImfTiledMisc.h b/src/lib/OpenEXR/ImfTiledMisc.h index 6b5990d4f2..9059ae2c70 100644 --- a/src/lib/OpenEXR/ImfTiledMisc.h +++ b/src/lib/OpenEXR/ImfTiledMisc.h @@ -12,9 +12,10 @@ // //----------------------------------------------------------------------------- -#include "ImathBox.h" -#include "ImfHeader.h" -#include "ImfNamespace.h" +#include "ImfForward.h" + +#include "ImfTileDescription.h" +#include #include #include diff --git a/src/lib/OpenEXR/ImfTiledOutputFile.cpp b/src/lib/OpenEXR/ImfTiledOutputFile.cpp index b766ea6735..b2a1971400 100644 --- a/src/lib/OpenEXR/ImfTiledOutputFile.cpp +++ b/src/lib/OpenEXR/ImfTiledOutputFile.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/lib/OpenEXR/ImfTiledOutputFile.h b/src/lib/OpenEXR/ImfTiledOutputFile.h index b1856909aa..8ba1b9de1f 100644 --- a/src/lib/OpenEXR/ImfTiledOutputFile.h +++ b/src/lib/OpenEXR/ImfTiledOutputFile.h @@ -12,15 +12,13 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImathBox.h" -#include "ImfTileDescription.h" +#include "ImfForward.h" + #include "ImfThreading.h" #include "ImfGenericOutputFile.h" -#include "ImfForward.h" -#include "ImfNamespace.h" -#include "ImfExport.h" +#include "ImfTileDescription.h" + +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -29,7 +27,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct PreviewRgba; -class TiledOutputFile : public GenericOutputFile +class IMF_EXPORT_TYPE TiledOutputFile : public GenericOutputFile { public: @@ -461,7 +459,7 @@ class TiledOutputFile : public GenericOutputFile int offset, int length, char c); - struct Data; + struct IMF_HIDDEN Data; private: @@ -471,6 +469,7 @@ class TiledOutputFile : public GenericOutputFile // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. // ---------------------------------------------------------------- + IMF_HIDDEN TiledOutputFile (const OutputPartData* part); TiledOutputFile (const TiledOutputFile &) = delete; @@ -478,11 +477,14 @@ class TiledOutputFile : public GenericOutputFile TiledOutputFile (TiledOutputFile &&) = delete; TiledOutputFile & operator = (TiledOutputFile &&) = delete; + IMF_HIDDEN void initialize (const Header &header); + IMF_HIDDEN bool isValidTile (int dx, int dy, int lx, int ly) const; + IMF_HIDDEN size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; diff --git a/src/lib/OpenEXR/ImfTiledOutputPart.cpp b/src/lib/OpenEXR/ImfTiledOutputPart.cpp index 84b0bd29c9..07a2604b06 100644 --- a/src/lib/OpenEXR/ImfTiledOutputPart.cpp +++ b/src/lib/OpenEXR/ImfTiledOutputPart.cpp @@ -4,7 +4,9 @@ // #include "ImfTiledOutputPart.h" -#include "ImfNamespace.h" + +#include "ImfMultiPartOutputFile.h" +#include "ImfTiledOutputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER diff --git a/src/lib/OpenEXR/ImfTiledOutputPart.h b/src/lib/OpenEXR/ImfTiledOutputPart.h index 4839c7fccb..19006889ac 100644 --- a/src/lib/OpenEXR/ImfTiledOutputPart.h +++ b/src/lib/OpenEXR/ImfTiledOutputPart.h @@ -6,11 +6,10 @@ #ifndef IMFTILEDOUTPUTPART_H_ #define IMFTILEDOUTPUTPART_H_ -#include "ImfMultiPartOutputFile.h" -#include "ImfTiledOutputFile.h" #include "ImfForward.h" -#include "ImfExport.h" -#include "ImfNamespace.h" + +#include "ImfTileDescription.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXR/ImfTiledRgbaFile.h b/src/lib/OpenEXR/ImfTiledRgbaFile.h index 4742c17f0f..8e8f5a5aa4 100644 --- a/src/lib/OpenEXR/ImfTiledRgbaFile.h +++ b/src/lib/OpenEXR/ImfTiledRgbaFile.h @@ -15,17 +15,19 @@ // //----------------------------------------------------------------------------- -#include "ImfHeader.h" -#include "ImfFrameBuffer.h" -#include "ImathVec.h" -#include "ImathBox.h" -#include "half.h" +#include "ImfForward.h" + +#include "ImfCompression.h" +#include "ImfLineOrder.h" #include "ImfTileDescription.h" #include "ImfRgba.h" #include "ImfThreading.h" + +#include +#include +#include + #include -#include "ImfNamespace.h" -#include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -35,7 +37,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // Tiled RGBA output file. // -class TiledRgbaOutputFile +class IMF_EXPORT_TYPE TiledRgbaOutputFile { public: @@ -291,7 +293,7 @@ class TiledRgbaOutputFile TiledRgbaOutputFile (TiledRgbaOutputFile &&) = delete; TiledRgbaOutputFile & operator = (TiledRgbaOutputFile &&) = delete; - class ToYa; + class IMF_HIDDEN ToYa; TiledOutputFile * _outputFile; ToYa * _toYa; diff --git a/src/lib/OpenEXR/ImfTimeCode.h b/src/lib/OpenEXR/ImfTimeCode.h index 354eb81dc5..bb7fcf500c 100644 --- a/src/lib/OpenEXR/ImfTimeCode.h +++ b/src/lib/OpenEXR/ImfTimeCode.h @@ -86,7 +86,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -class TimeCode +class IMF_EXPORT_TYPE TimeCode { public: @@ -94,7 +94,7 @@ class TimeCode // Bit packing variants //--------------------- - enum Packing + enum IMF_EXPORT_ENUM Packing { TV60_PACKING, // packing for 60-field television TV50_PACKING, // packing for 50-field television diff --git a/src/lib/OpenEXR/ImfTimeCodeAttribute.cpp b/src/lib/OpenEXR/ImfTimeCodeAttribute.cpp index 32d5d2c4b9..4d3ad08576 100644 --- a/src/lib/OpenEXR/ImfTimeCodeAttribute.cpp +++ b/src/lib/OpenEXR/ImfTimeCodeAttribute.cpp @@ -9,14 +9,16 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_TIMECODE_ATTRIBUTE + +#include "ImfTimeCodeAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * TimeCodeAttribute::staticTypeName () { return "timecode"; @@ -24,7 +26,7 @@ TimeCodeAttribute::staticTypeName () template <> -void +IMF_EXPORT void TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.timeAndFlags()); @@ -33,7 +35,7 @@ TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, in template <> -void +IMF_EXPORT void TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned int tmp; @@ -45,5 +47,7 @@ TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, i _value.setUserData (tmp); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfTimeCodeAttribute.h b/src/lib/OpenEXR/ImfTimeCodeAttribute.h index 9346ec6743..cb83683d6b 100644 --- a/src/lib/OpenEXR/ImfTimeCodeAttribute.h +++ b/src/lib/OpenEXR/ImfTimeCodeAttribute.h @@ -13,6 +13,9 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" #include "ImfTimeCode.h" @@ -21,19 +24,9 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute TimeCodeAttribute; -template <> -IMF_EXPORT -const char *TimeCodeAttribute::staticTypeName (); - -template <> -IMF_EXPORT -void TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, - int) const; - -template <> -IMF_EXPORT -void TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, - int, int); +#ifndef COMPILING_IMF_TIMECODE_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXR/ImfVecAttribute.cpp b/src/lib/OpenEXR/ImfVecAttribute.cpp index 509a184765..5049d6a73c 100644 --- a/src/lib/OpenEXR/ImfVecAttribute.cpp +++ b/src/lib/OpenEXR/ImfVecAttribute.cpp @@ -15,7 +15,8 @@ // //----------------------------------------------------------------------------- -#include +#define COMPILING_IMF_VECTOR_ATTRIBUTE +#include "ImfVecAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER @@ -23,7 +24,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> -const char * +IMF_EXPORT const char * V2iAttribute::staticTypeName () { return "v2i"; @@ -31,7 +32,7 @@ V2iAttribute::staticTypeName () template <> -void +IMF_EXPORT void V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -40,7 +41,7 @@ V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -49,7 +50,7 @@ V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si template <> -const char * +IMF_EXPORT const char * V2fAttribute::staticTypeName () { return "v2f"; @@ -57,7 +58,7 @@ V2fAttribute::staticTypeName () template <> -void +IMF_EXPORT void V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -66,7 +67,7 @@ V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -75,7 +76,7 @@ V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si template <> -const char * +IMF_EXPORT const char * V2dAttribute::staticTypeName () { return "v2d"; @@ -83,7 +84,7 @@ V2dAttribute::staticTypeName () template <> -void +IMF_EXPORT void V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -92,7 +93,7 @@ V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -101,7 +102,7 @@ V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si template <> -const char * +IMF_EXPORT const char * V3iAttribute::staticTypeName () { return "v3i"; @@ -109,7 +110,7 @@ V3iAttribute::staticTypeName () template <> -void +IMF_EXPORT void V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -119,7 +120,7 @@ V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -129,7 +130,7 @@ V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si template <> -const char * +IMF_EXPORT const char * V3fAttribute::staticTypeName () { return "v3f"; @@ -137,7 +138,7 @@ V3fAttribute::staticTypeName () template <> -void +IMF_EXPORT void V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -147,7 +148,7 @@ V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -157,7 +158,7 @@ V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si template <> -const char * +IMF_EXPORT const char * V3dAttribute::staticTypeName () { return "v3d"; @@ -165,7 +166,7 @@ V3dAttribute::staticTypeName () template <> -void +IMF_EXPORT void V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); @@ -175,7 +176,7 @@ V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int ver template <> -void +IMF_EXPORT void V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); @@ -183,5 +184,12 @@ V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int si Xdr::read (is, _value.z); } +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; +template class IMF_EXPORT_TEMPLATE_INSTANCE TypedAttribute; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXR/ImfVecAttribute.h b/src/lib/OpenEXR/ImfVecAttribute.h index 6ee8233e27..f9b79dbd87 100644 --- a/src/lib/OpenEXR/ImfVecAttribute.h +++ b/src/lib/OpenEXR/ImfVecAttribute.h @@ -18,53 +18,31 @@ // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include "ImfNamespace.h" + #include "ImfAttribute.h" -#include "ImathVec.h" +#include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute V2iAttribute; -template <> IMF_EXPORT const char *V2iAttribute::staticTypeName (); -template <> IMF_EXPORT void V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute V2fAttribute; -template <> IMF_EXPORT const char *V2fAttribute::staticTypeName (); -template <> IMF_EXPORT void V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute V2dAttribute; -template <> IMF_EXPORT const char *V2dAttribute::staticTypeName (); -template <> IMF_EXPORT void V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute V3iAttribute; -template <> IMF_EXPORT const char *V3iAttribute::staticTypeName (); -template <> IMF_EXPORT void V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute V3fAttribute; -template <> IMF_EXPORT const char *V3fAttribute::staticTypeName (); -template <> IMF_EXPORT void V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - typedef TypedAttribute V3dAttribute; -template <> IMF_EXPORT const char *V3dAttribute::staticTypeName (); -template <> IMF_EXPORT void V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; -template <> IMF_EXPORT void V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); - - -OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT +#ifndef COMPILING_IMF_VECTOR_ATTRIBUTE +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +extern template class IMF_EXPORT_EXTERN_TEMPLATE TypedAttribute; +#endif -#if defined (OPENEXR_IMF_INTERNAL_NAMESPACE_AUTO_EXPOSE) -namespace Imf { using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; } -#endif +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif diff --git a/src/lib/OpenEXR/ImfVersion.h b/src/lib/OpenEXR/ImfVersion.h index 5be6be781f..5d85fbcfd1 100644 --- a/src/lib/OpenEXR/ImfVersion.h +++ b/src/lib/OpenEXR/ImfVersion.h @@ -23,7 +23,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // a given file is an OpenEXR image file (see isImfMagic(), below). // -const int MAGIC = 20000630; +static const int MAGIC = 20000630; // @@ -37,15 +37,15 @@ const int MAGIC = 20000630; // and a 24-bit flags field. // -const int VERSION_NUMBER_FIELD = 0x000000ff; -const int VERSION_FLAGS_FIELD = 0xffffff00; +static const int VERSION_NUMBER_FIELD = 0x000000ff; +static const int VERSION_FLAGS_FIELD = 0xffffff00; // // Value that goes into VERSION_NUMBER_FIELD. // -const int EXR_VERSION = 2; +static const int EXR_VERSION = 2; // @@ -53,23 +53,23 @@ const int EXR_VERSION = 2; // Flags can only occupy the 1 bits in VERSION_FLAGS_FIELD. // -const int TILED_FLAG = 0x00000200; // File is tiled - +static const int TILED_FLAG = 0x00000200; // File is tiled +static const int LONG_NAMES_FLAG = 0x00000400; // File contains long // attribute or channel // names - +static const int NON_IMAGE_FLAG = 0x00000800; // File has at least one part // which is not a regular // scanline image or regular tiled image // (that is, it is a deep format) - +static const int MULTI_PART_FILE_FLAG = 0x00001000; // File has multiple parts // // Bitwise OR of all known flags. // - +static const int ALL_FLAGS = TILED_FLAG | LONG_NAMES_FLAG | NON_IMAGE_FLAG | MULTI_PART_FILE_FLAG; diff --git a/src/lib/OpenEXR/ImfXdr.h b/src/lib/OpenEXR/ImfXdr.h index 4c6a434730..63e7b940d5 100644 --- a/src/lib/OpenEXR/ImfXdr.h +++ b/src/lib/OpenEXR/ImfXdr.h @@ -73,13 +73,13 @@ // //---------------------------------------------------------------------------- +#include "ImfNamespace.h" + #include "IexMathExc.h" -#include "half.h" +#include #include #include -#include "ImfNamespace.h" - OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER namespace Xdr { diff --git a/src/lib/OpenEXR/ImfZip.h b/src/lib/OpenEXR/ImfZip.h index 41009ca3dd..30dea663c2 100644 --- a/src/lib/OpenEXR/ImfZip.h +++ b/src/lib/OpenEXR/ImfZip.h @@ -16,11 +16,8 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Zip { public: - IMF_EXPORT explicit Zip(size_t rawMaxSize); - IMF_EXPORT Zip(size_t maxScanlineSize, size_t numScanLines); - IMF_EXPORT ~Zip(); Zip (const Zip& other) = delete; @@ -28,23 +25,19 @@ class Zip Zip (Zip&& other) = delete; Zip& operator = (Zip&& other) = delete; - IMF_EXPORT size_t maxRawSize(); - IMF_EXPORT size_t maxCompressedSize(); // // Compress the raw data into the provided buffer. // Returns the amount of compressed data. // - IMF_EXPORT int compress(const char *raw, int rawSize, char *compressed); // // Uncompress the compressed data into the provided // buffer. Returns the amount of raw data actually decoded. // - IMF_EXPORT int uncompress(const char *compressed, int compressedSize, char *raw); diff --git a/src/lib/OpenEXR/ImfZipCompressor.h b/src/lib/OpenEXR/ImfZipCompressor.h index f21480f84c..acb03d3b76 100644 --- a/src/lib/OpenEXR/ImfZipCompressor.h +++ b/src/lib/OpenEXR/ImfZipCompressor.h @@ -13,9 +13,11 @@ // //----------------------------------------------------------------------------- +#include "ImfNamespace.h" + #include "ImfCompressor.h" + #include "ImfZip.h" -#include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -24,24 +26,19 @@ class ZipCompressor: public Compressor { public: - IMF_EXPORT ZipCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); - IMF_EXPORT virtual ~ZipCompressor (); - IMF_EXPORT virtual int numScanLines () const; - IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); - IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, diff --git a/src/lib/OpenEXRUtil/ImfCheckFile.cpp b/src/lib/OpenEXRUtil/ImfCheckFile.cpp index b433f6c123..2342780e06 100644 --- a/src/lib/OpenEXRUtil/ImfCheckFile.cpp +++ b/src/lib/OpenEXRUtil/ImfCheckFile.cpp @@ -7,10 +7,15 @@ #include "ImfArray.h" #include "ImfChannelList.h" #include "ImfFrameBuffer.h" +#include "ImfDeepFrameBuffer.h" #include "ImfPartType.h" +#include "ImfInputFile.h" #include "ImfInputPart.h" +#include "ImfDeepScanLineInputFile.h" #include "ImfDeepScanLineInputPart.h" +#include "ImfTiledInputFile.h" #include "ImfTiledInputPart.h" +#include "ImfDeepTiledInputFile.h" #include "ImfDeepTiledInputPart.h" #include "ImfStdIO.h" #include "ImfMultiPartInputFile.h" diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp b/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp index cf083fa973..6c0acd9040 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp @@ -9,6 +9,8 @@ // //---------------------------------------------------------------------------- +#define COMPILING_IMF_DEEP_IMAGE_CHANNEL + #include "ImfDeepImageChannel.h" #include "ImfDeepImageLevel.h" #include @@ -69,5 +71,254 @@ DeepImageChannel::resize () ImageChannel::resize(); } +//----------------------------------------------------------------------------- + +template +TypedDeepImageChannel::TypedDeepImageChannel + (DeepImageLevel &level, + bool pLinear) +: + DeepImageChannel (level, pLinear), + _sampleListPointers (0), + _base (0), + _sampleBuffer (0) +{ + resize(); +} + + +template +TypedDeepImageChannel::~TypedDeepImageChannel () +{ + delete [] _sampleListPointers; + delete [] _sampleBuffer; +} + + +template +DeepSlice +TypedDeepImageChannel::slice () const +{ + return DeepSlice (pixelType(), // type + (char *) _base, // base + sizeof (T*), // xStride + pixelsPerRow() * sizeof (T*), // yStride + sizeof (T), // sampleStride + xSampling(), + ySampling()); +} +template +void +TypedDeepImageChannel::setSamplesToZero + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples) +{ + // + // Expand the size of a sample list for a single pixel and + // set the new samples in the list to 0. + // + // i The position of the affected pixel in + // the channel's _sampleListPointers. + // + // oldNumSamples Original number of samples in the sample list. + // + // newNumSamples New number of samples in the sample list. + // + + for (unsigned int j = oldNumSamples; j < newNumSamples; ++j) + _sampleListPointers[i][j] = 0; +} + + +template +void +TypedDeepImageChannel::moveSampleList + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition) +{ + // + // Resize the sample list for a single pixel and move it to a new + // position in the sample buffer for this channel. + // + // i The position of the affected pixel in + // the channel's _sampleListPointers. + // + // oldNumSamples Original number of samples in sample list. + // + // newNumSamples New number of samples in the sample list. + // If the new number of samples is larger than + // the old number of samples for a given sample + // list, then the end of the new sample list + // is filled with zeroes. If the new number of + // samples is smaller than the old one, then + // samples at the end of the old sample list + // are discarded. + // + // newSampleListPosition The new position of the sample list in the + // sample buffer. + // + + T * oldSampleList = _sampleListPointers[i]; + T * newSampleList = _sampleBuffer + newSampleListPosition; + + if (oldNumSamples > newNumSamples) + { + for (unsigned int j = 0; j < newNumSamples; ++j) + newSampleList[j] = oldSampleList[j]; + } + else + { + for (unsigned int j = 0; j < oldNumSamples; ++j) + newSampleList[j] = oldSampleList[j]; + + for (unsigned int j = oldNumSamples; j < newNumSamples; ++j) + newSampleList[j] = 0; + } + + _sampleListPointers[i] = newSampleList; +} + + +template +void +TypedDeepImageChannel::moveSamplesToNewBuffer + (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions) +{ + // + // Allocate a new sample buffer for this channel. + // Copy the sample lists for all pixels into the new buffer. + // Then delete the old sample buffer. + // + // oldNumSamples Number of samples in each sample list in the + // old sample buffer. + // + // newNumSamples Number of samples in each sample list in + // the new sample buffer. If the new number + // of samples is larger than the old number of + // samples for a given sample list, then the + // end of the new sample list is filled with + // zeroes. If the new number of samples is + // smaller than the old one, then samples at + // the end of the old sample list are discarded. + // + // newSampleListPositions The positions of the new sample lists in the + // new sample buffer. + // + + T * oldSampleBuffer = _sampleBuffer; + _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; + + for (size_t i = 0; i < numPixels(); ++i) + { + T * oldSampleList = _sampleListPointers[i]; + T * newSampleList = _sampleBuffer + newSampleListPositions[i]; + + if (oldNumSamples[i] > newNumSamples[i]) + { + for (unsigned int j = 0; j < newNumSamples[i]; ++j) + newSampleList[j] = oldSampleList[j]; + } + else + { + for (unsigned int j = 0; j < oldNumSamples[i]; ++j) + newSampleList[j] = oldSampleList[j]; + + for (unsigned int j = oldNumSamples[i]; j < newNumSamples[i]; ++j) + newSampleList[j] = 0; + } + + _sampleListPointers[i] = newSampleList; + } + + delete [] oldSampleBuffer; +} + + +template +void +TypedDeepImageChannel::initializeSampleLists () +{ + // + // Allocate a new set of sample lists for this channel, and + // construct zero-filled sample lists for the pixels. + // + + delete [] _sampleBuffer; + + _sampleBuffer = 0; // set to 0 to prevent double deletion + // in case of an exception + + const unsigned int * numSamples = sampleCounts().numSamples(); + const size_t * sampleListPositions = sampleCounts().sampleListPositions(); + + _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; + + resetBasePointer(); + + for (size_t i = 0; i < numPixels(); ++i) + { + _sampleListPointers[i] = _sampleBuffer + sampleListPositions[i]; + + for (unsigned int j = 0; j < numSamples[i]; ++j) + _sampleListPointers[i][j] = T (0); + } +} + +template +void +TypedDeepImageChannel::resize () +{ + DeepImageChannel::resize(); + + delete [] _sampleListPointers; + _sampleListPointers = 0; + _sampleListPointers = new T * [numPixels()]; + initializeSampleLists(); +} + + +template +void +TypedDeepImageChannel::resetBasePointer () +{ + _base = _sampleListPointers - + level().dataWindow().min.y * pixelsPerRow() - + level().dataWindow().min.x; +} + + +template <> +PixelType +TypedDeepImageChannel::pixelType () const +{ + return HALF; +} + + +template <> +PixelType +TypedDeepImageChannel::pixelType () const +{ + return FLOAT; +} + + +template <> +PixelType +TypedDeepImageChannel::pixelType () const +{ + return UINT; +} + + +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedDeepImageChannel; +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedDeepImageChannel; +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedDeepImageChannel; + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h index 35a9d37e7c..df793a43fa 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.h @@ -16,10 +16,12 @@ // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include "ImfNamespace.h" + #include "ImfImageChannel.h" #include "ImfSampleCountChannel.h" #include "ImfImageLevel.h" -#include "ImfUtilExport.h" #include "ImfDeepFrameBuffer.h" @@ -104,7 +106,7 @@ class IMFUTIL_EXPORT_TYPE DeepImageChannel: public ImageChannel template -class TypedDeepImageChannel: public DeepImageChannel +class IMFUTIL_EXPORT_TEMPLATE_TYPE TypedDeepImageChannel: public DeepImageChannel { public: @@ -163,7 +165,9 @@ class TypedDeepImageChannel: public DeepImageChannel friend class DeepImageLevel; + IMFUTIL_HIDDEN TypedDeepImageChannel (DeepImageLevel &level, bool pLinear); + IMFUTIL_HIDDEN virtual ~TypedDeepImageChannel (); TypedDeepImageChannel (const TypedDeepImageChannel& other) = delete; @@ -171,26 +175,32 @@ class TypedDeepImageChannel: public DeepImageChannel TypedDeepImageChannel (TypedDeepImageChannel&& other) = delete; TypedDeepImageChannel& operator = (TypedDeepImageChannel&& other) = delete; + IMFUTIL_HIDDEN virtual void setSamplesToZero (size_t i, unsigned int oldNumSamples, unsigned int newNumSamples); + IMFUTIL_HIDDEN virtual void moveSampleList (size_t i, unsigned int oldNumSamples, unsigned int newNumSamples, size_t newSampleListPosition); + IMFUTIL_HIDDEN virtual void moveSamplesToNewBuffer (const unsigned int * oldNumSamples, const unsigned int * newNumSamples, const size_t * newSampleListPositions); + IMFUTIL_HIDDEN virtual void initializeSampleLists (); + IMFUTIL_HIDDEN virtual void resize (); + IMFUTIL_HIDDEN virtual void resetBasePointer (); T ** _sampleListPointers; // Array of pointers to per-pixel @@ -213,71 +223,10 @@ typedef TypedDeepImageChannel DeepHalfChannel; typedef TypedDeepImageChannel DeepFloatChannel; typedef TypedDeepImageChannel DeepUIntChannel; - //----------------------------------------------------------------------------- // Implementation of templates and inline functions //----------------------------------------------------------------------------- -template -TypedDeepImageChannel::TypedDeepImageChannel - (DeepImageLevel &level, - bool pLinear) -: - DeepImageChannel (level, pLinear), - _sampleListPointers (0), - _base (0), - _sampleBuffer (0) -{ - resize(); -} - - -template -TypedDeepImageChannel::~TypedDeepImageChannel () -{ - delete [] _sampleListPointers; - delete [] _sampleBuffer; -} - - -template <> -inline PixelType -DeepHalfChannel::pixelType () const -{ - return HALF; -} - - -template <> -inline PixelType -DeepFloatChannel::pixelType () const -{ - return FLOAT; -} - - -template <> -inline PixelType -DeepUIntChannel::pixelType () const -{ - return UINT; -} - - -template -DeepSlice -TypedDeepImageChannel::slice () const -{ - return DeepSlice (pixelType(), // type - (char *) _base, // base - sizeof (T*), // xStride - pixelsPerRow() * sizeof (T*), // yStride - sizeof (T), // sampleStride - xSampling(), - ySampling()); -} - - template inline T * TypedDeepImageChannel::operator () (int x, int y) @@ -327,190 +276,11 @@ TypedDeepImageChannel::row (int r) const return _base + r * pixelsPerRow(); } - -template -void -TypedDeepImageChannel::setSamplesToZero - (size_t i, - unsigned int oldNumSamples, - unsigned int newNumSamples) -{ - // - // Expand the size of a sample list for a single pixel and - // set the new samples in the list to 0. - // - // i The position of the affected pixel in - // the channel's _sampleListPointers. - // - // oldNumSamples Original number of samples in the sample list. - // - // newNumSamples New number of samples in the sample list. - // - - for (unsigned int j = oldNumSamples; j < newNumSamples; ++j) - _sampleListPointers[i][j] = 0; -} - - -template -void -TypedDeepImageChannel::moveSampleList - (size_t i, - unsigned int oldNumSamples, - unsigned int newNumSamples, - size_t newSampleListPosition) -{ - // - // Resize the sample list for a single pixel and move it to a new - // position in the sample buffer for this channel. - // - // i The position of the affected pixel in - // the channel's _sampleListPointers. - // - // oldNumSamples Original number of samples in sample list. - // - // newNumSamples New number of samples in the sample list. - // If the new number of samples is larger than - // the old number of samples for a given sample - // list, then the end of the new sample list - // is filled with zeroes. If the new number of - // samples is smaller than the old one, then - // samples at the end of the old sample list - // are discarded. - // - // newSampleListPosition The new position of the sample list in the - // sample buffer. - // - - T * oldSampleList = _sampleListPointers[i]; - T * newSampleList = _sampleBuffer + newSampleListPosition; - - if (oldNumSamples > newNumSamples) - { - for (unsigned int j = 0; j < newNumSamples; ++j) - newSampleList[j] = oldSampleList[j]; - } - else - { - for (unsigned int j = 0; j < oldNumSamples; ++j) - newSampleList[j] = oldSampleList[j]; - - for (unsigned int j = oldNumSamples; j < newNumSamples; ++j) - newSampleList[j] = 0; - } - - _sampleListPointers[i] = newSampleList; -} - - -template -void -TypedDeepImageChannel::moveSamplesToNewBuffer - (const unsigned int * oldNumSamples, - const unsigned int * newNumSamples, - const size_t * newSampleListPositions) -{ - // - // Allocate a new sample buffer for this channel. - // Copy the sample lists for all pixels into the new buffer. - // Then delete the old sample buffer. - // - // oldNumSamples Number of samples in each sample list in the - // old sample buffer. - // - // newNumSamples Number of samples in each sample list in - // the new sample buffer. If the new number - // of samples is larger than the old number of - // samples for a given sample list, then the - // end of the new sample list is filled with - // zeroes. If the new number of samples is - // smaller than the old one, then samples at - // the end of the old sample list are discarded. - // - // newSampleListPositions The positions of the new sample lists in the - // new sample buffer. - // - - T * oldSampleBuffer = _sampleBuffer; - _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; - - for (size_t i = 0; i < numPixels(); ++i) - { - T * oldSampleList = _sampleListPointers[i]; - T * newSampleList = _sampleBuffer + newSampleListPositions[i]; - - if (oldNumSamples[i] > newNumSamples[i]) - { - for (unsigned int j = 0; j < newNumSamples[i]; ++j) - newSampleList[j] = oldSampleList[j]; - } - else - { - for (unsigned int j = 0; j < oldNumSamples[i]; ++j) - newSampleList[j] = oldSampleList[j]; - - for (unsigned int j = oldNumSamples[i]; j < newNumSamples[i]; ++j) - newSampleList[j] = 0; - } - - _sampleListPointers[i] = newSampleList; - } - - delete [] oldSampleBuffer; -} - - -template -void -TypedDeepImageChannel::initializeSampleLists () -{ - // - // Allocate a new set of sample lists for this channel, and - // construct zero-filled sample lists for the pixels. - // - - delete [] _sampleBuffer; - - _sampleBuffer = 0; // set to 0 to prevent double deletion - // in case of an exception - - const unsigned int * numSamples = sampleCounts().numSamples(); - const size_t * sampleListPositions = sampleCounts().sampleListPositions(); - - _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; - - resetBasePointer(); - - for (size_t i = 0; i < numPixels(); ++i) - { - _sampleListPointers[i] = _sampleBuffer + sampleListPositions[i]; - - for (unsigned int j = 0; j < numSamples[i]; ++j) - _sampleListPointers[i][j] = T (0); - } -} - -template -void -TypedDeepImageChannel::resize () -{ - DeepImageChannel::resize(); - - delete [] _sampleListPointers; - _sampleListPointers = 0; - _sampleListPointers = new T * [numPixels()]; - initializeSampleLists(); -} - - -template -void -TypedDeepImageChannel::resetBasePointer () -{ - _base = _sampleListPointers - - level().dataWindow().min.y * pixelsPerRow() - - level().dataWindow().min.x; -} +#ifndef COMPILING_IMF_DEEP_IMAGE_CHANNEL +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedDeepImageChannel; +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedDeepImageChannel; +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedDeepImageChannel; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXRUtil/ImfDeepImageIO.h b/src/lib/OpenEXRUtil/ImfDeepImageIO.h index 5e3c9d5298..be3f8186ed 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageIO.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageIO.h @@ -13,9 +13,11 @@ // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include "ImfNamespace.h" + #include "ImfDeepImage.h" #include "ImfImageDataWindow.h" -#include "ImfUtilExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXRUtil/ImfDeepImageLevel.h b/src/lib/OpenEXRUtil/ImfDeepImageLevel.h index 685002596a..fcd1bde8cc 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageLevel.h +++ b/src/lib/OpenEXRUtil/ImfDeepImageLevel.h @@ -17,10 +17,12 @@ // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include "ImfNamespace.h" + #include "ImfDeepImageChannel.h" #include "ImfSampleCountChannel.h" #include "ImfImageLevel.h" -#include "ImfUtilExport.h" #include #include @@ -29,7 +31,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepImage; -class DeepImageLevel : public ImageLevel +class IMFUTIL_EXPORT_TYPE DeepImageLevel : public ImageLevel { public: @@ -126,46 +128,58 @@ class DeepImageLevel : public ImageLevel // The constructor and destructor are private. // Deep image levels exist only as part of a deep image. // - + IMF_HIDDEN DeepImageLevel (DeepImage& image, int xLevelNumber, int yLevelNumber, const IMATH_NAMESPACE::Box2i& dataWindow); + IMF_HIDDEN ~DeepImageLevel (); + IMF_HIDDEN void setSamplesToZero (size_t i, unsigned int oldNumSamples, unsigned int newNumSamples); + IMF_HIDDEN void moveSampleList (size_t i, unsigned int oldNumSamples, unsigned int newNumSamples, size_t newSampleListPosition); + IMF_HIDDEN void moveSamplesToNewBuffer (const unsigned int * oldNumSamples, const unsigned int * newNumSamples, const size_t * newSampleListPositions); + IMF_HIDDEN void initializeSampleLists (); + IMF_HIDDEN virtual void resize (const IMATH_NAMESPACE::Box2i& dataWindow); + IMF_HIDDEN virtual void shiftPixels (int dx, int dy); + IMF_HIDDEN virtual void insertChannel (const std::string& name, PixelType type, int xSampling, int ySampling, bool pLinear); + IMF_HIDDEN virtual void eraseChannel (const std::string& name); + IMF_HIDDEN virtual void clearChannels (); + IMF_HIDDEN virtual void renameChannel (const std::string &oldName, const std::string &newName); + IMF_HIDDEN virtual void renameChannels (const RenamingMap &oldToNewNames); ChannelMap _channels; @@ -173,7 +187,7 @@ class DeepImageLevel : public ImageLevel }; -class DeepImageLevel::Iterator +class IMFUTIL_EXPORT_TYPE DeepImageLevel::Iterator { public: @@ -211,7 +225,7 @@ class DeepImageLevel::Iterator }; -class DeepImageLevel::ConstIterator +class IMFUTIL_EXPORT_TYPE DeepImageLevel::ConstIterator { public: @@ -263,7 +277,7 @@ template TypedDeepImageChannel * DeepImageLevel::findTypedChannel (const std::string& name) { - return dynamic_cast_channel > (findChannel (name)); + return dynamic_cast *> (findChannel (name)); } @@ -271,7 +285,7 @@ template const TypedDeepImageChannel * DeepImageLevel::findTypedChannel (const std::string& name) const { - return dynamic_cast_channel > (findChannel (name)); + return dynamic_cast *> (findChannel (name)); } diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index d115c876b2..e300a394a6 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -82,7 +82,7 @@ class IMFUTIL_EXPORT_TYPE FlatImageChannel: public ImageChannel }; template -class TypedFlatImageChannel: public FlatImageChannel +class IMFUTIL_EXPORT_TEMPLATE_TYPE TypedFlatImageChannel: public FlatImageChannel { public: @@ -139,11 +139,13 @@ class TypedFlatImageChannel: public FlatImageChannel // image channels exist only as parts of a flat image level. // + IMF_HIDDEN TypedFlatImageChannel (FlatImageLevel &level, int xSampling, int ySampling, bool pLinear); + IMF_HIDDEN virtual ~TypedFlatImageChannel (); TypedFlatImageChannel (const TypedFlatImageChannel& other) = delete; @@ -151,8 +153,10 @@ class TypedFlatImageChannel: public FlatImageChannel TypedFlatImageChannel (TypedFlatImageChannel&& other) = delete; TypedFlatImageChannel& operator = (TypedFlatImageChannel&& other) = delete; + IMF_HIDDEN virtual void resize (); + IMF_HIDDEN virtual void resetBasePointer (); T * _pixels; // Pointer to allocated storage diff --git a/src/lib/OpenEXRUtil/ImfFlatImageLevel.h b/src/lib/OpenEXRUtil/ImfFlatImageLevel.h index f6df521e6c..f348ee988a 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageLevel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageLevel.h @@ -28,7 +28,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class FlatImage; -class FlatImageLevel : public ImageLevel +class IMFUTIL_EXPORT_TYPE FlatImageLevel : public ImageLevel { public: @@ -115,38 +115,46 @@ class FlatImageLevel : public ImageLevel // The constructor and destructor are private. // Image levels exist only as part of an image. // - + IMFUTIL_HIDDEN FlatImageLevel (FlatImage& image, int xLevelNumber, int yLevelNumber, const IMATH_NAMESPACE::Box2i& dataWindow); + IMFUTIL_HIDDEN virtual ~FlatImageLevel (); + IMFUTIL_HIDDEN virtual void resize (const IMATH_NAMESPACE::Box2i& dataWindow); + IMFUTIL_HIDDEN virtual void shiftPixels (int dx, int dy); + IMFUTIL_HIDDEN virtual void insertChannel (const std::string& name, PixelType type, int xSampling, int ySampling, bool pLinear); + IMFUTIL_HIDDEN virtual void eraseChannel (const std::string& name); + IMFUTIL_HIDDEN virtual void clearChannels (); + IMFUTIL_HIDDEN virtual void renameChannel (const std::string &oldName, const std::string &newName); + IMFUTIL_HIDDEN virtual void renameChannels (const RenamingMap &oldToNewNames); ChannelMap _channels; }; -class FlatImageLevel::Iterator +class IMFUTIL_EXPORT_TYPE FlatImageLevel::Iterator { public: @@ -184,7 +192,7 @@ class FlatImageLevel::Iterator }; -class FlatImageLevel::ConstIterator +class IMFUTIL_EXPORT_TYPE FlatImageLevel::ConstIterator { public: @@ -237,7 +245,7 @@ template TypedFlatImageChannel * FlatImageLevel::findTypedChannel (const std::string& name) { - return dynamic_cast_channel > (findChannel (name)); + return dynamic_cast *> (findChannel (name)); } @@ -245,7 +253,7 @@ template const TypedFlatImageChannel * FlatImageLevel::findTypedChannel (const std::string& name) const { - return dynamic_cast_channel > (findChannel (name)); + return dynamic_cast *> (findChannel (name)); } diff --git a/src/lib/OpenEXRUtil/ImfImage.h b/src/lib/OpenEXRUtil/ImfImage.h index 708eb36cac..efb0500ae7 100644 --- a/src/lib/OpenEXRUtil/ImfImage.h +++ b/src/lib/OpenEXRUtil/ImfImage.h @@ -63,10 +63,12 @@ // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include "ImfNamespace.h" + #include "ImfImageLevel.h" #include #include -#include "ImfUtilExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -318,11 +320,10 @@ class IMFUTIL_EXPORT_TYPE Image newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow) = 0; private: + IMFUTIL_HIDDEN bool levelNumberIsValid (int lx, int ly) const; + IMFUTIL_HIDDEN void clearLevels (); - IMFUTIL_EXPORT_LOCAL bool levelNumberIsValid (int lx, int ly) const; - IMFUTIL_EXPORT_LOCAL void clearLevels (); - - struct IMFUTIL_EXPORT_LOCAL ChannelInfo + struct IMFUTIL_HIDDEN ChannelInfo { ChannelInfo (PixelType type = HALF, int xSampling = 1, diff --git a/src/lib/OpenEXRUtil/ImfImageChannel.h b/src/lib/OpenEXRUtil/ImfImageChannel.h index 3d026f5d94..210503e41d 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfImageChannel.h @@ -98,8 +98,10 @@ class IMFUTIL_EXPORT_TYPE ImageChannel private: - ImageChannel (const ImageChannel &); // not implemented - ImageChannel & operator = (const ImageChannel &); // not implemented + ImageChannel (const ImageChannel &) = delete; + ImageChannel & operator = (const ImageChannel &) = delete; + ImageChannel (ImageChannel &&) = delete; + ImageChannel & operator = (ImageChannel &&) = delete; ImageLevel & _level; int _xSampling; @@ -110,49 +112,6 @@ class IMFUTIL_EXPORT_TYPE ImageChannel size_t _numPixels; }; -/// \addtogroup TypeConversion -/// -/// @{ - -/// similar to ImfAttribute, we may have type-erased image channels we use internally. -template -static U *dynamic_cast_channel (ImageChannel *a) -{ - if (!a) - return nullptr; - const auto &aid = typeid(*a); - const auto &uid = typeid(U); - // check the fast tests first before comparing names... - if (aid == uid || !strcmp(aid.name(), uid.name())) - { - return static_cast( a ); - } - return nullptr; -} -template -static const U *dynamic_cast_channel (const ImageChannel *a) -{ - return dynamic_cast_channel ( const_cast ( a ) ); -} -template -static U &dynamic_cast_channel (ImageChannel &a) -{ - U *ret = dynamic_cast_channel (&a); - if ( ! ret ) - throw IEX_NAMESPACE::TypeExc ("Mismatched image channel type."); - return *ret; -} -template -static const U &dynamic_cast_channel (const ImageChannel &a) -{ - const U *ret = dynamic_cast_channel (&a); - if ( ! ret ) - throw IEX_NAMESPACE::TypeExc ("Mismatched image channel type."); - return *ret; -} - -/// @} - OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT diff --git a/src/lib/OpenEXRUtil/ImfImageChannelRenaming.h b/src/lib/OpenEXRUtil/ImfImageChannelRenaming.h index ac1c5df14c..984092e620 100644 --- a/src/lib/OpenEXRUtil/ImfImageChannelRenaming.h +++ b/src/lib/OpenEXRUtil/ImfImageChannelRenaming.h @@ -30,17 +30,8 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef std::map RenamingMap; template -void -renameChannelsInMap (const RenamingMap oldToNewNames, ChannelMap &channels); - - -//----------------------------------------------------------------------------- -// Implementation -//----------------------------------------------------------------------------- - -template -void -renameChannelsInMap (const RenamingMap oldToNewNames, ChannelMap &channels) +inline void +renameChannelsInMap (const RenamingMap &oldToNewNames, ChannelMap &channels) { ChannelMap renamedChannels; diff --git a/src/lib/OpenEXRUtil/ImfImageDataWindow.h b/src/lib/OpenEXRUtil/ImfImageDataWindow.h index 914b5de64d..08a3fc41ba 100644 --- a/src/lib/OpenEXRUtil/ImfImageDataWindow.h +++ b/src/lib/OpenEXRUtil/ImfImageDataWindow.h @@ -20,7 +20,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER -enum DataWindowSource +enum IMFUTIL_EXPORT_ENUM DataWindowSource { USE_IMAGE_DATA_WINDOW, USE_HEADER_DATA_WINDOW diff --git a/src/lib/OpenEXRUtil/ImfImageIO.h b/src/lib/OpenEXRUtil/ImfImageIO.h index 825d39accb..6f9e947f5a 100644 --- a/src/lib/OpenEXRUtil/ImfImageIO.h +++ b/src/lib/OpenEXRUtil/ImfImageIO.h @@ -13,9 +13,10 @@ // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" + #include "ImfImage.h" #include "ImfImageDataWindow.h" -#include "ImfUtilExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER diff --git a/src/lib/OpenEXRUtil/ImfImageLevel.h b/src/lib/OpenEXRUtil/ImfImageLevel.h index b6b8f9d713..4c3f029960 100644 --- a/src/lib/OpenEXRUtil/ImfImageLevel.h +++ b/src/lib/OpenEXRUtil/ImfImageLevel.h @@ -26,7 +26,7 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Image; -class ImageLevel +class IMFUTIL_EXPORT_TYPE ImageLevel { public: diff --git a/src/lib/OpenEXRUtil/ImfSampleCountChannel.h b/src/lib/OpenEXRUtil/ImfSampleCountChannel.h index a4ea023e0f..f0f1ca9165 100644 --- a/src/lib/OpenEXRUtil/ImfSampleCountChannel.h +++ b/src/lib/OpenEXRUtil/ImfSampleCountChannel.h @@ -15,8 +15,8 @@ // //---------------------------------------------------------------------------- -#include "ImfImageChannel.h" #include "ImfUtilExport.h" +#include "ImfImageChannel.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER @@ -38,7 +38,7 @@ class DeepImageLevel; // x % c.xSampling() != 0 or y % c.ySampling() != 0, // -class SampleCountChannel : public ImageChannel +class IMFUTIL_EXPORT_TYPE SampleCountChannel : public ImageChannel { public: diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 3101de697f..41b9ab10c0 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -8,24 +8,49 @@ #if defined(OPENEXR_DLL) # if defined(OPENEXRUTIL_EXPORTS) # define IMFUTIL_EXPORT __declspec(dllexport) -# define IMFUTIL_EXPORT_CONST extern __declspec(dllexport) +# if defined(__MINGW32__) +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +# define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT +# else +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT +# endif # else # define IMFUTIL_EXPORT __declspec(dllimport) -# define IMFUTIL_EXPORT_CONST extern __declspec(dllimport) +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT # endif -# define IMFUTIL_EXPORT_TYPE -# define IMFUTIL_EXPORT_LOCAL #else # ifndef _MSC_VER -# define IMFUTIL_EXPORT __attribute__ ((visibility ("default"))) -# define IMFUTIL_EXPORT_CONST extern const __attribute__ ((visibility ("default"))) -# define IMFUTIL_EXPORT_TYPE __attribute__ ((visibility ("default"))) -# define IMFUTIL_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) +# define IMFUTIL_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IMFUTIL_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) +//# define IMFUTIL_EXPORT_TEMPLATE_DATA __attribute__ ((__visibility__ ("default"))) +# define IMFUTIL_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +# if __has_attribute(__type_visibility__) +# define IMFUTIL_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) +# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE __attribute__ ((__visibility__ ("default"))) +# else +# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__visibility__ ("default"))) +# endif # else # define IMFUTIL_EXPORT -# define IMFUTIL_EXPORT_CONST extern -# define IMFUTIL_EXPORT_TYPE -# define IMFUTIL_EXPORT_LOCAL # endif #endif +#ifndef IMFUTIL_EXPORT_TYPE +# define IMFUTIL_EXPORT_TYPE +#endif +#ifndef IMFUTIL_EXPORT_TEMPLATE_TYPE +# define IMFUTIL_EXPORT_TEMPLATE_TYPE +#endif +#ifndef IMFUTIL_EXPORT_EXTERN_TEMPLATE +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE +#endif +#ifndef IMFUTIL_EXPORT_TEMPLATE_INSTANCE +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE +#endif +#ifndef IMFUTIL_EXPORT_ENUM +# define IMFUTIL_EXPORT_ENUM +#endif +#ifndef IMFUTIL_HIDDEN +# define IMFUTIL_HIDDEN +#endif /// @} diff --git a/src/test/OpenEXRTest/TestUtilFStream.h b/src/test/OpenEXRTest/TestUtilFStream.h index 06b08597c4..2cb7a1f077 100644 --- a/src/test/OpenEXRTest/TestUtilFStream.h +++ b/src/test/OpenEXRTest/TestUtilFStream.h @@ -10,7 +10,9 @@ #include #ifdef _WIN32 -# define NOMINMAX +# ifndef NOMINMAX +# define NOMINMAX +# endif # define VC_EXTRALEAN # include # include diff --git a/src/test/OpenEXRTest/testAttributes.cpp b/src/test/OpenEXRTest/testAttributes.cpp index 5879374999..42f48c1fbd 100644 --- a/src/test/OpenEXRTest/testAttributes.cpp +++ b/src/test/OpenEXRTest/testAttributes.cpp @@ -3,16 +3,14 @@ // Copyright (c) Contributors to the OpenEXR Project. // -#ifdef NDEBUG -# undef NDEBUG -#endif - #include #include #include #include #include +#include +#include #include #include @@ -34,9 +32,13 @@ #include #include +#ifdef NDEBUG +# undef NDEBUG +#endif #include + namespace IMF = OPENEXR_IMF_NAMESPACE; using namespace IMF; @@ -290,7 +292,7 @@ writeReadAttr (const Array2D &pf1, // const Attribute& a = hdr["a24"]; - const OpaqueAttribute* oa = dynamic_cast_attr (&a); + const OpaqueAttribute* oa = dynamic_cast (&a); assert (oa); assert (!strcmp (a.typeName(), "testOpaque")); diff --git a/src/test/OpenEXRTest/testBadTypeAttributes.cpp b/src/test/OpenEXRTest/testBadTypeAttributes.cpp index 40c384e518..cc73b73397 100644 --- a/src/test/OpenEXRTest/testBadTypeAttributes.cpp +++ b/src/test/OpenEXRTest/testBadTypeAttributes.cpp @@ -9,14 +9,19 @@ #include "ImfInputFile.h" #include "ImfInputPart.h" +#include "ImfOutputFile.h" #include "ImfTiledInputFile.h" #include "ImfTiledInputPart.h" +#include "ImfTiledOutputFile.h" #include "ImfDeepScanLineInputFile.h" #include "ImfDeepScanLineInputPart.h" #include "ImfDeepTiledInputFile.h" #include "ImfDeepTiledInputPart.h" +#include "ImfDeepScanLineOutputFile.h" +#include "ImfDeepTiledOutputFile.h" + #include "ImfChannelList.h" #include "ImfMultiPartInputFile.h" #include "ImfPartType.h" diff --git a/src/test/OpenEXRTest/testChannels.cpp b/src/test/OpenEXRTest/testChannels.cpp index 1c50df62c0..19c20b9b5f 100644 --- a/src/test/OpenEXRTest/testChannels.cpp +++ b/src/test/OpenEXRTest/testChannels.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "half.h" #include diff --git a/src/test/OpenEXRTest/testCompression.cpp b/src/test/OpenEXRTest/testCompression.cpp index f00a4e227b..6c261a4859 100644 --- a/src/test/OpenEXRTest/testCompression.cpp +++ b/src/test/OpenEXRTest/testCompression.cpp @@ -12,8 +12,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testConversion.cpp b/src/test/OpenEXRTest/testConversion.cpp index 909460587a..e778706ccf 100644 --- a/src/test/OpenEXRTest/testConversion.cpp +++ b/src/test/OpenEXRTest/testConversion.cpp @@ -11,8 +11,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include #include "compareFloat.h" diff --git a/src/test/OpenEXRTest/testCopyDeepTiled.cpp b/src/test/OpenEXRTest/testCopyDeepTiled.cpp index dd1f64d30e..b5627bedc0 100644 --- a/src/test/OpenEXRTest/testCopyDeepTiled.cpp +++ b/src/test/OpenEXRTest/testCopyDeepTiled.cpp @@ -16,10 +16,12 @@ #include #include -#include + #include +#include +#include +#include #include -#include #include #include diff --git a/src/test/OpenEXRTest/testCopyMultiPartFile.cpp b/src/test/OpenEXRTest/testCopyMultiPartFile.cpp index 8ff43e3799..e7ecd3a801 100644 --- a/src/test/OpenEXRTest/testCopyMultiPartFile.cpp +++ b/src/test/OpenEXRTest/testCopyMultiPartFile.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testCopyPixels.cpp b/src/test/OpenEXRTest/testCopyPixels.cpp index aea4a81f1d..1de735177a 100644 --- a/src/test/OpenEXRTest/testCopyPixels.cpp +++ b/src/test/OpenEXRTest/testCopyPixels.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include diff --git a/src/test/OpenEXRTest/testCustomAttributes.cpp b/src/test/OpenEXRTest/testCustomAttributes.cpp index b6c4f062a3..bb75cbedba 100644 --- a/src/test/OpenEXRTest/testCustomAttributes.cpp +++ b/src/test/OpenEXRTest/testCustomAttributes.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testDeepTiledBasic.cpp b/src/test/OpenEXRTest/testDeepTiledBasic.cpp index 450b1a56e9..8d5b914a32 100644 --- a/src/test/OpenEXRTest/testDeepTiledBasic.cpp +++ b/src/test/OpenEXRTest/testDeepTiledBasic.cpp @@ -15,8 +15,11 @@ #include #include -#include + #include +#include +#include +#include #include #include diff --git a/src/test/OpenEXRTest/testFutureProofing.cpp b/src/test/OpenEXRTest/testFutureProofing.cpp index 80be6adee1..a7c901850a 100644 --- a/src/test/OpenEXRTest/testFutureProofing.cpp +++ b/src/test/OpenEXRTest/testFutureProofing.cpp @@ -25,14 +25,20 @@ #include #include #include +#include +#include #include +#include #include #include +#include #include #include #include +#include #include #include +#include #include #include diff --git a/src/test/OpenEXRTest/testIDManifest.cpp b/src/test/OpenEXRTest/testIDManifest.cpp index 578efa732c..73aa955bb8 100644 --- a/src/test/OpenEXRTest/testIDManifest.cpp +++ b/src/test/OpenEXRTest/testIDManifest.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testInputPart.cpp b/src/test/OpenEXRTest/testInputPart.cpp index bb3a7cf1db..ad255c4901 100644 --- a/src/test/OpenEXRTest/testInputPart.cpp +++ b/src/test/OpenEXRTest/testInputPart.cpp @@ -23,7 +23,10 @@ #include #include #include +#include +#include #include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testLargeDataWindowOffsets.cpp b/src/test/OpenEXRTest/testLargeDataWindowOffsets.cpp index af42efc622..0b32c3b0a4 100644 --- a/src/test/OpenEXRTest/testLargeDataWindowOffsets.cpp +++ b/src/test/OpenEXRTest/testLargeDataWindowOffsets.cpp @@ -9,6 +9,8 @@ #include "ImfChannelList.h" #include "ImfOutputFile.h" #include "ImfCompression.h" +#include "ImfFrameBuffer.h" +#include "ImfHeader.h" #include "ImfStandardAttributes.h" #include #include diff --git a/src/test/OpenEXRTest/testLineOrder.cpp b/src/test/OpenEXRTest/testLineOrder.cpp index bf807333d2..40a5fc4054 100644 --- a/src/test/OpenEXRTest/testLineOrder.cpp +++ b/src/test/OpenEXRTest/testLineOrder.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include "IlmThread.h" #include "half.h" diff --git a/src/test/OpenEXRTest/testMultiPartApi.cpp b/src/test/OpenEXRTest/testMultiPartApi.cpp index 6cd9d0b837..0f79a78596 100644 --- a/src/test/OpenEXRTest/testMultiPartApi.cpp +++ b/src/test/OpenEXRTest/testMultiPartApi.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testMultiPartFileMixingBasic.cpp b/src/test/OpenEXRTest/testMultiPartFileMixingBasic.cpp index c092b57cac..25433e624e 100644 --- a/src/test/OpenEXRTest/testMultiPartFileMixingBasic.cpp +++ b/src/test/OpenEXRTest/testMultiPartFileMixingBasic.cpp @@ -25,13 +25,21 @@ #include #include #include +#include +#include #include +#include #include #include +#include #include +#include #include +#include #include +#include #include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp index 90d5441192..25a07d941f 100644 --- a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp +++ b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -300,7 +303,7 @@ void testDiskAttrValue (const Header & diskHeader, const T & testAttribute) { const string & attrName = testAttribute.typeName(); - const T & diskAttr = dynamic_cast_attr (diskHeader[attrName]); + const T & diskAttr = dynamic_cast (diskHeader[attrName]); if (diskAttr.value() != testAttribute.value()) { throw IEX_NAMESPACE::InputExc ("incorrect value from disk"); @@ -392,7 +395,9 @@ testHeaders (const std::string & fn) ia.push_back(ta); headers[i].insert(IntAttribute::staticTypeName(), ta); } - + vector ifa; + ifa.push_back( FloatAttribute( 3.14f ) ); + headers[0].insert(FloatAttribute::staticTypeName(), ifa.back()); // write out the file remove(fn.c_str()); diff --git a/src/test/OpenEXRTest/testMultiPartThreading.cpp b/src/test/OpenEXRTest/testMultiPartThreading.cpp index eeade82a78..2abe557ef7 100644 --- a/src/test/OpenEXRTest/testMultiPartThreading.cpp +++ b/src/test/OpenEXRTest/testMultiPartThreading.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testMultiScanlinePartThreading.cpp b/src/test/OpenEXRTest/testMultiScanlinePartThreading.cpp index 46820c4e8e..79329d4fbc 100644 --- a/src/test/OpenEXRTest/testMultiScanlinePartThreading.cpp +++ b/src/test/OpenEXRTest/testMultiScanlinePartThreading.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testMultiTiledPartThreading.cpp b/src/test/OpenEXRTest/testMultiTiledPartThreading.cpp index 13c4befd06..8b3c3ca08a 100644 --- a/src/test/OpenEXRTest/testMultiTiledPartThreading.cpp +++ b/src/test/OpenEXRTest/testMultiTiledPartThreading.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testOptimized.cpp b/src/test/OpenEXRTest/testOptimized.cpp index af9fe2c4f6..1187c421b3 100644 --- a/src/test/OpenEXRTest/testOptimized.cpp +++ b/src/test/OpenEXRTest/testOptimized.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include "half.h" diff --git a/src/test/OpenEXRTest/testOptimizedInterleavePatterns.cpp b/src/test/OpenEXRTest/testOptimizedInterleavePatterns.cpp index 9420cbca12..b1e92cabc4 100644 --- a/src/test/OpenEXRTest/testOptimizedInterleavePatterns.cpp +++ b/src/test/OpenEXRTest/testOptimizedInterleavePatterns.cpp @@ -13,6 +13,7 @@ #include "ImfChannelList.h" #include "ImfOutputFile.h" #include "ImfCompression.h" +#include "ImfFrameBuffer.h" #include "ImfStandardAttributes.h" #include #include diff --git a/src/test/OpenEXRTest/testTiledCompression.cpp b/src/test/OpenEXRTest/testTiledCompression.cpp index aef053fa7f..297197f51b 100644 --- a/src/test/OpenEXRTest/testTiledCompression.cpp +++ b/src/test/OpenEXRTest/testTiledCompression.cpp @@ -14,8 +14,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testTiledCopyPixels.cpp b/src/test/OpenEXRTest/testTiledCopyPixels.cpp index c5b83fc9e6..9de5e1fcea 100644 --- a/src/test/OpenEXRTest/testTiledCopyPixels.cpp +++ b/src/test/OpenEXRTest/testTiledCopyPixels.cpp @@ -10,8 +10,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include diff --git a/src/test/OpenEXRTest/testTiledLineOrder.cpp b/src/test/OpenEXRTest/testTiledLineOrder.cpp index 8e331ce1a2..e345238e46 100644 --- a/src/test/OpenEXRTest/testTiledLineOrder.cpp +++ b/src/test/OpenEXRTest/testTiledLineOrder.cpp @@ -11,8 +11,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include #include diff --git a/src/test/OpenEXRTest/testTiledRgba.cpp b/src/test/OpenEXRTest/testTiledRgba.cpp index 0e39214ec6..c0b9710282 100644 --- a/src/test/OpenEXRTest/testTiledRgba.cpp +++ b/src/test/OpenEXRTest/testTiledRgba.cpp @@ -13,8 +13,9 @@ #include #include #include -#include #include +#include +#include #include #include #include diff --git a/src/test/OpenEXRUtilTest/testDeepImage.cpp b/src/test/OpenEXRUtilTest/testDeepImage.cpp index 26fbda9e5b..7b1d42df64 100644 --- a/src/test/OpenEXRUtilTest/testDeepImage.cpp +++ b/src/test/OpenEXRUtilTest/testDeepImage.cpp @@ -34,10 +34,10 @@ verifyPixelsAreEqual int dy) { const TypedDeepImageChannel &tc1 = - dynamic_cast_channel > (c1); + dynamic_cast &> (c1); const TypedDeepImageChannel &tc2 = - dynamic_cast_channel > (c2); + dynamic_cast &> (c2); const Box2i &dataWindow = c1.level().dataWindow(); const SampleCountChannel &scc1 = c1.deepLevel().sampleCounts(); @@ -221,7 +221,7 @@ fillChannel (Rand48 &random, DeepImageChannel &c) // TypedDeepImageChannel &tc = - dynamic_cast_channel > (c); + dynamic_cast &> (c); const Box2i &dataWindow = tc.level().dataWindow(); const SampleCountChannel &scc = c.deepLevel().sampleCounts(); diff --git a/src/test/OpenEXRUtilTest/testFlatImage.cpp b/src/test/OpenEXRUtilTest/testFlatImage.cpp index 7f87ed881d..4710bad3db 100644 --- a/src/test/OpenEXRUtilTest/testFlatImage.cpp +++ b/src/test/OpenEXRUtilTest/testFlatImage.cpp @@ -34,10 +34,10 @@ verifyPixelsAreEqual int dy) { const TypedFlatImageChannel &tc1 = - dynamic_cast_channel > (c1); + dynamic_cast &> (c1); const TypedFlatImageChannel &tc2 = - dynamic_cast_channel > (c2); + dynamic_cast &> (c2); const Box2i &dataWindow = c1.level().dataWindow(); int xStep = c1.xSampling(); @@ -192,7 +192,7 @@ fillChannel (Rand48 &random, FlatImageChannel &c) // TypedFlatImageChannel &tc = - dynamic_cast_channel > (c); + dynamic_cast &> (c); const Box2i &dataWindow = tc.level().dataWindow(); int xStep = tc.xSampling(); From 707768909fd45c00564fedc9ad1aa60921637826 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 14:07:37 +1300 Subject: [PATCH 17/23] Remove extraneous exports unneeded for template type Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfAttribute.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/lib/OpenEXR/ImfAttribute.h b/src/lib/OpenEXR/ImfAttribute.h index 8ec4c26f25..4162fcd25e 100644 --- a/src/lib/OpenEXR/ImfAttribute.h +++ b/src/lib/OpenEXR/ImfAttribute.h @@ -111,21 +111,16 @@ class IMF_EXPORT_TEMPLATE_TYPE TypedAttribute: public Attribute // that the type T is copyable/assignable/moveable. //------------------------------------------------------------ - IMF_EXPORT TypedAttribute () = default; TypedAttribute (const T &value); - IMF_EXPORT TypedAttribute (const TypedAttribute &other) = default; - IMF_EXPORT TypedAttribute (TypedAttribute &&other) = default; //NB: if we use a default destructor, it wreaks havoc with where the vtable and such end up //at least under mingw+windows, and since we are providing extern template instantiations //this will be pretty trim and should reduce code bloat virtual ~TypedAttribute (); - IMF_EXPORT TypedAttribute& operator = (const TypedAttribute& other) = default; - IMF_EXPORT TypedAttribute& operator = (TypedAttribute&& other) = default; //-------------------------------- From dbc0232c1e7fea70113c94de22c3c7954c955638 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 14:16:05 +1300 Subject: [PATCH 18/23] Ensure the types from Imath we are re-exporting are exported in the way we need Signed-off-by: Kimball Thurston --- src/lib/OpenEXR/ImfBoxAttribute.cpp | 10 ++++++++++ src/lib/OpenEXR/ImfBoxAttribute.h | 6 +++--- src/lib/OpenEXR/ImfMatrixAttribute.cpp | 8 ++++++++ src/lib/OpenEXR/ImfVecAttribute.cpp | 8 ++++++++ src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp | 7 +++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/lib/OpenEXR/ImfBoxAttribute.cpp b/src/lib/OpenEXR/ImfBoxAttribute.cpp index cec12a971a..9f48e1bf68 100644 --- a/src/lib/OpenEXR/ImfBoxAttribute.cpp +++ b/src/lib/OpenEXR/ImfBoxAttribute.cpp @@ -10,6 +10,16 @@ // class Box2fAttribute // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include +#include + +IMATH_INTERNAL_NAMESPACE_HEADER_ENTER +template class IMF_EXPORT_TEMPLATE_TYPE Vec2; +template class IMF_EXPORT_TEMPLATE_TYPE Vec3; +template class IMF_EXPORT_TEMPLATE_TYPE Box; +IMATH_INTERNAL_NAMESPACE_HEADER_EXIT + #define COMPILING_IMF_BOX_ATTRIBUTE #include diff --git a/src/lib/OpenEXR/ImfBoxAttribute.h b/src/lib/OpenEXR/ImfBoxAttribute.h index b1d63d58fa..9df7909256 100644 --- a/src/lib/OpenEXR/ImfBoxAttribute.h +++ b/src/lib/OpenEXR/ImfBoxAttribute.h @@ -14,12 +14,12 @@ // //----------------------------------------------------------------------------- -#include "ImfForward.h" #include "ImfExport.h" -#include "ImfAttribute.h" -#include "ImathBox.h" #include "ImfNamespace.h" +#include "ImfAttribute.h" +#include + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using Box2iAttribute = TypedAttribute; diff --git a/src/lib/OpenEXR/ImfMatrixAttribute.cpp b/src/lib/OpenEXR/ImfMatrixAttribute.cpp index bf5f958975..bf400671eb 100644 --- a/src/lib/OpenEXR/ImfMatrixAttribute.cpp +++ b/src/lib/OpenEXR/ImfMatrixAttribute.cpp @@ -12,6 +12,14 @@ // class M44dAttribute // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include +#include + +IMATH_INTERNAL_NAMESPACE_HEADER_ENTER +template class IMF_EXPORT_TEMPLATE_TYPE Matrix33; +template class IMF_EXPORT_TEMPLATE_TYPE Matrix44; +IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #define COMPILING_IMF_MATRIX_ATTRIBUTE diff --git a/src/lib/OpenEXR/ImfVecAttribute.cpp b/src/lib/OpenEXR/ImfVecAttribute.cpp index 5049d6a73c..1ac3b610c7 100644 --- a/src/lib/OpenEXR/ImfVecAttribute.cpp +++ b/src/lib/OpenEXR/ImfVecAttribute.cpp @@ -14,6 +14,14 @@ // class V3dAttribute // //----------------------------------------------------------------------------- +#include "ImfExport.h" +#include +#include + +IMATH_INTERNAL_NAMESPACE_HEADER_ENTER +template class IMF_EXPORT_TEMPLATE_TYPE Vec2; +template class IMF_EXPORT_TEMPLATE_TYPE Vec3; +IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #define COMPILING_IMF_VECTOR_ATTRIBUTE #include "ImfVecAttribute.h" diff --git a/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp b/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp index 6c0acd9040..ae4ba36117 100644 --- a/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp +++ b/src/lib/OpenEXRUtil/ImfDeepImageChannel.cpp @@ -8,6 +8,13 @@ // class DeepImageChannel // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include +#include + +IMATH_INTERNAL_NAMESPACE_HEADER_ENTER +class IMFUTIL_EXPORT_TYPE half; +IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #define COMPILING_IMF_DEEP_IMAGE_CHANNEL From 1174e223ade7d2001686be579a2fd3308c5ac57f Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 16:11:42 +1300 Subject: [PATCH 19/23] Add some documentation to the export files, option to control Also add missing include guards, fix up documentation after findings Signed-off-by: Kimball Thurston --- cmake/LibraryDefine.cmake | 12 +++-- cmake/OpenEXRSetup.cmake | 2 + docs/SymbolVisibility.md | 2 +- src/lib/Iex/IexExport.h | 56 ++++++++++++------- src/lib/OpenEXR/ImfExport.h | 84 +++++++++++++++++++---------- src/lib/OpenEXRUtil/ImfUtilExport.h | 82 +++++++++++++++++++--------- 6 files changed, 163 insertions(+), 75 deletions(-) diff --git a/cmake/LibraryDefine.cmake b/cmake/LibraryDefine.cmake index 14ca5933c0..6409742919 100644 --- a/cmake/LibraryDefine.cmake +++ b/cmake/LibraryDefine.cmake @@ -39,10 +39,16 @@ function(OPENEXR_DEFINE_LIBRARY libname) CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON - C_VISIBILITY_PRESET hidden - CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN ON ) + if (NOT OPENEXR_USE_DEFAULT_VISIBILITY) + set_target_properties(${objlib} PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + ) + else() + target_compile_definitions(${objlib} PUBLIC OPENEXR_USE_DEFAULT_VISIBILITY) + endif() if (_openexr_extra_flags) target_compile_options(${objlib} PUBLIC ${_openexr_extra_flags}) endif() diff --git a/cmake/OpenEXRSetup.cmake b/cmake/OpenEXRSetup.cmake index 40c4f1dc77..4648b175a2 100644 --- a/cmake/OpenEXRSetup.cmake +++ b/cmake/OpenEXRSetup.cmake @@ -46,6 +46,8 @@ endif() # are still used, just processed immediately option(OPENEXR_ENABLE_THREADING "Enables threaded processing of requests" ON) +option(OPENEXR_USE_DEFAULT_VISIBILITY "Makes the compile use default visibility (by default compiles tidy, hidden-by-default)" OFF) + # This is primarily for the auto array that enables a stack # object (if you enable this) that contains member to avoid double allocations option(OPENEXR_ENABLE_LARGE_STACK "Enables code to take advantage of large stack support" OFF) diff --git a/docs/SymbolVisibility.md b/docs/SymbolVisibility.md index f29ea20c14..41c9207bbd 100644 --- a/docs/SymbolVisibility.md +++ b/docs/SymbolVisibility.md @@ -66,7 +66,7 @@ allow that to happen. | class(typeinfo) | N/A | N/A | visibility("default") | visibility("default") | | template class | N/A | N/A | visibility("default") | type_visibility("default") | | template data | N/A | N/A | visibility("default") | visibility("default") | -| class template
instantiation | dllexport/dllimport | N/A | N/A | N/A | +| class template
instantiation | dllexport/dllimport | N/A | N/A | visibility("default") | | enum | N/A | N/A | auto unhides (N/A) | type_visibility("default") | | extern template | N/A | dllexport/dllimport | visibility("default") | visibility("default") | diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index c9af965b92..b984aea6e5 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -3,42 +3,62 @@ // Copyright (c) Contributors to the OpenEXR Project. // -#ifndef IEXEXPORT_H -#define IEXEXPORT_H +#ifndef INCLUDED_IEXEXPORT_H +#define INCLUDED_IEXEXPORT_H /// \defgroup ExportMacros Macros to manage symbol visibility /// -/// See docs/SymbolVisibility.md for more discussion +/// See docs/SymbolVisibility.md for more discussion about the +/// motivation for these macros /// /// Iex is simple and does not need to do more than expose class types /// and functions, and does not have any private members to hide +/// +/// Imf and ImfUtil have much more logic and have to deal with +/// templates and template instantiation. /// /// @{ + #if defined(OPENEXR_DLL) -# if defined(IEX_EXPORTS) -# define IEX_EXPORT __declspec(dllexport) -# else -# define IEX_EXPORT __declspec(dllimport) -# endif -# define IEX_EXPORT_TYPE -#else -# ifndef _MSC_VER -# define IEX_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IEX_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) + +// when building as a DLL for windows, typical dllexport / import case + +# if defined(IEX_EXPORTS) +# define IEX_EXPORT __declspec(dllexport) +# else +# define IEX_EXPORT __declspec(dllimport) +# endif + +#else // OPENEXR_DLL + +// need to avoid the case when compiling a static lib under MSVC (not +// a dll, not a compiler that has visibility attributes) +# ifndef _MSC_VER + +// did the user turn off visibility management +# ifdef OPENEXR_USE_DEFAULT_VISIBILITY +# define IEX_EXPORT # else -# define IEX_EXPORT -# define IEX_EXPORT_TYPE + // we actually want to control visibility +# define IEX_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IEX_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) # endif +# else +# define IEX_EXPORT +# endif + #endif +// Provide defaults so we don't have to replicate lines as much + #ifndef IEX_EXPORT_TYPE -# define IEX_EXPORT_TYPE +# define IEX_EXPORT_TYPE #endif #ifndef IEX_EXPORT_ENUM -# define IEX_EXPORT_ENUM +# define IEX_EXPORT_ENUM #endif /// @} -#endif // #ifndef IEXEXPORT_H +#endif // #ifndef INCLUDED_IEXEXPORT_H diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index 2405eff90e..e6d7a63179 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -3,41 +3,67 @@ // Copyright (c) Contributors to the OpenEXR Project. // +#ifndef INCLUDED_IMFEXPORT_H +#define INCLUDED_IMFEXPORT_H + /// \addtogroup ExportMacros /// @{ + +// are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) -# if defined(OPENEXR_EXPORTS) -# define IMF_EXPORT __declspec(dllexport) -# if defined(__MINGW32__) -# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT -# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT -# else -# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT -# endif + +# if defined(OPENEXR_EXPORTS) +# define IMF_EXPORT __declspec(dllexport) + +# if defined(__MINGW32__) +// mingw needs the export when the extern is defined +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +// for mingw windows, we need to cause this to export the typeinfo +// tables (but you don't need to have the complementary import, +// because might be a local template too) +# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT # else -# define IMF_EXPORT __declspec(dllimport) -//# if defined(__MINGW32__) -//# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT -//# endif -# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +// for normal msvc, need to export the actual instantiation in the cpp code +# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT # endif -#else -# ifndef _MSC_VER -# define IMF_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IMF_EXPORT_TYPE IMF_EXPORT -# define IMF_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -# if __has_attribute(__type_visibility__) -# define IMF_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) -# define IMF_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) -# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT -# else -# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT -# endif -# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT + # else -# define IMF_EXPORT +# define IMF_EXPORT __declspec(dllimport) +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT # endif -#endif + +#else // OPENEXR_DLL + +// need to avoid the case when compiling a static lib under MSVC (not +// a dll, not a compiler that has visibility attributes) +# ifndef _MSC_VER +# ifdef OPENEXR_USE_DEFAULT_VISIBILITY +# define IMF_EXPORT +# else +# define IMF_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IMF_EXPORT_TYPE IMF_EXPORT +# define IMF_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +// clang needs type visibility for enum and template, and the instantiation +// gcc does not have the type_visibility attribute, but if it ever adds it, +// the behavior should be the same +# if __has_attribute(__type_visibility__) +# define IMF_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) +# define IMF_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) +# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT +# else +# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT +# endif +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +# endif // OPENEXR_USE_DEFAULT_VISIBILITY + +# else // _MSC_VER +# define IMF_EXPORT +# endif + +#endif // OPENEXR_DLL + +// Provide defaults so we don't have to replicate lines as much + #ifndef IMF_EXPORT_TYPE # define IMF_EXPORT_TYPE #endif @@ -58,3 +84,5 @@ #endif /// @} + +#endif // INCLUDED_IMFEXPORT_H diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 41b9ab10c0..9f42f1aa71 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -3,38 +3,67 @@ // Copyright (c) Contributors to the OpenEXR Project. // +#ifndef INCLUDED_IMFUTILEXPORT_H +#define INCLUDED_IMFUTILEXPORT_H + /// \addtogroup ExportMacros /// @{ + +// are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) -# if defined(OPENEXRUTIL_EXPORTS) -# define IMFUTIL_EXPORT __declspec(dllexport) -# if defined(__MINGW32__) -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT -# define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT -# else -# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT -# endif + +# if defined(OPENEXR_EXPORTS) +# define IMFUTIL_EXPORT __declspec(dllexport) + +# if defined(__MINGW32__) +// mingw needs the export when the extern is defined +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +// for mingw windows, we need to cause this to export the typeinfo +// tables (but you don't need to have the complementary import, +// because might be a local template too) +# define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT # else -# define IMFUTIL_EXPORT __declspec(dllimport) -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +// for normal msvc, need to export the actual instantiation in the cpp code +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT # endif -#else -# ifndef _MSC_VER -# define IMFUTIL_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IMFUTIL_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) -//# define IMFUTIL_EXPORT_TEMPLATE_DATA __attribute__ ((__visibility__ ("default"))) -# define IMFUTIL_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -# if __has_attribute(__type_visibility__) -# define IMFUTIL_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) -# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE __attribute__ ((__visibility__ ("default"))) -# else -# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__visibility__ ("default"))) -# endif + # else -# define IMFUTIL_EXPORT +# define IMFUTIL_EXPORT __declspec(dllimport) +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT # endif -#endif + +#else // OPENEXR_DLL + +// need to avoid the case when compiling a static lib under MSVC (not +// a dll, not a compiler that has visibility attributes) +# ifndef _MSC_VER +# ifdef OPENEXR_USE_DEFAULT_VISIBILITY +# define IMFUTIL_EXPORT +# else +# define IMFUTIL_EXPORT __attribute__ ((__visibility__ ("default"))) +# define IMFUTIL_EXPORT_TYPE IMFUTIL_EXPORT +# define IMFUTIL_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +// clang needs type visibility for enum and template, and the instantiation +// gcc does not have the type_visibility attribute, but if it ever adds it, +// the behavior should be the same +# if __has_attribute(__type_visibility__) +# define IMFUTIL_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) +# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT +# else +# define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT +# endif +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +# endif // OPENEXR_USE_DEFAULT_VISIBILITY + +# else // _MSC_VER +# define IMFUTIL_EXPORT +# endif + +#endif // OPENEXR_DLL + +// Provide defaults so we don't have to replicate lines as much + #ifndef IMFUTIL_EXPORT_TYPE # define IMFUTIL_EXPORT_TYPE #endif @@ -53,4 +82,7 @@ #ifndef IMFUTIL_HIDDEN # define IMFUTIL_HIDDEN #endif + /// @} + +#endif // INCLUDED_IMFUTILEXPORT_H From 879513ff1e3b0947268db001e0aa083a0ef609e9 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 16:23:41 +1300 Subject: [PATCH 20/23] Fix typo introduced during documentation / cleanup pass Signed-off-by: Kimball Thurston --- src/lib/OpenEXRUtil/ImfUtilExport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 9f42f1aa71..b23a8b1150 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -12,7 +12,7 @@ // are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) -# if defined(OPENEXR_EXPORTS) +# if defined(OPENEXRUTIL_EXPORTS) # define IMFUTIL_EXPORT __declspec(dllexport) # if defined(__MINGW32__) From 6cf6719ba03003b4a9c609690a07b1dcc85ed6a5 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 14 Mar 2021 17:16:14 +1300 Subject: [PATCH 21/23] Fix flat image to use same mechanism for extern template instantiation as Deep Signed-off-by: Kimball Thurston --- src/lib/OpenEXRUtil/ImfFlatImageChannel.cpp | 104 ++++++++++++++++++++ src/lib/OpenEXRUtil/ImfFlatImageChannel.h | 97 ++---------------- 2 files changed, 113 insertions(+), 88 deletions(-) diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.cpp b/src/lib/OpenEXRUtil/ImfFlatImageChannel.cpp index 34bb202b63..c5d3f09579 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.cpp +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.cpp @@ -8,6 +8,15 @@ // class FlatImageChannel // //---------------------------------------------------------------------------- +#include "ImfUtilExport.h" +#include +#include + +IMATH_INTERNAL_NAMESPACE_HEADER_ENTER +class IMFUTIL_EXPORT_TYPE half; +IMATH_INTERNAL_NAMESPACE_HEADER_EXIT + +#define COMPILING_IMF_FLAT_IMAGE_CHANNEL #include "ImfFlatImageChannel.h" #include "ImfFlatImageLevel.h" @@ -58,4 +67,99 @@ FlatImageChannel::resize () } +//----------------------------------------------------------------------------- + + +template +TypedFlatImageChannel::TypedFlatImageChannel + (FlatImageLevel &level, + int xSampling, + int ySampling, + bool pLinear) +: + FlatImageChannel (level, xSampling, ySampling, pLinear), + _pixels (0), + _base (0) +{ + resize(); +} + + +template +TypedFlatImageChannel::~TypedFlatImageChannel () +{ + delete [] _pixels; +} + + +template <> +inline PixelType +FlatHalfChannel::pixelType () const +{ + return HALF; +} + + +template <> +inline PixelType +FlatFloatChannel::pixelType () const +{ + return FLOAT; +} + + +template <> +inline PixelType +FlatUIntChannel::pixelType () const +{ + return UINT; +} + + +template +Slice +TypedFlatImageChannel::slice () const +{ + return Slice (pixelType(), // type + (char *) _base, // base + sizeof (T), // xStride + pixelsPerRow() * sizeof (T), // yStride + xSampling(), + ySampling()); +} + + +template +void +TypedFlatImageChannel::resize () +{ + delete [] _pixels; + _pixels = 0; + + FlatImageChannel::resize(); // may throw an exception + + _pixels = new T [numPixels()]; + + for (size_t i = 0; i < numPixels(); ++i) + _pixels[i] = T (0); + + resetBasePointer (); +} + + +template +void +TypedFlatImageChannel::resetBasePointer () +{ + _base = _pixels - + (level().dataWindow().min.y / ySampling()) * pixelsPerRow() - + (level().dataWindow().min.x / xSampling()); +} + + +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedFlatImageChannel; +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedFlatImageChannel; +template class IMFUTIL_EXPORT_TEMPLATE_INSTANCE TypedFlatImageChannel; + + OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h index e300a394a6..aa0064ab69 100644 --- a/src/lib/OpenEXRUtil/ImfFlatImageChannel.h +++ b/src/lib/OpenEXRUtil/ImfFlatImageChannel.h @@ -139,13 +139,13 @@ class IMFUTIL_EXPORT_TEMPLATE_TYPE TypedFlatImageChannel: public FlatImageChanne // image channels exist only as parts of a flat image level. // - IMF_HIDDEN + IMFUTIL_HIDDEN TypedFlatImageChannel (FlatImageLevel &level, int xSampling, int ySampling, bool pLinear); - IMF_HIDDEN + IMFUTIL_HIDDEN virtual ~TypedFlatImageChannel (); TypedFlatImageChannel (const TypedFlatImageChannel& other) = delete; @@ -153,10 +153,10 @@ class IMFUTIL_EXPORT_TEMPLATE_TYPE TypedFlatImageChannel: public FlatImageChanne TypedFlatImageChannel (TypedFlatImageChannel&& other) = delete; TypedFlatImageChannel& operator = (TypedFlatImageChannel&& other) = delete; - IMF_HIDDEN + IMFUTIL_HIDDEN virtual void resize (); - IMF_HIDDEN + IMFUTIL_HIDDEN virtual void resetBasePointer (); T * _pixels; // Pointer to allocated storage @@ -178,63 +178,6 @@ typedef TypedFlatImageChannel FlatUIntChannel; //----------------------------------------------------------------------------- -template -TypedFlatImageChannel::TypedFlatImageChannel - (FlatImageLevel &level, - int xSampling, - int ySampling, - bool pLinear) -: - FlatImageChannel (level, xSampling, ySampling, pLinear), - _pixels (0), - _base (0) -{ - resize(); -} - - -template -TypedFlatImageChannel::~TypedFlatImageChannel () -{ - delete [] _pixels; -} - - -template <> -inline PixelType -FlatHalfChannel::pixelType () const -{ - return HALF; -} - - -template <> -inline PixelType -FlatFloatChannel::pixelType () const -{ - return FLOAT; -} - - -template <> -inline PixelType -FlatUIntChannel::pixelType () const -{ - return UINT; -} - - -template -Slice -TypedFlatImageChannel::slice () const -{ - return Slice (pixelType(), // type - (char *) _base, // base - sizeof (T), // xStride - pixelsPerRow() * sizeof (T), // yStride - xSampling(), - ySampling()); -} template @@ -286,33 +229,11 @@ TypedFlatImageChannel::row (int n) const return _base + n * pixelsPerRow(); } - -template -void -TypedFlatImageChannel::resize () -{ - delete [] _pixels; - _pixels = 0; - - FlatImageChannel::resize(); // may throw an exception - - _pixels = new T [numPixels()]; - - for (size_t i = 0; i < numPixels(); ++i) - _pixels[i] = T (0); - - resetBasePointer (); -} - - -template -void -TypedFlatImageChannel::resetBasePointer () -{ - _base = _pixels - - (level().dataWindow().min.y / ySampling()) * pixelsPerRow() - - (level().dataWindow().min.x / xSampling()); -} +#ifndef COMPILING_IMF_FLAT_IMAGE_CHANNEL +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedFlatImageChannel; +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedFlatImageChannel; +extern template class IMFUTIL_EXPORT_EXTERN_TEMPLATE TypedFlatImageChannel; +#endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT From e94f20f657c8fcd9b5867564973a62c79889761b Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 15 Mar 2021 08:47:50 +1300 Subject: [PATCH 22/23] Fix indenting, clarify comment, respect option in IlmThread Signed-off-by: Kimball Thurston --- src/lib/Iex/IexExport.h | 10 ++++-- src/lib/IlmThread/IlmThreadExport.h | 50 ++++++++++++++++++++--------- src/lib/OpenEXR/ImfExport.h | 8 ++--- src/lib/OpenEXRUtil/ImfUtilExport.h | 8 ++--- 4 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index b984aea6e5..ed814aa35c 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -12,10 +12,14 @@ /// motivation for these macros /// /// Iex is simple and does not need to do more than expose class types -/// and functions, and does not have any private members to hide +/// and functions, and does not have any private members to hide, so +/// only provides a couple of the possible macros. /// -/// Imf and ImfUtil have much more logic and have to deal with -/// templates and template instantiation. +/// Similarly, IlmThread is also simple. +/// +/// OpenEXR and OpenEXRUtil have much more logic and have to deal with +/// templates and template instantiation, and so define more of the +/// macros. /// /// @{ diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index d979b928a8..a4cd90a4ea 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -7,23 +7,43 @@ /// \addtogroup ExportMacros /// @{ + +// are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) -# if defined(ILMTHREAD_EXPORTS) -# define ILMTHREAD_EXPORT __declspec(dllexport) -# else -# define ILMTHREAD_EXPORT __declspec(dllimport) -# endif + +// our dll or nother location +# if defined(ILMTHREAD_EXPORTS) +# define ILMTHREAD_EXPORT __declspec(dllexport) +# else +# define ILMTHREAD_EXPORT __declspec(dllimport) +# endif + +#else // OPENEXR_DLL + +// need to avoid the case when compiling a static lib under MSVC (not +// a dll, not a compiler that has visibility attributes) +# ifndef _MSC_VER +# ifdef OPENEXR_USE_DEFAULT_VISIBILITY +# define ILMTHREAD_EXPORT +# else +# define ILMTHREAD_EXPORT __attribute__ ((__visibility__ ("default"))) +# define ILMTHREAD_EXPORT_TYPE ILMTHREAD_EXPORT +# define ILMTHREAD_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +# endif // OPENEXR_USE_DEFAULT_VISIBILITY + +# else // _MSC_VER +# define ILMTHREAD_EXPORT +# endif + +#endif // OPENEXR_DLL + +// Provide defaults so we don't have to replicate lines as much + +#ifndef ILMTHREAD_EXPORT_TYPE # define ILMTHREAD_EXPORT_TYPE +#endif +#ifndef ILMTHREAD_HIDDEN # define ILMTHREAD_HIDDEN -#else -# ifndef _MSC_VER -# define ILMTHREAD_EXPORT __attribute__ ((__visibility__ ("default"))) -# define ILMTHREAD_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) -# define ILMTHREAD_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -# else -# define ILMTHREAD_EXPORT -# define ILMTHREAD_EXPORT_TYPE -# define ILMTHREAD_HIDDEN -# endif #endif + /// @} diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index e6d7a63179..28d0f308a2 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -27,10 +27,10 @@ # define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT # endif -# else -# define IMF_EXPORT __declspec(dllimport) -# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT -# endif +# else // OPENEXR_EXPORTS, not in this DLL +# define IMF_EXPORT __declspec(dllimport) +# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +# endif #else // OPENEXR_DLL diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index b23a8b1150..6150fb0e33 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -27,10 +27,10 @@ # define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT # endif -# else -# define IMFUTIL_EXPORT __declspec(dllimport) -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT -# endif +# else // OPENEXRUTIL_EXPORTS, not in this DLL +# define IMFUTIL_EXPORT __declspec(dllimport) +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +# endif #else // OPENEXR_DLL From fd1d600540f1945843c16ee2cc138386de49ef16 Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Mon, 15 Mar 2021 22:43:58 +1300 Subject: [PATCH 23/23] refactor public / default visibility macros to top level set to simplify Signed-off-by: Kimball Thurston --- cmake/CMakeLists.txt | 13 +++-- cmake/OpenEXRConfig.h.in | 83 +++++++++++++++++++++++++++++ src/lib/Iex/IexExport.h | 53 +++++------------- src/lib/IlmThread/IlmThreadExport.h | 42 +++++++-------- src/lib/OpenEXR/ImfExport.h | 82 +++++++++++----------------- src/lib/OpenEXRUtil/ImfUtilExport.h | 79 ++++++++++----------------- 6 files changed, 179 insertions(+), 173 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index fd324ab467..7a6bf5f297 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -58,6 +58,15 @@ if(APPLE) endif() endif() +if (OPENEXR_ENABLE_LARGE_STACK) + set(OPENEXR_HAVE_LARGE_STACK ON) +endif() +if (OPENEXR_USE_DEFAULT_VISIBILITY) + set(OPENEXR_ENABLE_API_VISIBILITY OFF) +else() + set(OPENEXR_ENABLE_API_VISIBILITY ON) +endif() + configure_file(OpenEXRConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfig.h) configure_file(OpenEXRConfigInternal.h.in ${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfigInternal.h) @@ -110,10 +119,6 @@ if(OPENEXR_ENABLE_THREADING AND Threads_FOUND) endif() endif() -if (OPENEXR_ENABLE_LARGE_STACK) - set(OPENEXR_HAVE_LARGE_STACK ON) -endif() - configure_file(IexConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/IexConfig.h) configure_file(IexConfigInternal.h.in ${CMAKE_CURRENT_BINARY_DIR}/IexConfigInternal.h) configure_file(IlmThreadConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/IlmThreadConfig.h) diff --git a/cmake/OpenEXRConfig.h.in b/cmake/OpenEXRConfig.h.in index adb3151a7c..fd59bad48b 100644 --- a/cmake/OpenEXRConfig.h.in +++ b/cmake/OpenEXRConfig.h.in @@ -52,4 +52,87 @@ (uint32_t(OPENEXR_VERSION_MINOR) << 16) | \ (uint32_t(OPENEXR_VERSION_PATCH) << 8)) +// Whether the user configured the library to have symbol visibility +// tagged +#cmakedefine OPENEXR_ENABLE_API_VISIBILITY + +/// \defgroup ExportMacros Macros to manage symbol visibility +/// +/// See docs/SymbolVisibility.md for more discussion about the +/// motivation for these macros +/// +/// If we are compiling a DLL for Windows, there needs to be custom +/// rules for each library such that the macro swaps between doing a +/// dllexport and a dllimport, so the defines here are less +/// useful. Further, MSVC does not have this concept at all currently, +/// so is elided. +/// +/// The top level macros which start with OPENEXR can act as simple +/// ways to combine the logic however for non-DLL or non-windows +/// platforms, but until the current patterns change, one should check +/// the specific library export.h (i.e. @sa IexExport.h, +/// @sa IlmThreadExport.h, @sa ImfExport.h, @sa ImfUtilExport.h ) +/// +/// These per-library exports define a subset which are used by that +/// library. +/// +/// Iex is simple and does not need to do more than expose class types +/// and functions, and does not have any private members to hide, so +/// only provides a couple of the possible macros. +/// +/// Similarly, IlmThread is also reasonably simple. +/// +/// OpenEXR and OpenEXRUtil have much more logic and have to deal with +/// templates and template instantiation, and so define more of the +/// macros. +/// +/// @{ + +#if defined(OPENEXR_ENABLE_API_VISIBILITY) && ! ( defined(OPENEXR_DLL) || defined(_MSC_VER) ) +# define OPENEXR_PUBLIC_SYMBOL_ATTRIBUTE __attribute__ ((__visibility__ ("default"))) +# define OPENEXR_PRIVATE_SYMBOL_ATTRIBUTE __attribute__ ((__visibility__ ("hidden"))) + // clang differs from gcc and has type visibility which is needed + // for enums and templates, and isn't well documented, but causes + // the vtable and typeinfo to be made visible, but not necessarily + // all the members +# if __has_attribute(__type_visibility__) +# define OPENEXR_PUBLIC_TYPE_VISIBILITY_ATTRIBUTE __attribute__ ((__type_visibility__ ("default"))) +# endif + + // these are always the same, at least in current compilers +# define OPENEXR_EXPORT OPENEXR_PUBLIC_SYMBOL_ATTRIBUTE +# define OPENEXR_HIDDEN OPENEXR_PRIVATE_SYMBOL_ATTRIBUTE + // currently define this as the same between compilers to export + // things like default copy ctors etc, and do not use the type + // visibility which only exports the typeinfo / vtable +# define OPENEXR_EXPORT_TYPE OPENEXR_EXPORT +# define OPENEXR_EXPORT_EXTERN_TEMPLATE OPENEXR_EXPORT + +# ifdef OPENEXR_PUBLIC_TYPE_VISIBILITY_ATTRIBUTE +# define OPENEXR_EXPORT_ENUM OPENEXR_PUBLIC_TYPE_VISIBILITY_ATTRIBUTE +# define OPENEXR_EXPORT_TEMPLATE_TYPE OPENEXR_PUBLIC_TYPE_VISIBILITY_ATTRIBUTE + // clang (well, type_visibility) seems empirically need the + // default/public symbol tag when specifying explicit template + // instantiations, where gcc (no type_visibility) complains if + // you set that +# define OPENEXR_EXPORT_TEMPLATE_INSTANCE OPENEXR_EXPORT +# else +# define OPENEXR_EXPORT_ENUM +# define OPENEXR_EXPORT_TEMPLATE_TYPE OPENEXR_EXPORT +# define OPENEXR_EXPORT_TEMPLATE_INSTANCE +# endif + +#else // msvc or api visibility disabled, just clear all this out (DLLs will define a set anyway) + +# define OPENEXR_EXPORT +# define OPENEXR_HIDDEN +# define OPENEXR_EXPORT_TYPE +# define OPENEXR_EXPORT_EXTERN_TEMPLATE +# define OPENEXR_EXPORT_ENUM +# define OPENEXR_EXPORT_TEMPLATE_TYPE +# define OPENEXR_EXPORT_TYPE +# define OPENEXR_EXPORT_TEMPLATE_INSTANCE + +#endif + #endif // INCLUDED_OPENEXR_CONFIG_H diff --git a/src/lib/Iex/IexExport.h b/src/lib/Iex/IexExport.h index ed814aa35c..9667840771 100644 --- a/src/lib/Iex/IexExport.h +++ b/src/lib/Iex/IexExport.h @@ -6,26 +6,13 @@ #ifndef INCLUDED_IEXEXPORT_H #define INCLUDED_IEXEXPORT_H -/// \defgroup ExportMacros Macros to manage symbol visibility -/// -/// See docs/SymbolVisibility.md for more discussion about the -/// motivation for these macros -/// -/// Iex is simple and does not need to do more than expose class types -/// and functions, and does not have any private members to hide, so -/// only provides a couple of the possible macros. -/// -/// Similarly, IlmThread is also simple. -/// -/// OpenEXR and OpenEXRUtil have much more logic and have to deal with -/// templates and template instantiation, and so define more of the -/// macros. -/// -/// @{ +#include "OpenEXRConfig.h" #if defined(OPENEXR_DLL) // when building as a DLL for windows, typical dllexport / import case +// where we need to switch depending on whether we are compiling +// internally or not # if defined(IEX_EXPORTS) # define IEX_EXPORT __declspec(dllexport) @@ -33,34 +20,18 @@ # define IEX_EXPORT __declspec(dllimport) # endif -#else // OPENEXR_DLL - -// need to avoid the case when compiling a static lib under MSVC (not -// a dll, not a compiler that has visibility attributes) -# ifndef _MSC_VER - -// did the user turn off visibility management -# ifdef OPENEXR_USE_DEFAULT_VISIBILITY -# define IEX_EXPORT -# else - // we actually want to control visibility -# define IEX_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IEX_EXPORT_TYPE __attribute__ ((__visibility__ ("default"))) -# endif -# else -# define IEX_EXPORT -# endif +// DLLs don't support these types of visibility controls, just leave them as empty +# define IEX_EXPORT_TYPE +# define IEX_EXPORT_ENUM -#endif +#else // OPENEXR_DLL -// Provide defaults so we don't have to replicate lines as much +// just pass these through from the top level config +# define IEX_EXPORT OPENEXR_EXPORT +# define IEX_EXPORT_TYPE OPENEXR_EXPORT_TYPE +# define IEX_EXPORT_ENUM OPENEXR_EXPORT_ENUM -#ifndef IEX_EXPORT_TYPE -# define IEX_EXPORT_TYPE -#endif -#ifndef IEX_EXPORT_ENUM -# define IEX_EXPORT_ENUM -#endif +#endif // OPENEXR_DLL /// @} diff --git a/src/lib/IlmThread/IlmThreadExport.h b/src/lib/IlmThread/IlmThreadExport.h index a4cd90a4ea..519b84e4d9 100644 --- a/src/lib/IlmThread/IlmThreadExport.h +++ b/src/lib/IlmThread/IlmThreadExport.h @@ -3,6 +3,11 @@ // Copyright (c) Contributors to the OpenEXR Project. // +#ifndef INCLUDED_ILMTHREADEXPORT_H +#define INCLUDED_ILMTHREADEXPORT_H + +#include "OpenEXRConfig.h" + // See docs/SymbolVisibility.md for more discussion /// \addtogroup ExportMacros @@ -11,39 +16,28 @@ // are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) -// our dll or nother location +// when building as a DLL for windows, typical dllexport / import case +// where we need to switch depending on whether we are compiling +// internally or not # if defined(ILMTHREAD_EXPORTS) # define ILMTHREAD_EXPORT __declspec(dllexport) # else # define ILMTHREAD_EXPORT __declspec(dllimport) # endif +// DLLs don't support these types of visibility controls, just leave them as empty +# define ILMTHREAD_EXPORT_TYPE +# define ILMTHREAD_HIDDEN + #else // OPENEXR_DLL -// need to avoid the case when compiling a static lib under MSVC (not -// a dll, not a compiler that has visibility attributes) -# ifndef _MSC_VER -# ifdef OPENEXR_USE_DEFAULT_VISIBILITY -# define ILMTHREAD_EXPORT -# else -# define ILMTHREAD_EXPORT __attribute__ ((__visibility__ ("default"))) -# define ILMTHREAD_EXPORT_TYPE ILMTHREAD_EXPORT -# define ILMTHREAD_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -# endif // OPENEXR_USE_DEFAULT_VISIBILITY - -# else // _MSC_VER -# define ILMTHREAD_EXPORT -# endif +// just pass these through from the top level config +# define ILMTHREAD_EXPORT OPENEXR_EXPORT +# define ILMTHREAD_HIDDEN OPENEXR_HIDDEN +# define ILMTHREAD_EXPORT_TYPE OPENEXR_EXPORT_TYPE #endif // OPENEXR_DLL -// Provide defaults so we don't have to replicate lines as much - -#ifndef ILMTHREAD_EXPORT_TYPE -# define ILMTHREAD_EXPORT_TYPE -#endif -#ifndef ILMTHREAD_HIDDEN -# define ILMTHREAD_HIDDEN -#endif - /// @} + +#endif // INCLUDED_ILMTHREADEXPORT_H diff --git a/src/lib/OpenEXR/ImfExport.h b/src/lib/OpenEXR/ImfExport.h index 28d0f308a2..5a0c01555b 100644 --- a/src/lib/OpenEXR/ImfExport.h +++ b/src/lib/OpenEXR/ImfExport.h @@ -6,83 +6,61 @@ #ifndef INCLUDED_IMFEXPORT_H #define INCLUDED_IMFEXPORT_H +#include "OpenEXRConfig.h" + /// \addtogroup ExportMacros /// @{ // are we making a DLL under windows (might be msvc or mingw or others) #if defined(OPENEXR_DLL) +// when building as a DLL for windows, typical dllexport / import case +// where we need to switch depending on whether we are compiling +// internally or not # if defined(OPENEXR_EXPORTS) # define IMF_EXPORT __declspec(dllexport) + // mingw needs the export when the extern is defined # if defined(__MINGW32__) -// mingw needs the export when the extern is defined # define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT -// for mingw windows, we need to cause this to export the typeinfo -// tables (but you don't need to have the complementary import, -// because might be a local template too) +# define IMF_EXPORT_TEMPLATE_INSTANCE + // for mingw windows, we need to cause this to export the + // typeinfo tables (but you don't need to have the + // complementary import, because might be a local template too!) # define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT # else -// for normal msvc, need to export the actual instantiation in the cpp code + // for normal msvc, need to export the actual instantiation in + // the cpp code, and none of the others +# define IMF_EXPORT_EXTERN_TEMPLATE # define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT +# define IMF_EXPORT_TEMPLATE_TYPE # endif -# else // OPENEXR_EXPORTS, not in this DLL +# else // OPENEXR_EXPORTS # define IMF_EXPORT __declspec(dllimport) # define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT +# define IMF_EXPORT_TEMPLATE_INSTANCE +# define IMF_EXPORT_TEMPLATE_TYPE # endif -#else // OPENEXR_DLL +// DLLs don't support these types of visibility controls, just leave them as empty +# define IMF_EXPORT_TYPE +# define IMF_EXPORT_ENUM +# define IMF_HIDDEN -// need to avoid the case when compiling a static lib under MSVC (not -// a dll, not a compiler that has visibility attributes) -# ifndef _MSC_VER -# ifdef OPENEXR_USE_DEFAULT_VISIBILITY -# define IMF_EXPORT -# else -# define IMF_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IMF_EXPORT_TYPE IMF_EXPORT -# define IMF_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -// clang needs type visibility for enum and template, and the instantiation -// gcc does not have the type_visibility attribute, but if it ever adds it, -// the behavior should be the same -# if __has_attribute(__type_visibility__) -# define IMF_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) -# define IMF_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) -# define IMF_EXPORT_TEMPLATE_INSTANCE IMF_EXPORT -# else -# define IMF_EXPORT_TEMPLATE_TYPE IMF_EXPORT -# endif -# define IMF_EXPORT_EXTERN_TEMPLATE IMF_EXPORT -# endif // OPENEXR_USE_DEFAULT_VISIBILITY +#else // not an OPENEXR_DLL -# else // _MSC_VER -# define IMF_EXPORT -# endif +// just pass these through from the top level config +# define IMF_EXPORT OPENEXR_EXPORT +# define IMF_HIDDEN OPENEXR_HIDDEN +# define IMF_EXPORT_ENUM OPENEXR_EXPORT_ENUM +# define IMF_EXPORT_TYPE OPENEXR_EXPORT_TYPE +# define IMF_EXPORT_TEMPLATE_TYPE OPENEXR_EXPORT_TEMPLATE_TYPE +# define IMF_EXPORT_EXTERN_TEMPLATE OPENEXR_EXPORT_EXTERN_TEMPLATE +# define IMF_EXPORT_TEMPLATE_INSTANCE OPENEXR_EXPORT_TEMPLATE_INSTANCE #endif // OPENEXR_DLL -// Provide defaults so we don't have to replicate lines as much - -#ifndef IMF_EXPORT_TYPE -# define IMF_EXPORT_TYPE -#endif -#ifndef IMF_EXPORT_TEMPLATE_TYPE -# define IMF_EXPORT_TEMPLATE_TYPE -#endif -#ifndef IMF_EXPORT_EXTERN_TEMPLATE -# define IMF_EXPORT_EXTERN_TEMPLATE -#endif -#ifndef IMF_EXPORT_TEMPLATE_INSTANCE -# define IMF_EXPORT_TEMPLATE_INSTANCE -#endif -#ifndef IMF_EXPORT_ENUM -# define IMF_EXPORT_ENUM -#endif -#ifndef IMF_HIDDEN -# define IMF_HIDDEN -#endif - /// @} #endif // INCLUDED_IMFEXPORT_H diff --git a/src/lib/OpenEXRUtil/ImfUtilExport.h b/src/lib/OpenEXRUtil/ImfUtilExport.h index 6150fb0e33..abb9c3b774 100644 --- a/src/lib/OpenEXRUtil/ImfUtilExport.h +++ b/src/lib/OpenEXRUtil/ImfUtilExport.h @@ -6,6 +6,8 @@ #ifndef INCLUDED_IMFUTILEXPORT_H #define INCLUDED_IMFUTILEXPORT_H +#include "OpenEXRConfig.h" + /// \addtogroup ExportMacros /// @{ @@ -15,74 +17,47 @@ # if defined(OPENEXRUTIL_EXPORTS) # define IMFUTIL_EXPORT __declspec(dllexport) + // mingw needs the export when the extern is defined # if defined(__MINGW32__) -// mingw needs the export when the extern is defined # define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT -// for mingw windows, we need to cause this to export the typeinfo -// tables (but you don't need to have the complementary import, -// because might be a local template too) +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE + // for mingw windows, we need to cause this to export the + // typeinfo tables (but you don't need to have the + // complementary import, because might be a local template too!) # define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT # else -// for normal msvc, need to export the actual instantiation in the cpp code + // for normal msvc, need to export the actual instantiation in + // the cpp code, and none of the others +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE # define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT +# define IMFUTIL_EXPORT_TEMPLATE_TYPE # endif -# else // OPENEXRUTIL_EXPORTS, not in this DLL +# else // OPENEXRUTIL_EXPORTS # define IMFUTIL_EXPORT __declspec(dllimport) # define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE +# define IMFUTIL_EXPORT_TEMPLATE_TYPE # endif -#else // OPENEXR_DLL +// DLLs don't support these types of visibility controls, just leave them as empty +# define IMFUTIL_EXPORT_TYPE +# define IMFUTIL_EXPORT_ENUM +# define IMFUTIL_HIDDEN -// need to avoid the case when compiling a static lib under MSVC (not -// a dll, not a compiler that has visibility attributes) -# ifndef _MSC_VER -# ifdef OPENEXR_USE_DEFAULT_VISIBILITY -# define IMFUTIL_EXPORT -# else -# define IMFUTIL_EXPORT __attribute__ ((__visibility__ ("default"))) -# define IMFUTIL_EXPORT_TYPE IMFUTIL_EXPORT -# define IMFUTIL_HIDDEN __attribute__ ((__visibility__ ("hidden"))) -// clang needs type visibility for enum and template, and the instantiation -// gcc does not have the type_visibility attribute, but if it ever adds it, -// the behavior should be the same -# if __has_attribute(__type_visibility__) -# define IMFUTIL_EXPORT_ENUM __attribute__ ((__type_visibility__ ("default"))) -# define IMFUTIL_EXPORT_TEMPLATE_TYPE __attribute__ ((__type_visibility__ ("default"))) -# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE IMFUTIL_EXPORT -# else -# define IMFUTIL_EXPORT_TEMPLATE_TYPE IMFUTIL_EXPORT -# endif -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE IMFUTIL_EXPORT -# endif // OPENEXR_USE_DEFAULT_VISIBILITY +#else // not an OPENEXR_DLL -# else // _MSC_VER -# define IMFUTIL_EXPORT -# endif +// just pass these through from the top level config +# define IMFUTIL_EXPORT OPENEXR_EXPORT +# define IMFUTIL_HIDDEN OPENEXR_HIDDEN +# define IMFUTIL_EXPORT_ENUM OPENEXR_EXPORT_ENUM +# define IMFUTIL_EXPORT_TYPE OPENEXR_EXPORT_TYPE +# define IMFUTIL_EXPORT_TEMPLATE_TYPE OPENEXR_EXPORT_TEMPLATE_TYPE +# define IMFUTIL_EXPORT_EXTERN_TEMPLATE OPENEXR_EXPORT_EXTERN_TEMPLATE +# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE OPENEXR_EXPORT_TEMPLATE_INSTANCE #endif // OPENEXR_DLL -// Provide defaults so we don't have to replicate lines as much - -#ifndef IMFUTIL_EXPORT_TYPE -# define IMFUTIL_EXPORT_TYPE -#endif -#ifndef IMFUTIL_EXPORT_TEMPLATE_TYPE -# define IMFUTIL_EXPORT_TEMPLATE_TYPE -#endif -#ifndef IMFUTIL_EXPORT_EXTERN_TEMPLATE -# define IMFUTIL_EXPORT_EXTERN_TEMPLATE -#endif -#ifndef IMFUTIL_EXPORT_TEMPLATE_INSTANCE -# define IMFUTIL_EXPORT_TEMPLATE_INSTANCE -#endif -#ifndef IMFUTIL_EXPORT_ENUM -# define IMFUTIL_EXPORT_ENUM -#endif -#ifndef IMFUTIL_HIDDEN -# define IMFUTIL_HIDDEN -#endif - /// @} #endif // INCLUDED_IMFUTILEXPORT_H