Images: update code to support OpenEXR 3

Compatibility with OpenEXR 2 is preserved, since Blender releases and Linux
distribution packages can be on different versions.

Ref D14128
This commit is contained in:
Sebastian Parborg 2022-02-16 17:36:47 +01:00 committed by Brecht Van Lommel
parent 4541249360
commit cd7550cfe7
1 changed files with 50 additions and 34 deletions

View File

@ -32,30 +32,46 @@
#include <stdexcept>
#include <string>
#include <Iex.h>
#include <ImathBox.h>
#include <ImfArray.h>
#include <ImfChannelList.h>
#include <ImfCompression.h>
#include <ImfCompressionAttribute.h>
#include <ImfIO.h>
#include <ImfInputFile.h>
#include <ImfOutputFile.h>
#include <ImfPixelType.h>
#include <ImfStandardAttributes.h>
#include <ImfStringAttribute.h>
#include <ImfVersion.h>
#include <half.h>
/* The OpenEXR version can reliably be found in this header file from OpenEXR,
* for both 2.x and 3.x:
*/
#include <OpenEXR/OpenEXRConfig.h>
#define COMBINED_OPENEXR_VERSION \
((10000 * OPENEXR_VERSION_MAJOR) + (100 * OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH)
#if COMBINED_OPENEXR_VERSION >= 20599
/* >=2.5.99 -> OpenEXR >=3.0 */
# include <Imath/half.h>
# include <OpenEXR/ImfFrameBuffer.h>
# define exr_file_offset_t uint64_t
#else
/* OpenEXR 2.x, use the old locations. */
# include <OpenEXR/half.h>
# define exr_file_offset_t Int64
#endif
#include <OpenEXR/Iex.h>
#include <OpenEXR/ImfArray.h>
#include <OpenEXR/ImfChannelList.h>
#include <OpenEXR/ImfCompression.h>
#include <OpenEXR/ImfCompressionAttribute.h>
#include <OpenEXR/ImfIO.h>
#include <OpenEXR/ImfInputFile.h>
#include <OpenEXR/ImfOutputFile.h>
#include <OpenEXR/ImfPixelType.h>
#include <OpenEXR/ImfStandardAttributes.h>
#include <OpenEXR/ImfStringAttribute.h>
#include <OpenEXR/ImfVersion.h>
/* multiview/multipart */
#include <ImfInputPart.h>
#include <ImfMultiPartInputFile.h>
#include <ImfMultiPartOutputFile.h>
#include <ImfMultiView.h>
#include <ImfOutputPart.h>
#include <ImfPartHelper.h>
#include <ImfPartType.h>
#include <ImfTiledOutputPart.h>
#include <OpenEXR/ImfInputPart.h>
#include <OpenEXR/ImfMultiPartInputFile.h>
#include <OpenEXR/ImfMultiPartOutputFile.h>
#include <OpenEXR/ImfMultiView.h>
#include <OpenEXR/ImfOutputPart.h>
#include <OpenEXR/ImfPartHelper.h>
#include <OpenEXR/ImfPartType.h>
#include <OpenEXR/ImfTiledOutputPart.h>
#include "DNA_scene_types.h" /* For OpenEXR compression constants */
@ -131,12 +147,12 @@ class IMemStream : public Imf::IStream {
return false;
}
Int64 tellg() override
exr_file_offset_t tellg() override
{
return _exrpos;
}
void seekg(Int64 pos) override
void seekg(exr_file_offset_t pos) override
{
_exrpos = pos;
}
@ -146,8 +162,8 @@ class IMemStream : public Imf::IStream {
}
private:
Int64 _exrpos;
Int64 _exrsize;
exr_file_offset_t _exrpos;
exr_file_offset_t _exrsize;
unsigned char *_exrbuf;
};
@ -182,12 +198,12 @@ class IFileStream : public Imf::IStream {
return check_error();
}
Int64 tellg() override
exr_file_offset_t tellg() override
{
return std::streamoff(ifs.tellg());
}
void seekg(Int64 pos) override
void seekg(exr_file_offset_t pos) override
{
ifs.seekg(pos);
check_error();
@ -231,19 +247,19 @@ class OMemStream : public OStream {
ibuf->encodedsize += n;
}
Int64 tellp() override
exr_file_offset_t tellp() override
{
return offset;
}
void seekp(Int64 pos) override
void seekp(exr_file_offset_t pos) override
{
offset = pos;
ensure_size(offset);
}
private:
void ensure_size(Int64 size)
void ensure_size(exr_file_offset_t size)
{
/* if buffer is too small increase it. */
while (size > ibuf->encodedbuffersize) {
@ -254,7 +270,7 @@ class OMemStream : public OStream {
}
ImBuf *ibuf;
Int64 offset;
exr_file_offset_t offset;
};
/* File Output Stream */
@ -284,12 +300,12 @@ class OFileStream : public OStream {
check_error();
}
Int64 tellp() override
exr_file_offset_t tellp() override
{
return std::streamoff(ofs.tellp());
}
void seekp(Int64 pos) override
void seekp(exr_file_offset_t pos) override
{
ofs.seekp(pos);
check_error();