diff --git a/cmake/modules/FindOpenEXR.cmake b/cmake/modules/FindOpenEXR.cmake index 1e4ac805..b8ed6414 100644 --- a/cmake/modules/FindOpenEXR.cmake +++ b/cmake/modules/FindOpenEXR.cmake @@ -1,102 +1,55 @@ -# Try to find the OpenEXR libraries, once done this will define: +# Try to find OpenEXR, once done this will define: # # OPENEXR_FOUND - system has OpenEXR -# OPENEXR_INCLUDE_DIR - OpenEXR include directory -# OPENEXR_LIBRARIES - Libraries needed to use OpenEXR -# OPENEXR_DEFINITIONS - definitions required to use OpenEXR - -# Copyright (c) 2006, Alexander Neundorf, +# OPENEXR_INCLUDE_DIR - the OpenEXR include directory +# OPENEXR_LIBRARIES - the libraries needed to use OpenEXR +# OPENEXR_DEFINITIONS - compiler switches required for using OpenEXR +# +# Copyright (c) 2021 Ivailo Monev # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. +if(NOT WIN32) + include(FindPkgConfig) + pkg_check_modules(PC_OPENEXR QUIET OpenEXR) -if (OPENEXR_INCLUDE_DIR AND OPENEXR_LIBRARIES) - # in cache already - set(OPENEXR_FOUND TRUE) + set(OPENEXR_INCLUDE_DIR ${PC_OPENEXR_INCLUDE_DIRS}) + set(OPENEXR_LIBRARIES ${PC_OPENEXR_LIBRARIES}) +endif() -else (OPENEXR_INCLUDE_DIR AND OPENEXR_LIBRARIES) +set(OPENEXR_VERSION ${PC_OPENEXR_VERSION}) +set(OPENEXR_DEFINITIONS ${PC_OPENEXR_CFLAGS_OTHER}) - # use pkg-config to get the directories and then use these values - # in the FIND_PATH() and FIND_LIBRARY() calls - find_package(PkgConfig) - pkg_check_modules(PC_OPENEXR QUIET OpenEXR) +if(NOT OPENEXR_INCLUDE_DIR OR NOT OPENEXR_LIBRARIES) + find_path(OPENEXR_INCLUDE_DIR + NAMES ImfRgbaFile.h + PATH_SUFFIXES OpenEXR + HINTS $ENV{OPENEXRDIR}/include + ) - FIND_PATH(OPENEXR_INCLUDE_DIR ImfRgbaFile.h - HINTS - ${PC_OPENEXR_INCLUDEDIR} - ${PC_OPENEXR_INCLUDE_DIRS} - PATH_SUFFIXES OpenEXR - ) + find_library(OPENEXR_LIBRARIES + NAMES OpenEXR + HINTS $ENV{OPENEXRDIR}/lib + ) - FIND_LIBRARY(OPENEXR_HALF_LIBRARY NAMES Half - HINTS - ${PC_OPENEXR_LIBDIR} - ${PC_OPENEXR_LIBRARY_DIRS} - ) + # fallback for versions older than 3.0 + if(NOT OPENEXR_LIBRARIES) + set(OPENEXR_NAMES Imath IlmImf Half Iex IlmThread) + foreach(lib ${OPENEXR_NAMES}) + find_library(OPENEXR_${lib}_PATH + NAMES ${lib} + HINTS $ENV{OPENEXRDIR}/lib + ) + set(OPENEXR_LIBRARIES ${OPENEXR_LIBRARIES} ${OPENEXR_${lib}_PATH}) + endforeach() + endif() +endif() +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenEXR + VERSION_VAR OPENEXR_VERSION + REQUIRED_VARS OPENEXR_LIBRARIES OPENEXR_INCLUDE_DIR +) - FIND_LIBRARY(OPENEXR_IEX_LIBRARY NAMES Iex - PATHS - ${PC_OPENEXR_LIBDIR} - ${PC_OPENEXR_LIBRARY_DIRS} - ) - - FIND_LIBRARY(OPENEXR_IMATH_LIBRARY NAMES Imath - HINTS - ${PC_OPENEXR_LIBDIR} - ${PC_OPENEXR_LIBRARY_DIRS} - ) - - FIND_LIBRARY(OPENEXR_ILMIMF_LIBRARY NAMES IlmImf - HINTS - ${PC_OPENEXR_LIBDIR} - ${PC_OPENEXR_LIBRARY_DIRS} - ) - - FIND_LIBRARY(OPENEXR_ILMTHREAD_LIBRARY NAMES IlmThread - HINTS - ${PC_OPENEXR_LIBDIR} - ${PC_OPENEXR_LIBRARY_DIRS} - ) - - if (OPENEXR_INCLUDE_DIR AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) - set(OPENEXR_FOUND TRUE) - if (OPENEXR_ILMTHREAD_LIBRARY) - set(OPENEXR_LIBRARIES ${OPENEXR_IMATH_LIBRARY} ${OPENEXR_ILMIMF_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_HALF_LIBRARY} ${OPENEXR_ILMTHREAD_LIBRARY} ) - else (OPENEXR_ILMTHREAD_LIBRARY) - set(OPENEXR_LIBRARIES ${OPENEXR_IMATH_LIBRARY} ${OPENEXR_ILMIMF_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_HALF_LIBRARY} ) - endif (OPENEXR_ILMTHREAD_LIBRARY) - - if (WIN32) - set(_OPENEXR_DEFINITIONS -DOPENEXR_DLL) - else (WIN32) - set(_OPENEXR_DEFINITIONS) - endif (WIN32) - - set(OPENEXR_DEFINITIONS ${_OPENEXR_DEFINITIONS}) - - endif (OPENEXR_INCLUDE_DIR AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) - - - if (OPENEXR_FOUND) - if (NOT OpenEXR_FIND_QUIETLY) - message(STATUS "Found OPENEXR: ${OPENEXR_LIBRARIES}") - endif (NOT OpenEXR_FIND_QUIETLY) - else (OPENEXR_FOUND) - if (OpenEXR_FIND_REQUIRED) - message(FATAL_ERROR "Could NOT find OPENEXR") - endif (OpenEXR_FIND_REQUIRED) - endif (OPENEXR_FOUND) - - mark_as_advanced( - OPENEXR_INCLUDE_DIR - OPENEXR_LIBRARIES - OPENEXR_ILMIMF_LIBRARY - OPENEXR_ILMTHREAD_LIBRARY - OPENEXR_IMATH_LIBRARY - OPENEXR_IEX_LIBRARY - OPENEXR_HALF_LIBRARY - OPENEXR_DEFINITIONS ) - -endif (OPENEXR_INCLUDE_DIR AND OPENEXR_LIBRARIES) +mark_as_advanced(OPENEXR_INCLUDE_DIR OPENEXR_LIBRARIES) diff --git a/kimgio/exr.cpp b/kimgio/exr.cpp index b4e2d9f7..7dbb42ed 100644 --- a/kimgio/exr.cpp +++ b/kimgio/exr.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -38,6 +39,12 @@ #include #include +#if defined(OPENEXR_VERSION_MAJOR) && OPENEXR_VERSION_MAJOR >= 3 +# define K_OE_INT_TYPE uint64_t +#else +# define K_OE_INT_TYPE Imf::Int64 +#endif + class K_IStream: public Imf::IStream { public: @@ -46,8 +53,8 @@ public: {} virtual bool read( char c[], int n ); - virtual Imf::Int64 tellg( ); - virtual void seekg( Imf::Int64 pos ); + virtual K_OE_INT_TYPE tellg( ); + virtual void seekg( K_OE_INT_TYPE pos ); virtual void clear( ); private: @@ -66,12 +73,12 @@ bool K_IStream::read( char c[], int n ) return false; } -Imf::Int64 K_IStream::tellg( ) +K_OE_INT_TYPE K_IStream::tellg( ) { return m_dev->pos(); } -void K_IStream::seekg( Imf::Int64 pos ) +void K_IStream::seekg( K_OE_INT_TYPE pos ) { m_dev->seek( pos ); }