diff --git a/cmake/macros/TargetOpenEXR.cmake b/cmake/macros/TargetOpenEXR.cmake index 9d63ba3ef4a..8acd629119d 100644 --- a/cmake/macros/TargetOpenEXR.cmake +++ b/cmake/macros/TargetOpenEXR.cmake @@ -14,36 +14,38 @@ macro(TARGET_OPENEXR) TMP REGEX "#define OPENEXR_VERSION_STRING.*$") string(REGEX MATCHALL "[0-9.]+" OPENEXR_VERSION ${TMP}) - + file(STRINGS ${openexr_config_file} TMP REGEX "#define OPENEXR_VERSION_MAJOR.*$") string(REGEX MATCHALL "[0-9]" OPENEXR_MAJOR_VERSION ${TMP}) - + file(STRINGS ${openexr_config_file} TMP REGEX "#define OPENEXR_VERSION_MINOR.*$") string(REGEX MATCHALL "[0-9]" OPENEXR_MINOR_VERSION ${TMP}) + else() + message(WARNING "Failed to find ${openexr_config_file}") endif() set(OPENEXR_LIBRARY_RELEASE "") set(OPENEXR_LIBRARY_DEBUG "") foreach(OPENEXR_LIB - IlmImf - IlmImfUtil - Half + OpenEXRCore + OpenEXR + OpenEXRUtil Iex - IexMath + IlmThread Imath - IlmThread) + ) # OpenEXR libraries may be suffixed with the version number, so we search # using both versioned and unversioned names. find_library(OPENEXR_${OPENEXR_LIB}_LIBRARY_RELEASE NAMES - ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION}_s + ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION} ${OPENEXR_LIB}_s PATHS ${VCPKG_INSTALL_ROOT}/lib NO_DEFAULT_PATH @@ -52,13 +54,15 @@ macro(TARGET_OPENEXR) if(OPENEXR_${OPENEXR_LIB}_LIBRARY_RELEASE) list(APPEND OPENEXR_LIBRARY_RELEASE ${OPENEXR_${OPENEXR_LIB}_LIBRARY_RELEASE}) + else() + message(WARNING "Failed to find ${OPENEXR_LIB} (release); ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION}") endif() # OpenEXR libraries may be suffixed with the version number, so we search # using both versioned and unversioned names. find_library(OPENEXR_${OPENEXR_LIB}_LIBRARY_DEBUG NAMES - ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION}_s_d + ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION}_d ${OPENEXR_LIB}_s_d PATHS ${VCPKG_INSTALL_ROOT}/debug/lib NO_DEFAULT_PATH @@ -67,10 +71,13 @@ macro(TARGET_OPENEXR) if(OPENEXR_${OPENEXR_LIB}_LIBRARY_DEBUG) list(APPEND OPENEXR_LIBRARY_DEBUG ${OPENEXR_${OPENEXR_LIB}_LIBRARY_DEBUG}) + else() + message(WARNING "Failed to find ${OPENEXR_LIB} (debug); ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION}_d") endif() endforeach(OPENEXR_LIB) select_library_configurations(OPENEXR) target_link_libraries(${TARGET_NAME} ${OPENEXR_LIBRARY}) + target_include_directories(${TARGET_NAME} PUBLIC "${VCPKG_INSTALL_ROOT}/include/Imath") endif() endmacro() diff --git a/cmake/ports/imath/portfile.cmake b/cmake/ports/imath/portfile.cmake new file mode 100644 index 00000000000..3f4f34ad58c --- /dev/null +++ b/cmake/ports/imath/portfile.cmake @@ -0,0 +1,25 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO AcademySoftwareFoundation/Imath + REF v3.1.9 + SHA512 ad96b2ac306fc13c01e8ea3256f885499c3f545be327feaba0f5e093b70b544bcca6f8b353fa7e35107aae515c19caced44331a95d0414f367ead4691ec73564 + HEAD_REF master +) + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + -DIMATH_INSTALL_SYM_LINK=OFF + -DBUILD_TESTING=OFF + -DIMATH_INSTALL_PKG_CONFIG=ON +) + +vcpkg_cmake_install() + +vcpkg_copy_pdbs() +vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/Imath) +vcpkg_fixup_pkgconfig() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") + +file(INSTALL "${SOURCE_PATH}/LICENSE.md" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) diff --git a/cmake/ports/imath/vcpkg.json b/cmake/ports/imath/vcpkg.json new file mode 100644 index 00000000000..85b1cb6915f --- /dev/null +++ b/cmake/ports/imath/vcpkg.json @@ -0,0 +1,18 @@ +{ + "name": "imath", + "version": "3.1.9", + "port-version": 1, + "description": "Imath is a C++ and Python library of 2D and 3D vector, matrix, and math operations for computer graphics.", + "homepage": "https://github.com/AcademySoftwareFoundation/Imath", + "license": "BSD-3-Clause", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ] +} diff --git a/cmake/ports/openexr/CONTROL b/cmake/ports/openexr/CONTROL deleted file mode 100644 index d59ab286e1d..00000000000 --- a/cmake/ports/openexr/CONTROL +++ /dev/null @@ -1,4 +0,0 @@ -Source: openexr -Version: 2.3.0-2 -Description: OpenEXR is a high dynamic-range (HDR) image file format developed by Industrial Light & Magic for use in computer imaging applications -Build-Depends: zlib \ No newline at end of file diff --git a/cmake/ports/openexr/FindOpenEXR.cmake b/cmake/ports/openexr/FindOpenEXR.cmake deleted file mode 100644 index a381c6db9a3..00000000000 --- a/cmake/ports/openexr/FindOpenEXR.cmake +++ /dev/null @@ -1,87 +0,0 @@ -include(FindPackageHandleStandardArgs) - -find_path(OpenEXR_INCLUDE_DIRS OpenEXR/OpenEXRConfig.h) -find_path(OPENEXR_INCLUDE_PATHS NAMES ImfRgbaFile.h PATH_SUFFIXES OpenEXR) - -file(STRINGS "${OpenEXR_INCLUDE_DIRS}/OpenEXR/OpenEXRConfig.h" OPENEXR_CONFIG_H) - -string(REGEX REPLACE "^.*define OPENEXR_VERSION_MAJOR ([0-9]+).*$" "\\1" OpenEXR_VERSION_MAJOR "${OPENEXR_CONFIG_H}") -string(REGEX REPLACE "^.*define OPENEXR_VERSION_MINOR ([0-9]+).*$" "\\1" OpenEXR_VERSION_MINOR "${OPENEXR_CONFIG_H}") -set(OpenEXR_LIB_SUFFIX "${OpenEXR_VERSION_MAJOR}_${OpenEXR_VERSION_MINOR}") - -include(SelectLibraryConfigurations) - -if(NOT OpenEXR_BASE_LIBRARY) - find_library(OpenEXR_BASE_LIBRARY_RELEASE NAMES IlmImf-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_BASE_LIBRARY_DEBUG NAMES IlmImf-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_BASE) -endif() - -if(NOT OpenEXR_UTIL_LIBRARY) - find_library(OpenEXR_UTIL_LIBRARY_RELEASE NAMES IlmImfUtil-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_UTIL_LIBRARY_DEBUG NAMES IlmImfUtil-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_UTIL) -endif() - -if(NOT OpenEXR_HALF_LIBRARY) - find_library(OpenEXR_HALF_LIBRARY_RELEASE NAMES Half-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_HALF_LIBRARY_DEBUG NAMES Half-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_HALF) -endif() - -if(NOT OpenEXR_IEX_LIBRARY) - find_library(OpenEXR_IEX_LIBRARY_RELEASE NAMES Iex-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_IEX_LIBRARY_DEBUG NAMES Iex-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_IEX) -endif() - -if(NOT OpenEXR_MATH_LIBRARY) - find_library(OpenEXR_MATH_LIBRARY_RELEASE NAMES Imath-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_MATH_LIBRARY_DEBUG NAMES Imath-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_MATH) -endif() - -if(NOT OpenEXR_THREAD_LIBRARY) - find_library(OpenEXR_THREAD_LIBRARY_RELEASE NAMES IlmThread-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_THREAD_LIBRARY_DEBUG NAMES IlmThread-${OpenEXR_LIB_SUFFIX}_d) - select_library_configurations(OpenEXR_THREAD) -endif() - -if(NOT OpenEXR_IEXMATH_LIBRARY) - find_library(OpenEXR_IEXMATH_LIBRARY_RELEASE NAMES IexMath-${OpenEXR_LIB_SUFFIX}) - find_library(OpenEXR_IEXMATH_LIBRARY_DEBUG NAMES IexMath-${OpenEXR_LIB_SUFFIX}d) - select_library_configurations(OpenEXR_IEXMATH) -endif() - -set(OPENEXR_HALF_LIBRARY "${OpenEXR_HALF_LIBRARY}") -set(OPENEXR_IEX_LIBRARY "${OpenEXR_IEX_LIBRARY}") -set(OPENEXR_IMATH_LIBRARY "${OpenEXR_MATH_LIBRARY}") -set(OPENEXR_ILMIMF_LIBRARY "${OpenEXR_BASE_LIBRARY}") -set(OPENEXR_ILMIMFUTIL_LIBRARY "${OpenEXR_UTIL_LIBRARY}") -set(OPENEXR_ILMTHREAD_LIBRARY "${OpenEXR_THREAD_LIBRARY}") - -set(OpenEXR_LIBRARY "${OpenEXR_BASE_LIBRARY}") - -set(OpenEXR_LIBRARIES - ${OpenEXR_LIBRARY} - ${OpenEXR_MATH_LIBRARY} - ${OpenEXR_IEXMATH_LIBRARY} - ${OpenEXR_UTIL_LIBRARY} - ${OpenEXR_HALF_LIBRARY} - ${OpenEXR_IEX_LIBRARY} - ${OpenEXR_THREAD_LIBRARY} -) - -set(OPENEXR_LIBRARIES - ${OPENEXR_HALF_LIBRARY} - ${OPENEXR_IEX_LIBRARY} - ${OPENEXR_IMATH_LIBRARY} - ${OPENEXR_ILMIMF_LIBRARY} - ${OPENEXR_ILMTHREAD_LIBRARY} -) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenEXR REQUIRED_VARS OpenEXR_LIBRARIES OpenEXR_INCLUDE_DIRS) - -if(OpenEXR_FOUND) - set(OPENEXR_FOUND 1) -endif() diff --git a/cmake/ports/openexr/fix-arm64-windows-build.patch b/cmake/ports/openexr/fix-arm64-windows-build.patch new file mode 100644 index 00000000000..1d3310a8b98 --- /dev/null +++ b/cmake/ports/openexr/fix-arm64-windows-build.patch @@ -0,0 +1,13 @@ +diff --git a/src/lib/OpenEXRCore/internal_dwa_simd.h b/src/lib/OpenEXRCore/internal_dwa_simd.h +index 7b53501ac..ca69c9848 100644 +--- a/src/lib/OpenEXRCore/internal_dwa_simd.h ++++ b/src/lib/OpenEXRCore/internal_dwa_simd.h +@@ -18,7 +18,7 @@ + // aligned. Unaligned pointers may risk seg-faulting. + // + +-#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) ++#if defined __SSE2__ || (_MSC_VER >= 1300 && (_M_IX86 || _M_X64) && !_M_CEE_PURE) + # define IMF_HAVE_SSE2 1 + # include + # include diff --git a/cmake/ports/openexr/fix_install_ilmimf.patch b/cmake/ports/openexr/fix_install_ilmimf.patch deleted file mode 100644 index db65be73684..00000000000 --- a/cmake/ports/openexr/fix_install_ilmimf.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/OpenEXR/IlmImf/CMakeLists.txt b/OpenEXR/IlmImf/CMakeLists.txt -index e1a8740..d31cf68 100644 ---- a/OpenEXR/IlmImf/CMakeLists.txt -+++ b/OpenEXR/IlmImf/CMakeLists.txt -@@ -2,14 +2,6 @@ - - SET(CMAKE_INCLUDE_CURRENT_DIR 1) - --IF (WIN32) -- SET(RUNTIME_DIR ${OPENEXR_PACKAGE_PREFIX}/bin) -- SET(WORKING_DIR ${RUNTIME_DIR}) --ELSE () -- SET(RUNTIME_DIR ${OPENEXR_PACKAGE_PREFIX}/lib) -- SET(WORKING_DIR .) --ENDIF () -- - SET(BUILD_B44EXPLOGTABLE OFF) - IF (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/b44ExpLogTable.h") - SET(BUILD_B44EXPLOGTABLE ON) diff --git a/cmake/ports/openexr/portfile.cmake b/cmake/ports/openexr/portfile.cmake index 6e773434e85..8ffa6c76bb8 100644 --- a/cmake/ports/openexr/portfile.cmake +++ b/cmake/ports/openexr/portfile.cmake @@ -1,71 +1,46 @@ -set(OPENEXR_VERSION 2.3.0) -set(OPENEXR_HASH 268ae64b40d21d662f405fba97c307dad1456b7d996a447aadafd41b640ca736d4851d9544b4741a94e7b7c335fe6e9d3b16180e710671abfc0c8b2740b147b2) - vcpkg_from_github( - OUT_SOURCE_PATH SOURCE_PATH - REPO openexr/openexr - REF v${OPENEXR_VERSION} - SHA512 ${OPENEXR_HASH} - HEAD_REF master - PATCHES "fix_install_ilmimf.patch" + OUT_SOURCE_PATH SOURCE_PATH + REPO AcademySoftwareFoundation/openexr + REF "v${VERSION}" + SHA512 ec60e79341695452e05f50bbcc0d55e0ce00fbb64cdec01a83911189c8643eb28a8046b14ee4230e5f438f018f2f1d0714f691983474d7979befd199f3f34758 + HEAD_REF master + PATCHES + fix-arm64-windows-build.patch # https://github.com/AcademySoftwareFoundation/openexr/pull/1447 ) -set(OPENEXR_STATIC ON) -set(OPENEXR_SHARED OFF) - -vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH} - PREFER_NINJA - OPTIONS - -DOPENEXR_BUILD_PYTHON_LIBS=OFF - -DOPENEXR_BUILD_VIEWERS=OFF - -DOPENEXR_RUN_FUZZ_TESTS=OFF - -DOPENEXR_BUILD_SHARED=${OPENEXR_SHARED} - -DOPENEXR_BUILD_STATIC=${OPENEXR_STATIC} - OPTIONS_DEBUG - -DILMBASE_PACKAGE_PREFIX=${CURRENT_INSTALLED_DIR}/debug - OPTIONS_RELEASE - -DILMBASE_PACKAGE_PREFIX=${CURRENT_INSTALLED_DIR}) - -vcpkg_install_cmake() - -file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) -file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) - -# NOTE: Only use ".exe" extension on Windows executables. -# Is there a cleaner way to do this? -if(WIN32) - set(EXECUTABLE_SUFFIX ".exe") -else() - set(EXECUTABLE_SUFFIX "") -endif() -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrenvmap${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrheader${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrmakepreview${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrmaketiled${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrmultipart${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrmultiview${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/exrstdattr${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrenvmap${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrheader${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrmakepreview${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrmaketiled${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrmultipart${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrmultiview${EXECUTABLE_SUFFIX}) -file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/exrstdattr${EXECUTABLE_SUFFIX}) - +vcpkg_check_features(OUT_FEATURE_OPTIONS OPTIONS + FEATURES + tools OPENEXR_BUILD_TOOLS + tools OPENEXR_INSTALL_TOOLS +) +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + ${OPTIONS} + -DBUILD_TESTING=OFF + -DOPENEXR_INSTALL_EXAMPLES=OFF + -DBUILD_DOCS=OFF + OPTIONS_DEBUG + -DOPENEXR_BUILD_TOOLS=OFF + -DOPENEXR_INSTALL_TOOLS=OFF +) +vcpkg_cmake_install() vcpkg_copy_pdbs() -if (OPENEXR_STATIC) - file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) -endif() +vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/OpenEXR) +vcpkg_fixup_pkgconfig() -if (VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(OPENEXR_PORT_DIR "openexr") -else() - set(OPENEXR_PORT_DIR "OpenEXR") +if(OPENEXR_INSTALL_TOOLS) + vcpkg_copy_tools( + TOOL_NAMES exrenvmap exrheader exrinfo exrmakepreview exrmaketiled exrmultipart exrmultiview exrstdattr exr2aces + AUTO_CLEAN + ) endif() -file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${OPENEXR_PORT_DIR}) -file(RENAME ${CURRENT_PACKAGES_DIR}/share/${OPENEXR_PORT_DIR}/LICENSE ${CURRENT_PACKAGES_DIR}/share/${OPENEXR_PORT_DIR}/copyright) +file(REMOVE_RECURSE + "${CURRENT_PACKAGES_DIR}/debug/include" + "${CURRENT_PACKAGES_DIR}/debug/share" +) -file(COPY ${CMAKE_CURRENT_LIST_DIR}/FindOpenEXR.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/${OPENEXR_PORT_DIR}) +file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") +file(INSTALL "${SOURCE_PATH}/LICENSE.md" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) diff --git a/cmake/ports/openexr/usage b/cmake/ports/openexr/usage new file mode 100644 index 00000000000..6b09d9db5fc --- /dev/null +++ b/cmake/ports/openexr/usage @@ -0,0 +1,4 @@ +openexr provides CMake targets: + + find_package(OpenEXR CONFIG REQUIRED) + target_link_libraries(main PRIVATE OpenEXR::OpenEXR) diff --git a/cmake/ports/openexr/vcpkg.json b/cmake/ports/openexr/vcpkg.json new file mode 100644 index 00000000000..7f35bfac691 --- /dev/null +++ b/cmake/ports/openexr/vcpkg.json @@ -0,0 +1,25 @@ +{ + "name": "openexr", + "version": "3.1.8", + "description": "OpenEXR is a high dynamic-range (HDR) image file format developed by Industrial Light & Magic for use in computer imaging applications", + "homepage": "https://www.openexr.com/", + "license": "BSD-3-Clause", + "supports": "!uwp", + "dependencies": [ + "imath", + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + }, + "zlib" + ], + "features": { + "tools": { + "description": "Build tools" + } + } +} diff --git a/libraries/image/src/image/OpenEXRReader.cpp b/libraries/image/src/image/OpenEXRReader.cpp index 66e304e3fa5..d1af1c96212 100644 --- a/libraries/image/src/image/OpenEXRReader.cpp +++ b/libraries/image/src/image/OpenEXRReader.cpp @@ -23,6 +23,7 @@ #include #include #include +#include class QIODeviceImfStream : public Imf::IStream { public: @@ -39,11 +40,11 @@ class QIODeviceImfStream : public Imf::IStream { return true; } - Imf::Int64 tellg() override { + uint64_t tellg() override { return _device.pos(); } - void seekg(Imf::Int64 pos) override { + void seekg(uint64_t pos) override { _device.seek(pos); } @@ -76,7 +77,7 @@ image::Image image::readOpenEXR(QIODevice& content, const std::string& filename) Image image{ width, height, Image::Format_PACKED_FLOAT }; auto packHDRPixel = getHDRPackingFunction(); - + for (int y = 0; y < height; y++) { const auto srcScanline = pixels[y]; gpu::uint32* dstScanline = (gpu::uint32*) image.editScanLine(y);