diff --git a/.devcontainer/security/Dockerfile b/.devcontainer/security/Dockerfile index 64bf100ad7d..dd866a48316 100644 --- a/.devcontainer/security/Dockerfile +++ b/.devcontainer/security/Dockerfile @@ -13,6 +13,7 @@ RUN git clone --depth 1 https://github.com/strukturag/libheif RUN git clone --depth 1 https://github.com/uclouvain/openjpeg RUN git clone --depth 1 https://github.com/webmproject/libwebp RUN git clone --depth 1 https://github.com/madler/zlib +RUN git clone --depth 1 https://github.com/ebiggers/libdeflate RUN git clone --depth 1 https://github.com/libjpeg-turbo/libjpeg-turbo RUN git clone --depth 1 https://github.com/xz-mirror/xz RUN git clone --depth 1 https://github.com/libraw/libraw @@ -23,7 +24,7 @@ RUN git clone --depth 1 https://gitlab.com/federicomenaquintero/bzip2.git RUN git clone --depth 1 --recursive https://github.com/libjxl/libjxl RUN git -c http.sslVerify=false clone https://www.cl.cam.ac.uk/~mgk25/git/jbigkit -ADD Magick++/fuzz/build_dependencies.sh build_dependencies.sh +ADD oss-fuzz/build_dependencies.sh build_dependencies.sh ENV SRC=/ImageMagick/dependencies ENV WORK=/ImageMagick diff --git a/.devcontainer/security/build_imagemagick.sh b/.devcontainer/security/build_imagemagick.sh index 7da14c34e59..a0c4bca22c7 100644 --- a/.devcontainer/security/build_imagemagick.sh +++ b/.devcontainer/security/build_imagemagick.sh @@ -1,6 +1,6 @@ #!/bin/bash -eu -./Magick++/fuzz/build_imagemagick.sh +./oss-fuzz/build_imagemagick.sh cat <> /ImageMagick/etc/ImageMagick-7/policy.xml diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index ac500d44787..febb1d83ed8 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -8,6 +8,8 @@ on: pull_request: branches: - main + paths: + - '.github/workflows/app-image.yml' permissions: contents: write @@ -18,7 +20,7 @@ jobs: name: 'Create AppImage' runs-on: ubuntu-latest container: - image: ubuntu:18.04 + image: ubuntu:20.04 options: --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined strategy: @@ -27,27 +29,26 @@ jobs: include: - compiler: gcc cxx_compiler: g++ + packages: gcc g++ - compiler: clang cxx_compiler: clang++ + packages: clang steps: - name: Install dependencies run: | set -e - apt-get update -y - apt-get install -y autoconf curl fuse git kmod libbz2-dev libdjvulibre-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev liblcms-dev libopenexr-dev libopenjp2-7-dev libturbojpeg0-dev liblqr-dev libraqm-dev libtiff-dev libwebp-dev libx11-dev libxml2-dev liblzma-dev software-properties-common wget + export DEBIAN_FRONTEND=noninteractive + apt update -y + apt install -y autoconf curl fuse git kmod libbz2-dev libdjvulibre-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev liblcms-dev libopenexr-dev libopenjp2-7-dev libturbojpeg0-dev liblqr-dev libraqm-dev libtiff-dev libwebp-dev libx11-dev libxml2-dev liblzma-dev make software-properties-common wget ${{ matrix.packages }} add-apt-repository ppa:git-core/ppa -y - apt-get install -y git + apt install -y git add-apt-repository ppa:strukturag/libheif -y add-apt-repository ppa:strukturag/libde265 -y - apt-get install libheif-dev -y + apt install libheif-dev -y - name: Checkout - uses: actions/checkout@v3 - - - name: Install ${{ matrix.compiler }} - if: matrix.compiler == 'clang' - run: apt-get install -y ${{ matrix.compiler }} + uses: actions/checkout@v4 - name: Download AppImage run: | @@ -90,7 +91,7 @@ jobs: find /appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - name: Upload ImageMagick AppImage - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: AppImage-${{ matrix.compiler }} path: artifacts @@ -104,7 +105,7 @@ jobs: steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: artifacts diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 208a56963fd..faee24d8b7a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -20,7 +20,7 @@ jobs: modules: [ 'with-modules', 'without-modules' ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 2 @@ -31,7 +31,7 @@ jobs: echo "" > config.status - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: cpp @@ -40,4 +40,4 @@ jobs: make - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index ad3cb3d2a65..73b49c046e5 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -32,7 +32,7 @@ jobs: mv ChangeLog.md artifacts/ChangeLog.md - name: Upload ChangeLog.md - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ChangeLog path: artifacts @@ -76,7 +76,7 @@ jobs: apt-get install -y autoconf libfontconfig1-dev libfreetype6-dev libltdl-dev make pkg-config ${{ matrix.packages }} - name: Clone msttcorefonts - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ImageMagick/msttcorefonts ref: refs/heads/main @@ -86,7 +86,7 @@ jobs: set -e ./install.sh - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Configure ImageMagick env: @@ -130,7 +130,7 @@ jobs: steps: - name: Clone ImageMagick-Windows - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -143,7 +143,7 @@ jobs: CloneRepositories.cmd https://github.com/ImageMagick shallow - name: Download ChangeLog.md - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ChangeLog path: ImageMagick-Windows\ImageMagick @@ -181,7 +181,7 @@ jobs: steps: - name: Clone ImageMagick-Windows - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -232,9 +232,9 @@ jobs: - name: Prepare git run: git config --global core.autocrlf false - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 219c1fb4c44..05d92495c01 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: packages: clang steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install dependencies run: | @@ -62,7 +62,7 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install dependencies run: | @@ -92,11 +92,11 @@ jobs: platform: [ x86, x64, arm64 ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: path: ImageMagick - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -136,9 +136,9 @@ jobs: - name: Prepare git run: git config --global core.autocrlf false - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 029a86a1471..7f99f105c42 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -37,7 +37,7 @@ jobs: mv ChangeLog.md artifacts/ChangeLog.md - name: Upload ChangeLog.md - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ChangeLog path: artifacts @@ -73,7 +73,7 @@ jobs: hdri_flag: '-HDRI' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -86,7 +86,7 @@ jobs: CloneRepositories.cmd https://github.com/ImageMagick shallow - name: Download ChangeLog.md - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ChangeLog path: ImageMagick-Windows\ImageMagick @@ -184,9 +184,19 @@ jobs: timestamp-digest: SHA256 timeout: 600 - - uses: actions/upload-artifact@v3 + - name: Get version + id: version + shell: pwsh + run: | + $version = (cat "ImageMagick-Windows\VisualMagick\installer\inc\version.isx" | Select-String "MagickPackageFullVersionText") | Out-String + $version = ($version | Select-String '".*"' -AllMatches | Select -Expand Matches | Select -Expand Value | Out-String) + $version = $version -Replace "`n|`r|""","" + $version = $version -Replace " ","-" + echo "version=$version" >> $env:GITHUB_OUTPUT + + - uses: actions/upload-artifact@v4 with: - name: installers + name: 'ImageMagick-${{steps.version.outputs.version}}-installer-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.platform}}' path: 'ImageMagick-Windows\VisualMagick\installer\output' release_windows_source: @@ -196,7 +206,7 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -209,7 +219,7 @@ jobs: CloneRepositories.cmd https://github.com/ImageMagick source - name: Download ChangeLog.md - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ChangeLog path: ImageMagick-Windows\ImageMagick @@ -220,7 +230,7 @@ jobs: cd ImageMagick-Windows 7z a ImageMagick-Windows.7z .\source\* - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: ImageMagick-Windows path: 'ImageMagick-Windows\ImageMagick-Windows.7z' @@ -251,7 +261,7 @@ jobs: hdri_flag: '-HDRI' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -264,7 +274,7 @@ jobs: CloneRepositories.cmd https://github.com/ImageMagick shallow - name: Download ChangeLog.md - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ChangeLog path: ImageMagick-Windows\ImageMagick @@ -339,7 +349,7 @@ jobs: $version = $version -Replace " ","-" echo "version=$version" >> $env:GITHUB_OUTPUT - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: 'ImageMagick-${{steps.package.outputs.version}}-portable-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}' path: portable diff --git a/CMakeLists.txt b/CMakeLists.txt index 874be1f887f..c9f94cbd2c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,514 +11,104 @@ # under the License. # # CMake script file to build ImageMagick -# +# cmake_minimum_required(VERSION 3.19.0) -cmake_policy(VERSION 3.19.0) - -project(ImageMagick) - -include(cmake/checks.cmake) - -macro(magick_find_delegate) - cmake_parse_arguments(MAGICK_FIND "" "DELEGATE;NAME;DEFAULT" "TARGETS" ${ARGN}) - - if((NOT DEFINED ${MAGICK_FIND_DELEGATE} AND ${MAGICK_FIND_DEFAULT}) OR ${MAGICK_FIND_DELEGATE}) - find_package(${MAGICK_FIND_NAME} QUIET) - set(${MAGICK_FIND_DELEGATE} ${${MAGICK_FIND_NAME}_FOUND}) - if(${MAGICK_FIND_DELEGATE}) - message("Delegate ${MAGICK_FIND_NAME} found.") - if(MAGICK_FIND_TARGETS) - set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} ${MAGICK_FIND_TARGETS}) - else() - set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} ${MAGICK_FIND_NAME}::${MAGICK_FIND_NAME}) - endif() - else() - message("Delegate ${MAGICK_FIND_NAME} disabled. (Not found)") - endif() - else() - set(${MAGICK_FIND_DELEGATE} FALSE) - message("Delegate ${MAGICK_FIND_NAME} disabled.") - endif() -endmacro() - -# Get the platform -if(WIN32) - if(NOT WINDOWS) - set(WINDOWS TRUE) - endif() - # TODO check for mingw or cygwin ??? -elseif(UNIX AND NOT APPLE) - if(CMAKE_SYSTEM_NAME MATCHES ".*Linux") - set(LINUX TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*") - set(FREEBSD TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") - set(NETBSD TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") - set(OPENBSD TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") - set(GNU TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") - set(BSDI TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") - set(FREEBSD TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") - set(SYSV5 TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*") - set(SOLARIS TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") - set(HPUX TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*") - set(AIX TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*") - set(MINIX TRUE) - endif() -elseif(APPLE) - if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*") - set(DARWIN TRUE) - elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*") - set(MACOSX TRUE) - endif() - # TODO: iOS? -elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*") - set(BEOS TRUE) -elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*") - set(HAIKU TRUE) -endif() - -# if we're on MacOS X we enable the universal build -if(APPLE) - set(AC_APPLE_UNIVERSAL_BUILD TRUE) -endif() +project(ImageMagick LANGUAGES C) -magick_check_env() +include(cmake/platform_vars.cmake) ####### OPTIONS ####### set(MAGICKCORE_QUANTUM_DEPTH "16" CACHE STRING "Number of bits in a pixel Quantum") set_property(CACHE MAGICKCORE_QUANTUM_DEPTH PROPERTY STRINGS "8;16;32;64") -set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -DMAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) - option(MAGICK_BUILD_STATIC "Build ImageMagick statically" FALSE) -if(MAGICK_BUILD_STATIC) - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -D_LIB) -else() - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -D_DLL) -endif() - option(MAGICK_HDRI_ENABLE "Build ImageMagick with High dynamic-range imaging" TRUE) -if(MAGICK_HDRI_ENABLE) - set(HDRI_SUFFIX HDRI) - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -DMAGICKCORE_HDRI_ENABLE=1) -else() - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -DMAGICKCORE_HDRI_ENABLE=0) -endif() - option(BUILD_MAGICKPP "Enable build/install of Magick++" TRUE) option(BUILD_UTILITIES "Enable build/install of command-line utilities" TRUE) +option(BUILD_TESTS "Build test executables" TRUE) option(BUILD_MODULES "Compile coders and filters as modules" FALSE) # TODO option(CIPHER_SUPPORT "Permit enciphering and deciphering image pixels" TRUE) option(EXCLUDE_DEPRECATED "Exclude deprecated methods" TRUE) set(NAMESPACE_PREFIX "" CACHE STRING "Prefix MagickCore API methods") -set(NAMESPACE_PREFIX_TAG ${NAMESPACE_PREFIX}) -set(PixelCacheThreshold "" CACHE STRING "Set pixel cache threshhold in MB (default available memory)") +set(PixelCacheThreshold "" CACHE STRING "Set pixel cache threshold in MB (default available memory)") option(WITH_DMALLOC "Use dmalloc for memory profiling" FALSE) option(ZERO_CONFIGURATION_SUPPORT "Build self-contained, embeddable, zero-configuration ImageMagick" FALSE) +option(DPC_SUPPORT "Enable distributed pixel cache support" TRUE) +option(WITH_64BIT_CHANNEL_MASK_SUPPORT "Enable 64-bit channel masks" FALSE) +set(SECURITY_POLICY "open" CACHE STRING "Set the security policy variant to enforce") +set_property(CACHE SECURITY_POLICY PROPERTY STRINGS "open;limited;secure;websafe") -# Fetch some needed values from version.sh and fill the correspondent variables -file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure CONTENT_CONFIGURE) - -# Try to find the date in the format yyyy-mm-dd -string(REGEX MATCH "\nPACKAGE_RELEASE_DATE=([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])\n" FOUND_LAST_CHANGE_DATE "${CONTENT_CONFIGURE}") -if(FOUND_LAST_CHANGE_DATE) - set(PACKAGE_RELEASE_DATE ${CMAKE_MATCH_1}) -endif() - -# Try to find `PACKAGE_NAME' -string(REGEX MATCH "\nPACKAGE_NAME='([A-Za-z0-9]+)'\n" FOUND_PACKAGE_NAME ${CONTENT_CONFIGURE}) -if(FOUND_PACKAGE_NAME) - set(PACKAGE_NAME ${CMAKE_MATCH_1}) -endif() - -# Try to find `PACKAGE_LIB_VERSION' -string(REGEX MATCH "\nPACKAGE_LIB_VERSION=([A-Fa-f0-9x]+)\n" FOUND_PACKAGE_LIB_VERSION ${CONTENT_CONFIGURE}) -if(FOUND_PACKAGE_LIB_VERSION) - set(PACKAGE_LIB_VERSION ${CMAKE_MATCH_1}) -endif() - -# Try to find `PACKAGE_VERSION' -string(REGEX MATCH "\nPACKAGE_BASE_VERSION=([0-9.]+)\n" FOUND_PACKAGE_VERSION ${CONTENT_CONFIGURE}) -if(FOUND_PACKAGE_VERSION) - set(MAGICK_LIB_VERSION_TEXT ${CMAKE_MATCH_1}) - set(MAGICKPP_LIB_VERSION_TEXT ${CMAKE_MATCH_1}) -endif() - -# Try parse just the major version number from MAGICK_LIB_VERSION_TEXT -string(REGEX MATCH "([0-9])\\..*" FOUND_VERSION_MAJOR "${MAGICK_LIB_VERSION_TEXT}") -if(FOUND_VERSION_MAJOR) - set(MAGICK_VERSION_MAJOR ${CMAKE_MATCH_1}) -endif() - -# Try to find `MAGICK_LIBRARY_CURRENT', `MAGICK_LIBRARY_REVISION' and `MAGICK_LIBRARY_AGE' -string(REGEX MATCH "\nMAGICK_LIBRARY_CURRENT=([0-9]+)\nMAGICK_LIBRARY_REVISION=([0-9]+)\nMAGICK_LIBRARY_AGE=([0-9]+)\n" FOUND_MAGICK_LIB_VERSION_NUMBER ${CONTENT_CONFIGURE}) -if(FOUND_MAGICK_LIB_VERSION_NUMBER) - set(MAGICK_LIB_VERSION_NUMBER "${CMAKE_MATCH_1},${CMAKE_MATCH_2},${CMAKE_MATCH_3}") - set(MAGICK_LIBRARY_CURRENT ${CMAKE_MATCH_1}) - set(MAGICK_LIBRARY_CURRENT_MIN ${CMAKE_MATCH_1}) -endif() - -# Try to find `PACKAGE_RELEASE' -string(REGEX MATCH "\nPACKAGE_VERSION_ADDENDUM=-([0-9]+)\n" FOUND_PACKAGE_RELEASE ${CONTENT_CONFIGURE}) -if(FOUND_PACKAGE_RELEASE) - set(PACKAGE_VERSION_ADDENDUM "-${CMAKE_MATCH_1}") -endif() +add_compile_definitions(MAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) +set(QUANTUM_DEPTH_OBSOLETE_IN_H ${MAGICKCORE_QUANTUM_DEPTH}) -# Try to find `MAGICKPP_LIBRARY_CURRENT', `MAGICKPP_LIBRARY_REVISION' and `MAGICKPP_LIBRARY_AGE' -string(REGEX MATCH "\nMAGICKPP_LIBRARY_CURRENT=([0-9]+)\nMAGICKPP_LIBRARY_REVISION=([0-9]+)\nMAGICKPP_LIBRARY_AGE=([0-9]+)\n" FOUND_MAGICKPP_LIBRARY_VERSION_INFO ${CONTENT_CONFIGURE}) -if(FOUND_MAGICKPP_LIBRARY_VERSION_INFO) - set(MAGICKPP_LIBRARY_VERSION_INFO "${CMAKE_MATCH_1}:${CMAKE_MATCH_2}:${CMAKE_MATCH_3}") - set(MAGICKPP_LIBRARY_CURRENT ${CMAKE_MATCH_1}) - set(MAGICKPP_LIBRARY_CURRENT_MIN ${CMAKE_MATCH_1}) -endif() - -# TODO -set(VERSION "") -set(MAGICK_TARGET_CPU "") -set(MAGICK_TARGET_OS "") -set(MAGICK_TARGET_VENDOR "") -set(PACKAGE "") -set(PACKAGE_BUGREPORT "") -set(PACKAGE_STRING "") -set(PACKAGE_TARNAME "") -set(PACKAGE_URL "") -set(PACKAGE_VERSION "") - -# Set if pipe (|) is enabled on filenames -# TODO Add linux and mac os X -# TODO maybe this would be better with a test somehow -if(WIN32) - set(PIPES_SUPPORT FALSE) -endif() - -# Check if we are on AIX, do the _ALL_SOURCE magic -if(AIX) - set(_ALL_SOURCE 1) - set(_LARGE_FILES 1) +if(MAGICK_BUILD_STATIC) + add_compile_definitions(_LIB) + set(BUILD_SHARED_LIBS FALSE) +else() + add_compile_definitions(_DLL) + set(BUILD_SHARED_LIBS TRUE) endif() -# Check if we're on Solaris -IF (SOLARIS) - set(_POSIX_PTHREAD_SEMANTICS TRUE) - set(__EXTENSIONS__ TRUE) - # TODO restrict the system version and check if the define should be these - set(_UINT32_T uint32_t) - set(_UINT64_T uint64_t) - set(_UINT8_T uint8_t) +if(MAGICK_HDRI_ENABLE) + set(HDRI_SUFFIX HDRI) + add_compile_definitions(MAGICKCORE_HDRI_ENABLE=1) +else() + add_compile_definitions(MAGICKCORE_HDRI_ENABLE=0) endif() -# TODO Not sure how to test this, so for now it's disabled -set(_TANDEM_SOURCE FALSE) - -# TODO check if this is supposed to be any of the ones defined https://cmake.org/cmake/help/v3.0/module/FindX11.html -set(X11_CONFIGURE_PATH "") - -# TODO should this be an option ?? -set(X_DISPLAY_MISSING 1) +set(NAMESPACE_PREFIX_TAG ${NAMESPACE_PREFIX}) -# TODO does this suffice? -if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW) - set(_FILE_OFFSET_BITS 64) - set(_LARGEFILE_SOURCE 1) +if(WITH_64BIT_CHANNEL_MASK_SUPPORT) + set(CHANNEL_MASK_DEPTH 64) else() -# Not sure on Windows if code is made to work with 64 bits - set(_FILE_OFFSET_BITS 32) + set(CHANNEL_MASK_DEPTH 32) endif() -# Disable run-time bounds-checking -set(_FORTIFY_SOURCE FALSE) - -####### PATHS ####### -# TODO Configure these correctly -set(CODER_DIRNAME "") -set(CONFIGURE_PATH "") -set(CONFIGURE_RELATIVE_PATH "\"ImageMagick-7\"") -set(DOCUMENTATION_PATH "") -set(EXECUTABLE_PATH "") -set(FILTER_DIRNAME "") -set(INCLUDEARCH_PATH "") -set(INCLUDE_PATH "") -set(INSTALLED_SUPPORT "") -set(LIBRARY_PATH "\"ImageMagick-7\"") -set(LIBRARY_RELATIVE_PATH "\"ImageMagick-7\"") -set(LIB_BIN_BASEDIRNAME "") -set(SHAREARCH_BASEDIRNAME "") -set(SHAREARCH_DIRNAME "") -set(SHARE_PATH "") -set(SHARE_RELATIVE_PATH "\"ImageMagick-7\"") -set(MODULES_BASEDIRNAME "") -set(MODULES_DIRNAME "") -set(LT_OBJDIR "") +message(STATUS "Security policy variant to enforce: ${SECURITY_POLICY}") -# Set the default font search path -if(WIN32) - set(MAGICK_FONT_PATH "\"$ENV{WINDIR}\\FONTS\\\"") - # Escape the path C way where '\' must be '\\' (regex and cmake also escapes '\' so to find one we need '\\\\') - string(REGEX REPLACE "\\\\" "\\\\\\\\" MAGICK_FONT_PATH ${MAGICK_FONT_PATH}) -elseif(UNIX AND NOT APPLE) - set(MAGICK_FONT_PATH "/usr/share/fonts/") -elseif(APPLE) - set(MAGICK_FONT_PATH "/System/Library/Fonts/") +if(BUILD_MAGICKPP) + enable_language(CXX) endif() ####### DELEGATES ####### -magick_find_delegate(DELEGATE BZLIB_DELEGATE NAME BZip2 DEFAULT TRUE) -magick_find_delegate(DELEGATE LZMA_DELEGATE NAME LibLZMA DEFAULT TRUE) -magick_find_delegate(DELEGATE ZLIB_DELEGATE NAME ZLIB DEFAULT TRUE) -magick_find_delegate(DELEGATE ZSTD_DELEGATE NAME zstd DEFAULT TRUE) -magick_find_delegate(DELEGATE FREETYPE_DELEGATE NAME Freetype DEFAULT TRUE) -magick_find_delegate(DELEGATE XML_DELEGATE NAME LibXml2 DEFAULT TRUE) - -magick_find_delegate(DELEGATE OPENMP_SUPPORT NAME OpenMP DEFAULT TRUE TARGETS OpenMP::OpenMP_C) -if(OPENMP_SUPPORT) - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -D_OPENMP=${OpenMP_C_SPEC_DATE}) -endif() - -magick_find_delegate(DELEGATE THREADS_SUPPORT NAME Threads DEFAULT TRUE TARGETS) -if(CMAKE_USE_PTHREADS_INIT) - set(THREAD_SUPPORT TRUE) - set(CMAKE_THREAD_PREFER_PTHREAD TRUE) - set(THREADS_PREFER_PTHREAD_FLAG TRUE) - set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} Threads::Threads) -endif() -CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H) -if(HAVE_PTHREAD_H) - CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_PTHREAD) - CHECK_SYMBOL_EXISTS(PTHREAD_PRIO_INHERIT pthread.h HAVE_PTHREAD_PRIO_INHERIT) -endif() -# TODO Not sure what to do here -set(PTHREAD_CREATE_JOINABLE "") - -magick_find_delegate(DELEGATE TIFF_DELEGATE NAME TIFF DEFAULT TRUE) -if(TIFF_FOUND) - set(HAVE_TIFFCONF_H 1) - set(HAVE_TIFFISBIGENDIAN 1) - set(HAVE_TIFFISCODECCONFIGURED 1) - set(HAVE_TIFFMERGEFIELDINFO 1) - set(HAVE_TIFFREADEXIFDIRECTORY 1) - set(HAVE_TIFFSETERRORHANDLEREXT 1) - set(HAVE_TIFFSETTAGEXTENDER 1) - set(HAVE_TIFFSETWARNINGHANDLEREXT 1) - set(HAVE_TIFFSWABARRAYOFTRIPLES 1) -endif() -magick_find_delegate(DELEGATE LCMS_DELEGATE NAME lcms DEFAULT TRUE) -if(LCMS_FOUND) - set(HAVE_LCMS2_H 1) -endif() -magick_find_delegate(DELEGATE RAW_R_DELEGATE NAME libraw DEFAULT TRUE) -if(LIBRAW_FOUND) - set(HAVE_LIBRAW_LIBRAW_H 1) -endif() -magick_find_delegate(DELEGATE HEIC_DELEGATE NAME libheif DEFAULT TRUE) -if(LIBHEIF_FOUND) - set(HAVE_LIBHEIF_LIBHEIF_H 1) -endif() +include(cmake/delegates.cmake) -magick_find_delegate(DELEGATE JBIG_DELEGATE NAME JBIG DEFAULT TRUE) -magick_find_delegate(DELEGATE JPEG_DELEGATE NAME JPEG DEFAULT TRUE) -magick_find_delegate(DELEGATE LIBOPENJP2_DELEGATE NAME OpenJPEG DEFAULT TRUE) -magick_find_delegate(DELEGATE OPENEXR_DELEGATE NAME OpenEXR DEFAULT TRUE) -magick_find_delegate(DELEGATE PNG_DELEGATE NAME PNG DEFAULT TRUE) -magick_find_delegate(DELEGATE RSVG_DELEGATE NAME Rsvg DEFAULT TRUE) -magick_find_delegate(DELEGATE WEBP_DELEGATE NAME WebP DEFAULT TRUE) -magick_find_delegate(DELEGATE JXL_DELEGATE NAME libjxl DEFAULT TRUE) - -# TODO are these correct and should they be off by default? -magick_find_delegate(DELEGATE AUTOTRACE_DELEGATE NAME AUTOTRACE DEFAULT FALSE) -magick_find_delegate(DELEGATE CAIRO_DELEGATE NAME Cairo DEFAULT FALSE) -magick_find_delegate(DELEGATE DJVU_DELEGATE NAME DJVU DEFAULT FALSE) -magick_find_delegate(DELEGATE DPS_DELEGATE NAME DPS DEFAULT FALSE) -magick_find_delegate(DELEGATE FFTW_DELEGATE NAME FFTW DEFAULT FALSE) -magick_find_delegate(DELEGATE FLIF_DELEGATE NAME FLIF DEFAULT FALSE) -magick_find_delegate(DELEGATE FONTCONFIG_DELEGATE NAME Fontconfig DEFAULT FALSE) -magick_find_delegate(DELEGATE FPX_DELEGATE NAME FlashPIX DEFAULT FALSE) -magick_find_delegate(DELEGATE GS_DELEGATE NAME Ghostscript DEFAULT FALSE) -magick_find_delegate(DELEGATE GVC_DELEGATE NAME GVC DEFAULT FALSE) -magick_find_delegate(DELEGATE LTDL_DELEGATE NAME LTDL DEFAULT FALSE) -# TODO -set(LTDL_MODULE_EXT "") -magick_find_delegate(DELEGATE PANGO_DELEGATE NAME Pango DEFAULT FALSE) -magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME PangoCairo DEFAULT FALSE) -magick_find_delegate(DELEGATE RAQM_DELEGATE NAME RAQM DEFAULT FALSE) -magick_find_delegate(DELEGATE WEBPMUX_DELEGATE NAME WEBPMUX DEFAULT FALSE) -magick_find_delegate(DELEGATE WMF_DELEGATE NAME WMF DEFAULT FALSE) -magick_find_delegate(DELEGATE LQR NAME Lqr DEFAULT FALSE) - -magick_find_delegate(DELEGATE HasJEMALLOC NAME Jemalloc DEFAULT FALSE) -magick_find_delegate(DELEGATE HasUMEM NAME UMEM DEFAULT FALSE) - -magick_find_delegate(DELEGATE OPENCLLIB_DELEGATE NAME OpenCL DEFAULT FALSE) -if(OpenCL_FOUND) - set(_OPENCL 1) - CHECK_INCLUDE_FILE(OpenCL/cl.h HAVE_OPENCL_CL_H) - CHECK_INCLUDE_FILE(CL/cl.h HAVE_CL_CL_H) -endif() - -# TODO Should we check if gdi32 exists if windows? -if(WIN32) - set(WINGDI32_DELEGATE TRUE) -endif() +####### CONFIG ####### +include(cmake/configure.cmake) -# Compile with X11 if present -magick_find_delegate(DELEGATE X11_DELEGATE NAME X11 DEFAULT TRUE) -if(X11_DELEGATE) - set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} X11::Xext) -endif() +####### BUILD ####### # Set ImageMagick base dir to be used inside sub-projects set(IMAGEMAGICK_BASE_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) -# Set coders andd filters path +# Set coders and filters path set(CODERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) -set(IMAGEMAGICK_INC_DIR "include/ImageMagick-${MAGICK_VERSION_MAJOR}") - -####### CONFIG ####### -# Set the version.h file path to be autogenerated -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/MagickCore/version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/MagickCore/version.h) - -if(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 8) - set(MagickQuantumDepth "Q8") -elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 16) - set(MagickQuantumDepth "Q16") -elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 32) - set(MagickQuantumDepth "Q32") -elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 64) - set(MagickQuantumDepth "Q64") -else() - set(MagickQuantumDepth "Q?") -endif() - -# rc files are only used on Windows binaries -if(WIN32) - set(MagickLibVersionNumber ${MAGICK_LIB_VERSION_NUMBER}) - set(MagickLibVersionText \"${MAGICK_LIB_VERSION_TEXT}\") - - if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) - set(MagickPlatform "x86") - elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 8) - set(MagickPlatform "x64") - else() - set(MagickPlatform ${MAGICK_TARGET_CPU}) - endif() - - # Read the version.h file so we can get some needed values using regex - file(READ ${CMAKE_CURRENT_BINARY_DIR}/MagickCore/version.h CONTENT_VERSION_H) - - # Try to find `MagickCopyright' - string(REGEX MATCH "\n#define[ ]+MagickCopyright[ ]+\"([^\"]+)\"\n" FOUND_MAGICK_COPYRIGHT ${CONTENT_VERSION_H}) - if(FOUND_MAGICK_COPYRIGHT) - set(MagickCopyright \"${CMAKE_MATCH_1}\") - endif() - - # Try to find `MagickAuthoritativeURL' - string(REGEX MATCH "\n#define[ ]+MagickAuthoritativeURL[ ]+\"([^\"]+)\"\n" FOUND_MAGICK_AUTHORITATIVE_URL ${CONTENT_VERSION_H}) - if(FOUND_MAGICK_AUTHORITATIVE_URL) - set(MagickAuthoritativeURL ${CMAKE_MATCH_1}) - endif() - - set(MagickVersion "\"${PACKAGE_NAME} ${MAGICK_LIB_VERSION_TEXT}${PACKAGE_VERSION_ADDENDUM} ${MagickQuantumDepth} ${MagickPlatform} ${PACKAGE_RELEASE_DATE} ${MagickAuthoritativeURL}\"") - - # Set the ImageMagick.rc file path to be autogenerated - set(MAGICK_RESOURCE_FILE_PATH ${CMAKE_CURRENT_BINARY_DIR}/config/resources/ImageMagick.rc) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/ImageMagick.rc.cmake ${MAGICK_RESOURCE_FILE_PATH}) - # Copy only the needed resource files to output directory - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/images/ImageMagick.ico ${CMAKE_CURRENT_BINARY_DIR}/images/ImageMagick.ico COPYONLY) -endif() - -# Before making the config.h we still need to do somethings -set(PACKAGE_NAME \"${PACKAGE_NAME}\") - -# Set the config.h file path to be autogenerated -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config/config.h) - -# Now we need to read its content to generate the magick-baseconfig.h header -file(READ ${CMAKE_CURRENT_BINARY_DIR}/config/config.h CONTENT_CONFIG_H) - -# Now we need to Regex Replace some things in the header file -# All caps defines will be prefixed with a macro MAGICKCORE_ -string(REGEX REPLACE - "\\*\\/\n#define[ ]+([A-Z0-9_]+)[ ]*([a-zA-Z0-9\":\\\-]*)\n" - "*/\n#ifndef MAGICKCORE_\\1\n#define MAGICKCORE_\\1 \\2\n#endif\n" - CONTENT_CONFIG_H ${CONTENT_CONFIG_H} -) -# All uncaps defines will be prefixed with a macro _magickcore_ -string(REGEX REPLACE - "\\*\\/\n#define[ ]+([a-z0-9_]+)[ ]*([a-zA-Z0-9 \"_]*)\n" - "*/\n#ifndef _magickcore_\\1\n#define _magickcore_\\1 \\2\n#endif\n" - CONTENT_CONFIG_H ${CONTENT_CONFIG_H} -) -# For some reason (I can't seem to find the logic) there's some defines we need to remove the prefix -string(REGEX REPLACE - "_magickcore___func__" - "__func__" - CONTENT_CONFIG_H ${CONTENT_CONFIG_H} -) -# Also for ssize_t we need to typedef instead of define or else magick++ will not compile -string(REGEX REPLACE - "#ifndef _magickcore_ssize_t\n#define _magickcore_ssize_t ([a-zA-Z ]*)\n#endif" - "typedef \\1 ssize_t;" - CONTENT_CONFIG_H ${CONTENT_CONFIG_H} -) - -# Now we need to append things to the previously read file content -set(CONTENT_CONFIG_H -"#ifndef _MAGICKCORE_MAGICK_BASECONFIG_H -#define _MAGICKCORE_MAGICK_BASECONFIG_H 1 - -/* MagickCore/magick-baseconfig.h. Generated automatically at end of configure. */ -/* config/config.h. Generated from config.h.cmake by CMake. */ -${CONTENT_CONFIG_H} - -/* once: _MAGICKCORE_MAGICK_BASECONFIG_H */ -#endif -" -) - -# Create the magick-baseconfig.h file -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/MagickCore/magick-baseconfig.h "${CONTENT_CONFIG_H}") - -if(ZERO_CONFIGURATION_SUPPORT) - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/config/thresholds.xml THRESHOLD_XML) - # Convert xml file to header - string(REPLACE "\"" "\\\"" THRESHOLD_XML "${THRESHOLD_XML}") - string(REGEX REPLACE "\n" "\"\n \"" THRESHOLD_XML "${THRESHOLD_XML}") - set(THRESHOLD_H "static const char *const\n BuiltinMap=\n \"${THRESHOLD_XML}") - string(LENGTH ${THRESHOLD_H} THRESHOLD_H_LEN) - math(EXPR THRESHOLD_H_LEN "${THRESHOLD_H_LEN} - 6") - string(SUBSTRING ${THRESHOLD_H} 0 ${THRESHOLD_H_LEN} THRESHOLD_H) - set(THRESHOLD_H "${THRESHOLD_H};\n") -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/MagickCore/threshold-map.h "${THRESHOLD_H}") -endif() - # Set the binaries name -set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MagickQuantumDepth}${HDRI_SUFFIX}") -set(MAGICKCORE_BINARY_NAME "MagickCore-${MAGICK_BINARY_SUFFIX}") -set(MAGICKWAND_BINARY_NAME "MagickWand-${MAGICK_BINARY_SUFFIX}") -set(MAGICKXX_BINARY_NAME "Magick++-${MAGICK_BINARY_SUFFIX}") -set(MAGICK_BINARY_NAME "Magick") +set(MAGICK_BINARY_SUFFIX "${PACKAGE_MAJOR_VERSION}.${MAGICK_ABI_SUFFIX}") # Add the subdirectories to be compiled -add_subdirectory("MagickCore") -add_subdirectory("MagickWand") +add_subdirectory(config) +add_subdirectory(MagickCore) +add_subdirectory(MagickWand) if(BUILD_MAGICKPP) - add_subdirectory("Magick++") + add_subdirectory(Magick++) endif() if(BUILD_UTILITIES) - add_subdirectory("utilities") + add_subdirectory(utilities) +endif() +if(BUILD_TESTS) + # Running ctest with CTEST_PARALLEL_LEVEL=20 env var is recommended. + enable_testing() + add_subdirectory(tests) + if(BUILD_MAGICKPP) + add_subdirectory(Magick++/tests) + add_subdirectory(Magick++/demo) + endif() endif() install(FILES - LICENSE - NOTICE - DESTINATION licenses + LICENSE + NOTICE + DESTINATION licenses ) diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index 03b390a3b37..6d87e83a536 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -11,9 +11,9 @@ # under the License. # # CMake script file to build ImageMagick -# +# -project(Magick++ CXX) +enable_language(CXX) SET(MAGICKXX_PUBLIC_HEADERS lib/Magick++/Blob.h @@ -77,24 +77,29 @@ set(MAGICKXX_SRC lib/Magick++/TypeMetric.h ) -if(MAGICK_BUILD_STATIC) - add_library(${MAGICKXX_BINARY_NAME} STATIC ${MAGICKXX_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -else() - add_library(${MAGICKXX_BINARY_NAME} SHARED ${MAGICKXX_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -endif() +add_library(Magick++ ${MAGICKXX_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -set_target_properties(${MAGICKXX_BINARY_NAME} PROPERTIES PUBLIC_HEADER "${MAGICKXX_PUBLIC_HEADERS}") -target_include_directories(${MAGICKXX_BINARY_NAME} PUBLIC ${IMAGEMAGICK_BASE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib) -target_compile_definitions(${MAGICKXX_BINARY_NAME} PRIVATE ${MAGICK_BUILD_DEFINES} -D_MAGICKLIB_) -target_link_libraries(${MAGICKXX_BINARY_NAME} PUBLIC ${MAGICKWAND_BINARY_NAME}) +set_target_properties(Magick++ PROPERTIES + OUTPUT_NAME "Magick++-${MAGICK_BINARY_SUFFIX}" + PUBLIC_HEADER "${MAGICKXX_PUBLIC_HEADERS}" +) +target_include_directories(Magick++ PUBLIC ${IMAGEMAGICK_BASE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib) +target_compile_definitions(Magick++ PRIVATE _MAGICKLIB_) +target_link_libraries(Magick++ PUBLIC MagickWand) -install(TARGETS ${MAGICKXX_BINARY_NAME} - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/Magick++ +install(TARGETS Magick++ + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${INCLUDE_PATH}/Magick++ +) + +install(FILES + lib/Magick++.h DESTINATION ${INCLUDE_PATH} ) +configure_file(bin/Magick++-config.in ${CMAKE_CURRENT_BINARY_DIR}/Magick++-config @ONLY) install(FILES - lib/Magick++.h DESTINATION ${IMAGEMAGICK_INC_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/Magick++-config DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) diff --git a/Magick++/bin/Magick++-config.in b/Magick++/bin/Magick++-config.in index 76b686c962e..877545c1a75 100755 --- a/Magick++/bin/Magick++-config.in +++ b/Magick++/bin/Magick++-config.in @@ -7,6 +7,7 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ +export PKG_CONFIG_LIBDIR="${exec_prefix}/lib/pkgconfig" usage='Usage: Magick++-config [--cppflags] [--cxxflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version] diff --git a/Magick++/demo/CMakeLists.txt b/Magick++/demo/CMakeLists.txt new file mode 100644 index 00000000000..a26c9732db7 --- /dev/null +++ b/Magick++/demo/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include(${CMAKE_SOURCE_DIR}/cmake/test_helpers.cmake) + +foreach(demo analyze button demo flip gravity piddle shapes zoom) + add_executable(${demo} "${CMAKE_SOURCE_DIR}/Magick++/demo/${demo}.cpp") + target_link_libraries(${demo} PRIVATE Magick++) +endforeach() + +copy_test_resources(magickpp-demo) + +add_tap_test(demos magick++-demos) diff --git a/Magick++/demo/demos.tap b/Magick++/demo/demos.tap index e7370034a5c..7b7fd198382 100755 --- a/Magick++/demo/demos.tap +++ b/Magick++/demo/demos.tap @@ -10,7 +10,7 @@ # for usage and copying restrictions. # subdir=Magick++/demo -. ./common.shi +# . ./common.shi echo "1..24" SRCDIR=${top_srcdir}/${subdir}/ @@ -18,15 +18,15 @@ export SRCDIR cd ${subdir} || exit 1 -./analyze "$SRCDIR/model.miff" && echo "ok" || echo "not ok" +${MAGICPP_DEMO_BINARIES_DIR:-.}/analyze "$SRCDIR/model.miff" && echo "ok" || echo "not ok" for demo in button demo flip gravity piddle shapes do - ./${demo} && echo "ok" || echo "not ok" + ${MAGICPP_DEMO_BINARIES_DIR:-.}/${demo} && echo "ok" || echo "not ok" done for filter in bessel blackman box catrom cubic gaussian hamming hanning hermite lanczos mitchell point quadratic sample scale sinc triangle do - ./zoom -filter $filter -geometry 600x600 ${SRCDIR}/model.miff zoom_${filter}_out.miff && echo "ok" || echo "not ok" + ${MAGICPP_DEMO_BINARIES_DIR:-.}/zoom -filter $filter -geometry 600x600 ${SRCDIR}/model.miff zoom_${filter}_out.miff && echo "ok" || echo "not ok" done : diff --git a/Magick++/fuzz/build_imagemagick.sh b/Magick++/fuzz/build_imagemagick.sh deleted file mode 100755 index 170a3ac0b77..00000000000 --- a/Magick++/fuzz/build_imagemagick.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -eu - -autoreconf -fiv -./configure --prefix="$WORK" --disable-shared --disable-docs --with-jxl CFLAGS="$CFLAGS -I$WORK/include" LIBS="-L$WORK/lib -lhwy -lbrotlidec -lbrotlienc -lbrotlicommon -lde265" PKG_CONFIG_PATH="$WORK/lib/pkgconfig" -make "-j$(nproc)" -make install diff --git a/Magick++/tests/CMakeLists.txt b/Magick++/tests/CMakeLists.txt new file mode 100644 index 00000000000..ae2c15d327f --- /dev/null +++ b/Magick++/tests/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include(${CMAKE_SOURCE_DIR}/cmake/test_helpers.cmake) + +foreach(executable appendImages attributes averageImages coalesceImages coderInfo color colorHistogram exceptions geometry montageImages morphImages readWriteBlob readWriteImages) + add_executable(${executable} "${CMAKE_SOURCE_DIR}/Magick++/tests/${executable}.cpp") + target_link_libraries(${executable} PRIVATE MagickCore MagickWand Magick++) +endforeach() + +copy_test_resources(magickpp-tests) + +add_tap_test(tests magick++-tests) diff --git a/Magick++/tests/tests.tap b/Magick++/tests/tests.tap index b5c15ff8ea6..ba684fe0d7c 100755 --- a/Magick++/tests/tests.tap +++ b/Magick++/tests/tests.tap @@ -7,7 +7,7 @@ # for usage and copying restrictions. # subdir=Magick++/tests -. ./common.shi +# . ./common.shi echo "1..13" SRCDIR=${top_srcdir}/${subdir}/ @@ -17,6 +17,6 @@ cd ${subdir} || exit 1 for mytest in appendImages attributes averageImages coalesceImages coderInfo color colorHistogram exceptions geometry montageImages morphImages readWriteBlob readWriteImages do - ./${mytest} && echo "ok" || echo "not ok" + ${MAGICPP_TEST_BINARIES_DIR:-.}/${mytest} && echo "ok" || echo "not ok" done : diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index d5cc6588c84..64f70a95edb 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -11,9 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# - -project(MagickCore C) +# set(MAGICKCORE_SRC MagickCore.h @@ -240,7 +238,7 @@ set(MAGICKCORE_SRC utility.h utility-private.h version.c - version.h + # version.h version-private.h visual-effects.c visual-effects.h @@ -420,6 +418,7 @@ set(MAGICKCORE_CODERS_SRCS ${CODERS_PATH}/dib.c ${CODERS_PATH}/dib.h ${CODERS_PATH}/djvu.h + ${CODERS_PATH}/dmr.h ${CODERS_PATH}/dng.c ${CODERS_PATH}/dng.h ${CODERS_PATH}/dot.c @@ -651,10 +650,12 @@ endif() if(DJVU_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/djvu.c) endif() +if(DMR_DELEGATE) + list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/dmr.c) +endif() if(OPENEXR_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/exr.c) - # OpenEXR should export this dep but it isn't currently so we have to make sure this object uses c++ - set_source_files_properties(${CODERS_PATH}/exr.c PROPERTIES LANGUAGE CXX) + set_source_files_properties(${CODERS_PATH}/exr.c PROPERTIES LINKER_LANGUAGE CXX) endif() if(FLIF_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/flif.c) @@ -688,8 +689,10 @@ if(WEBP_DELEGATE) endif() if(WINGDI32_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/clipboard.c ${CODERS_PATH}/emf.c) - # Seems that emf.c uses namespaces so we need to compile as c++ - set_source_files_properties(${CODERS_PATH}/emf.c PROPERTIES LANGUAGE CXX) + if(BUILD_MAGICKPP) + # Seems that emf.c uses namespaces so we need to compile as c++ + set_source_files_properties(${CODERS_PATH}/emf.c PROPERTIES LANGUAGE CXX) + endif() endif() if(WMF_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/wmf.c) @@ -698,31 +701,34 @@ if(X11_DELEGATE) list(APPEND MAGICKCORE_CODERS_DELEGATES_SRCS ${CODERS_PATH}/x.c ${CODERS_PATH}/xwd.c) endif() -if(MAGICK_BUILD_STATIC) - add_library(${MAGICKCORE_BINARY_NAME} STATIC ${MAGICKCORE_SRC} ${MAGICKCORE_FILTERS_SRCS} ${MAGICKCORE_CODERS_SRCS} ${MAGICKCORE_CODERS_DELEGATES_SRCS} ${MAGICK_RESOURCE_FILE_PATH}) -else() - add_library(${MAGICKCORE_BINARY_NAME} SHARED ${MAGICKCORE_SRC} ${MAGICKCORE_FILTERS_SRCS} ${MAGICKCORE_CODERS_SRCS} ${MAGICKCORE_CODERS_DELEGATES_SRCS} ${MAGICK_RESOURCE_FILE_PATH}) -endif() +add_library(MagickCore ${MAGICKCORE_SRC} ${MAGICKCORE_FILTERS_SRCS} ${MAGICKCORE_CODERS_SRCS} ${MAGICKCORE_CODERS_DELEGATES_SRCS} ${MAGICK_RESOURCE_FILE_PATH}) -set_target_properties(${MAGICKCORE_BINARY_NAME} PROPERTIES PUBLIC_HEADER "${MAGICKCORE_PUBLIC_HEADERS}") -target_include_directories(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_BASE_PATH}) -target_link_libraries(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES}) -#TODO should we make a test to see if we need to link -lm ?? +set_target_properties(MagickCore PROPERTIES + OUTPUT_NAME "MagickCore-${MAGICK_BINARY_SUFFIX}" + PUBLIC_HEADER "${MAGICKCORE_PUBLIC_HEADERS}" +) +target_include_directories(MagickCore PUBLIC ${IMAGEMAGICK_BASE_PATH}) +target_link_libraries(MagickCore PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES}) if(UNIX) - target_link_libraries(${MAGICKCORE_BINARY_NAME} PUBLIC -lm) + target_link_libraries(MagickCore PUBLIC m) endif() -# Set the MAGICKCORE_SHAREARCH_BASEDIRNAME to "config", not sure if I should add it to the -target_compile_definitions(${MAGICKCORE_BINARY_NAME} PRIVATE ${MAGICK_BUILD_DEFINES} -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") +target_compile_definitions(MagickCore PRIVATE _MAGICKLIB_) -install(TARGETS ${MAGICKCORE_BINARY_NAME} - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/MagickCore +install(TARGETS MagickCore + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${INCLUDE_PATH}/MagickCore ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/magick-baseconfig.h ${CMAKE_CURRENT_BINARY_DIR}/version.h - DESTINATION ${IMAGEMAGICK_INC_DIR}/MagickCore + DESTINATION ${INCLUDE_PATH}/MagickCore +) + +configure_file(MagickCore-config.in ${CMAKE_CURRENT_BINARY_DIR}/MagickCore-config @ONLY) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/MagickCore-config DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) diff --git a/MagickCore/MagickCore-config.in b/MagickCore/MagickCore-config.in index c6631b6984d..ab790055d19 100644 --- a/MagickCore/MagickCore-config.in +++ b/MagickCore/MagickCore-config.in @@ -6,13 +6,14 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ +export PKG_CONFIG_LIBDIR="${exec_prefix}/lib/pkgconfig" usage="\ Usage: MagickCore-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" if test $# -eq 0; then echo "${usage}" 1>&2 - echo "Example: gcc \`MagickCore-config --cflags --cppflags\` -o core core.c \`Magick-config --ldflags --libs\`" 1>&2 + echo "Example: gcc \`MagickCore-config --cflags --cppflags\` -o core core.c \`MagickCore-config --ldflags --libs\`" 1>&2 exit 1 fi diff --git a/MagickCore/annotate.c b/MagickCore/annotate.c index 7f587cf3231..8fd6ec4231a 100644 --- a/MagickCore/annotate.c +++ b/MagickCore/annotate.c @@ -1940,8 +1940,12 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info, (draw_info->stroke.alpha == (MagickRealType) TransparentAlpha) && (draw_info->stroke_pattern == (Image *) NULL)) ? MagickTrue : MagickFalse; - image_view=AcquireAuthenticCacheView(image,exception); r=bitmap->bitmap.buffer; + image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,bitmap->bitmap.rows,4) +#endif for (y=0; y < (ssize_t) bitmap->bitmap.rows; y++) { double @@ -2211,7 +2215,8 @@ static MagickBooleanType RenderPostscript(Image *image, unique_file; MagickBooleanType - identity; + identity, + status; PointInfo extent, @@ -2385,7 +2390,12 @@ static MagickBooleanType RenderPostscript(Image *image, (void) SetImageAlphaChannel(annotate_image,OpaqueAlphaChannel, exception); fill_color=draw_info->fill; + status=MagickTrue; annotate_view=AcquireAuthenticCacheView(annotate_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(annotate_image,annotate_image,annotate_image->rows,4) +#endif for (y=0; y < (ssize_t) annotate_image->rows; y++) { ssize_t @@ -2394,10 +2404,15 @@ static MagickBooleanType RenderPostscript(Image *image, Quantum *magick_restrict q; + if (status == MagickFalse) + continue; q=GetCacheViewAuthenticPixels(annotate_view,0,y,annotate_image->columns, 1,exception); if (q == (Quantum *) NULL) - break; + { + status=MagickFalse; + continue; + } for (x=0; x < (ssize_t) annotate_image->columns; x++) { GetFillColor(draw_info,x,y,&fill_color,exception); @@ -2410,7 +2425,7 @@ static MagickBooleanType RenderPostscript(Image *image, } sync=SyncCacheViewAuthenticPixels(annotate_view,exception); if (sync == MagickFalse) - break; + status=MagickFalse; } annotate_view=DestroyCacheView(annotate_view); (void) CompositeImage(image,annotate_image,OverCompositeOp,MagickTrue, diff --git a/MagickCore/attribute.c b/MagickCore/attribute.c index d193b58cdf6..5446c4a8a6a 100644 --- a/MagickCore/attribute.c +++ b/MagickCore/attribute.c @@ -482,7 +482,7 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image, GetPixelInfo(image,&zero); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1568,13 +1568,7 @@ MagickExport ImageType IdentifyImageGray(const Image *image, *image_view; ImageType - type; - - const Quantum - *p; - - ssize_t - x; + type = BilevelType; ssize_t y; @@ -1587,13 +1581,27 @@ MagickExport ImageType IdentifyImageGray(const Image *image, return(image->type); if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) return(UndefinedType); - type=BilevelType; image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(type) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { + const Quantum + *p; + + ssize_t + x; + + if (type == UndefinedType) + continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) - break; + { + type=UndefinedType; + continue; + } for (x=0; x < (ssize_t) image->columns; x++) { if (IsPixelGray(image,p) == MagickFalse) @@ -1605,8 +1613,6 @@ MagickExport ImageType IdentifyImageGray(const Image *image, type=GrayscaleType; p+=GetPixelChannels(image); } - if (type == UndefinedType) - break; } image_view=DestroyCacheView(image_view); if ((type == GrayscaleType) && (image->alpha_trait != UndefinedPixelTrait)) @@ -1647,14 +1653,8 @@ MagickExport MagickBooleanType IdentifyImageMonochrome(const Image *image, CacheView *image_view; - MagickBooleanType - bilevel; - - ssize_t - x; - - const Quantum - *p; + ImageType + type = BilevelType; ssize_t y; @@ -1667,27 +1667,39 @@ MagickExport MagickBooleanType IdentifyImageMonochrome(const Image *image, return(MagickTrue); if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) return(MagickFalse); - bilevel=MagickTrue; image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(type) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { + const Quantum + *p; + + ssize_t + x; + + if (type == UndefinedType) + continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) - break; + { + type=UndefinedType; + continue; + } for (x=0; x < (ssize_t) image->columns; x++) { if (IsPixelMonochrome(image,p) == MagickFalse) { - bilevel=MagickFalse; + type=UndefinedType; break; } p+=GetPixelChannels(image); } - if (bilevel == MagickFalse) - break; } image_view=DestroyCacheView(image_view); - return(bilevel); + return(type == BilevelType ? MagickTrue : MagickFalse); } /* @@ -1849,11 +1861,8 @@ MagickExport MagickBooleanType IsImageOpaque(const Image *image, CacheView *image_view; - const Quantum - *p; - - ssize_t - x; + MagickBooleanType + opaque = MagickTrue; ssize_t y; @@ -1868,22 +1877,38 @@ MagickExport MagickBooleanType IsImageOpaque(const Image *image, if ((image->alpha_trait & BlendPixelTrait) == 0) return(MagickTrue); image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(opaque) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { + const Quantum + *p; + + ssize_t + x; + + if (opaque == MagickFalse) + continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) - break; + { + opaque=MagickFalse; + continue; + } for (x=0; x < (ssize_t) image->columns; x++) { if (GetPixelAlpha(image,p) != OpaqueAlpha) - break; + { + opaque=MagickFalse; + break; + } p+=GetPixelChannels(image); } - if (x < (ssize_t) image->columns) - break; } image_view=DestroyCacheView(image_view); - return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue); + return(opaque); } /* @@ -1989,7 +2014,7 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, range); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2047,7 +2072,7 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, */ #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/blob.c b/MagickCore/blob.c index 42eaecce1a9..39e1c60f914 100644 --- a/MagickCore/blob.c +++ b/MagickCore/blob.c @@ -618,8 +618,7 @@ MagickExport MagickBooleanType CloseBlob(Image *image) blob_info=image->blob; if ((blob_info == (BlobInfo *) NULL) || (blob_info->type == UndefinedStream)) return(MagickTrue); - if (SyncBlob(image) != 0) - ThrowBlobException(blob_info); + (void) SyncBlob(image); status=blob_info->status; switch (blob_info->type) { @@ -5518,6 +5517,8 @@ static int SyncBlob(const Image *image) assert(image->blob != (BlobInfo *) NULL); if (IsEventLogging() != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (EOFBlob(image) != 0) + return(0); blob_info=image->blob; status=0; switch (blob_info->type) diff --git a/MagickCore/cache-view.h b/MagickCore/cache-view.h index fae48ca51f3..7a820d5f22d 100644 --- a/MagickCore/cache-view.h +++ b/MagickCore/cache-view.h @@ -1,5 +1,5 @@ /* - Copyright @ 2000 ImageMagick Studio LLC, a non-profit organization + Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization dedicated to making software imaging solutions freely available. You may not use this file except in compliance with the License. You may diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 711c7a42e94..43dfd1a3194 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -731,7 +731,7 @@ static MagickBooleanType ClonePixelCacheRepository( status=MagickTrue; #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - cache_number_threads(cache_info,clone_info,(int) cache_info->rows,1) + cache_number_threads(cache_info,clone_info,(int) cache_info->rows,4) #endif for (y=0; y < (ssize_t) cache_info->rows; y++) { @@ -812,7 +812,7 @@ static MagickBooleanType ClonePixelCacheRepository( clone_info->metacontent_extent); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - cache_number_threads(cache_info,clone_info,(int) cache_info->rows,1) + cache_number_threads(cache_info,clone_info,(int) cache_info->rows,4) #endif for (y=0; y < (ssize_t) cache_info->rows; y++) { @@ -1696,6 +1696,9 @@ static Cache GetImagePixelCache(Image *image,const MagickBooleanType clone, if (IsImageTTLExpired(image) != MagickFalse) { +#if defined(ESTALE) + errno=ESTALE; +#endif (void) ThrowMagickException(exception,GetMagickModule(), ResourceLimitError,"TimeLimitExceeded","`%s'",image->filename); return((Cache) NULL); @@ -5223,7 +5226,7 @@ static MagickBooleanType SetCacheAlphaChannel(Image *image,const Quantum alpha, image_view=AcquireVirtualCacheView(image,exception); /* must be virtual */ #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/channel.c b/MagickCore/channel.c index fa027c7e24d..fda75d93f9d 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -141,7 +141,7 @@ static MagickBooleanType ChannelImage(Image *destination_image, destination_view=AcquireAuthenticCacheView(destination_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(source_image,source_image,height,1) + magick_number_threads(source_image,source_image,height,4) #endif for (y=0; y < (ssize_t) height; y++) { @@ -570,6 +570,10 @@ MagickExport Image *CombineImages(const Image *image, status=MagickTrue; progress=0; combine_view=AcquireAuthenticCacheView(combine_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(progress,status) \ + magick_number_threads(combine_image,combine_image,combine_image->rows,4) +#endif for (y=0; y < (ssize_t) combine_image->rows; y++) { CacheView @@ -578,13 +582,11 @@ MagickExport Image *CombineImages(const Image *image, const Image *next; - Quantum - *pixels; - const Quantum *magick_restrict p; Quantum + *pixels, *magick_restrict q; ssize_t @@ -763,7 +765,7 @@ MagickExport Image *SeparateImage(const Image *image, separate_view=AcquireAuthenticCacheView(separate_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1014,7 +1016,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1074,7 +1076,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1134,7 +1136,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1204,6 +1206,52 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image->alpha_trait=UndefinedPixelTrait; break; } + case OffIfOpaqueAlphaChannel: + { + MagickBooleanType + opaque = MagickTrue; + + /* + Remove opaque alpha channel. + */ + if ((image->alpha_trait & BlendPixelTrait) == 0) + break; + image_view=AcquireVirtualCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(opaque,status) \ + magick_number_threads(image,image,image->rows,2) +#endif + for (y=0; y < (ssize_t) image->rows; y++) + { + const Quantum + *magick_restrict p; + + ssize_t + x; + + if ((status == MagickFalse) || (opaque == MagickFalse)) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + if (p == (const Quantum *) NULL) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + if (GetPixelAlpha(image,p) != OpaqueAlpha) + { + opaque=MagickFalse; + break; + } + p+=GetPixelChannels(image); + } + } + image_view=DestroyCacheView(image_view); + if (opaque != MagickFalse) + image->alpha_trait=UndefinedPixelTrait; + break; + } case OnAlphaChannel: { if ((image->alpha_trait & BlendPixelTrait) == 0) @@ -1229,7 +1277,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1284,7 +1332,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/channel.h b/MagickCore/channel.h index 5ef504b8f1a..641ba79acbc 100644 --- a/MagickCore/channel.h +++ b/MagickCore/channel.h @@ -24,6 +24,27 @@ extern "C" { #endif +typedef enum +{ + UndefinedAlphaChannel, + ActivateAlphaChannel, + AssociateAlphaChannel, + BackgroundAlphaChannel, + CopyAlphaChannel, + DeactivateAlphaChannel, + DiscreteAlphaChannel, + DisassociateAlphaChannel, + ExtractAlphaChannel, + OffAlphaChannel, + OnAlphaChannel, + OpaqueAlphaChannel, + RemoveAlphaChannel, + SetAlphaChannel, + ShapeAlphaChannel, + TransparentAlphaChannel, + OffIfOpaqueAlphaChannel +} AlphaChannelOption; + extern MagickExport Image *ChannelFxImage(const Image *,const char *,ExceptionInfo *), *CombineImages(const Image *,const ColorspaceType,ExceptionInfo *), diff --git a/MagickCore/colormap.c b/MagickCore/colormap.c index 2a29441df8a..91b90f9f872 100644 --- a/MagickCore/colormap.c +++ b/MagickCore/colormap.c @@ -207,7 +207,7 @@ MagickExport MagickBooleanType CycleColormapImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -306,7 +306,7 @@ MagickExport MagickBooleanType SortColormapByIntensity(Image *image, status; ssize_t - i; + j; ssize_t y; @@ -331,8 +331,8 @@ MagickExport MagickBooleanType SortColormapByIntensity(Image *image, /* Assign index values to colormap entries. */ - for (i=0; i < (ssize_t) image->colors; i++) - image->colormap[i].alpha=(double) i; + for (j=0; j < (ssize_t) image->colors; j++) + image->colormap[j].alpha=(double) j; /* Sort image colormap by decreasing color popularity. */ @@ -341,29 +341,38 @@ MagickExport MagickBooleanType SortColormapByIntensity(Image *image, /* Update image colormap indexes to sorted colormap order. */ - for (i=0; i < (ssize_t) image->colors; i++) - pixels[(ssize_t) image->colormap[i].alpha]=(unsigned short) i; + for (j=0; j < (ssize_t) image->colors; j++) + pixels[(ssize_t) image->colormap[j].alpha]=(unsigned short) j; status=MagickTrue; image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { Quantum - index; + *magick_restrict q; ssize_t x; - Quantum - *magick_restrict q; - + if (status == MagickFalse) + continue; q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) { status=MagickFalse; - break; + continue; } for (x=0; x < (ssize_t) image->columns; x++) { + Quantum + index; + + ssize_t + i; + i=ConstrainColormapIndex(image,GetPixelIndex(image,q),exception); index=(Quantum) pixels[i]; SetPixelIndex(image,index,q); @@ -372,8 +381,6 @@ MagickExport MagickBooleanType SortColormapByIntensity(Image *image, } if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) status=MagickFalse; - if (status == MagickFalse) - break; } image_view=DestroyCacheView(image_view); pixels=(unsigned short *) RelinquishMagickMemory(pixels); diff --git a/MagickCore/colorspace.c b/MagickCore/colorspace.c index 989f8419f51..0aedd79452f 100644 --- a/MagickCore/colorspace.c +++ b/MagickCore/colorspace.c @@ -596,7 +596,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -655,7 +655,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -713,7 +713,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -806,7 +806,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1054,7 +1054,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1121,7 +1121,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1366,7 +1366,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2190,7 +2190,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2249,7 +2249,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2310,7 +2310,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2404,7 +2404,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2655,7 +2655,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2721,7 +2721,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2953,7 +2953,7 @@ static MagickBooleanType TransformsRGBImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/composite.c b/MagickCore/composite.c index fee7f2a765a..328f184ca18 100644 --- a/MagickCore/composite.c +++ b/MagickCore/composite.c @@ -634,7 +634,7 @@ static MagickBooleanType BlendMaskAlphaChannel(Image *image, mask_view=AcquireVirtualCacheView(mask_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -747,7 +747,7 @@ static Image *BlendMeanImage(Image *image,const Image *mask_image, mean_view=AcquireAuthenticCacheView(mean_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(mask_image,mean_image,mean_image->rows,1) + magick_number_threads(mask_image,mean_image,mean_image->rows,4) #endif for (y=0; y < (ssize_t) mean_image->rows; y++) { @@ -1623,7 +1623,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(source_image,image,source_image->rows,1) + magick_number_threads(source_image,image,source_image->rows,4) #endif for (y=0; y < (ssize_t) source_image->rows; y++) { @@ -1707,7 +1707,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(source_image,image,source_image->rows,1) + magick_number_threads(source_image,image,source_image->rows,4) #endif for (y=0; y < (ssize_t) source_image->rows; y++) { @@ -3756,7 +3756,7 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(texture_image,image,image->rows,1) + magick_number_threads(texture_image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/draw.c b/MagickCore/draw.c index bb83e8bafb4..e07f9adfe52 100644 --- a/MagickCore/draw.c +++ b/MagickCore/draw.c @@ -1247,7 +1247,7 @@ MagickExport MagickBooleanType DrawAffineImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(source,image,(size_t) (stop-start),1) + magick_number_threads(source,image,(size_t) (stop-start),2) #endif for (y=start; y <= stop; y++) { diff --git a/MagickCore/effect.c b/MagickCore/effect.c index b387a728710..1ece63dabc6 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -625,6 +625,12 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, ((width-(size_t) j)/2L)+GetPixelChannels(image)*((width-(size_t) j)/2)); for (i=0; i < (ssize_t) GetPixelChannels(sharp_image); i++) { + const double + *magick_restrict k; + + const Quantum + *magick_restrict pixels; + double alpha, gamma, @@ -637,16 +643,8 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, sharp_traits, traits; - const double - *magick_restrict k; - - const Quantum - *magick_restrict pixels; - - ssize_t - u; - ssize_t + u, v; channel=GetPixelChannelChannel(image,i); @@ -1236,7 +1234,7 @@ static void Hull(const Image *image,const ssize_t x_offset, r=p+(y_offset*((ssize_t) columns+2)+x_offset); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) \ - magick_number_threads(image,image,rows,1) + magick_number_threads(image,image,rows,2) #endif for (y=0; y < (ssize_t) rows; y++) { @@ -1273,7 +1271,7 @@ static void Hull(const Image *image,const ssize_t x_offset, s=q-(y_offset*((ssize_t) columns+2)+x_offset); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) \ - magick_number_threads(image,image,rows,1) + magick_number_threads(image,image,rows,2) #endif for (y=0; y < (ssize_t) rows; y++) { diff --git a/MagickCore/fx.c b/MagickCore/fx.c index fa0c4f51172..7a512cdb531 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -2818,9 +2818,6 @@ static ChannelStatistics *CollectOneImgStats (FxInfo * pfx, Image * img) cs[ch].maxima *= QuantumScale; cs[ch].minima *= QuantumScale; cs[ch].standard_deviation *= QuantumScale; - cs[ch].kurtosis *= QuantumScale; - cs[ch].skewness *= QuantumScale; - cs[ch].entropy *= QuantumScale; } return cs; @@ -3174,12 +3171,15 @@ static MagickBooleanType ExecuteRPN (FxInfo * pfx, fxRtT * pfxrt, fxFltType *res } for (i=0; i < pfx->usedElements; i++) { + ElementT + *pel; + if (i < 0) { (void) ThrowMagickException ( pfx->exception, GetMagickModule(), OptionError, "Bad run-time address", "%i", i); } - ElementT *pel = &pfx->Elements[i]; + pel=&pfx->Elements[i]; switch (pel->nArgs) { case 0: break; diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c index 40ff83fa98c..1d596eaf1ac 100644 --- a/MagickCore/geometry.c +++ b/MagickCore/geometry.c @@ -85,25 +85,25 @@ static const PageInfo MagickPagesize("4A0", "4768x6741"), MagickPagesize("2A0", "3370x4768"), MagickPagesize("a0", "2384x3370"), + MagickPagesize("a10", "74x105"), MagickPagesize("a1", "1684x2384"), MagickPagesize("a2", "1191x1684"), MagickPagesize("a3", "842x1191"), - MagickPagesize("a4", "595x842"), MagickPagesize("a4small", "595x842"), + MagickPagesize("a4", "595x842"), MagickPagesize("a5", "420x595"), MagickPagesize("a6", "298x420"), MagickPagesize("a7", "210x298"), MagickPagesize("a8", "147x210"), MagickPagesize("a9", "105x147"), - MagickPagesize("a10", "74x105"), MagickPagesize("archa", "648x864"), MagickPagesize("archb", "864x1296"), MagickPagesize("archC", "1296x1728"), MagickPagesize("archd", "1728x2592"), MagickPagesize("arche", "2592x3456"), MagickPagesize("b0", "2920x4127"), - MagickPagesize("b1", "2064x2920"), MagickPagesize("b10", "91x127"), + MagickPagesize("b1", "2064x2920"), MagickPagesize("b2", "1460x2064"), MagickPagesize("b3", "1032x1460"), MagickPagesize("b4", "729x1032"), @@ -129,8 +129,8 @@ static const PageInfo MagickPagesize("folio", "612x936"), MagickPagesize("halfletter", "396x612"), MagickPagesize("isob0", "2835x4008"), - MagickPagesize("isob1", "2004x2835"), MagickPagesize("isob10", "88x125"), + MagickPagesize("isob1", "2004x2835"), MagickPagesize("isob2", "1417x2004"), MagickPagesize("isob3", "1001x1417"), MagickPagesize("isob4", "709x1001"), @@ -148,8 +148,8 @@ static const PageInfo MagickPagesize("jisb6", "128x182"), MagickPagesize("ledger", "1224x792"), MagickPagesize("legal", "612x1008"), - MagickPagesize("letter", "612x792"), MagickPagesize("lettersmall", "612x792"), + MagickPagesize("letter", "612x792"), MagickPagesize("monarch", "279x540"), MagickPagesize("quarto", "610x780"), MagickPagesize("statement", "396x612"), diff --git a/MagickCore/identify.c b/MagickCore/identify.c index a22959561ae..1a63c6b293c 100644 --- a/MagickCore/identify.c +++ b/MagickCore/identify.c @@ -93,6 +93,7 @@ #include "MagickCore/string_.h" #include "MagickCore/string-private.h" #include "MagickCore/timer.h" +#include "MagickCore/timer-private.h" #include "MagickCore/token.h" #include "MagickCore/utility.h" #include "MagickCore/utility-private.h" @@ -476,6 +477,7 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, char buffer[MagickPathExtent], color[MagickPathExtent], + iso8601[sizeof("9999-99-99T99:99:99Z")], key[MagickPathExtent]; ChannelFeatures @@ -515,6 +517,9 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, ImageType type; + int + expired; + MagickBooleanType ping; @@ -530,6 +535,9 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, struct stat properties; + struct tm + timestamp; + assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (IsEventLogging() != MagickFalse) @@ -1662,6 +1670,15 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, image->rows/elapsed_time+0.5),MagickFalse,"P",MagickPathExtent,buffer); (void) FormatLocaleFile(file," Pixels per second: %s\n",buffer); } + (void) GetMagickUTCTime(&image->timestamp,×tamp); + (void) strftime(iso8601,sizeof(iso8601),"%FT%TZ",×tamp); + expired=' '; + if (IsImageTTLExpired(image) != MagickFalse) + expired='*'; + (void) FormatLocaleFile(file," Time-to-live: %g:%g:%g:%g%c %s\n", + (double) (image->ttl/(3600*24)),(double) ((image->ttl % (24*3600))/3600), + (double) ((image->ttl % 3600)/60),(double) ((image->ttl % 3600) % 60), + expired,iso8601); (void) FormatLocaleFile(file," User time: %0.3fu\n",user_time); (void) FormatLocaleFile(file," Elapsed time: %lu:%02lu.%03lu\n", (unsigned long) (elapsed_time/60.0),(unsigned long) ceil(fmod(elapsed_time, diff --git a/MagickCore/image.c b/MagickCore/image.c index f7158f46940..745035b1e0c 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -140,9 +140,6 @@ MagickExport Image *AcquireImage(const ImageInfo *image_info, Image *image; - int - time_limit; - MagickStatusType flags; @@ -187,9 +184,7 @@ MagickExport Image *AcquireImage(const ImageInfo *image_info, image->channel_map=AcquirePixelChannelMap(); image->blob=CloneBlobInfo((BlobInfo *) NULL); image->timestamp=GetMagickTime(); - time_limit=(int) GetMagickResourceLimit(TimeResource); - if (time_limit > 0) - image->ttl=image->timestamp+time_limit; + image->ttl=(time_t) GetMagickResourceLimit(TimeResource); image->debug=(GetLogEventMask() & (ImageEvent | TransformEvent | CoderEvent)) != 0 ? MagickTrue : MagickFalse; image->reference_count=1; @@ -547,7 +542,7 @@ MagickExport Image *AppendImages(const Image *images, image_view=AcquireVirtualCacheView(next,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(next,next,next->rows,1) + magick_number_threads(next,next,next->rows,2) #endif for (y=0; y < (ssize_t) next->rows; y++) { @@ -1091,7 +1086,7 @@ MagickExport MagickBooleanType CopyImagePixels(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,source_image,geometry->height,1) + magick_number_threads(image,source_image,geometry->height,2) #endif for (y=0; y < (ssize_t) geometry->height; y++) { @@ -1485,6 +1480,10 @@ MagickExport Image *GetImageMask(const Image *image,const PixelMask type, (void) SetImageColorspace(mask_image,GRAYColorspace,exception); image_view=AcquireVirtualCacheView(image,exception); mask_view=AcquireAuthenticCacheView(mask_image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { const Quantum @@ -1813,7 +1812,7 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, *image_view; MagickBooleanType - status; + hdri = MagickFalse; ssize_t y; @@ -1822,11 +1821,10 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, assert(image->signature == MagickCoreSignature); if (IsEventLogging() != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - status=MagickTrue; image_view=AcquireVirtualCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + #pragma omp parallel for schedule(static) shared(hdri) \ + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1836,14 +1834,11 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, ssize_t x; - if (status == MagickFalse) + if (hdri != MagickFalse) continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) - { - status=MagickFalse; - continue; - } + continue; for (x=0; x < (ssize_t) image->columns; x++) { ssize_t @@ -1863,17 +1858,18 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, pixel=(double) p[i]; if ((pixel < 0.0) || (pixel > (double) QuantumRange) || (pixel != (double) ((QuantumAny) pixel))) - break; + { + hdri=MagickTrue; + break; + } } + if (hdri != MagickFalse) + break; p+=GetPixelChannels(image); - if (i < (ssize_t) GetPixelChannels(image)) - status=MagickFalse; } - if (x < (ssize_t) image->columns) - status=MagickFalse; } image_view=DestroyCacheView(image_view); - return(status != MagickFalse ? MagickFalse : MagickTrue); + return(hdri); #endif } @@ -2076,7 +2072,7 @@ MagickExport Image *NewMagickImage(const ImageInfo *image_info, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2276,7 +2272,7 @@ MagickExport MagickBooleanType ResetImagePixels(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2355,7 +2351,7 @@ MagickExport MagickBooleanType SetImageAlpha(Image *image,const Quantum alpha, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2443,6 +2439,10 @@ MagickExport MagickBooleanType SetImageBackgroundColor(Image *image, */ status=MagickTrue; image_view=AcquireAuthenticCacheView(image,exception); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { Quantum @@ -2555,7 +2555,7 @@ MagickExport MagickBooleanType SetImageColor(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -3273,7 +3273,7 @@ MagickExport MagickBooleanType SetImageMask(Image *image,const PixelMask type, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(mask,image,image->rows,1) + magick_number_threads(mask,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -3432,7 +3432,7 @@ MagickExport MagickBooleanType SetImageRegionMask(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -3937,7 +3937,7 @@ MagickExport MagickBooleanType SyncImage(Image *image,ExceptionInfo *exception) image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(range_exception,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/image.h b/MagickCore/image.h index 81ae37daf4a..47e9b21bd4f 100644 --- a/MagickCore/image.h +++ b/MagickCore/image.h @@ -25,26 +25,6 @@ extern "C" { #define OpaqueAlpha ((Quantum) QuantumRange) #define TransparentAlpha ((Quantum) 0) -typedef enum -{ - UndefinedAlphaChannel, - ActivateAlphaChannel, - AssociateAlphaChannel, - BackgroundAlphaChannel, - CopyAlphaChannel, - DeactivateAlphaChannel, - DiscreteAlphaChannel, - DisassociateAlphaChannel, - ExtractAlphaChannel, - OffAlphaChannel, - OnAlphaChannel, - OpaqueAlphaChannel, - RemoveAlphaChannel, - SetAlphaChannel, - ShapeAlphaChannel, - TransparentAlphaChannel -} AlphaChannelOption; - typedef enum { UndefinedType, diff --git a/MagickCore/matrix.c b/MagickCore/matrix.c index f51543cd603..8f14eb5eccc 100644 --- a/MagickCore/matrix.c +++ b/MagickCore/matrix.c @@ -941,7 +941,7 @@ MagickExport Image *MatrixToImage(const MatrixInfo *matrix_info, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index a683ed15e16..142c9011cb1 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -94,10 +94,6 @@ #include "ltdl.h" #endif -#ifndef MAGICKCORE_WINDOWS_SUPPORT -#include -#endif - /* Define declarations. */ @@ -2479,11 +2475,7 @@ void *OsLibraryGetFunctionAddress(void *library,const char *functionName) { if ((library == (void *) NULL) || (functionName == (const char *) NULL)) return (void *) NULL; -#ifdef MAGICKCORE_WINDOWS_SUPPORT - return (void *) GetProcAddress((HMODULE)library,functionName); -#else - return (void *) dlsym(library,functionName); -#endif + return lt_dlsym(library,functionName); } static MagickBooleanType BindOpenCLFunctions() @@ -2493,9 +2485,9 @@ static MagickBooleanType BindOpenCLFunctions() #else (void) memset(openCL_library,0,sizeof(MagickLibrary)); #ifdef MAGICKCORE_WINDOWS_SUPPORT - openCL_library->library=(void *)LoadLibraryA("OpenCL.dll"); + openCL_library->library=(void *)lt_dlopen("OpenCL.dll"); #else - openCL_library->library=(void *)dlopen("libOpenCL.so",RTLD_NOW); + openCL_library->library=(void *)lt_dlopen("libOpenCL.so"); #endif #define BIND(X) \ if ((openCL_library->X=(MAGICKpfn_##X)OsLibraryGetFunctionAddress(openCL_library->library,#X)) == NULL) \ diff --git a/MagickCore/option.c b/MagickCore/option.c index 3e848024f5d..abd64d8e592 100644 --- a/MagickCore/option.c +++ b/MagickCore/option.c @@ -43,6 +43,7 @@ #include "MagickCore/studio.h" #include "MagickCore/artifact.h" #include "MagickCore/cache.h" +#include "MagickCore/channel.h" #include "MagickCore/color.h" #include "MagickCore/compare.h" #include "MagickCore/constitute.h" @@ -112,6 +113,7 @@ static const OptionInfo { "Disassociate", DisassociateAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Extract", ExtractAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Off", OffAlphaChannel, UndefinedOptionFlag, MagickFalse }, + { "OffIfOpaque", OffIfOpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "On", OnAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Opaque", OpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Remove", RemoveAlphaChannel, UndefinedOptionFlag, MagickFalse }, diff --git a/MagickCore/paint.c b/MagickCore/paint.c index acb3f6a7236..7de91c5d8ba 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -153,7 +153,6 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, *segment_info; PixelInfo - fill_color, pixel; SegmentInfo @@ -325,6 +324,10 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, } while (x <= x2); } status=MagickTrue; +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static) shared(status) \ + magick_number_threads(floodplane_image,image,image->rows,2) +#endif for (y=0; y < (ssize_t) image->rows; y++) { const Quantum @@ -352,8 +355,21 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, { if (GetPixelGray(floodplane_image,p) != 0) { + PixelInfo + fill_color; + GetFillColor(draw_info,x,y,&fill_color,exception); - SetPixelViaPixelInfo(image,&fill_color,q); + if ((image->channel_mask & RedChannel) != 0) + SetPixelRed(image,(Quantum) fill_color.red,q); + if ((image->channel_mask & GreenChannel) != 0) + SetPixelGreen(image,(Quantum) fill_color.green,q); + if ((image->channel_mask & BlueChannel) != 0) + SetPixelBlue(image,(Quantum) fill_color.blue,q); + if ((image->channel_mask & BlackChannel) != 0) + SetPixelBlack(image,(Quantum) fill_color.black,q); + if (((image->channel_mask & AlphaChannel) != 0) && + ((image->alpha_trait & BlendPixelTrait) != 0)) + SetPixelAlpha(image,(Quantum) fill_color.alpha,q); } p+=GetPixelChannels(floodplane_image); q+=GetPixelChannels(image); diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c index 4f18d88e40b..9f36afc5329 100644 --- a/MagickCore/pixel.c +++ b/MagickCore/pixel.c @@ -6410,8 +6410,10 @@ MagickExport ChannelType SetPixelChannelMask(Image *image, MagickExport MagickBooleanType SetPixelMetaChannels(Image *image, const size_t number_meta_channels,ExceptionInfo *exception) { - image->number_meta_channels=MagickMin(number_meta_channels,MaxPixelChannels - -(size_t) MetaPixelChannels); + if (number_meta_channels >= (MaxPixelChannels-MetaPixelChannels)) + ThrowBinaryException(CorruptImageError,"MaximumChannelsExceeded", + image->filename); + image->number_meta_channels=number_meta_channels; InitializePixelChannelMap(image); return(SyncImagePixelCache(image,exception)); } diff --git a/MagickCore/resize.c b/MagickCore/resize.c index 754a591a218..ddd3711dedd 100644 --- a/MagickCore/resize.c +++ b/MagickCore/resize.c @@ -3941,7 +3941,7 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns, sample_view=AcquireAuthenticCacheView(sample_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,sample_image,sample_image->rows,1) + magick_number_threads(image,sample_image,sample_image->rows,2) #endif for (y=0; y < (ssize_t) sample_image->rows; y++) { diff --git a/MagickCore/resource.c b/MagickCore/resource.c index 4000311519a..148ee568798 100644 --- a/MagickCore/resource.c +++ b/MagickCore/resource.c @@ -1211,11 +1211,10 @@ MagickPrivate MagickBooleanType ResourceComponentGenesis(void) MagickSizeType memory; - ssize_t - i; - ssize_t files, + i, + number_threads, pages, pagesize; @@ -1316,7 +1315,10 @@ MagickPrivate MagickBooleanType ResourceComponentGenesis(void) 100.0)); limit=DestroyString(limit); } - (void) SetMagickResourceLimit(ThreadResource,GetOpenMPMaximumThreads()); + number_threads=(ssize_t) GetOpenMPMaximumThreads(); + if (number_threads > 1) + number_threads--; /* reserve core for OS */ + (void) SetMagickResourceLimit(ThreadResource,(size_t) number_threads); limit=GetEnvironmentValue("MAGICK_THREAD_LIMIT"); if (limit != (char *) NULL) { diff --git a/MagickCore/shear.c b/MagickCore/shear.c index 9f15f3289ae..dda8663b96e 100644 --- a/MagickCore/shear.c +++ b/MagickCore/shear.c @@ -376,7 +376,7 @@ static MagickBooleanType RadonTransform(const Image *image, image_view=AcquireVirtualCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -433,7 +433,7 @@ static MagickBooleanType RadonTransform(const Image *image, (void) NullMatrix(source_matrices); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -775,7 +775,7 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, tile_width=image->columns; #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,rotate_image,image->rows/tile_height,1) + magick_number_threads(image,rotate_image,image->rows/tile_height,2) #endif for (tile_y=0; tile_y < (ssize_t) image->rows; tile_y+=(ssize_t) tile_height) { @@ -891,7 +891,7 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, */ #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,rotate_image,image->rows,1) + magick_number_threads(image,rotate_image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -975,7 +975,7 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, tile_width=image->columns; #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,rotate_image,image->rows/tile_height,1) + magick_number_threads(image,rotate_image,image->rows/tile_height,2) #endif for (tile_y=0; tile_y < (ssize_t) image->rows; tile_y+=(ssize_t) tile_height) { diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 67282ff6426..e305d829087 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2020,6 +2020,20 @@ static ssize_t GetMedianPixel(Quantum *pixels,const size_t n) } } +static inline long double PerceptibleReciprocalLD(const long double x) +{ + long double + sign; + + /* + Return 1/x where x is perceptible (not unlimited or infinitesimal). + */ + sign=x < 0.0 ? -1.0 : 1.0; + if ((sign*x) >= MagickEpsilon) + return(1.0/x); + return(sign/MagickEpsilon); +} + MagickExport ChannelStatistics *GetImageStatistics(const Image *image, ExceptionInfo *exception) { @@ -2027,10 +2041,11 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, *channel_statistics; double + *histogram; + + long double area, - channels, - *histogram, - standard_deviation; + channels; MagickStatusType status; @@ -2055,8 +2070,8 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, assert(image->signature == MagickCoreSignature); if (IsEventLogging() != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - histogram=(double *) AcquireQuantumMemory(MaxMap+1UL,GetPixelChannels(image)* - sizeof(*histogram)); + histogram=(double *) AcquireQuantumMemory(MaxMap+1UL, + MagickMax(GetPixelChannels(image),1)*sizeof(*histogram)); channel_statistics=(ChannelStatistics *) AcquireQuantumMemory( MaxPixelChannels+1,sizeof(*channel_statistics)); if ((channel_statistics == (ChannelStatistics *) NULL) || @@ -2067,15 +2082,24 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, if (channel_statistics != (ChannelStatistics *) NULL) channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( channel_statistics); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); return(channel_statistics); } (void) memset(channel_statistics,0,(MaxPixelChannels+1)* sizeof(*channel_statistics)); for (i=0; i <= (ssize_t) MaxPixelChannels; i++) { - channel_statistics[i].depth=1; - channel_statistics[i].maxima=(-MagickMaximumValue); - channel_statistics[i].minima=MagickMaximumValue; + ChannelStatistics *cs = channel_statistics+i; + cs->area = 0; + cs->depth=1; + cs->maxima=(-MagickMaximumValue); + cs->minima=MagickMaximumValue; + cs->sum=cs->sumLD=0; + cs->mean=0; + cs->standard_deviation = cs->variance = 0.0; + cs->skewness = cs->kurtosis = 0.0; + cs->entropy = 0.0; } (void) memset(histogram,0,(MaxMap+1)*GetPixelChannels(image)* sizeof(*histogram)); @@ -2102,78 +2126,108 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { + ChannelStatistics + *cs; + PixelChannel channel = GetPixelChannelChannel(image,i); PixelTrait traits = GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - if ((traits & UpdatePixelTrait) == 0) - continue; - if (channel_statistics[channel].depth != MAGICKCORE_QUANTUM_DEPTH) + cs=channel_statistics+i; + if (cs->depth != MAGICKCORE_QUANTUM_DEPTH) { - depth=channel_statistics[channel].depth; + depth=cs->depth; range=GetQuantumRange(depth); status=p[i] != ScaleAnyToQuantum(ScaleQuantumToAny(p[i],range), range) ? MagickTrue : MagickFalse; if (status != MagickFalse) { - channel_statistics[channel].depth++; - if (channel_statistics[channel].depth > - channel_statistics[CompositePixelChannel].depth) - channel_statistics[CompositePixelChannel].depth= - channel_statistics[channel].depth; + cs->depth++; + if (cs->depth > channel_statistics[CompositePixelChannel].depth) + channel_statistics[CompositePixelChannel].depth=cs->depth; i--; continue; } } - if ((double) p[i] < channel_statistics[channel].minima) - channel_statistics[channel].minima=(double) p[i]; - if ((double) p[i] > channel_statistics[channel].maxima) - channel_statistics[channel].maxima=(double) p[i]; - channel_statistics[channel].sum+=QuantumScale*p[i]; - channel_statistics[channel].sum_squared+=QuantumScale*p[i]* - QuantumScale*p[i]; - channel_statistics[channel].sum_cubed+=QuantumScale*p[i]* - QuantumScale*p[i]*QuantumScale*p[i]; - channel_statistics[channel].sum_fourth_power+=QuantumScale*p[i]* - QuantumScale*p[i]*QuantumScale*p[i]*QuantumScale*p[i]; - channel_statistics[channel].area++; - if ((double) p[i] < channel_statistics[CompositePixelChannel].minima) - channel_statistics[CompositePixelChannel].minima=p[i]; - if ((double) p[i] > channel_statistics[CompositePixelChannel].maxima) - channel_statistics[CompositePixelChannel].maxima=p[i]; + + cs->area++; + + if ((double) p[i] < cs->minima) + cs->minima=(double) p[i]; + if ((double) p[i] > cs->maxima) + cs->maxima=(double) p[i]; + histogram[(ssize_t) GetPixelChannels(image)*ScaleQuantumToMap( - ClampToQuantum(p[i]))+i]++; - channel_statistics[CompositePixelChannel].sum+=QuantumScale*p[i]; - channel_statistics[CompositePixelChannel].sum_squared+=QuantumScale* - p[i]*QuantumScale*p[i]; - channel_statistics[CompositePixelChannel].sum_cubed+=QuantumScale* - p[i]*QuantumScale*p[i]*QuantumScale*p[i]; - channel_statistics[CompositePixelChannel].sum_fourth_power+= - QuantumScale*p[i]*QuantumScale*p[i]*QuantumScale*p[i]* - QuantumScale*p[i]; - channel_statistics[CompositePixelChannel].area++; + ClampToQuantum((double) p[i]))+i]++; + + cs->sumLD += (long double) p[i]; + /* sum_squared, sum_cubed and sum_fourth_power are not used in MagickCore or MagickWand, + but are made available in Magick++/lib/Statistic.cpp, so we need to calculate these. + */ + cs->sum_squared+=(double) p[i]*(double) p[i]; + cs->sum_cubed+=(double) p[i]*(double) p[i]*(double) p[i]; + cs->sum_fourth_power+=(double) p[i]*(double) p[i]*(double) p[i]* + (double) p[i]; + + { + /* Calculate running totals for Welford's method. + */ + long double delta, delta_n, delta_n2, term1; + double n1 = cs->area-1; + double n = cs->area; + + delta = (double) p[i] - cs->M1; + delta_n = delta / n; + delta_n2 = delta_n * delta_n; + term1 = delta * delta_n * n1; + cs->M4 += term1 * delta_n2 * (n*n - 3*n + 3) + 6 * delta_n2 * + cs->M2 - 4 * delta_n * cs->M3; + cs->M3 += term1 * delta_n * (n - 2) - 3 * delta_n * cs->M2; + cs->M2 += term1; + cs->M1 += delta_n; + } } p+=GetPixelChannels(image); } } - for (i=0; i <= (ssize_t) MaxPixelChannels; i++) + + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - /* - Normalize pixel statistics. - */ - area=PerceptibleReciprocal(channel_statistics[i].area); - channel_statistics[i].sum*=area; - channel_statistics[i].sum_squared*=area; - channel_statistics[i].sum_cubed*=area; - channel_statistics[i].sum_fourth_power*=area; - channel_statistics[i].mean=channel_statistics[i].sum; - channel_statistics[i].variance=channel_statistics[i].sum_squared; - standard_deviation=sqrt(channel_statistics[i].variance- - (channel_statistics[i].mean*channel_statistics[i].mean)); - standard_deviation=sqrt(PerceptibleReciprocal(channel_statistics[i].area- - 1.0)*channel_statistics[i].area*standard_deviation*standard_deviation); - channel_statistics[i].standard_deviation=standard_deviation; + ChannelStatistics + *cs; + + PixelChannel channel = GetPixelChannelChannel(image,i); + PixelTrait traits = GetPixelChannelTraits(image,channel); + double AdjArea = 1.0; + if (traits == UndefinedPixelTrait) + continue; + cs = &channel_statistics[i]; + + if (cs->area > 0) { + cs->mean = cs->sumLD / (long double) cs->area; + if (cs->area > 1) + AdjArea = cs->area / ( cs->area - 1.0); + } else { + cs->mean = 0; + } + cs->sum = (double)cs->sum; + if (cs->M2 == 0) { + cs->standard_deviation = 0.0; + cs->variance = 0.0; + cs->skewness = 0.0; + cs->kurtosis = 0.0; + } else { + if (cs->area > 1) { + cs->standard_deviation = sqrtl(cs->M2/((long double)cs->area-1.0)); + } else { + cs->standard_deviation = sqrtl(cs->M2/((long double)cs->area)); + } + cs->variance = cs->standard_deviation * cs->standard_deviation; + cs->skewness = sqrtl(cs->area) * cs->M3 / powl (cs->M2*AdjArea,1.5); + cs->kurtosis = cs->area * cs->M4 / (cs->M2*cs->M2*AdjArea*AdjArea) - 3.0; + } } + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { double @@ -2182,59 +2236,39 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, ssize_t j; + PixelChannel channel = GetPixelChannelChannel(image,i); + ChannelStatistics * cs = &channel_statistics[i]; + if (cs->area > 0) { + cs->sum /= cs->area; + cs->sum_squared /= cs->area; + cs->sum_cubed /= cs->area; + cs->sum_fourth_power /= cs->area; + } + /* Compute pixel entropy. */ - PixelChannel channel = GetPixelChannelChannel(image,i); number_bins=0.0; for (j=0; j <= (ssize_t) MaxMap; j++) if (histogram[(ssize_t) GetPixelChannels(image)*j+i] > 0.0) number_bins++; - area=PerceptibleReciprocal(channel_statistics[channel].area); + area=PerceptibleReciprocalLD(channel_statistics[channel].area); for (j=0; j <= (ssize_t) MaxMap; j++) { double count; count=area*histogram[(ssize_t) GetPixelChannels(image)*j+i]; - channel_statistics[channel].entropy+=-count*MagickLog10(count)* - PerceptibleReciprocal(MagickLog10(number_bins)); - channel_statistics[CompositePixelChannel].entropy+=-count* - MagickLog10(count)*PerceptibleReciprocal(MagickLog10(number_bins))/ - GetPixelChannels(image); + channel_statistics[channel].entropy+=((long double) -count* + MagickLog10(count)*PerceptibleReciprocalLD((long double) + MagickLog10(number_bins))); + channel_statistics[CompositePixelChannel].entropy+=((long double) -count* + MagickLog10(count)*PerceptibleReciprocalLD((long double) + MagickLog10(number_bins))/GetPixelChannels(image)); } } histogram=(double *) RelinquishMagickMemory(histogram); - for (i=0; i <= (ssize_t) MaxPixelChannels; i++) - { - /* - Compute kurtosis & skewness statistics. - */ - standard_deviation=PerceptibleReciprocal( - channel_statistics[i].standard_deviation); - channel_statistics[i].skewness=(channel_statistics[i].sum_cubed-3.0* - channel_statistics[i].mean*channel_statistics[i].sum_squared+2.0* - channel_statistics[i].mean*channel_statistics[i].mean* - channel_statistics[i].mean)*(standard_deviation*standard_deviation* - standard_deviation); - channel_statistics[i].kurtosis=(channel_statistics[i].sum_fourth_power-4.0* - channel_statistics[i].mean*channel_statistics[i].sum_cubed+6.0* - channel_statistics[i].mean*channel_statistics[i].mean* - channel_statistics[i].sum_squared-3.0*channel_statistics[i].mean* - channel_statistics[i].mean*1.0*channel_statistics[i].mean* - channel_statistics[i].mean)*(standard_deviation*standard_deviation* - standard_deviation*standard_deviation)-3.0; - } - for (i=0; i <= (ssize_t) MaxPixelChannels; i++) - { - channel_statistics[i].mean*=QuantumRange; - channel_statistics[i].variance*=QuantumRange; - channel_statistics[i].standard_deviation*=QuantumRange; - channel_statistics[i].sum*=QuantumRange; - channel_statistics[i].sum_squared*=QuantumRange; - channel_statistics[i].sum_cubed*=QuantumRange; - channel_statistics[i].sum_fourth_power*=QuantumRange; - } + median_info=AcquireVirtualMemory(image->columns,image->rows*sizeof(*median)); if (median_info == (MemoryInfo *) NULL) (void) ThrowMagickException(exception,GetMagickModule(), @@ -2283,26 +2317,65 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, } median_info=RelinquishVirtualMemory(median_info); } - channel_statistics[CompositePixelChannel].mean=0.0; - channel_statistics[CompositePixelChannel].median=0.0; - channel_statistics[CompositePixelChannel].standard_deviation=0.0; - channel_statistics[CompositePixelChannel].entropy=0.0; - for (i=0; i < (ssize_t) MaxPixelChannels; i++) { - channel_statistics[CompositePixelChannel].mean+= - channel_statistics[i].mean; - channel_statistics[CompositePixelChannel].median+= - channel_statistics[i].median; - channel_statistics[CompositePixelChannel].standard_deviation+= - channel_statistics[i].standard_deviation; - channel_statistics[CompositePixelChannel].entropy+= - channel_statistics[i].entropy; + ChannelStatistics *csComp = channel_statistics+CompositePixelChannel; + csComp->sum=0.0; + csComp->sum_squared=0.0; + csComp->sum_cubed=0.0; + csComp->sum_fourth_power=0.0; + csComp->maxima=(-MagickMaximumValue); + csComp->minima=MagickMaximumValue; + csComp->area=0.0; + csComp->mean=0.0; + csComp->median=0.0; + csComp->variance=0.0; + csComp->standard_deviation=0.0; + csComp->entropy=0.0; + csComp->skewness=0.0; + csComp->kurtosis=0.0; + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + ChannelStatistics + *cs; + + PixelChannel channel = GetPixelChannelChannel(image,i); + PixelTrait traits = GetPixelChannelTraits(image,channel); + if (traits == UndefinedPixelTrait) + continue; + if ((traits & UpdatePixelTrait) == 0) + continue; + cs=channel_statistics+i; + if (csComp->maxima < cs->maxima) + csComp->maxima = cs->maxima; + if (csComp->minima > cs->minima) + csComp->minima = cs->minima; + csComp->sum += cs->sum; + csComp->sum_squared += cs->sum_squared; + csComp->sum_cubed += cs->sum_cubed; + csComp->sum_fourth_power += cs->sum_fourth_power; + csComp->median += cs->median; + csComp->area += cs->area; + csComp->mean += cs->mean; + csComp->variance += cs->variance; + csComp->standard_deviation += cs->standard_deviation; + csComp->skewness += cs->skewness; + csComp->kurtosis += cs->kurtosis; + csComp->entropy += cs->entropy; + } + channels=(double) GetImageChannels(image); + csComp->sum /= channels; + csComp->sum_squared /= channels; + csComp->sum_cubed /= channels; + csComp->sum_fourth_power /= channels; + csComp->median /= channels; + csComp->area /= channels; + csComp->mean /= channels; + csComp->variance /= channels; + csComp->standard_deviation /= channels; + csComp->skewness /= channels; + csComp->kurtosis /= channels; + csComp->entropy /= channels; } - channels=(double) GetImageChannels(image); - channel_statistics[CompositePixelChannel].mean/=channels; - channel_statistics[CompositePixelChannel].median/=channels; - channel_statistics[CompositePixelChannel].standard_deviation/=channels; - channel_statistics[CompositePixelChannel].entropy/=channels; if (y < (ssize_t) image->rows) channel_statistics=(ChannelStatistics *) RelinquishMagickMemory( channel_statistics); @@ -2997,8 +3070,8 @@ MagickExport Image *StatisticImage(const Image *image,const StatisticType type, minimum=(double) pixels[i]; if ((double) pixels[i] > maximum) maximum=(double) pixels[i]; - sum+=QuantumScale*pixels[i]; - sum_squared+=QuantumScale*pixels[i]*QuantumScale*pixels[i]; + sum+=(double) pixels[i]; + sum_squared+=(double) pixels[i]*(double) pixels[i]; pixels+=GetPixelChannels(image); } pixels+=GetPixelChannels(image)*image->columns; @@ -3024,7 +3097,7 @@ MagickExport Image *StatisticImage(const Image *image,const StatisticType type, case MeanStatistic: default: { - pixel=QuantumRange*ClampToQuantum(sum/area); + pixel=ClampToQuantum(sum/area); break; } case MedianStatistic: @@ -3049,13 +3122,12 @@ MagickExport Image *StatisticImage(const Image *image,const StatisticType type, } case RootMeanSquareStatistic: { - pixel=QuantumRange*ClampToQuantum(sqrt(sum_squared/area)); + pixel=ClampToQuantum(sqrt(sum_squared/area)); break; } case StandardDeviationStatistic: { - pixel=QuantumRange*ClampToQuantum(sqrt(sum_squared/area- - (sum/area*sum/area))); + pixel=ClampToQuantum(sqrt(sum_squared/area-(sum/area*sum/area))); break; } } diff --git a/MagickCore/statistic.h b/MagickCore/statistic.h index a100f11f50b..93e472f66dd 100644 --- a/MagickCore/statistic.h +++ b/MagickCore/statistic.h @@ -46,6 +46,13 @@ typedef struct _ChannelStatistics skewness, entropy, median; + + long double + sumLD, + M1, + M2, + M3, + M4; } ChannelStatistics; typedef struct _ChannelMoments diff --git a/MagickCore/thread-private.h b/MagickCore/thread-private.h index 291a6e467b9..23ba9b6ce14 100644 --- a/MagickCore/thread-private.h +++ b/MagickCore/thread-private.h @@ -27,9 +27,8 @@ extern "C" { #endif -#define magick_number_threads(source,destination,chunk,multithreaded) \ - num_threads(GetMagickNumberThreads((source),(destination),(chunk), \ - (multithreaded))) +#define magick_number_threads(source,destination,chunk,factor) \ + num_threads(GetMagickNumberThreads((source),(destination),(chunk),(factor))) #if defined(__clang__) || (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 10)) #define MagickCachePrefetch(address,mode,locality) \ __builtin_prefetch(address,mode,locality) @@ -49,8 +48,10 @@ extern "C" { #endif static inline int GetMagickNumberThreads(const Image *source, - const Image *destination,const size_t chunk,int multithreaded) + const Image *destination,const size_t chunk,const int factor) { +#define WorkLoadFactor (64UL << factor) + const CacheType destination_type = (CacheType) GetImagePixelCacheType(destination), source_type = (CacheType) GetImagePixelCacheType(source); @@ -61,15 +62,12 @@ static inline int GetMagickNumberThreads(const Image *source, /* Return number of threads dependent on cache type and work load. */ - if (multithreaded == 0) - return(1); + number_threads=(int) MagickMax(MagickMin(chunk/WorkLoadFactor, + GetMagickResourceLimit(ThreadResource)),1); if (((source_type != MemoryCache) && (source_type != MapCache)) || ((destination_type != MemoryCache) && (destination_type != MapCache))) - number_threads=(int) MagickMin(GetMagickResourceLimit(ThreadResource),2); - else - number_threads=(int) MagickMin((ssize_t) - GetMagickResourceLimit(ThreadResource),(ssize_t) (chunk)/64); - return(MagickMax(number_threads,1)); + number_threads=MagickMin(number_threads,2); + return(number_threads); } static inline MagickThreadType GetMagickThreadId(void) @@ -160,7 +158,7 @@ static inline void SetOpenMPNested(const int value) omp_set_nested(value); #else static inline void SetOpenMPNested(const int magick_unused(value)) -{ +{ magick_unreferenced(value); #endif } diff --git a/MagickCore/thread.c b/MagickCore/thread.c index a05a498e302..5919693776a 100644 --- a/MagickCore/thread.c +++ b/MagickCore/thread.c @@ -16,7 +16,7 @@ % March 2003 % % % % % -% Copyright @ 2003 ImageMagick Studio LLC, a non-profit organization % +% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % diff --git a/MagickCore/threshold.c b/MagickCore/threshold.c index 7d62b9b3487..389ebcb465f 100644 --- a/MagickCore/threshold.c +++ b/MagickCore/threshold.c @@ -249,14 +249,12 @@ MagickExport Image *AdaptiveThresholdImage(const Image *image, Quantum *magick_restrict q; - ssize_t - i, - x; - ssize_t center, + i, u, - v; + v, + x; if (status == MagickFalse) continue; @@ -837,7 +835,7 @@ MagickExport MagickBooleanType BilevelImage(Image *image,const double threshold, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -998,7 +996,7 @@ MagickExport MagickBooleanType BlackThresholdImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1133,7 +1131,7 @@ MagickExport MagickBooleanType ClampImage(Image *image,ExceptionInfo *exception) image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1340,7 +1338,7 @@ MagickExport MagickBooleanType ColorThresholdImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1977,7 +1975,7 @@ MagickExport MagickBooleanType OrderedDitherImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2147,7 +2145,7 @@ MagickExport MagickBooleanType PerceptibleImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2273,7 +2271,7 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image, #if defined(MAGICKCORE_OPENMP_SUPPORT) key=GetRandomSecretKey(random_info[0]); #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,key == ~0UL) + magick_number_threads(image,image,image->rows,key == ~0UL ? 0 : 1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2410,7 +2408,7 @@ MagickExport MagickBooleanType RangeThresholdImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2589,7 +2587,7 @@ MagickExport MagickBooleanType WhiteThresholdImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/timer-private.h b/MagickCore/timer-private.h index 967115bf763..7ecc0457bff 100644 --- a/MagickCore/timer-private.h +++ b/MagickCore/timer-private.h @@ -24,7 +24,7 @@ extern "C" { #include "MagickCore/locale_.h" -static inline void GetMagickUTCtime(const time_t *timep,struct tm *result) +static inline void GetMagickUTCTime(const time_t *timep,struct tm *result) { #if defined(MAGICKCORE_HAVE_GMTIME_R) (void) gmtime_r(timep,result); @@ -56,6 +56,17 @@ static inline void GetMagickLocaltime(const time_t *timep,struct tm *result) #endif } +extern MagickExport time_t + GetMagickTime(void); + +static inline MagickBooleanType IsImageTTLExpired(const Image* image) +{ + if ((image->ttl != (time_t) 0) && + (image->timestamp+image->ttl) < GetMagickTime()) + return(MagickTrue); + return(MagickFalse); +} + static inline time_t ParseMagickTimeToLive(const char *time_to_live) { char @@ -90,19 +101,9 @@ static inline time_t ParseMagickTimeToLive(const char *time_to_live) return(ttl); } -extern MagickExport time_t - GetMagickTime(void); - extern MagickPrivate void SetMagickDatePrecision(const unsigned long); -static inline MagickBooleanType IsImageTTLExpired(const Image* image) -{ - if (image->ttl == (time_t) 0) - return(MagickFalse); - return(image->ttl < GetMagickTime() ? MagickTrue : MagickFalse); -} - #if defined(__cplusplus) || defined(c_plusplus) } #endif diff --git a/MagickCore/timer.c b/MagickCore/timer.c index 59aad7d643b..9f6707ee199 100644 --- a/MagickCore/timer.c +++ b/MagickCore/timer.c @@ -284,7 +284,7 @@ MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length, limit=DestroyString(limit); } } - GetMagickUTCtime(&time,&utc_time); + GetMagickUTCTime(&time,&utc_time); count=FormatLocaleString(timestamp,length, "%04d-%02d-%02dT%02d:%02d:%02d%+03d:00",utc_time.tm_year+1900, utc_time.tm_mon+1,utc_time.tm_mday,utc_time.tm_hour,utc_time.tm_min, diff --git a/MagickCore/transform.c b/MagickCore/transform.c index 5e5a8c417ff..c55ac773b3d 100644 --- a/MagickCore/transform.c +++ b/MagickCore/transform.c @@ -258,7 +258,7 @@ MagickExport Image *ChopImage(const Image *image,const RectangleInfo *chop_info, chop_view=AcquireAuthenticCacheView(chop_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,chop_image,(size_t) extent.y,1) + magick_number_threads(image,chop_image,(size_t) extent.y,2) #endif for (y=0; y < (ssize_t) extent.y; y++) { @@ -323,7 +323,7 @@ MagickExport Image *ChopImage(const Image *image,const RectangleInfo *chop_info, */ #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,chop_image,image->rows-((size_t) extent.y+extent.height),1) + magick_number_threads(image,chop_image,image->rows-((size_t) extent.y+extent.height),2) #endif for (y=0; y < (ssize_t) (image->rows-((size_t) extent.y+extent.height)); y++) { @@ -680,7 +680,7 @@ MagickExport Image *CropImage(const Image *image,const RectangleInfo *geometry, crop_view=AcquireAuthenticCacheView(crop_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,crop_image,crop_image->rows,1) + magick_number_threads(image,crop_image,crop_image->rows,2) #endif for (y=0; y < (ssize_t) crop_image->rows; y++) { @@ -1029,7 +1029,7 @@ MagickExport Image *ExcerptImage(const Image *image, excerpt_view=AcquireAuthenticCacheView(excerpt_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,excerpt_image,excerpt_image->rows,1) + magick_number_threads(image,excerpt_image,excerpt_image->rows,2) #endif for (y=0; y < (ssize_t) excerpt_image->rows; y++) { @@ -1229,7 +1229,7 @@ MagickExport Image *FlipImage(const Image *image,ExceptionInfo *exception) flip_view=AcquireAuthenticCacheView(flip_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,flip_image,flip_image->rows,1) + magick_number_threads(image,flip_image,flip_image->rows,2) #endif for (y=0; y < (ssize_t) flip_image->rows; y++) { @@ -1364,7 +1364,7 @@ MagickExport Image *FlopImage(const Image *image,ExceptionInfo *exception) flop_view=AcquireAuthenticCacheView(flop_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(image,flop_image,flop_image->rows,1) + magick_number_threads(image,flop_image,flop_image->rows,2) #endif for (y=0; y < (ssize_t) flop_image->rows; y++) { @@ -1483,7 +1483,7 @@ static MagickBooleanType CopyImageRegion(Image *destination,const Image *source, destination_view=AcquireAuthenticCacheView(destination,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(source,destination,rows,1) + magick_number_threads(source,destination,rows,2) #endif for (y=0; y < (ssize_t) rows; y++) { @@ -1810,7 +1810,7 @@ MagickExport Image *SpliceImage(const Image *image, splice_view=AcquireAuthenticCacheView(splice_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,splice_image,(size_t) splice_geometry.y,1) + magick_number_threads(image,splice_image,(size_t) splice_geometry.y,2) #endif for (y=0; y < (ssize_t) splice_geometry.y; y++) { @@ -2162,7 +2162,7 @@ MagickExport Image *TransposeImage(const Image *image,ExceptionInfo *exception) transpose_view=AcquireAuthenticCacheView(transpose_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,transpose_image,image->rows,1) + magick_number_threads(image,transpose_image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -2300,7 +2300,7 @@ MagickExport Image *TransverseImage(const Image *image,ExceptionInfo *exception) transverse_view=AcquireAuthenticCacheView(transverse_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,transverse_image,image->rows,1) + magick_number_threads(image,transverse_image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/version.c b/MagickCore/version.c index d3f3ff4fea5..dca8786ceb1 100644 --- a/MagickCore/version.c +++ b/MagickCore/version.c @@ -101,7 +101,7 @@ MagickExport const char *GetMagickCopyright(void) MagickExport const char *GetMagickDelegates(void) { static const char - *delegates = "" + *delegates="" #if defined(MAGICKCORE_AUTOTRACE_DELEGATE) " autotrace" #endif @@ -221,6 +221,8 @@ MagickExport const char *GetMagickDelegates(void) " zstd" #endif ; + if (*delegates == '\0') + return(delegates); return(delegates+1); } diff --git a/MagickCore/version.h.cmake b/MagickCore/version.h.cmake deleted file mode 100644 index 5e54a08b49c..00000000000 --- a/MagickCore/version.h.cmake +++ /dev/null @@ -1,97 +0,0 @@ -/* - Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization - dedicated to making software imaging solutions freely available. - - You may not use this file except in compliance with the License. - obtain a copy of the License at - - http://imagemagick.org/script/license.php - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - MagickCore version methods. -*/ -#ifndef _MAGICKCORE_VERSION_H -#define _MAGICKCORE_VERSION_H - -#if defined(__cplusplus) || defined(c_plusplus) -extern "C" { -#endif - -/* - Define declarations. -*/ -#define MagickPackageName "@PACKAGE_NAME@" -#define MagickCopyright "© 1999-2019 ImageMagick Studio LLC" -#define MagickLibVersion @PACKAGE_LIB_VERSION@ -#define MagickLibVersionText "@MAGICK_LIB_VERSION_TEXT@" -#define MagickLibVersionNumber @MAGICK_LIB_VERSION_NUMBER@ -#define MagickLibAddendum "@PACKAGE_VERSION_ADDENDUM@" -#define MagickLibInterface @MAGICK_LIBRARY_CURRENT@ -#define MagickLibMinInterface @MAGICK_LIBRARY_CURRENT_MIN@ -#if defined(_WINDOWS) -# if defined(_WIN64) -# define MagickPlatform "x64" -# else -# define MagickPlatform "x86" -# endif -#else -#define MagickPlatform "@MAGICK_TARGET_CPU@" -#endif -#define MagickppLibVersionText "@MAGICKPP_LIB_VERSION_TEXT@" -#define MagickppLibVersionNumber @MAGICKPP_LIBRARY_VERSION_INFO@ -#define MagickppLibAddendum "@PACKAGE_VERSION_ADDENDUM@" -#define MagickppLibInterface @MAGICKPP_LIBRARY_CURRENT@ -#define MagickppLibMinInterface @MAGICKPP_LIBRARY_CURRENT_MIN@ -#define MagickReleaseDate "@PACKAGE_RELEASE_DATE@" -#define MagickAuthoritativeLicense \ - "https://imagemagick.org/script/license.php" -#define MagickAuthoritativeURL "https://imagemagick.org" -#define MagickHomeURL "file://@DOCUMENTATION_PATH@/index.html" -#if (MAGICKCORE_QUANTUM_DEPTH == 8) -#define MagickQuantumDepth "Q8" -#define MagickQuantumRange "255" -#elif (MAGICKCORE_QUANTUM_DEPTH == 16) -#define MagickQuantumDepth "Q16" -#define MagickQuantumRange "65535" -#elif (MAGICKCORE_QUANTUM_DEPTH == 32) -#define MagickQuantumDepth "Q32" -#define MagickQuantumRange "4294967295" -#elif (MAGICKCORE_QUANTUM_DEPTH == 64) -#define MagickQuantumDepth "Q64" -#define MagickQuantumRange "65535" -#else -#define MagickQuantumDepth "Q?" -#define MagickQuantumRange "?" -#endif -#define MagickVersion \ - MagickPackageName " " MagickLibVersionText MagickLibAddendum " " \ - MagickQuantumDepth " " MagickPlatform " " MagickReleaseDate " " \ - MagickAuthoritativeURL - -extern MagickExport char - *GetMagickHomeURL(void); - -extern MagickExport const char - *GetMagickCopyright(void) magick_attribute((__const__)), - *GetMagickDelegates(void) magick_attribute((__const__)), - *GetMagickFeatures(void) magick_attribute((__const__)), - *GetMagickLicense(void) magick_attribute((__const__)), - *GetMagickPackageName(void) magick_attribute((__const__)), - *GetMagickQuantumDepth(size_t *), - *GetMagickQuantumRange(size_t *), - *GetMagickReleaseDate(void) magick_attribute((__const__)), - *GetMagickVersion(size_t *); - -extern MagickExport void - ListMagickVersion(FILE *); - -#if defined(__cplusplus) || defined(c_plusplus) -} -#endif - -#endif diff --git a/MagickCore/vision.c b/MagickCore/vision.c index 5d12d713dd8..1773215eb6a 100644 --- a/MagickCore/vision.c +++ b/MagickCore/vision.c @@ -236,10 +236,8 @@ static void PerimeterThreshold(const Image *component_image, else if (foreground == 2) { - if ((((ssize_t) pixels[0] == i) && - ((ssize_t) pixels[3] == i)) || - (((ssize_t) pixels[1] == i) && - ((ssize_t) pixels[2] == i))) + if ((((ssize_t) pixels[0] == i) && ((ssize_t) pixels[3] == i)) || + (((ssize_t) pixels[1] == i) && ((ssize_t) pixels[2] == i))) pattern[0]++; /* diagonal */ else pattern[2]++; diff --git a/MagickCore/visual-effects.c b/MagickCore/visual-effects.c index 83b3ca20bf6..d1cb87543d3 100644 --- a/MagickCore/visual-effects.c +++ b/MagickCore/visual-effects.c @@ -192,7 +192,7 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, #if defined(MAGICKCORE_OPENMP_SUPPORT) key=GetRandomSecretKey(random_info[0]); #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,noise_image,image->rows,key == ~0UL) + magick_number_threads(image,noise_image,image->rows,key == ~0UL ? 0 : 2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -611,7 +611,7 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, image_view=AcquireAuthenticCacheView(colorize_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(colorize_image,colorize_image,colorize_image->rows,1) + magick_number_threads(colorize_image,colorize_image,colorize_image->rows,2) #endif for (y=0; y < (ssize_t) colorize_image->rows; y++) { @@ -1267,7 +1267,7 @@ MagickExport Image *MorphImages(const Image *image,const size_t number_frames, morph_view=AcquireAuthenticCacheView(morph_images,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(morph_image,morph_image,morph_image->rows,1) + magick_number_threads(morph_image,morph_image,morph_image->rows,2) #endif for (y=0; y < (ssize_t) morph_images->rows; y++) { @@ -2216,7 +2216,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius, #if defined(MAGICKCORE_OPENMP_SUPPORT) key=GetRandomSecretKey(random_info[0]); #pragma omp parallel for schedule(static) shared(status) \ - magick_number_threads(random_image,random_image,random_image->rows,key == ~0UL) + magick_number_threads(random_image,random_image,random_image->rows,key == ~0UL ? 0 : 2) #endif for (y=0; y < (ssize_t) random_image->rows; y++) { @@ -2387,7 +2387,7 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static) shared(progress,status) \ - magick_number_threads(image,image,image->rows,1) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 50e22a78c2f..dbc43d8d72b 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -11,9 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# - -project(MagickWand C) +# set(MAGICKWAND_SRC MagickWand.h @@ -99,22 +97,26 @@ set(MAGICKWAND_PUBLIC_HEADERS wand-view.h ) -if(MAGICK_BUILD_STATIC) - add_library(${MAGICKWAND_BINARY_NAME} STATIC ${MAGICKWAND_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -else() - add_library(${MAGICKWAND_BINARY_NAME} SHARED ${MAGICKWAND_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -endif() +add_library(MagickWand ${MAGICKWAND_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -set_target_properties(${MAGICKWAND_BINARY_NAME} PROPERTIES PUBLIC_HEADER "${MAGICKWAND_PUBLIC_HEADERS}") -target_include_directories(${MAGICKWAND_BINARY_NAME} PUBLIC ${IMAGEMAGICK_BASE_PATH}) -target_include_directories(${MAGICKWAND_BINARY_NAME} PRIVATE ${IMAGEMAGICK_DELEGATES_INCLUDE_DIRS}) -# Set the MAGICKCORE_SHAREARCH_BASEDIRNAME to "config", not sure if I should add it to the -target_compile_definitions(${MAGICKWAND_BINARY_NAME} PRIVATE ${MAGICK_BUILD_DEFINES} -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") -target_link_libraries(${MAGICKWAND_BINARY_NAME} PUBLIC ${MAGICKCORE_BINARY_NAME}) +set_target_properties(MagickWand PROPERTIES + OUTPUT_NAME "MagickWand-${MAGICK_BINARY_SUFFIX}" + PUBLIC_HEADER "${MAGICKWAND_PUBLIC_HEADERS}" +) +target_include_directories(MagickWand PUBLIC ${IMAGEMAGICK_BASE_PATH}) +target_include_directories(MagickWand PRIVATE ${IMAGEMAGICK_DELEGATES_INCLUDE_DIRS}) +target_compile_definitions(MagickWand PRIVATE _MAGICKLIB_) +target_link_libraries(MagickWand PUBLIC MagickCore) + +install(TARGETS MagickWand + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${INCLUDE_PATH}/MagickWand +) -install(TARGETS ${MAGICKWAND_BINARY_NAME} - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/MagickWand +configure_file(MagickWand-config.in ${CMAKE_CURRENT_BINARY_DIR}/MagickWand-config @ONLY) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/MagickWand-config DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) diff --git a/MagickWand/MagickWand-config.in b/MagickWand/MagickWand-config.in index da7f750104b..647b80c2e7a 100644 --- a/MagickWand/MagickWand-config.in +++ b/MagickWand/MagickWand-config.in @@ -6,6 +6,7 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ +export PKG_CONFIG_LIBDIR="${exec_prefix}/lib/pkgconfig" usage="\ Usage: MagickWand-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [--libs] [--prefix] [--version]" diff --git a/MagickWand/MagickWand.h b/MagickWand/MagickWand.h index 709bd0ee491..5018e65ce9b 100644 --- a/MagickWand/MagickWand.h +++ b/MagickWand/MagickWand.h @@ -22,6 +22,7 @@ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif + #if !defined(MAGICKWAND_CONFIG_H) # define MAGICKWAND_CONFIG_H # if !defined(vms) diff --git a/MagickWand/studio.h b/MagickWand/studio.h index 2d617a653ad..ec32d68a4c5 100644 --- a/MagickWand/studio.h +++ b/MagickWand/studio.h @@ -94,10 +94,6 @@ extern "C" { #if defined(MAGICKCORE_HAVE_UNISTD_H) # include #endif -#if defined(MAGICKWAND_WINDOWS_SUPPORT) && defined(_DEBUG) -#define _CRTDBG_MAP_ALLOC -#endif - #if defined(MAGICKWAND_WINDOWS_SUPPORT) && defined(_DEBUG) #define _CRTDBG_MAP_ALLOC #endif diff --git a/Makefile.in b/Makefile.in index 8e0fcdb8da4..e6a19eefede 100644 --- a/Makefile.in +++ b/Makefile.in @@ -263,8 +263,7 @@ check_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_4) @MAGICKCORE_ZERO_CONFIGURATION_SUPPORT_TRUE@am__append_5 = MagickCore/threshold-map.h subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ac_func_fseeko.m4 \ - $(top_srcdir)/m4/ax_c___attribute__.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_framework.m4 \ @@ -3638,7 +3637,6 @@ EXTRA_LTLIBRARIES = BUILT_SOURCES = MOSTLYCLEANFILES = M4_EXTRA_DIST = \ - ac_func_fseeko.m4 \ ax_append_flag.m4 \ ax_c___attribute__.m4 \ ax_cflags_warn_all.m4 \ diff --git a/PerlMagick/MANIFEST b/PerlMagick/MANIFEST index f5ac48c682d..a3ae153c7b2 100644 --- a/PerlMagick/MANIFEST +++ b/PerlMagick/MANIFEST @@ -6,7 +6,6 @@ demo/button.pl demo/compose-specials.pl demo/composite.pl demo/demo.pl -demo/dst.png demo/Generic.ttf demo/lsys.pl demo/Makefile @@ -20,7 +19,6 @@ demo/shadow-text.pl demo/shapes.pl demo/single-pixels.pl demo/smile.gif -demo/src.png demo/steganography.pl demo/tile.gif demo/tree.pl diff --git a/PerlMagick/demo/steganography.pl b/PerlMagick/demo/steganography.pl index fdb3834ffd6..7c736d6c9c6 100644 --- a/PerlMagick/demo/steganography.pl +++ b/PerlMagick/demo/steganography.pl @@ -15,7 +15,7 @@ $image->ReadImage('model.gif'); $image->SteganoImage(image=>$watermark,offset=>91); $image->Write('model.pam'); -$image->Write('show:'); +$image->Write(magick=>'SHOW',title=>"Steganography Model"); # # Extract image from image. # @@ -23,4 +23,4 @@ $stegano=Image::Magick->new(size=>$size); $stegano->ReadImage('stegano:model.pam'); $stegano->Write('stegano.pam'); -$image->Write(magick=>'SHOW',title=>"Steganography Demo"); +$stegano->Write(magick=>'SHOW',title=>"Hidden Image"); diff --git a/aclocal.m4 b/aclocal.m4 index 10de731ae6a..170e104cc5d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1267,7 +1267,6 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR -m4_include([m4/ac_func_fseeko.m4]) m4_include([m4/ax_c___attribute__.m4]) m4_include([m4/ax_cflags_warn_all.m4]) m4_include([m4/ax_check_compile_flag.m4]) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 2f3688e813f..63f9c93c754 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -1,38 +1,281 @@ -include(CheckIncludeFile) -include(CheckIncludeFiles) -include(CheckSymbolExists) -include(CheckPrototypeDefinition) -include(CheckFunctionExists) -include(CheckCXXSourceCompiles) -include(CheckTypeSize) -include(CheckLibraryExists) -include(CheckCXXSourceRuns) -include(CheckStructHasMember) -include(CheckCSourceCompiles) -include(CheckSourceRuns) -include(TestBigEndian) - macro(magick_check_env) - # Check if `closedir' function returns void instead of `int' + include(CheckCSourceCompiles) + include(CheckCSourceCompiles) + include(CheckCSourceRuns) + include(CheckFunctionExists) + include(CheckIncludeFile) + include(CheckIncludeFiles) + include(CheckLibraryExists) + include(CheckPrototypeDefinition) + include(CheckSourceRuns) + include(CheckStructHasMember) + include(CheckSymbolExists) + include(CheckTypeSize) + include(TestBigEndian) + + if(BUILD_MAGICKPP) + include(CheckCXXSourceCompiles) + include(CheckCXXSourceRuns) + endif() + + option(MSVC_SKIP_CHECKS "Skip trivial checks on MSVC" ON) + if(MSVC AND MSVC_SKIP_CHECKS) + # Skip most trivial checks on MSVC + set(__CHAR_UNSIGNED__ 1) + set(__EXTENSIONS__) + set(__func__) + set(_ALL_SOURCE) + set(_DARWIN_C_SOURCE) + set(_FILE_OFFSET_BITS 32) + set(_FORTIFY_SOURCE) + set(_GNU_SOURCE) + set(_HPUX_ALT_XOPEN_SOCKET_API) + set(_LARGE_FILES) + set(_LARGEFILE_SOURCE) + set(_MINIX) + set(_NETBSD_SOURCE) + set(_OPENBSD_SOURCE) + set(_POSIX_1_SOURCE) + set(_POSIX_PTHREAD_SEMANTICS) + set(_POSIX_SOURCE) + set(_TANDEM_SOURCE) + set(_UINT32_T) + set(_UINT64_T) + set(_UINT8_T) + set(_XOPEN_SOURCE) + set(HAVE___ATTRIBUTE__ 0) + set(HAVE__ALIGNED_MALLOC 0) + set(HAVE__BOOL 1) + set(HAVE__EXIT 1) + set(HAVE__NSGETEXECUTABLEPATH 0) + set(HAVE__PCLOSE 1) + set(HAVE__POPEN 1) + set(HAVE__WFOPEN 1) + set(HAVE__WSTAT 1) + set(HAVE_ACOSH 1) + set(HAVE_ALIGNED_MALLOC 0) + set(HAVE_ARM_LIMITS_H 0) + set(HAVE_ARPA_INET_H 0) + set(HAVE_ASINH 1) + set(HAVE_ATANH 1) + set(HAVE_ATEXIT 1) + set(HAVE_ATOLL 1) + set(HAVE_BOOL 1) + set(HAVE_CABS 1) + set(HAVE_CARG 1) + set(HAVE_CIMAG 1) + set(HAVE_CLOCK 1) + set(HAVE_CLOCK_GETRES 0) + set(HAVE_CLOCK_GETTIME 0) + set(HAVE_CLOCK_REALTIME 0) + set(HAVE_COMPLEX_H 1) + set(HAVE_CREAL 1) + set(HAVE_CTIME_R 0) + set(HAVE_DECL_PREAD 0) + set(HAVE_DECL_PWRITE 0) + set(HAVE_DECL_STRERROR_R 0) + set(HAVE_DECL_STRLCPY 0) + set(HAVE_DECL_TZNAME 0) + set(HAVE_DECL_VSNPRINTF 0) + set(HAVE_DIRECTIO 0) + set(HAVE_DIRENT_H 0) + set(HAVE_DLFCN_H 0) + set(HAVE_ERF 1) + set(HAVE_ERRNO_H 1) + set(HAVE_EXECVP 1) + set(HAVE_FCHMOD 0) + set(HAVE_FLOAT_H 1) + set(HAVE_FLOOR 1) + set(HAVE_FORK 0) + set(HAVE_FSEEKO 0) + set(HAVE_FTIME 1) + set(HAVE_FTRUNCATE 0) + set(HAVE_GETC_UNLOCKED 0) + set(HAVE_GETCWD 1) + set(HAVE_GETDTABLESIZE 0) + set(HAVE_GETENTROPY 0) + set(HAVE_GETEXECNAME 0) + set(HAVE_GETPAGESIZE 0) + set(HAVE_GETPID 1) + set(HAVE_GETPWNAM_R 0) + set(HAVE_GETRLIMIT 0) + set(HAVE_GETRUSAGE 0) + set(HAVE_GETTIMEOFDAY 0) + set(HAVE_GMTIME_R 0) + set(HAVE_HUGEPAGES 0) + set(HAVE_INTMAX_T 1) + set(HAVE_INTPTR_T 1) + set(HAVE_INTTYPES_H 1) + set(HAVE_ISNAN 1) + set(HAVE_J0 1) + set(HAVE_J1 1) + set(HAVE_LIBGCOV 0) + set(HAVE_LIMITS_H 1) + set(HAVE_LINUX_SENDFILE 0) + set(HAVE_LINUX_UNISTD_H 0) + set(HAVE_LLTOSTR 0) + set(HAVE_LOCALE_H 1) + set(HAVE_LOCALTIME_R 0) + set(HAVE_LONG_DOUBLE 1) + set(HAVE_LONG_DOUBLE_WIDER 0) + set(HAVE_LONG_LONG_INT 1) + set(HAVE_LSTAT 0) + set(HAVE_MACH_O_DYLD_H 0) + set(HAVE_MACHINE_PARAM_H 0) + set(HAVE_MALLOC_H 1) + set(HAVE_MBSTATE_T 1) + set(HAVE_MEMMOVE 1) + set(HAVE_MEMSET 1) + set(HAVE_MINIX_CONFIG_H 0) + set(HAVE_MKDIR 1) + set(HAVE_MKSTEMP 0) + set(HAVE_MMAP 0) + set(HAVE_NAMESPACE_STD 1) + set(HAVE_NAMESPACES 1) + set(HAVE_NANOSLEEP 0) + set(HAVE_NDIR_H 0) + set(HAVE_NETDB_H 0) + set(HAVE_NETINET_IN_H 0) + set(HAVE_NEWLOCALE 0) + set(HAVE_OS_H 0) + set(HAVE_PCLOSE 0) + set(HAVE_POLL 0) + set(HAVE_POPEN 0) + set(HAVE_POSIX_FADVISE 0) + set(HAVE_POSIX_FALLOCATE 0) + set(HAVE_POSIX_MADVISE 0) + set(HAVE_POSIX_MEMALIGN 0) + set(HAVE_POSIX_SPAWNP 0) + set(HAVE_POW 1) + set(HAVE_PREAD 0) + set(HAVE_PROCESS_H 1) + set(HAVE_PUTENV 1) + set(HAVE_PWRITE 0) + set(HAVE_QSORT_R 0) + set(HAVE_RAISE 1) + set(HAVE_RAND_R 0) + set(HAVE_READLINK 0) + set(HAVE_REALPATH 0) + set(HAVE_SEEKDIR 0) + set(HAVE_SELECT 0) + set(HAVE_SENDFILE 0) + set(HAVE_SETLOCALE 1) + set(HAVE_SETVBUF 1) + set(HAVE_SHARED_MEMORY 0) + set(HAVE_SIGACTION 0) + set(HAVE_SIGEMPTYSET 0) + set(HAVE_SOCKET 0) + set(HAVE_SPAWNVP 1) + set(HAVE_SQRT 1) + set(HAVE_STAT 1) + set(HAVE_STD_LIBS 1) + set(HAVE_STDARG_H 1) + set(HAVE_STDBOOL_H 1) + set(HAVE_STDDEF_H 1) + set(HAVE_STDINT_H 1) + set(HAVE_STDLIB_H 1) + set(HAVE_STRCASECMP 0) + set(HAVE_STRCASESTR 0) + set(HAVE_STRCHR 1) + set(HAVE_STRCSPN 1) + set(HAVE_STRDUP 1) + set(HAVE_STRERROR 1) + set(HAVE_STRERROR_R 0) + set(HAVE_STRING_H 1) + set(HAVE_STRINGIZE 1) + set(HAVE_STRINGS_H 0) + set(HAVE_STRLCAT 0) + set(HAVE_STRLCPY 0) + set(HAVE_STRNCASECMP 0) + set(HAVE_STRPBRK 1) + set(HAVE_STRRCHR 1) + set(HAVE_STRSPN 1) + set(HAVE_STRSTR 1) + set(HAVE_STRTOD 1) + set(HAVE_STRTOD_L 0) + set(HAVE_STRTOL 1) + set(HAVE_STRTOUL 1) + set(HAVE_STRUCT_TM_TM_ZONE 0) + set(HAVE_SUN_PREFETCH_H 0) + set(HAVE_SYMLINK 0) + set(HAVE_SYS_DIR_H 0) + set(HAVE_SYS_IPC_H 0) + set(HAVE_SYS_MMAN_H 0) + set(HAVE_SYS_NDIR_H 0) + set(HAVE_SYS_PARAM_H 0) + set(HAVE_SYS_RESOURCE_H 0) + set(HAVE_SYS_SENDFILE_H 0) + set(HAVE_SYS_SOCKET_H 0) + set(HAVE_SYS_STAT_H 1) + set(HAVE_SYS_SYSLIMITS_H 0) + set(HAVE_SYS_TIME_H 0) + set(HAVE_SYS_TIMES_H 0) + set(HAVE_SYS_TYPES_H 1) + set(HAVE_SYS_UIO_H 0) + set(HAVE_SYS_WAIT_H 0) + set(HAVE_SYSCONF 0) + set(HAVE_SYSTEM 1) + set(HAVE_TCMALLOC 0) + set(HAVE_TELLDIR 0) + set(HAVE_TEMPNAM 1) + set(HAVE_TIMES 0) + set(HAVE_TM_ZONE 0) + set(HAVE_TZNAME 0) + set(HAVE_UINTMAX_T 1) + set(HAVE_UINTPTR_T 1) + set(HAVE_ULLTOSTR 0) + set(HAVE_UNISTD_H 0) + set(HAVE_UNSIGNED_LONG_LONG_INT 1) + set(HAVE_USELOCALE 0) + set(HAVE_USLEEP 0) + set(HAVE_UTIME 1) + set(HAVE_UTIME_H 0) + set(HAVE_UTIMENSAT 0) + set(HAVE_VFPRINTF 1) + set(HAVE_VFPRINTF_L 0) + set(HAVE_VSNPRINTF 1) + set(HAVE_VSNPRINTF_L 0) + set(HAVE_VSPRINTF 1) + set(HAVE_WAITPID 0) + set(HAVE_WCHAR_H 1) + set(HAVE_WINDOWS_H 1) + set(HAVE_XLOCALE_H 0) + set(inline) + set(mbstate_t) + set(mode_t int) + set(off_t) + set(pid_t int) + set(SETJMP_IS_THREAD_SAFE 1) + set(size_t) + set(STAT_MACROS_BROKEN) + set(STDC_HEADERS 1) + set(STRERROR_R_CHAR_P) + set(TM_IN_SYS_TIME) + set(volatile) + set(X_DISPLAY_MISSING 1) + endif() + + # libm is required for complex.h checks + check_library_exists(m pow "" LIBM) + if (LIBM) + set(CMAKE_REQUIRED_LIBRARIES m) + set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES}) + endif() + + # Check if `' exists check_include_file(dirent.h HAVE_DIRENT_H) - if(HAVE_DIRENT_H) - unset(HAVE_DIRENT_H) - check_symbol_exists(DIR dirent.h HAVE_DIRENT_H) - if(NOT HAVE_DIRENT_H) - message(STATUS "--- DIR not defined...") - else(NOT HAVE_DIRENT_H) - check_prototype_definition(closedir "void closedir(DIR *dirp)" "NULL" "dirent.h" CLOSEDIR_VOID) - endif(NOT HAVE_DIRENT_H) - endif(HAVE_DIRENT_H) # Check if `acosh' exists check_function_exists(acosh HAVE_ACOSH) + # Check if `aligned_malloc' exists + check_function_exists(aligned_malloc HAVE_ALIGNED_MALLOC) + # Check if exists check_include_file(arm/limits.h HAVE_ARM_LIMITS_H) # Check if exists - check_include_file(arpa/inet.h HAVE_ARM_LIMITS_H) + check_include_file(arpa/inet.h HAVE_ARPA_INET_H) # Check if `asinh' exists check_function_exists(asinh HAVE_ASINH) @@ -46,17 +289,19 @@ macro(magick_check_env) # Check if `atoll' exists check_function_exists(atoll HAVE_ATOLL) - # Check if `bool' exists (check_type_size is not working at least on windows) - check_cxx_source_compiles ("void main () {bool b = false;}" HAVE_BOOL) + if(BUILD_MAGICKPP) + # Check if `bool' exists (check_type_size is not working at least on windows) + check_cxx_source_compiles ("int main () {bool b = false;}" HAVE_BOOL) + endif() # Check if `carg' exists - check_function_exists(carg HAVE_CARG) + check_symbol_exists(carg complex.h HAVE_CARG) # Check if `cabs' exists - check_function_exists(cabs HAVE_CABS) + check_symbol_exists(cabs complex.h HAVE_CABS) # Check if `cimag' exists - check_function_exists(cimag HAVE_CIMAG) + check_symbol_exists(cimag complex.h HAVE_CIMAG) # Check if `clock' exists check_function_exists(clock HAVE_CLOCK) @@ -74,7 +319,7 @@ macro(magick_check_env) check_include_file(complex.h HAVE_COMPLEX_H) # Check if `creal' exists - check_function_exists(creal HAVE_CREAL) + check_symbol_exists(creal complex.h HAVE_CREAL) # Check if `ctime_r' exists check_function_exists(ctime_r HAVE_CTIME_R) @@ -82,6 +327,19 @@ macro(magick_check_env) # Check if `pread' exists check_function_exists(pread HAVE_DECL_PREAD) + # Check if `PTHREAD_PRIO_INHERIT` exists + set(CMAKE_REQUIRED_LIBRARIES pthread) + check_c_source_compiles(" + #include + int main() { + int i = PTHREAD_PRIO_INHERIT; + } + " HAVE_PTHREAD_PRIO_INHERIT) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE}) + + # Check if `putenv' exists + check_function_exists(putenv HAVE_PUTENV) + # Check if `pwrite' exists check_function_exists(pwrite HAVE_DECL_PWRITE) @@ -100,19 +358,25 @@ macro(magick_check_env) # Check if exists check_include_file(dlfcn.h HAVE_DLFCN_H) + # Check if `float_t' exists + check_c_source_compiles ( + " + #include + int main () {float_t f = 0;} + " + HAVE_FLOAT_T) + # Check if `double_t' exists - check_cxx_source_compiles ( + check_c_source_compiles ( " #include - void main () {double_t d = 0;} - " + int main () {double_t d = 0;} + " HAVE_DOUBLE_T) # Check if `erf' exists # Only check if not windows since explicit defines the macro and it will cause a lot of warnings - if(NOT WINDOWS) - check_function_exists(erf HAVE_ERF) - endif() + check_function_exists(erf HAVE_ERF) # Check if exists check_include_file(errno.h HAVE_ERRNO_H) @@ -126,13 +390,8 @@ macro(magick_check_env) # Check if exists check_include_file(fcntl.h HAVE_FCNTL_H) - # Check if `float_t' exists - check_cxx_source_compiles ( - " - #include - void main () {float_t f = 0;} - " - HAVE_FLOAT_T) + # Check if exists + check_include_file(float.h HAVE_FLOAT_H) # Check if `floor' exists check_function_exists(floor HAVE_FLOOR) @@ -152,6 +411,9 @@ macro(magick_check_env) # Check if `getcwd' exists check_function_exists(getcwd HAVE_GETCWD) + # Check if `getentropy' exists + check_function_exists(getentropy HAVE_GETENTROPY) + # Check if `getc_unlocked' exists check_function_exists(getc_unlocked HAVE_GETC_UNLOCKED) @@ -167,6 +429,9 @@ macro(magick_check_env) # Check if `getpid' exists check_function_exists(getpid HAVE_GETPID) + # Check if `getpwnam_r' exists + check_function_exists(getpwnam_r HAVE_GETPWNAM_R) + # Check if `getrlimit' exists check_function_exists(getrlimit HAVE_GETRLIMIT) @@ -177,7 +442,7 @@ macro(magick_check_env) check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) # Check if `gmtime_r' exists - check_function_exists(gettimeofday HAVE_GMTIME_R) + check_function_exists(gmtime_r HAVE_GMTIME_R) # I don't think our program will have a big memory impact set(HAVE_HUGEPAGES FALSE) @@ -198,7 +463,7 @@ macro(magick_check_env) check_include_file(inttypes.h HAVE_INTTYPES_H) # Check if `isnan' exists - check_function_exists(isnan HAVE_ISNAN) + check_symbol_exists(isnan math.h float.h HAVE_ISNAN) # Check if `j0' exists check_function_exists(j0 HAVE_J0) @@ -212,6 +477,18 @@ macro(magick_check_env) # Check if exists check_include_file(limits.h HAVE_LIMITS_H) + # Check if you have Linux-compatible sendfile() + check_c_source_compiles( " + #undef _FILE_OFFSET_BITS + #include + #include + #include + int main() { + sendfile(0, 0, (void *) 0, 0); + }" + HAVE_LINUX_SENDFILE) + + # Check if exists check_include_file(linux/unistd.h HAVE_LINUX_UNISTD_H) @@ -221,12 +498,6 @@ macro(magick_check_env) # Check if exists check_include_file(locale.h HAVE_LOCALE_H) - # Check if `locale_t' exists - check_type_size(locale_t LOCALE_T) - if(HAVE_LOCALE_T ) # it was TRUE and we need it to be 1 - set(HAVE_LOCALE_T 1) - endif() - # Check if `localtime_r' exists check_function_exists(localtime_r HAVE_LOCALTIME_R) @@ -239,7 +510,7 @@ macro(magick_check_env) # Check if `long double' have more precision than `double' if(HAVE_LONG_DOUBLE) check_type_size(double DOUBLE) - if(${LONG_DOUBLE} GREATER ${DOUBLE}) + if(LONG_DOUBLE GREATER DOUBLE) set(HAVE_LONG_DOUBLE_WIDER 1) endif() endif() @@ -250,24 +521,40 @@ macro(magick_check_env) set(HAVE_LONG_LONG_INT 1) endif() + # Check if `lstat' exists + check_function_exists(lstat HAVE_LSTAT) + # Check if exists check_include_file(machine/param.h HAVE_MACHINE_PARAM_H) # Check if exists check_include_file(mach-o/dyld.h HAVE_MACH_O_DYLD_H) + # Check if exists + check_include_file(malloc.h HAVE_MALLOC_H) + # Check if `mbstate_t' exists in - check_symbol_exists(mbstate_t wchar.h HAVE_MBSTATE_T) + set(CMAKE_EXTRA_INCLUDE_FILES wchar.h) + check_type_size(mbstate_t SIZEOF_MBSTATE_T LANGUAGE C) + set(CMAKE_EXTRA_INCLUDE_FILES) + if(SIZEOF_MBSTATE_T) + set(HAVE_MBSTATE_T 1) + else() + set(mbstate_t int) + endif() # Check if `memmove' exists check_function_exists(memmove HAVE_MEMMOVE) - # Check if exists - check_include_file(memory.h HAVE_MEMORY_H) - # Check if `memset' exists check_function_exists(memset HAVE_MEMSET) + # Check if exists + check_include_file(minix/config.h HAVE_MINIX_CONFIG_H) + + # Check if `mkdir' exists + check_function_exists(mkdir HAVE_MKDIR) + # Check if `mkstemp' exists check_function_exists(mkstemp HAVE_MKSTEMP) @@ -277,16 +564,18 @@ macro(magick_check_env) # Check if `munmap' exists check_function_exists(munmap HAVE_MUNMAP) - # Check if `namespace' exists - check_cxx_source_compiles ("namespace test {} void main() {using namespace ::test;}" HAVE_NAMESPACES) + if(BUILD_MAGICKPP) + # Check if `namespace' exists + check_cxx_source_compiles ("namespace test {} int main() {using namespace ::test;}" HAVE_NAMESPACES) - # Check if `std::' exists - check_cxx_source_compiles ( - " - #include - void main() {std::istream& is = std::cin;} - " - HAVE_NAMESPACE_STD) + # Check if `std::' exists + check_cxx_source_compiles ( + " + #include + int main() {std::istream& is = std::cin;} + " + HAVE_NAMESPACE_STD) + endif() # Check if `nanosleep' exists check_function_exists(nanosleep HAVE_NANOSLEEP) @@ -369,7 +658,7 @@ macro(magick_check_env) # Check if `setvbuf' exists check_function_exists(setvbuf HAVE_SETVBUF) - # Check supported X11 extensions + # Check supported X11 extensions find_package(X11) if(X11_Xshape_FOUND) set(HAVE_SHAPE 1) @@ -396,16 +685,21 @@ macro(magick_check_env) # Check if `stat' exists check_function_exists(stat HAVE_STAT) - # Check if `stdarg' exists - check_function_exists(stdarg HAVE_STDARG_H) + # Check if `' exists + check_include_file(stdarg.h HAVE_STDARG_H) - # Check if exists and conforms to C99 - check_cxx_source_compiles ( - " - #include - void main() {bool b = __bool_true_false_are_defined;} - " - HAVE_STDBOOL_H) + if(BUILD_MAGICKPP) + # Check if exists and conforms to C99 + check_cxx_source_compiles ( + " + #include + int main() {bool b = __bool_true_false_are_defined;} + " + HAVE_STDBOOL_H) + endif() + + # Check if exists + check_include_file(stddef.h HAVE_STDDEF_H) # Check if exists check_include_file(stdint.h HAVE_STDINT_H) @@ -413,28 +707,33 @@ macro(magick_check_env) # Check if exists check_include_file(stdlib.h HAVE_STDLIB_H) - # Check if compiler supports ISO C++ standard library - set(CMAKE_REQUIRED_DEFINITIONS_SAVE ${CMAKE_REQUIRED_DEFINITIONS}) - if(HAVE_NAMESPACES) - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DHAVE_NAMESPACES) + if(BUILD_MAGICKPP) + # Check if compiler supports ISO C++ standard library + set(CMAKE_REQUIRED_DEFINITIONS_SAVE ${CMAKE_REQUIRED_DEFINITIONS}) + if(HAVE_NAMESPACES) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DHAVE_NAMESPACES) + endif() + check_cxx_source_compiles ( + " + #include + #include + #include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif + + int main() {} + " + HAVE_STD_LIBS) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) endif() - check_cxx_source_compiles ( - " - #include - #include - #include - #ifdef HAVE_NAMESPACES - using namespace std; - #endif - - void main() {} - " - HAVE_STD_LIBS) - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) # Check if `strcasecmp' exists check_function_exists(strcasecmp HAVE_STRCASECMP) + # Check if `strcasestr' exists + check_function_exists(strcasestr HAVE_STRCASESTR) + # Check if `strchr' exists check_function_exists(strchr HAVE_STRCHR) @@ -453,7 +752,7 @@ macro(magick_check_env) # Check if `#' stringizing operator is supported set(HAVE_STRINGIZE_EXITCODE 1) set(HAVE_STRINGIZE_EXITCODE__TRYRUN_OUTPUT 1) - check_cxx_source_runs( + check_c_source_runs( " #define x(y) #y int main() { char c[] = \"c\"; char* p = x(c); return (c[0] != p[0]) || (c[1] != p[1]); } @@ -488,7 +787,7 @@ macro(magick_check_env) check_function_exists(strstr HAVE_STRSTR) # Check if `strtod' exists - check_function_exists(strtod HAVE_STRSTR) + check_function_exists(strtod HAVE_STRTOD) # Check if `strtod_l' exists check_function_exists(strtod_l HAVE_STRTOD_L) @@ -511,6 +810,9 @@ macro(magick_check_env) # Check if `sysconf' exists check_function_exists(sysconf HAVE_SYSCONF) + # Check if `system' exists + check_function_exists(system HAVE_SYSTEM) + # Check if exists and defines `DIR' check_symbol_exists(DIR sys/dir.h HAVE_SYS_DIR_H) @@ -523,15 +825,15 @@ macro(magick_check_env) # Check if exists and defines `DIR' check_symbol_exists(DIR sys/ndir.h HAVE_SYS_NDIR_H) + # Check if exists + check_include_file(netdb.h HAVE_NETDB_H) + # Check if exists check_include_file(sys/param.h HAVE_SYS_PARAM_H) # Check if exists check_include_file(sys/resource.h HAVE_SYS_RESOURCE_H) - # Check if exists - check_include_file(sys/select.h HAVE_SYS_SELECT_H) - # Check if exists check_include_file(sys/sendfile.h HAVE_SYS_SENDFILE_H) @@ -544,9 +846,6 @@ macro(magick_check_env) # Check if exists check_include_file(sys/syslimits.h HAVE_SYS_SYSLIMITS_H) - # Check if exists - check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H) - # Check if exists check_include_file(sys/times.h HAVE_SYS_TIMES_H) @@ -556,6 +855,9 @@ macro(magick_check_env) # Check if exists check_include_file(sys/types.h HAVE_SYS_TYPES_H) + # Check if exists + check_include_file(sys/uio.h HAVE_SYS_UIO_H) + # Check if exists check_include_file(sys/wait.h HAVE_SYS_WAIT_H) @@ -609,28 +911,18 @@ macro(magick_check_env) # Check if `utime' exists check_function_exists(utime HAVE_UTIME) + # Check if `utimensat' exists + check_function_exists(utimensat HAVE_UTIMENSAT) + # Check if exists check_include_file(utime.h HAVE_UTIME_H) - # Check if `vfork' exists - check_function_exists(vfork HAVE_VFORK) - - # Check if exists - check_include_file(vfork.h HAVE_VFORK_H) - # Check if `vfprintf' exists check_symbol_exists(vfprintf stdio.h HAVE_VFPRINTF) # Check if `vfprintf_l' exists check_symbol_exists(vfprintf_l stdio.h HAVE_VFPRINTF_L) - # Check if `vprintf' exists - check_symbol_exists(vprintf stdio.h HAVE_VPRINTF) - # Check if `_doprnt' exists only if `vprintf' do not exists - if(NOT HAVE_VPRINTF) - check_function_exists(_doprnt HAVE_DOPRNT) - endif() - # Check if `vsnprintf' exists check_symbol_exists(vsnprintf stdio.h HAVE_VSNPRINTF) check_function_exists(vsnprintf HAVE_DECL_VSNPRINTF) @@ -650,49 +942,9 @@ macro(magick_check_env) # Check if exists check_include_file(windows.h HAVE_WINDOWS_H) - # Check if `fork' works - if(HAVE_FORK) - set(HAVE_WORKING_FORK_EXITCODE 1) - set(HAVE_WORKING_FORK_EXITCODE__TRYRUN_OUTPUT 1) - check_cxx_source_runs( - " - #ifdef HAVE_SYS_TYPES_H - #include - #endif - #ifdef HAVE_UNISTD_H - #include - #endif - int main() { if (fork() < 0) return(1); return(0); } - " - HAVE_WORKING_FORK) - endif() - - # Check if `vfork' works - if(HAVE_VFORK) - set(HAVE_WORKING_VFORK_EXITCODE 1) - set(HAVE_WORKING_VFORK_EXITCODE__TRYRUN_OUTPUT 1) - check_cxx_source_runs( - " - #ifdef HAVE_SYS_TYPES_H - #include - #endif - #ifdef HAVE_UNISTD_H - #include - #endif - #ifdef HAVE_VFORK_H - #include - #endif - int main() { if (vfork() < 0) return(1); return(0); } - " - HAVE_WORKING_VFORK) - endif() - # Check if exists check_include_file(xlocale.h HAVE_XLOCALE_H) - # Check if `_aligned_malloc' exists - check_function_exists(_aligned_malloc HAVE__ALIGNED_MALLOC) - # Check if `_Bool' exists check_type_size(_Bool _BOOL) if(HAVE__BOOL) # it was TRUE and we need it to be 1 @@ -722,36 +974,10 @@ macro(magick_check_env) " #include static void foo(void) __attribute__ ((unused)); - void main() { } + int main() { } " HAVE___ATTRIBUTE__) - # Check return type of signal handlers - check_c_source_compiles( - " - #include - #ifdef signal - #undef signal - #endif - #ifdef __cplusplus - extern \"C\" void (*signal (int, void (*)(int)))(int); - #else - void (*signal ()) (); - #endif - void main() {} - " - SIGNAL_RETURN_TYPE_IS_VOID) - if(SIGNAL_RETURN_TYPE_IS_VOID) - set(RETSIGTYPE void) - else(SIGNAL_RETURN_TYPE_IS_VOID) - set(RETSIGTYPE int) - endif(SIGNAL_RETURN_TYPE_IS_VOID) - - #TODO These seems to be obsolet but should we check them ???? - set(SELECT_TYPE_ARG1 "") - set(SELECT_TYPE_ARG234 "") - set(SELECT_TYPE_ARG5 "") - # Check `double' size check_type_size(double SIZEOF_DOUBLE) @@ -819,33 +1045,23 @@ macro(magick_check_env) check_type_size("unsigned short" SIZEOF_UNSIGNED_SHORT) # TODO Not sure how to heck if the `S_IS*' macros in are broken - # Should we test them all ???? + # Should we test them all ???? set(STAT_MACROS_BROKEN 0) # Check ANSI C header files exists check_include_fileS("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) # Check strerror_r returns `char *' - check_cxx_source_compiles( + check_c_source_compiles( " - void main() - { - char buf[100]; - char x = *strerror_r(0, buf, sizeof buf); - char *p = strerror_r(0, buf, sizeof buf); + #include + int main() { + char buf[100]; + const char* c = strerror_r(0, buf, 100); } " STRERROR_R_CHAR_P) - # Check if we can safely include both and - check_cxx_source_compiles( - " - #include - #include - void main(void){} - " - TIME_WITH_SYS_TIME) - # Check if `struct tm' exists in if(HAVE_SYS_TIME_H) check_symbol_exists("struct tm" sys/time.h TM_IN_SYS_TIME) @@ -855,21 +1071,18 @@ macro(magick_check_env) check_symbol_exists(__GNU_LIBRARY__ features.h _GNU_SOURCE) # Check if system is Big Endian - TEST_BIG_ENDIAN(WORDS_BIGENDIAN) + test_big_endian(WORDS_BIGENDIAN) # Check if we are on MINIX check_symbol_exists(_MINIX "stdio.h" EVENT___MINIX) # Check if system does not provide POSIX.1 features except with this defined - #TODO does this suffice ???? - check_symbol_exists(_POSIX_1_SOURCE "stdio.h" EVENT___POSIX_1_SOURCE) - if(NOT _POSIX_1_SOURCE) - set(_POSIX_1_SOURCE 2) + if(HAVE_MINIX_CONFIG_H) + set(_MINIX ON) + set(_POSIX_1_SOURCE ON) + set(_POSIX_SOURCE ON) endif() - # TODO Is this true or should it be 1 when not found??? - check_symbol_exists(_POSIX_SOURCE "stdio.h" EVENT___POSIX_SOURCE) - if(NOT CMAKE_COMPILER_IS_GNUCC) set(__CHAR_UNSIGNED___EXITCODE 1) set(__CHAR_UNSIGNED___EXITCODE__TRYRUN_OUTPUT 1) @@ -882,19 +1095,18 @@ macro(magick_check_env) endif() # Check for compiler `__func__' compatibility - check_c_source_compiles("void main() {char *function_name = __func__;}" HAVE___FUNC__) - check_c_source_compiles("void main() {char *function_name = __FUNCTION__;}" HAVE___FUNCTION__) - + check_c_source_compiles("int main() {char *function_name = __func__;}" HAVE___FUNC__) + check_c_source_compiles("int main() {char *function_name = __FUNCTION__;}" HAVE___FUNCTION__) if(HAVE___FUNC__) - set(__func__ __func__) - elseif(HAVE___FUNCTION__) + set(__func__) + elseif(HAVE___FUNCTION__) set(__func__ __FUNCTION__) else() - set(__func__ "") + set(__func__ __FILE__) endif() - # Check if `const' is supported by compiler - check_c_source_compiles("void main() {const char *s = \"Test\";}" HAVE_CONST) + # Check if `const' is supported by compiler + check_c_source_compiles("int main() {const char *s = \"Test\";}" HAVE_CONST) # Only set const to empty if it doesn't exist otherwise magick++ will not compile if(NOT HAVE_CONST) set(const " ") @@ -912,23 +1124,21 @@ macro(magick_check_env) check_c_source_compiles( "static inline int test (void) {return 0;}\nint main (void) {return test();}" HAVE_INLINE) - check_c_source_compiles ( "static __inline int test (void) {return 0;}\nint main (void) {return test();}" HAVE___INLINE) - check_c_source_compiles ( "static __inline__ int test (void) {return 0;}\nint main (void) {return test();}" HAVE___INLINE__) if(HAVE_INLINE) - set(inline inline) + set(inline) elseif(HAVE___INLINE) set(inline __inline) elseif(HAVE___INLINE__) set(inline __inline__) else() - set(inline "") + set(inline " ") endif() #TODO these defines if system doesn't define them @@ -938,7 +1148,6 @@ macro(magick_check_env) set(int8_t "") set(intmax_t "") set(intptr_t "") - set(mbstate_t "") # Check if doesn't define `mode_t' if(HAVE_SYS_TYPES_H) @@ -1021,24 +1230,17 @@ macro(magick_check_env) set(uintmax_t "") set(uintptr_t "") - # Check if `vfork' is not working and define it as `fork' - if(NOT HAVE_WORKING_VFORK) - set(vfork fork) - endif() - # Check if `volatile' works - check_cxx_source_compiles( + check_c_source_compiles( " - void main() { volatile int i = 1; } + int main() { volatile int i = 1; } " HAVE_VOLATILE) - if(HAVE_VOLATILE) - set(volatile volatile) - else() - set(volatile "") + if(NOT HAVE_VOLATILE) + set(volatile " ") endif() #TODO check if this is actually true set(SETJMP_IS_THREAD_SAFE TRUE) -endmacro() \ No newline at end of file +endmacro() diff --git a/cmake/configure.cmake b/cmake/configure.cmake new file mode 100644 index 00000000000..f43c97bc7b4 --- /dev/null +++ b/cmake/configure.cmake @@ -0,0 +1,259 @@ +# Copyright 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include(${CMAKE_CURRENT_LIST_DIR}/checks.cmake) +magick_check_env() + +include(${CMAKE_CURRENT_LIST_DIR}/parse_version.cmake) + +set(CC ${CMAKE_C_COMPILER}) +set(CONFIGURE_ARGS) +set(CXX ${CMAKE_CXX_COMPILER}) +set(CXXFLAGS) +set(DEFS) +set(DISTCHECK_CONFIG_FLAGS) +set(MAGICK_CFLAGS) +set(MAGICK_CPPFLAGS) +set(MAGICK_LDFLAGS) +set(MAGICK_LIBS) +set(MAGICK_PCFLAGS) +set(MAGICK_SECURITY_POLICY ${SECURITY_POLICY}) +set(QUANTUM_DEPTH ${MAGICKCORE_QUANTUM_DEPTH}) + +# TODO +# set(MAGICK_DELEGATES) +# set(MAGICK_FEATURES) + +# Set if pipe (|) is enabled on filenames +# TODO Add linux and mac os X +# TODO maybe this would be better with a test somehow +if(WIN32) + set(PIPES_SUPPORT FALSE) +endif() + +# Check if we are on AIX, do the _ALL_SOURCE magic +if(AIX) + set(_ALL_SOURCE 1) + set(_LARGE_FILES 1) +endif() + +# Check if we're on Solaris +IF(SOLARIS) + set(_POSIX_PTHREAD_SEMANTICS TRUE) + set(__EXTENSIONS__ TRUE) + # TODO restrict the system version and check if the define should be these + set(_UINT32_T uint32_t) + set(_UINT64_T uint64_t) + set(_UINT8_T uint8_t) +endif() + +# TODO Not sure how to test this, so for now it's disabled +set(_TANDEM_SOURCE FALSE) + +# TODO check if this is supposed to be any of the ones defined https://cmake.org/cmake/help/v3.0/module/FindX11.html +set(X11_CONFIGURE_PATH) + +# TODO should this be an option ?? +set(X_DISPLAY_MISSING 1) + +# TODO does this suffice? +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW) + set(_FILE_OFFSET_BITS 64) + set(_LARGEFILE_SOURCE 1) +else() + # Not sure on Windows if code is made to work with 64 bits + set(_FILE_OFFSET_BITS 32) +endif() + +# Disable run-time bounds-checking +set(_FORTIFY_SOURCE FALSE) + +# Build a version of ImageMagick which operates uninstalled. +# Used to build distributions located via MAGICK_HOME / executable path +set(INSTALLED_SUPPORT) + +if(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 8) + set(MagickQuantumDepth "Q8") +elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 16) + set(MagickQuantumDepth "Q16") +elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 32) + set(MagickQuantumDepth "Q32") +elseif(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 64) + set(MagickQuantumDepth "Q64") +else() + set(MagickQuantumDepth "Q?") +endif() + +####### PATHS ####### +include(GNUInstallDirs) + +set(RELATIVE_PATH ${PACKAGE_NAME}-${PACKAGE_MAJOR_VERSION}) +set(MAGICK_ABI_SUFFIX ${MagickQuantumDepth}${HDRI_SUFFIX}) + +set(CONFIGURE_PATH ${CMAKE_INSTALL_SYSCONFDIR}/${RELATIVE_PATH} CACHE INTERNAL "Installation path for configuration files") +set(CONFIGURE_RELATIVE_PATH ${RELATIVE_PATH}) +set(DOCUMENTATION_RELATIVE_PATH ${RELATIVE_PATH}) +set(DOCUMENTATION_PATH ${CMAKE_INSTALL_DOCDIR}/${RELATIVE_PATH}) +set(EXECUTABLE_PATH ${CMAKE_INSTALL_BINDIR}) +set(EXEC_PREFIX_DIR ${CMAKE_INSTALL_PREFIX}) +set(INCLUDEARCH_PATH ${CMAKE_INSTALL_INCLUDEDIR}/${RELATIVE_PATH}) +set(INCLUDE_RELATIVE_PATH ${RELATIVE_PATH}) +set(INCLUDE_PATH ${CMAKE_INSTALL_INCLUDEDIR}/${RELATIVE_PATH}) +set(LIBRARY_PATH ${RELATIVE_PATH}) +set(LIBRARY_RELATIVE_PATH ${RELATIVE_PATH}) +set(LIB_BIN_BASEDIRNAME ${CMAKE_INSTALL_BINDIR}) +set(LT_OBJDIR) +set(LTDL_MODULE_EXT) +set(MODULES_BASEDIRNAME modules) +set(MODULES_DIRNAME ${MODULES_BASEDIRNAME}-${MAGICK_ABI_SUFFIX}) +set(MODULES_PATH ${CMAKE_INSTALL_LIBDIR}/${RELATIVE_PATH}/${MODULES_DIRNAME} CACHE INTERNAL "Installation path for modules") +set(PREFIX_DIR ${CMAKE_INSTALL_PREFIX}) +set(SHAREARCH_BASEDIRNAME config) +set(SHAREARCH_DIRNAME ${SHAREARCH_BASEDIRNAME}-${MAGICK_ABI_SUFFIX}) +set(SHAREARCH_PATH ${CMAKE_INSTALL_LIBDIR}/${PACKAGE_NAME}-${MAGICK_BASE_VERSION}/${SHAREARCH_DIRNAME} CACHE INTERNAL "Installation path for platform-dependent data") +set(SHARE_PATH ${CMAKE_INSTALL_DATAROOTDIR}/${RELATIVE_PATH} CACHE INTERNAL "Installation path for platform-independent data") +set(SHARE_RELATIVE_PATH ${RELATIVE_PATH}) + +set(CODER_DIRNAME coders) +set(CODER_PATH ${MODULES_PATH}/${CODER_DIRNAME}) +set(FILTER_DIRNAME filters) +set(FILTER_PATH ${MODULES_PATH}/${FILTER_DIRNAME}) + +# rc files are only used on Windows binaries +if(WIN32) + set(MagickLibVersionNumber ${MAGICK_LIB_VERSION_NUMBER}) + set(MagickLibVersionText ${MAGICK_LIB_VERSION_TEXT}) + + if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) + set(MagickPlatform "x86") + elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(MagickPlatform "x64") + else() + set(MagickPlatform ${MAGICK_TARGET_CPU}) + endif() + + # Read the version.h file so we can get some needed values using regex + file(READ ${CMAKE_SOURCE_DIR}/MagickCore/version.h.in CONTENT_VERSION_H) + + # Try to find `MagickCopyright' + string(REGEX MATCH "\n#define +MagickCopyright +\"([^\"]+)\"\n" FOUND_MAGICK_COPYRIGHT ${CONTENT_VERSION_H}) + if(FOUND_MAGICK_COPYRIGHT) + set(MagickCopyright \"${CMAKE_MATCH_1}\") + endif() + + # Try to find `MagickAuthoritativeURL' + string(REGEX MATCH "\n#define +MagickAuthoritativeURL +\"([^\"]+)\"\n" FOUND_MAGICK_AUTHORITATIVE_URL ${CONTENT_VERSION_H}) + if(FOUND_MAGICK_AUTHORITATIVE_URL) + set(MagickAuthoritativeURL ${CMAKE_MATCH_1}) + endif() + + set(MagickVersion "${PACKAGE_NAME} ${MAGICK_LIB_VERSION_TEXT}${PACKAGE_VERSION_ADDENDUM} ${MagickQuantumDepth} ${MagickPlatform} ${PACKAGE_RELEASE_DATE} ${MagickAuthoritativeURL}") +endif() + +# Set the default font search path +if(WIN32) + set(MAGICK_FONT_PATH "$ENV{WINDIR}\\FONTS\\") + # Escape the path C way where '\' must be '\\' (regex and cmake also escapes '\' so to find one we need '\\\\') + string(REGEX REPLACE "\\\\" "\\\\\\\\" MAGICK_FONT_PATH ${MAGICK_FONT_PATH}) +elseif(UNIX AND NOT APPLE) + set(MAGICK_FONT_PATH "/usr/share/fonts/") +elseif(APPLE) + set(MAGICK_FONT_PATH "/System/Library/Fonts/") +endif() + +set(MAGICK_FONT_PATH "${MAGICK_FONT_PATH}" CACHE STRING "Font search path") + +set(apple_font_dir "${MAGICK_FONT_PATH}" CACHE STRING "Apple font directory") +set(dejavu_font_dir "${MAGICK_FONT_PATH}" CACHE STRING "DejaVu font directory") +set(ghostscript_font_dir "${MAGICK_FONT_PATH}" CACHE STRING "Ghostscript font directory") +set(urw_base35_font_dir "${MAGICK_FONT_PATH}" CACHE STRING "URW base35 font directory") +set(windows_font_dir "${MAGICK_FONT_PATH}" CACHE STRING "Windows font directory") + +set(type_include_files) +if(apple_font_dir) + set(type_include_files "${type_include_files} ") +endif() +if(dejavu_font_dir) + set(type_include_files "${type_include_files} ") +endif() +if(ghostscript_font_dir) + set(type_include_files "${type_include_files} ") +endif() +if(urw_base35_font_dir) + set(type_include_files "${type_include_files} ") +endif() +if(windows_font_dir) + set(type_include_files "${type_include_files} ") +endif() + +set(BPGDecodeDelegate bpgdec CACHE STRING "BPG decode delegate") +set(BPGEncodeDelegate bpgenc CACHE STRING "BPG encode delegate") +set(BlenderDecodeDelegate blender CACHE STRING "Blender decode delegate") +set(BrowseDelegate xdg-open CACHE STRING "Browse delegate") +set(CCMALLOCDelegate ccmalloc CACHE STRING "CCMalloc delegate") +set(ConvertDelegate magick CACHE STRING "Convert delegate") +set(DNGDecodeDelegate ufraw-batch CACHE STRING "DNG decode delegate") +set(DOCDecodeDelegate libreoffice CACHE STRING "DOC decode delegate") +set(DVIDecodeDelegate dvips CACHE STRING "DVI decode delegate") +set(DisplayDelegate magick CACHE STRING "Display delegate") +set(EditorDelegate xterm CACHE STRING "Editor delegate") +set(Fig2devDelegate fig2dev CACHE STRING "Fig2dev delegate") +set(GVCDecodeDelegate dot CACHE STRING "GVC decode delegate") +set(HPGLDecodeDelegate hp2xx CACHE STRING "HPGL decode delegate") +set(HTMLDecodeDelegate html2ps CACHE STRING "HTML decode delegate") +set(ILBMDecodeDelegate ilbmtoppm CACHE STRING "ILBM decode delegate") +set(ILBMEncodeDelegate ppmtoilbm CACHE STRING "ILBM encode delegate") +set(JXRDecodeDelegate JxrDecApp CACHE STRING "JXR decode delegate") +set(JXREncodeDelegate JxrEncApp CACHE STRING "JXR encode delegate") +set(LEPDelegate lepton CACHE STRING "LEP delegate") +set(LPDelegate lp CACHE STRING "LP delegate") +set(LPRDelegate lpr CACHE STRING "LPR delegate") +set(LaunchDelegate gimp CACHE STRING "Launch delegate") +set(MVDelegate mv CACHE STRING "MV delegate") +set(MogrifyDelegate magick CACHE STRING "Mogrify delegate") +set(MrSIDDecodeDelegate mrsidgeodecode CACHE STRING "MrSID decode delegate") +set(PCLDelegate pcl6 CACHE STRING "PCL delegate") +set(PrintDelegate lpr CACHE STRING "Print delegate") +set(RMDelegate rm CACHE STRING "RM delegate") +set(RSVGDecodeDelegate rsvg-convert CACHE STRING "RSVG decode delegate") +set(SVGDecodeDelegate inkscape CACHE STRING "SVG decode delegate") +set(ShowImageDelegate display CACHE STRING "ShowImage delegate") +set(TextEncodeDelegate tesseract CACHE STRING "Text encode delegate") +set(TraceEncodeDelegate potrace CACHE STRING "Trace encode delegate") +set(VIDEODecodeDelegate ffmpeg CACHE STRING "Video decode delegate") +set(VIDEOEncodeDelegate ffmpeg CACHE STRING "Video encode delegate") +set(WWWDecodeDelegate curl CACHE STRING "WWW decode delegate") +set(WebPDecodeDelegate dwebp CACHE STRING "WebP decode delegate") +set(WebPEncodeDelegate cwebp CACHE STRING "WebP encode delegate") +set(XPSDelegate gxps CACHE STRING "XPS delegate") + +if(WIN32) + set(PSDelegate gswin32c) +else() + set(PSDelegate gs) +endif() + +set(GSAlphaDevice pngalpha CACHE STRING "Ghostscript alpha device") +set(GSCMYKDevice pamcmyk32 CACHE STRING "Ghostscript CMYK device") +set(GSColorDevice png16m CACHE STRING "Ghostscript color device") +set(GSEPSDevice eps2write CACHE STRING "Ghostscript EPS device") +set(GSMonoDevice pbmraw CACHE STRING "Ghostscript mono device") +set(GSPDFDevice pdfwrite CACHE STRING "Ghostscript PDF device") +set(GSPSDevice ps2write CACHE STRING "Ghostscript PS device") +set(PCLCMYKDevice pamcmyk32 CACHE STRING "PCL CMYK device") +set(PCLColorDevice ppmraw CACHE STRING "PCL color device") +set(PCLMonoDevice pbmraw CACHE STRING "PCL mono device") +set(XPSCMYKDevice bmpsep8 CACHE STRING "XPS CMYK device") +set(XPSColorDevice ppmraw CACHE STRING "XPS color device") +set(XPSMonoDevice pbmraw CACHE STRING "XPS mono device") diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake new file mode 100644 index 00000000000..a304b7e2e87 --- /dev/null +++ b/cmake/delegates.cmake @@ -0,0 +1,136 @@ +macro(magick_find_delegate) + cmake_parse_arguments(MAGICK_FIND "" "DELEGATE;NAME;DEFAULT" "TARGETS" ${ARGN}) + + if((NOT DEFINED ${MAGICK_FIND_DELEGATE} AND ${MAGICK_FIND_DEFAULT}) OR "${${MAGICK_FIND_DELEGATE}}") + find_package(${MAGICK_FIND_NAME} REQUIRED) + set(${MAGICK_FIND_DELEGATE} ${${MAGICK_FIND_NAME}_FOUND}) + string(TOUPPER ${MAGICK_FIND_NAME} _NAME_UPPER) + set(${_NAME_UPPER}_FOUND ${${MAGICK_FIND_NAME}_FOUND}) + if(${MAGICK_FIND_DELEGATE}) + message("Delegate ${MAGICK_FIND_NAME} found.") + if(MAGICK_FIND_TARGETS) + set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} ${MAGICK_FIND_TARGETS}) + else() + set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} ${MAGICK_FIND_NAME}::${MAGICK_FIND_NAME}) + endif() + else() + message("Delegate ${MAGICK_FIND_NAME} disabled. (Not found)") + endif() + else() + set(${MAGICK_FIND_DELEGATE} FALSE) + message("Delegate ${MAGICK_FIND_NAME} disabled.") + endif() +endmacro() + +include(CheckIncludeFile) +include(CheckLibraryExists) +include(CheckSymbolExists) + +magick_find_delegate(DELEGATE BZLIB_DELEGATE NAME BZip2 DEFAULT TRUE) +magick_find_delegate(DELEGATE LZMA_DELEGATE NAME LibLZMA DEFAULT TRUE) +magick_find_delegate(DELEGATE ZLIB_DELEGATE NAME ZLIB DEFAULT TRUE) +magick_find_delegate(DELEGATE ZSTD_DELEGATE NAME zstd DEFAULT TRUE) +magick_find_delegate(DELEGATE FREETYPE_DELEGATE NAME Freetype DEFAULT TRUE) +magick_find_delegate(DELEGATE XML_DELEGATE NAME LibXml2 DEFAULT TRUE) + +magick_find_delegate(DELEGATE OPENMP_SUPPORT NAME OpenMP DEFAULT TRUE TARGETS OpenMP::OpenMP_C) +if(OPENMP_SUPPORT) + add_compile_definitions(_OPENMP=${OpenMP_C_SPEC_DATE}) +endif() + +magick_find_delegate(DELEGATE THREADS_SUPPORT NAME Threads DEFAULT TRUE TARGETS) +if(CMAKE_USE_PTHREADS_INIT) + set(THREAD_SUPPORT TRUE) + set(CMAKE_THREAD_PREFER_PTHREAD TRUE) + set(THREADS_PREFER_PTHREAD_FLAG TRUE) + set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} Threads::Threads) +endif() +check_include_file(pthread.h HAVE_PTHREAD_H) +if(HAVE_PTHREAD_H) + check_library_exists(pthread pthread_create "" HAVE_PTHREAD) + check_symbol_exists(PTHREAD_PRIO_INHERIT pthread.h HAVE_PTHREAD_PRIO_INHERIT) +endif() +# TODO Not sure what to do here +set(PTHREAD_CREATE_JOINABLE "") + +magick_find_delegate(DELEGATE TIFF_DELEGATE NAME TIFF DEFAULT TRUE) +if(TIFF_FOUND) + set(HAVE_TIFFCONF_H 1) + set(HAVE_TIFFISBIGENDIAN 1) + set(HAVE_TIFFISCODECCONFIGURED 1) + set(HAVE_TIFFMERGEFIELDINFO 1) + set(HAVE_TIFFREADEXIFDIRECTORY 1) + set(HAVE_TIFFREADGPSDIRECTORY 1) + set(HAVE_TIFFSETERRORHANDLEREXT 1) + set(HAVE_TIFFSETTAGEXTENDER 1) + set(HAVE_TIFFSETWARNINGHANDLEREXT 1) + set(HAVE_TIFFSWABARRAYOFTRIPLES 1) +endif() +magick_find_delegate(DELEGATE LCMS_DELEGATE NAME lcms DEFAULT TRUE) +if(LCMS_FOUND) + set(HAVE_LCMS2_H 1) +endif() +magick_find_delegate(DELEGATE RAW_R_DELEGATE NAME libraw DEFAULT TRUE) +if(LIBRAW_FOUND) + set(HAVE_LIBRAW_LIBRAW_H 1) +endif() +magick_find_delegate(DELEGATE HEIC_DELEGATE NAME libheif DEFAULT TRUE) +if(LIBHEIF_FOUND) + set(HAVE_LIBHEIF_LIBHEIF_H 1) +endif() + +magick_find_delegate(DELEGATE JBIG_DELEGATE NAME JBIG DEFAULT TRUE) +magick_find_delegate(DELEGATE JPEG_DELEGATE NAME JPEG DEFAULT TRUE) +magick_find_delegate(DELEGATE LIBOPENJP2_DELEGATE NAME OpenJPEG DEFAULT TRUE) +magick_find_delegate(DELEGATE OPENEXR_DELEGATE NAME OpenEXR DEFAULT TRUE) +magick_find_delegate(DELEGATE PNG_DELEGATE NAME PNG DEFAULT TRUE) +magick_find_delegate(DELEGATE RSVG_DELEGATE NAME Rsvg DEFAULT TRUE) +magick_find_delegate(DELEGATE WEBP_DELEGATE NAME WebP DEFAULT TRUE) +magick_find_delegate(DELEGATE JXL_DELEGATE NAME libjxl DEFAULT TRUE) + +# TODO are these correct and should they be off by default? +magick_find_delegate(DELEGATE AUTOTRACE_DELEGATE NAME AUTOTRACE DEFAULT FALSE) +magick_find_delegate(DELEGATE CAIRO_DELEGATE NAME Cairo DEFAULT FALSE) +magick_find_delegate(DELEGATE DMR_DELEGATE NAME MagickCache DEFAULT FALSE) +magick_find_delegate(DELEGATE DJVU_DELEGATE NAME DJVU DEFAULT FALSE) +magick_find_delegate(DELEGATE DPS_DELEGATE NAME DPS DEFAULT FALSE) +magick_find_delegate(DELEGATE FFTW_DELEGATE NAME FFTW DEFAULT FALSE) +magick_find_delegate(DELEGATE FLIF_DELEGATE NAME FLIF DEFAULT FALSE) +magick_find_delegate(DELEGATE FONTCONFIG_DELEGATE NAME Fontconfig DEFAULT FALSE) +magick_find_delegate(DELEGATE FPX_DELEGATE NAME FlashPIX DEFAULT FALSE) +magick_find_delegate(DELEGATE GS_DELEGATE NAME Ghostscript DEFAULT FALSE) +magick_find_delegate(DELEGATE GVC_DELEGATE NAME GVC DEFAULT FALSE) +magick_find_delegate(DELEGATE LTDL_DELEGATE NAME LTDL DEFAULT FALSE) +magick_find_delegate(DELEGATE PANGO_DELEGATE NAME Pango DEFAULT FALSE) +magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME PangoCairo DEFAULT FALSE) +magick_find_delegate(DELEGATE RAQM_DELEGATE NAME RAQM DEFAULT FALSE) +magick_find_delegate(DELEGATE WEBPMUX_DELEGATE NAME WEBPMUX DEFAULT FALSE) +magick_find_delegate(DELEGATE WMF_DELEGATE NAME WMF DEFAULT FALSE) +magick_find_delegate(DELEGATE LQR NAME Lqr DEFAULT FALSE) + +magick_find_delegate(DELEGATE HAVE_JEMALLOC NAME Jemalloc DEFAULT FALSE) +magick_find_delegate(DELEGATE HAVE_MTMALLOC NAME MTMalloc DEFAULT FALSE) +magick_find_delegate(DELEGATE HAVE_TCMALLOC NAME TCMalloc DEFAULT FALSE) +magick_find_delegate(DELEGATE HAVE_UMEM NAME UMEM DEFAULT FALSE) + +magick_find_delegate(DELEGATE OPENCLLIB_DELEGATE NAME OpenCL DEFAULT FALSE) +if(OpenCL_FOUND) + set(_OPENCL 1) + set(CMAKE_REQUIRED_INCLUDES ${OpenCL_INCLUDE_DIRS}) + check_include_file(OpenCL/cl.h HAVE_OPENCL_CL_H) + check_include_file(CL/cl.h HAVE_CL_CL_H) + # Set the target OpenCL version explicitly to silence warnings + set(TARGET_OPENCL_VERSION 300 CACHE STRING "OpenCL version to target (defaults to 3.0)") + add_compile_definitions(CL_TARGET_OPENCL_VERSION=${TARGET_OPENCL_VERSION}) +endif() + +# TODO Should we check if gdi32 exists if windows? +if(WIN32) + set(WINGDI32_DELEGATE TRUE) +endif() + +# Compile with X11 if present +magick_find_delegate(DELEGATE X11_DELEGATE NAME X11 DEFAULT TRUE) +if(X11_DELEGATE) + set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} X11::Xext) +endif() diff --git a/cmake/parse_version.cmake b/cmake/parse_version.cmake new file mode 100644 index 00000000000..84e0c725715 --- /dev/null +++ b/cmake/parse_version.cmake @@ -0,0 +1,75 @@ +file(READ ${CMAKE_SOURCE_DIR}/m4/version.m4 CONTENT_VERSION_M4) + +# Parse 'm4_define([magick_library_current], [10])' etc. +function(extract_m4_define var_name) + string(TOLOWER ${var_name} define_name) + string(REGEX MATCH "m4_define\\(\\[(${define_name})\\],[ \n]+\\[([^]]+)\\]\\)" FOUND_DEFINE "${CONTENT_VERSION_M4}") + if(FOUND_DEFINE) + set(${var_name} ${CMAKE_MATCH_2} PARENT_SCOPE) + else() + message(FATAL_ERROR "Could not find ${define_name} in version.m4") + endif() +endfunction() + +extract_m4_define(MAGICK_NAME) +extract_m4_define(MAGICK_MAJOR_VERSION) +extract_m4_define(MAGICK_MINOR_VERSION) +extract_m4_define(MAGICK_MICRO_VERSION) +extract_m4_define(MAGICK_PATCHLEVEL_VERSION) +extract_m4_define(MAGICK_IS_BETA) +extract_m4_define(MAGICK_BUGREPORT) +extract_m4_define(MAGICK_URL) +extract_m4_define(MAGICK_LIB_VERSION) +extract_m4_define(MAGICK_TARNAME) +extract_m4_define(MAGICK_LIBRARY_CURRENT) +extract_m4_define(MAGICK_LIBRARY_REVISION) +extract_m4_define(MAGICK_LIBRARY_AGE) +extract_m4_define(MAGICKPP_LIBRARY_CURRENT) +extract_m4_define(MAGICKPP_LIBRARY_REVISION) +extract_m4_define(MAGICKPP_LIBRARY_AGE) + +set(MAGICK_BASE_VERSION ${MAGICK_MAJOR_VERSION}.${MAGICK_MINOR_VERSION}.${MAGICK_MICRO_VERSION}) +set(MAGICK_VERSION ${MAGICK_BASE_VERSION}-${MAGICK_PATCHLEVEL_VERSION}) +set(MAGICK_LIB_VERSION_NUMBER ${MAGICK_MAJOR_VERSION},${MAGICK_MINOR_VERSION},${MAGICK_MICRO_VERSION},${MAGICK_PATCHLEVEL_VERSION}) + +set(VERSION ${MAGICK_VERSION}) + +if(MAGICK_IS_BETA STREQUAL "y") + set(MAGICK_IS_BETA 1) + set(PACKAGE_VERSION_ADDENDUM "-${MAGICK_PATCHLEVEL_VERSION} (Beta)") +else() + set(MAGICK_IS_BETA 0) + set(PACKAGE_VERSION_ADDENDUM "-${MAGICK_PATCHLEVEL_VERSION}") +endif() + +set(PACKAGE ${MAGICK_NAME}) +set(PACKAGE_NAME ${MAGICK_NAME}) +set(PACKAGE_MAJOR_VERSION ${MAGICK_MAJOR_VERSION}) +set(PACKAGE_MINOR_VERSION ${MAGICK_MINOR_VERSION}) +set(PACKAGE_MICRO_VERSION ${MAGICK_MICRO_VERSION}) +set(PACKAGE_PATCHLEVEL_VERSION ${MAGICK_PATCHLEVEL_VERSION}) +set(PACKAGE_IS_BETA ${MAGICK_IS_BETA}) +set(PACKAGE_BUGREPORT ${MAGICK_BUGREPORT}) +set(PACKAGE_URL ${MAGICK_URL}) +set(PACKAGE_LIB_VERSION ${MAGICK_LIB_VERSION}) +set(PACKAGE_TARNAME ${MAGICK_TARNAME}) +set(PACKAGE_LIBRARY_CURRENT ${MAGICK_LIBRARY_CURRENT}) +set(PACKAGE_LIBRARY_REVISION ${MAGICK_LIBRARY_REVISION}) +set(PACKAGE_LIBRARY_AGE ${MAGICK_LIBRARY_AGE}) +set(PACKAGE_BASE_VERSION ${MAGICK_BASE_VERSION}) +set(PACKAGE_VERSION ${MAGICK_VERSION}) +set(PACKAGE_LIB_VERSION_NUMBER ${MAGICK_LIB_VERSION_NUMBER}) +set(PACKAGE_VERSION_NUMBER ${MAGICK_LIB_VERSION_NUMBER}) +set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") + +set(MAGICK_LIB_VERSION_TEXT ${PACKAGE_BASE_VERSION}) +set(MAGICKPP_LIB_VERSION_TEXT ${PACKAGE_BASE_VERSION}) + +# Try to find the date in the format yyyy-mm-dd +file(READ ${CMAKE_SOURCE_DIR}/configure CONTENT_CONFIGURE) +string(REGEX MATCH "\nPACKAGE_RELEASE_DATE=([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])\n" FOUND_LAST_CHANGE_DATE "${CONTENT_CONFIGURE}") +if(FOUND_LAST_CHANGE_DATE) + set(PACKAGE_RELEASE_DATE ${CMAKE_MATCH_1}) +else() + message(FATAL_ERROR "Could not find PACKAGE_RELEASE_DATE in ./configure") +endif() diff --git a/cmake/platform_vars.cmake b/cmake/platform_vars.cmake new file mode 100644 index 00000000000..e1249b6b993 --- /dev/null +++ b/cmake/platform_vars.cmake @@ -0,0 +1,73 @@ +# Get the platform + +if(WIN32) + if(NOT WINDOWS) + set(WINDOWS TRUE) + endif() + # TODO check for mingw or cygwin ??? +elseif(UNIX AND NOT APPLE) + if(CMAKE_SYSTEM_NAME MATCHES ".*Linux") + set(LINUX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*") + set(FREEBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") + set(NETBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + set(OPENBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") + set(GNU TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") + set(BSDI TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") + set(FREEBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") + set(SYSV5 TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*") + set(SOLARIS TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") + set(HPUX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*") + set(AIX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*") + set(MINIX TRUE) + endif() +elseif(APPLE) + if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*") + set(DARWIN TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*") + set(MACOSX TRUE) + endif() + # TODO: iOS? +elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*") + set(BEOS TRUE) +elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*") + set(HAIKU TRUE) +endif() + +# if we're on MacOS X we enable the universal build +if(APPLE) + set(AC_APPLE_UNIVERSAL_BUILD TRUE) +endif() + +find_program(UNAME NAMES uname) +if(UNAME) + execute_process(COMMAND "${UNAME}" -m OUTPUT_VARIABLE host_cpu OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND "${UNAME}" -r OUTPUT_VARIABLE host_os OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND "${UNAME}" -s OUTPUT_VARIABLE host_vendor OUTPUT_STRIP_TRAILING_WHITESPACE) +else() + # These definitely do not match the uname info used by autotools, but it's better than nothing + set(host_cpu ${CMAKE_HOST_SYSTEM_PROCESSOR}) + set(host_os ${CMAKE_HOST_SYSTEM_NAME}) + set(host_vendor ${CMAKE_HOST_SYSTEM_NAME}) +endif() +if(NOT CMAKE_CROSSCOMPILING) + set(MAGICK_TARGET_CPU ${host_cpu}) + set(MAGICK_TARGET_OS ${host_os}) + set(MAGICK_TARGET_VENDOR ${host_vendor}) +else() + set(MAGICK_TARGET_CPU ${CMAKE_SYSTEM_PROCESSOR}) + set(MAGICK_TARGET_OS ${CMAKE_SYSTEM_NAME}) + set(MAGICK_TARGET_VENDOR ${CMAKE_SYSTEM_NAME}) +endif() +set(host "${host_vendor}-${host_os}-${host_cpu}") +set(target "${MAGICK_TARGET_VENDOR}-${MAGICK_TARGET_OS}-${MAGICK_TARGET_CPU}") diff --git a/cmake/test_helpers.cmake b/cmake/test_helpers.cmake new file mode 100644 index 00000000000..56fbd22c961 --- /dev/null +++ b/cmake/test_helpers.cmake @@ -0,0 +1,68 @@ +function(add_tap_test TEST_FILE) + set(TEST_ENV + "MAGICK=$" + "ANIMATE=$ animate" + "COMPARE=$ compare" + "COMPOSITE=$ composite" + "CONJURE=$ conjure" + "CONVERT=$ convert" + "DISPLAY=$ display" + "IDENTIFY=$ identify" + "IMPORT=$ import" + "MOGRIFY=$ mogrify" + "MONTAGE=$ montage" + "STREAM=$ stream" + + "VALIDATE=$" + "DRAWTEST=$" + "WANDTEST=$" + + "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}/" + "srcdir=${CMAKE_CURRENT_BINARY_DIR}/" + "TOPSRCDIR=${CMAKE_BINARY_DIR}/" + "top_srcdir=${CMAKE_BINARY_DIR}/" + "MAGICK_CONFIGURE_PATH=${CMAKE_BINARY_DIR}/config/" + "MAGICK_FONT=${CMAKE_SOURCE_DIR}/PerlMagick/demo/Generic.ttf" + ) + if(BUILD_MAGICKPP) + set(TEST_ENV ${TEST_ENV} + "MAGICPP_TEST_BINARIES_DIR=$" + "MAGICPP_DEMO_BINARIES_DIR=$" + ) + endif() + + if(ARGC GREATER 1) + set(TEST_NAME ${ARGV1}) + else() + set(TEST_NAME ${TEST_FILE}) + endif() + set(log_path "tests/test_${TEST_NAME}.log") + add_test( + NAME ${TEST_NAME} + COMMAND sh -c "sh '${CMAKE_CURRENT_BINARY_DIR}/${TEST_FILE}.tap' | tee '${log_path}' && grep -q 'not ok' '${log_path}' && exit 1 || exit 0" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "${TEST_ENV}") +endfunction() + +function(copy_test_resources suffix) + add_custom_target(copy_test_resources_${suffix} ALL) + file(GLOB TEST_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.tap" "${CMAKE_CURRENT_SOURCE_DIR}/*.miff" "${CMAKE_CURRENT_SOURCE_DIR}/*.pnm") + foreach(TEST_RESOURCE ${TEST_RESOURCES}) + get_filename_component(NAME ${TEST_RESOURCE} NAME) + set(SRC ${TEST_RESOURCE}) + set(DST ${CMAKE_CURRENT_BINARY_DIR}/${NAME}) + add_custom_command( + OUTPUT ${DST} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} ${DST} + DEPENDS ${SRC} + ) + add_custom_target(copy_${NAME} ALL DEPENDS ${SRC} ${DST}) + add_dependencies(copy_test_resources_${suffix} copy_${NAME}) + endforeach() +endfunction() + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES + "${CMAKE_BINARY_DIR}/*_out.*" + "${CMAKE_BINARY_DIR}/tests/*.log" +) diff --git a/coders/bmp.c b/coders/bmp.c index 53b84f45ee9..526adf7ec62 100644 --- a/coders/bmp.c +++ b/coders/bmp.c @@ -1827,7 +1827,7 @@ static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image, *p; const StringInfo - *profile; + *profile = (const StringInfo *) NULL; MagickBooleanType have_color_info, @@ -2016,7 +2016,8 @@ static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image, } bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32); bmp_info.ba_offset=0; - profile=GetImageProfile(image,"icc"); + if (type > 3) + profile=GetImageProfile(image,"icc"); have_color_info=(image->rendering_intent != UndefinedIntent) || (profile != (StringInfo *) NULL) || (image->gamma != 0.0) ? MagickTrue : MagickFalse; diff --git a/coders/caption.c b/coders/caption.c index af4a82f432e..30b4dcc4516 100644 --- a/coders/caption.c +++ b/coders/caption.c @@ -277,19 +277,21 @@ static Image *ReadCAPTIONImage(const ImageInfo *image_info, if (status == MagickFalse) break; AdjustTypeMetricBounds(&metrics); - width=CastDoubleToUnsigned(metrics.width+draw_info->stroke_width+0.5); - height=CastDoubleToUnsigned(metrics.height-metrics.underline_position+ + width=CastDoubleToUnsigned(metrics.width+draw_info->stroke_width+ + 0.5); + height=CastDoubleToUnsigned( + metrics.height-metrics.underline_position+ draw_info->interline_spacing+draw_info->stroke_width+0.5); if ((image->columns != 0) && (image->rows != 0)) { - if ((width >= image->columns) || (height >= image->rows)) + if ((width > image->columns) && (height > image->rows)) break; - if ((width < image->columns) && (height < image->rows)) + if ((width <= image->columns) && (height <= image->rows)) low=draw_info->pointsize; } else - if (((image->columns != 0) && (width >= image->columns)) || - ((image->rows != 0) && (height >= image->rows))) + if (((image->columns != 0) && (width > image->columns)) || + ((image->rows != 0) && (height > image->rows))) break; } high=draw_info->pointsize; @@ -315,19 +317,20 @@ static Image *ReadCAPTIONImage(const ImageInfo *image_info, draw_info->interline_spacing+draw_info->stroke_width+0.5); if ((image->columns != 0) && (image->rows != 0)) { - if ((width < image->columns) && (height < image->rows)) + if ((width <= image->columns) && (height <= image->rows)) low=draw_info->pointsize+0.5; else high=draw_info->pointsize-0.5; } else - if (((image->columns != 0) && (width < image->columns)) || - ((image->rows != 0) && (height < image->rows))) + if (((image->columns != 0) && (width <= image->columns)) || + ((image->rows != 0) && (height <= image->rows))) low=draw_info->pointsize+0.5; else high=draw_info->pointsize-0.5; } - draw_info->pointsize=floor((low+high)/2.0-0.5); + if (status != MagickFalse) + draw_info->pointsize=floor((low+high)/2.0+0.5); } /* Draw caption. diff --git a/coders/cin.c b/coders/cin.c index 97a3f3ed0d8..b0e238a0766 100644 --- a/coders/cin.c +++ b/coders/cin.c @@ -998,7 +998,7 @@ static MagickBooleanType WriteCINImage(const ImageInfo *image_info,Image *image, offset+=WriteBlob(image,sizeof(cin.file.filename),(unsigned char *) cin.file.filename); seconds=GetMagickTime(); - GetMagickUTCtime(&seconds,&utc_time); + GetMagickUTCTime(&seconds,&utc_time); (void) memset(timestamp,0,sizeof(timestamp)); (void) strftime(timestamp,MagickPathExtent,"%Y:%m:%d:%H:%M:%SUTC",&utc_time); (void) memset(cin.file.create_date,0,sizeof(cin.file.create_date)); diff --git a/coders/djvu.c b/coders/djvu.c index a81a1cf7990..914d0d251eb 100644 --- a/coders/djvu.c +++ b/coders/djvu.c @@ -607,6 +607,8 @@ static Image *ReadOneDJVUImage(LoadContext* lc,const int pagenum, if (tag == 0) break; } while (!ddjvu_page_decoding_done(lc->page)); + if (ddjvu_page_decoding_error(lc->page) != 0) + ThrowReaderException(CorruptImageError,"CorruptImage"); ddjvu_document_get_pageinfo(lc->document, pagenum, &info); image->resolution.x = (float) info.dpi; diff --git a/coders/dng.c b/coders/dng.c index 810d55e5da5..47b117ee468 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -337,6 +337,21 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, const char *option; +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,20) +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,21) + raw_info->rawparams.max_raw_memory_mb=8192; +#else + raw_info->params.max_raw_memory_mb=8192; +#endif + option=GetImageOption(image_info,"dng:max-raw-memory"); + if (option != (const char *) NULL) +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,21) + raw_info->rawparams.max_raw_memory_mb=(unsigned int) + StringToInteger(option); +#else + raw_info->params.max_raw_memory_mb=(unsigned int) StringToInteger(option); +#endif +#endif raw_info->params.user_flip=0; raw_info->params.output_bps=16; raw_info->params.use_camera_wb=1; @@ -432,10 +447,11 @@ static void ReadLibRawThumbnail(const ImageInfo *image_info,Image *image, SetImageProperty(image,"dng:thumbnail.type","bitmap",exception); (void) FormatLocaleString(value,sizeof(value),"%hu",thumbnail->bits); SetImageProperty(image,"dng:thumbnail.bits",value,exception); - (void) FormatLocaleString(value,sizeof(value),"%hu",thumbnail->colors); + (void) FormatLocaleString(value,sizeof(value),"%hu", + thumbnail->colors); SetImageProperty(image,"dng:thumbnail.colors",value,exception); - (void) FormatLocaleString(value,sizeof(value),"%hux%hu",thumbnail->width, - thumbnail->height); + (void) FormatLocaleString(value,sizeof(value),"%hux%hu", + thumbnail->width,thumbnail->height); SetImageProperty(image,"dng:thumbnail.geometry",value,exception); } profile=BlobToStringInfo(thumbnail->data,thumbnail->data_size); diff --git a/coders/dng.h b/coders/dng.h index 3695bf5d548..ef32aff0f97 100644 --- a/coders/dng.h +++ b/coders/dng.h @@ -17,13 +17,15 @@ #include "coders/coders-private.h" #define MagickDNGHeaders \ - MagickCoderHeader("CR2", 0, "\115\115\000\052\000\020\000\000\122\103\002") \ - MagickCoderHeader("CR2", 0, "\111\111\052\000\020\000\000\000\103\122\002") \ + MagickCoderHeader("CR2", 0, "MM\x00\x2a\x00\x10\x00\x00RC\x02") \ + MagickCoderHeader("CR2", 0, "II\x2a\x00\x10\x00\x00\x00CR\x02") \ MagickCoderHeader("CR3", 4, "ftypcrx ") \ MagickCoderHeader("CRW", 0, "II\x1a\x00\x00\x00HEAPCCDR") \ MagickCoderHeader("ORF", 0, "IIRO\x08\x00\x00\x00") \ MagickCoderHeader("MRW", 0, "\x00MRM") \ - MagickCoderHeader("RAF", 0, "FUJIFILMCCD-RAW ") + MagickCoderHeader("RAF", 0, "FUJIFILMCCD-RAW ") \ + MagickCoderHeader("RAW", 0, "IIU\x00\x08\x00\x00\x00") \ + MagickCoderHeader("RW2", 0, "IIU\x00\x18\x00\x00\x00") #define MagickDNGAliases \ MagickCoderAlias("DNG", "3FR") \ diff --git a/coders/jbig.c b/coders/jbig.c index 4403b8d7402..d97e4a360e1 100644 --- a/coders/jbig.c +++ b/coders/jbig.c @@ -122,19 +122,12 @@ static Image *ReadJBIGImage(const ImageInfo *image_info, status; Quantum - index; - - ssize_t - x; - - Quantum + index, *q; - unsigned char - *p; - ssize_t length, + x, y; struct jbg_dec_state @@ -143,7 +136,8 @@ static Image *ReadJBIGImage(const ImageInfo *image_info, unsigned char bit, *buffer, - byte; + byte, + *p; /* Open image file. @@ -165,6 +159,9 @@ static Image *ReadJBIGImage(const ImageInfo *image_info, /* Initialize JBIG toolkit. */ + if ((image->columns != (unsigned long) image->columns) || + (image->rows != (unsigned long) image->rows)) + ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); jbg_dec_init(&jbig_info); jbg_dec_maxsize(&jbig_info,(unsigned long) image->columns,(unsigned long) image->rows); @@ -410,6 +407,9 @@ static void JBIGEncode(unsigned char *pixels,size_t length,void *data) static MagickBooleanType WriteJBIGImage(const ImageInfo *image_info, Image *image,ExceptionInfo *exception) { + const Quantum + *p; + double version; @@ -422,20 +422,12 @@ static MagickBooleanType WriteJBIGImage(const ImageInfo *image_info, MemoryInfo *pixel_info; - const Quantum - *p; - - ssize_t - x; - - unsigned char - *q; - size_t number_images, number_packets; ssize_t + x, y; struct jbg_enc_state @@ -444,7 +436,8 @@ static MagickBooleanType WriteJBIGImage(const ImageInfo *image_info, unsigned char bit, byte, - *pixels; + *pixels, + *q; /* Open image file. diff --git a/coders/jp2.c b/coders/jp2.c index 556f88cc83e..815235bbb42 100644 --- a/coders/jp2.c +++ b/coders/jp2.c @@ -909,9 +909,7 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image, *jp2_stream; ssize_t - i; - - ssize_t + i, y; unsigned int @@ -955,12 +953,12 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image, } if (image_info->extract != (char *) NULL) { - RectangleInfo - geometry; - int flags; + RectangleInfo + geometry; + /* Set tile size. */ @@ -1039,19 +1037,28 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image, parameters->tcp_numlayers=i+1; parameters->cp_disto_alloc=OPJ_TRUE; } - if (image_info->sampling_factor != (const char *) NULL) - (void) sscanf(image_info->sampling_factor,"%d:%d", - ¶meters->subsampling_dx,¶meters->subsampling_dy); + if (image_info->sampling_factor != (char *) NULL) + { + GeometryInfo + geometry_info; + + MagickStatusType + flags; + + flags=ParseGeometry(image_info->sampling_factor,&geometry_info); + if ((flags & RhoValue) != 0) + parameters->subsampling_dx=(int) geometry_info.rho; + parameters->subsampling_dy=parameters->subsampling_dx; + if ((flags & SigmaValue) != 0) + parameters->subsampling_dy=(int) geometry_info.sigma; + } property=GetImageProperty(image,"comment",exception); if (property != (const char *) NULL) parameters->cp_comment=(char *) property; channels=3; jp2_colorspace=OPJ_CLRSPC_SRGB; if (image->colorspace == YUVColorspace) - { - jp2_colorspace=OPJ_CLRSPC_SYCC; - parameters->subsampling_dx=2; - } + jp2_colorspace=OPJ_CLRSPC_SYCC; else { if (IsGrayColorspace(image->colorspace) != MagickFalse) diff --git a/coders/json.c b/coders/json.c index 679475d0652..992c6098dfe 100644 --- a/coders/json.c +++ b/coders/json.c @@ -17,7 +17,7 @@ % January 2014 % % % % % -% Copyright @ 2014 ImageMagick Studio LLC, a non-profit organization % +% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % @@ -718,11 +718,14 @@ static ssize_t PrintChannelStatistics(FILE *file,const PixelChannel channel, n; n=FormatLocaleFile(file,StatisticsFormat,name,GetMagickPrecision(), + channel_statistics[channel].minima == MagickMaximumValue ? 0.0 : (double) ClampToQuantum(scale*channel_statistics[channel].minima), - GetMagickPrecision(),(double) ClampToQuantum(scale* - channel_statistics[channel].maxima),GetMagickPrecision(), - scale*channel_statistics[channel].mean,GetMagickPrecision(), - scale*channel_statistics[channel].median,GetMagickPrecision(), + GetMagickPrecision(), + channel_statistics[channel].maxima == -MagickMaximumValue ? 0.0 : + (double) ClampToQuantum(scale*channel_statistics[channel].maxima), + GetMagickPrecision(),scale*channel_statistics[channel].mean, + GetMagickPrecision(),scale*channel_statistics[channel].median, + GetMagickPrecision(), IsNaN(channel_statistics[channel].standard_deviation) != 0 ? MagickEpsilon : scale*channel_statistics[channel].standard_deviation,GetMagickPrecision(), channel_statistics[channel].kurtosis,GetMagickPrecision(), @@ -1730,7 +1733,9 @@ static MagickBooleanType WriteJSONImage(const ImageInfo *image_info, (void) WriteBlobString(image,"["); image->magick_columns=image->columns; image->magick_rows=image->rows; - (void) EncodeImageAttributes(image,file,exception); + status=EncodeImageAttributes(image,file,exception); + if (status == MagickFalse) + break; if (GetNextImageInList(image) == (Image *) NULL) { (void) WriteBlobString(image,"]"); diff --git a/coders/jxl.c b/coders/jxl.c index a7f837f4f6f..237973f7dae 100644 --- a/coders/jxl.c +++ b/coders/jxl.c @@ -84,7 +84,7 @@ typedef struct MemoryManagerInfo */ static MagickBooleanType WriteJXLImage(const ImageInfo *,Image *,ExceptionInfo *); - + /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % @@ -337,8 +337,8 @@ static Image *ReadJXLImage(const ImageInfo *image_info,ExceptionInfo *exception) /* Initialize JXL delegate library. */ - memset(&basic_info,0,sizeof(basic_info)); - memset(&pixel_format,0,sizeof(pixel_format)); + (void) memset(&basic_info,0,sizeof(basic_info)); + (void) memset(&pixel_format,0,sizeof(pixel_format)); JXLSetMemoryManager(&memory_manager,&memory_manager_info,image,exception); jxl_info=JxlDecoderCreate(&memory_manager); if (jxl_info == (JxlDecoder *) NULL) @@ -402,7 +402,7 @@ static Image *ReadJXLImage(const ImageInfo *image_info,ExceptionInfo *exception) remaining=JxlDecoderReleaseInput(jxl_info); if (remaining > 0) - memmove(pixels,pixels+input_size-remaining,remaining); + (void) memmove(pixels,pixels+input_size-remaining,remaining); count=ReadBlob(image,input_size-remaining,pixels+remaining); if (count <= 0) { @@ -446,7 +446,7 @@ static Image *ReadJXLImage(const ImageInfo *image_info,ExceptionInfo *exception) StringInfo *profile; - memset(&color_encoding,0,sizeof(color_encoding)); + (void) memset(&color_encoding,0,sizeof(color_encoding)); JXLSetFormat(image,&pixel_format,exception); #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0,9,0) jxl_status=JxlDecoderGetColorAsEncodedProfile(jxl_info, @@ -948,9 +948,9 @@ static MagickBooleanType WriteJXLImage(const ImageInfo *image_info,Image *image, /* Initialize JXL delegate library. */ - memset(&basic_info,0,sizeof(basic_info)); - memset(&frame_header,0,sizeof(frame_header)); - memset(&pixel_format,0,sizeof(pixel_format)); + (void) memset(&basic_info,0,sizeof(basic_info)); + (void) memset(&frame_header,0,sizeof(frame_header)); + (void) memset(&pixel_format,0,sizeof(pixel_format)); JXLSetMemoryManager(&memory_manager,&memory_manager_info,image,exception); jxl_info=JxlEncoderCreate(&memory_manager); if (jxl_info == (JxlEncoder *) NULL) diff --git a/coders/label.c b/coders/label.c index 5d08035a25f..121c6cf666d 100644 --- a/coders/label.c +++ b/coders/label.c @@ -214,19 +214,21 @@ static Image *ReadLABELImage(const ImageInfo *image_info, if (status == MagickFalse) break; AdjustTypeMetricBounds(&metrics); - width=CastDoubleToUnsigned(metrics.width+draw_info->stroke_width+0.5); - height=CastDoubleToUnsigned(metrics.height-metrics.underline_position+ + width=CastDoubleToUnsigned(metrics.width+draw_info->stroke_width+ + 0.5); + height=CastDoubleToUnsigned( + metrics.height-metrics.underline_position+ draw_info->stroke_width+0.5); if ((image->columns != 0) && (image->rows != 0)) { - if ((width >= image->columns) || (height >= image->rows)) + if ((width > image->columns) && (height > image->rows)) break; - if ((width < image->columns) && (height < image->rows)) + if ((width <= image->columns) && (height <= image->rows)) low=draw_info->pointsize; } else - if (((image->columns != 0) && (width >= image->columns)) || - ((image->rows != 0) && (height >= image->rows))) + if (((image->columns != 0) && (width > image->columns)) || + ((image->rows != 0) && (height > image->rows))) break; } if (status == MagickFalse) @@ -238,7 +240,7 @@ static Image *ReadLABELImage(const ImageInfo *image_info, } high=draw_info->pointsize; } - while((high-low) > 0.5) + while ((high-low) > 0.5) { draw_info->pointsize=(low+high)/2.0; (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g", @@ -267,11 +269,7 @@ static Image *ReadLABELImage(const ImageInfo *image_info, high=draw_info->pointsize-0.5; } if (status != MagickFalse) - { - draw_info->pointsize=floor((low+high)/2.0-0.5); - status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception); - AdjustTypeMetricBounds(&metrics); - } + draw_info->pointsize=floor((low+high)/2.0+0.5); } label=DestroyString(label); if (status == MagickFalse) @@ -280,6 +278,11 @@ static Image *ReadLABELImage(const ImageInfo *image_info, image=DestroyImageList(image); return((Image *) NULL); } + /* + Draw label. + */ + status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception); + AdjustTypeMetricBounds(&metrics); if (image->columns == 0) image->columns=(size_t) floor(metrics.width+draw_info->stroke_width+0.5); if (image->columns == 0) diff --git a/coders/mat.c b/coders/mat.c index 24b7f5dd467..a7275533d72 100644 --- a/coders/mat.c +++ b/coders/mat.c @@ -1633,7 +1633,7 @@ static MagickBooleanType WriteMATImage(const ImageInfo *image_info,Image *image, image->depth=8; current_time=GetMagickTime(); - GetMagickUTCtime(¤t_time,&utc_time); + GetMagickUTCTime(¤t_time,&utc_time); (void) memset(MATLAB_HDR,' ',MagickMin(sizeof(MATLAB_HDR),124)); FormatLocaleString(MATLAB_HDR,sizeof(MATLAB_HDR), "MATLAB 5.0 MAT-file, Platform: %s, Created on: %s %s %2d %2d:%2d:%2d %d", diff --git a/coders/pdf.c b/coders/pdf.c index 2576efb871e..f776013bee2 100644 --- a/coders/pdf.c +++ b/coders/pdf.c @@ -3226,7 +3226,7 @@ static MagickBooleanType WritePDFImage(const ImageInfo *image_info,Image *image, WritePDFValue(image,"Subject",GetPDFSubject(image_info),is_pdfa); WritePDFValue(image,"Keywords",GetPDFKeywords(image_info),is_pdfa); seconds=GetPdfCreationDate(image_info,image); - GetMagickUTCtime(&seconds,&utc_time); + GetMagickUTCTime(&seconds,&utc_time); (void) FormatLocaleString(temp,MagickPathExtent,"D:%04d%02d%02d%02d%02d%02d", utc_time.tm_year+1900,utc_time.tm_mon+1,utc_time.tm_mday, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); @@ -3234,7 +3234,7 @@ static MagickBooleanType WritePDFImage(const ImageInfo *image_info,Image *image, temp); (void) WriteBlobString(image,buffer); seconds=GetPdfModDate(image_info,image); - GetMagickUTCtime(&seconds,&utc_time); + GetMagickUTCTime(&seconds,&utc_time); (void) FormatLocaleString(temp,MagickPathExtent,"D:%04d%02d%02d%02d%02d%02d", utc_time.tm_year+1900,utc_time.tm_mon+1,utc_time.tm_mday, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); diff --git a/coders/png.c b/coders/png.c index ac5c5aa60a3..32227a1b04a 100644 --- a/coders/png.c +++ b/coders/png.c @@ -1791,8 +1791,6 @@ static int PNGParseiTXt(Image *image,png_byte *data,png_size_t size, (void) FormatLocaleString(key,MagickPathExtent,"%s",(const char *) GetStringInfoDatum(profile)); offset=(ssize_t) strlen(key)+1; - (void) FormatLocaleString(key,MagickPathExtent,"png:%s",(const char *) - GetStringInfoDatum(profile)); if (((MagickOffsetType) size-offset) < 1) { profile=DestroyStringInfo(profile); @@ -7913,6 +7911,69 @@ static void write_tIME_chunk(Image *image,png_struct *ping,png_info *info, } #endif +static void Magick_png_set_text(png_struct *ping,png_info *ping_info, + MngWriteInfo *mng_info, const ImageInfo *image_info,const char* key, + const char *value) +{ + const char + *c; + + MagickBooleanType + write_itxt=MagickFalse; + + int + compresion_none=PNG_TEXT_COMPRESSION_NONE, + compresion_zTXt=PNG_TEXT_COMPRESSION_zTXt; + + png_textp + text; + + size_t + length; + + /* + Check if the string contains non-Latin1 characters. + */ + c=value; + while(*c != '\0') + { + if (((const unsigned char) *c) > 127) { + write_itxt=MagickTrue; + compresion_none=PNG_ITXT_COMPRESSION_NONE; + compresion_zTXt=PNG_ITXT_COMPRESSION_zTXt; + break; + } + c++; + } +#if PNG_LIBPNG_VER >= 10400 + text=(png_textp) png_malloc(ping,(png_alloc_size_t) sizeof(png_text)); +#else + text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); +#endif + if (text == (png_textp) NULL) + return; + (void) memset(text,0,sizeof(png_text)); + text[0].key=(char *) key; + text[0].text=(char *) value; + length=strlen(value); + if (write_itxt == MagickFalse) + text[0].text_length=length; + else + text[0].itxt_length=length; + if (mng_info->exclude_tEXt != MagickFalse) + text[0].compression=compresion_zTXt; + else + if (mng_info->exclude_zTXt != MagickFalse) + text[0].compression=compresion_none; + else + text[0].compression= + image_info->compression == NoCompression || + (image_info->compression == UndefinedCompression && + (length < 128)) ? compresion_none : compresion_zTXt; + png_set_text(ping,ping_info,text,1); + png_free(ping,text); +} + /* Write one PNG image */ static MagickBooleanType WriteOnePNGImage(MngWriteInfo *mng_info, const ImageInfo *IMimage_info,Image *IMimage,ExceptionInfo *exception) @@ -11175,9 +11236,6 @@ static MagickBooleanType WriteOnePNGImage(MngWriteInfo *mng_info, ResetImagePropertyIterator(image); while ((property=GetNextImageProperty(image)) != (const char *) NULL) { - png_textp - text; - /* Don't write any "png:" or "jpeg:" properties; those are just for * "identify" or for passing through to another JPEG */ @@ -11202,36 +11260,7 @@ static MagickBooleanType WriteOnePNGImage(MngWriteInfo *mng_info, value=GetImageProperty(image,property,exception); if (value == (const char *) NULL) continue; -#if PNG_LIBPNG_VER >= 10400 - text=(png_textp) png_malloc(ping, - (png_alloc_size_t) sizeof(png_text)); -#else - text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); -#endif - text[0].key=(char *) property; - text[0].text=(char *) value; - text[0].text_length=strlen(value); - if (mng_info->exclude_tEXt != MagickFalse) - text[0].compression=PNG_TEXT_COMPRESSION_zTXt; - else if (mng_info->exclude_zTXt != MagickFalse) - text[0].compression=PNG_TEXT_COMPRESSION_NONE; - else - { - text[0].compression=image_info->compression == NoCompression || - (image_info->compression == UndefinedCompression && - text[0].text_length < 128) ? PNG_TEXT_COMPRESSION_NONE : - PNG_TEXT_COMPRESSION_zTXt ; - } - if (logging != MagickFalse) - { - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " Setting up text chunk"); - - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " keyword: '%s'",text[0].key); - } - png_set_text(ping,ping_info,text,1); - png_free(ping,text); + Magick_png_set_text(ping,ping_info,mng_info,image_info,property,value); } } diff --git a/coders/psd.c b/coders/psd.c index ee7b0e67e07..a58713e177a 100644 --- a/coders/psd.c +++ b/coders/psd.c @@ -1523,7 +1523,7 @@ static MagickBooleanType ReadPSDChannel(Image *image, return(status); } -static MagickBooleanType GetPixelChannelFromPsdIndex(const PSDInfo *psd_info, +static MagickBooleanType GetPixelChannelFromPSDIndex(const PSDInfo *psd_info, ssize_t index,PixelChannel *channel) { *channel=RedPixelChannel; @@ -1569,7 +1569,7 @@ static MagickBooleanType GetPixelChannelFromPsdIndex(const PSDInfo *psd_info, return(MagickTrue); } -static void SetPsdMetaChannels(Image *image,const PSDInfo *psd_info, +static void SetPSDMetaChannels(Image *image,const PSDInfo *psd_info, const unsigned short channels,ExceptionInfo *exception) { ssize_t @@ -1621,7 +1621,7 @@ static MagickBooleanType ReadPSDLayer(Image *image,const ImageInfo *image_info, (void) SetImageProperty(layer_info->image,"label",(char *) layer_info->name, exception); - SetPsdMetaChannels(layer_info->image,psd_info,layer_info->channels,exception); + SetPSDMetaChannels(layer_info->image,psd_info,layer_info->channels,exception); status=MagickTrue; for (j=0; j < (ssize_t) layer_info->channels; j++) { @@ -1670,6 +1670,13 @@ static MagickBooleanType ReadPSDLayer(Image *image,const ImageInfo *image_info, return(status); } +static MagickBooleanType IsEmptyPSDLayer(LayerInfo *layer_info) +{ + if ((layer_info->page.width == 0) || (layer_info->page.height == 0)) + return(MagickTrue); + return(MagickFalse); +} + static MagickBooleanType CheckPSDChannels(const Image *image, const PSDInfo *psd_info,LayerInfo *layer_info) { @@ -1682,6 +1689,8 @@ static MagickBooleanType CheckPSDChannels(const Image *image, ssize_t i; + if (IsEmptyPSDLayer(layer_info) != MagickFalse) + return(MagickTrue); if (layer_info->channels < psd_info->min_channels) return(MagickFalse); channel_type=RedChannel; @@ -2006,7 +2015,7 @@ static MagickBooleanType ReadPSDLayersInternal(Image *image, layer_info[i].page.width,(double) layer_info[i].channels); for (j=0; j < (ssize_t) layer_info[i].channels; j++) { - layer_info[i].channel_info[j].supported=GetPixelChannelFromPsdIndex( + layer_info[i].channel_info[j].supported=GetPixelChannelFromPSDIndex( psd_info,(ssize_t) ReadBlobSignedShort(image), &layer_info[i].channel_info[j].channel); layer_info[i].channel_info[j].size=(size_t) GetPSDSize(psd_info, @@ -2167,7 +2176,7 @@ static MagickBooleanType ReadPSDLayersInternal(Image *image, for (i=0; i < number_layers; i++) { - if ((layer_info[i].page.width == 0) || (layer_info[i].page.height == 0)) + if (IsEmptyPSDLayer(&layer_info[i]) != MagickFalse) { if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), @@ -2303,14 +2312,14 @@ static MagickBooleanType ReadPSDMergedImage(const ImageInfo *image_info, image->filename); } - SetPsdMetaChannels(image,psd_info,psd_info->channels,exception); + SetPSDMetaChannels(image,psd_info,psd_info->channels,exception); status=MagickTrue; for (i=0; i < (ssize_t) psd_info->channels; i++) { PixelChannel channel; - status=GetPixelChannelFromPsdIndex(psd_info,i,&channel); + status=GetPixelChannelFromPSDIndex(psd_info,i,&channel); if (status == MagickFalse) { (void) ThrowMagickException(exception,GetMagickModule(), diff --git a/coders/svg.c b/coders/svg.c index 7c4782124b3..5a9a0f9eaba 100644 --- a/coders/svg.c +++ b/coders/svg.c @@ -435,21 +435,27 @@ static Image *RenderRSVGImage(const ImageInfo *image_info,Image *image, rsvg_handle_set_base_uri(svg_handle,image_info->filename); if ((fabs(image->resolution.x) > MagickEpsilon) && (fabs(image->resolution.y) > MagickEpsilon)) - rsvg_handle_set_dpi_x_y(svg_handle,image->resolution.x, - image->resolution.y); + rsvg_handle_set_dpi_x_y(svg_handle,image->resolution.x,image->resolution.y); while ((n=ReadBlob(image,MagickMaxBufferExtent-1,buffer)) != 0) { buffer[n]='\0'; error=(GError *) NULL; (void) rsvg_handle_write(svg_handle,buffer,(gsize) n,&error); if (error != (GError *) NULL) - g_error_free(error); + { + g_error_free(error); + break; + } } buffer=(unsigned char *) RelinquishMagickMemory(buffer); error=(GError *) NULL; rsvg_handle_close(svg_handle,&error); if (error != (GError *) NULL) - g_error_free(error); + { + g_error_free(error); + g_object_unref(svg_handle); + ThrowReaderException(CorruptImageError,"UnableToReadImageData"); + } #if defined(MAGICKCORE_CAIRO_DELEGATE) apply_density=MagickTrue; rsvg_handle_get_dimensions(svg_handle,&dimension_info); @@ -556,8 +562,7 @@ static Image *RenderRSVGImage(const ImageInfo *image_info,Image *image, cairo_surface_destroy(cairo_surface); pixel_info=RelinquishVirtualMemory(pixel_info); g_object_unref(svg_handle); - ThrowReaderException(ResourceLimitError, - "MemoryAllocationFailed"); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); } cairo_image=cairo_create(cairo_surface); cairo_set_operator(cairo_image,CAIRO_OPERATOR_CLEAR); diff --git a/coders/url.c b/coders/url.c index b9189d1421b..34d3e02511d 100644 --- a/coders/url.c +++ b/coders/url.c @@ -18,7 +18,7 @@ % March 2000 % % % % % -% Copyright @ 2000 ImageMagick Studio LLC, a non-profit organization % +% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % diff --git a/coders/video.c b/coders/video.c index ea6de28a5d4..77321f31bf7 100644 --- a/coders/video.c +++ b/coders/video.c @@ -327,69 +327,81 @@ ModuleExport size_t RegisterVIDEOImage(void) entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsPNG; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","AVI","Microsoft Audio/Visual Interleaved"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","FLV","Flash Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","MKV","Multimedia Container"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","MOV","MPEG Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","MPEG","MPEG Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","MPG","MPEG Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","MP4","VIDEO-4 Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","M2V","MPEG Video Stream"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","M4V","Raw VIDEO-4 Video"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","WEBM","Open Web Media"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); entry=AcquireMagickInfo("VIDEO","WMV","Windows Media Video"); entry->decoder=(DecodeImageHandler *) ReadVIDEOImage; entry->encoder=(EncodeImageHandler *) WriteVIDEOImage; entry->magick=(IsImageFormatHandler *) IsVIDEO; entry->flags^=CoderBlobSupportFlag; + entry->flags|=CoderDecoderSeekableStreamFlag; (void) RegisterMagickInfo(entry); return(MagickImageCoderSignature); } diff --git a/coders/webp.c b/coders/webp.c index 0472e0c55d8..a1a67057f38 100644 --- a/coders/webp.c +++ b/coders/webp.c @@ -163,6 +163,19 @@ static inline uint32_t ReadWebPLSBWord( return(value); } +static inline void WriteWebPLSBWord(unsigned char *magick_restrict data, + const size_t value) +{ + unsigned char + *p; + + p=data; + *(p++)=(unsigned char) value; + *(p++)=(unsigned char) (value >> 8); + *(p++)=(unsigned char) (value >> 16); + *(p++)=(unsigned char) (value >> 24); +} + static MagickBooleanType IsWEBPImageLossless(const unsigned char *stream, const size_t length) { @@ -514,6 +527,7 @@ static Image *ReadWEBPImage(const ImageInfo *image_info, status; size_t + blob_size, length; ssize_t @@ -559,8 +573,14 @@ static Image *ReadWEBPImage(const ImageInfo *image_info, length=(size_t) (ReadWebPLSBWord(header+4)+8); if (length < 12) ThrowWEBPException(CorruptImageError,"CorruptImage"); - if ((MagickSizeType) length > GetBlobSize(image)) - ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + blob_size=(size_t) GetBlobSize(image); + if (length > blob_size) + { + if (length-blob_size != 12) + ThrowWEBPException(CorruptImageError,"InsufficientImageDataInFile"); + length-=12; + WriteWebPLSBWord(header+4,length-8); + } stream=(unsigned char *) AcquireQuantumMemory(length,sizeof(*stream)); if (stream == (unsigned char *) NULL) ThrowWEBPException(ResourceLimitError,"MemoryAllocationFailed"); diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000000..7e46708de24 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,446 @@ +import os + +from conan import ConanFile +from conan.errors import ConanInvalidConfiguration +from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout +from conan.tools.env import VirtualBuildEnv +from conan.tools.files import replace_in_file +from conan.tools.microsoft import is_msvc +from conan.tools.scm import Version + +required_conan_version = ">=1.53.0" + + +class ImageMagicConan(ConanFile): + name = "imagemagick" + description = ("ImageMagick is a free and open-source software suite for displaying, " + "converting, and editing raster image and vector image files") + license = "ImageMagick" + url = "https://github.com/conan-io/conan-center-index" + homepage = "https://imagemagick.org" + topics = ("images", "manipulating") + + package_type = "library" + settings = "os", "arch", "compiler", "build_type" + options = { + "shared": [True, False], + "fPIC": [True, False], + "cipher_support": [True, False], + "exclude_deprecated": [True, False], + "hdri": [True, False], + "magickpp": [True, False], + "quantum_depth": [8, 16, 32], + "utilities": [True, False], + "with_bzlib": [True, False], + "with_cairo": [True, False], + "with_djvu": [True, False], + "with_fftw": [True, False], + "with_fontconfig": [True, False], + "with_freetype": [True, False], + "with_heic": [True, False], + "with_jbig": [True, False], + "with_jpeg": [None, "libjpeg", "libjpeg-turbo"], + "with_jxl": [True, False], + "with_lcms": [True, False], + "with_ltdl": [True, False], + "with_lzma": [True, False], + "with_opencl": [True, False], + "with_openexr": [True, False], + "with_openjp2": [True, False], + "with_openmp": [True, False], + "with_pango": [True, False], + "with_png": [True, False], + "with_raw": [True, False], + "with_threads": [True, False], + "with_tiff": [True, False], + "with_webp": [True, False], + "with_x11": [True, False], + "with_xml2": [True, False], + "with_zlib": [True, False], + "with_zstd": [True, False], + } + default_options = { + "shared": False, + "fPIC": True, + "cipher_support": True, + "exclude_deprecated": True, + "hdri": True, + "magickpp": True, + "quantum_depth": 16, + "utilities": True, + "with_bzlib": True, + "with_cairo": True, + "with_djvu": False, + "with_fftw": True, + "with_fontconfig": True, + "with_freetype": True, + "with_heic": True, + "with_jbig": True, + "with_jpeg": "libjpeg", + "with_jxl": False, # FIXME: re-enable once migrated + "with_lcms": True, + "with_ltdl": True, + "with_lzma": True, + "with_opencl": True, + "with_openexr": True, + "with_openjp2": True, + "with_openmp": True, + "with_pango": False, # FIXME: re-enable once migrated + "with_png": True, + "with_raw": True, + "with_threads": True, + "with_tiff": True, + "with_webp": True, + "with_x11": True, + "with_xml2": True, + "with_zlib": True, + "with_zstd": True, + } + exports_sources = [ + "CMakeLists.txt", + "configure", + "LICENSE", + "NOTICE", + "cmake/*", + "coders/**", + "config/**", + "filters/**", + "images/**", + "m4/**", + "Magick++/**", + "MagickCore/**", + "MagickWand/**", + "utilities/**", + ] + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + if self.settings.os not in ["Linux", "FreeBSD"]: + del self.options.with_x11 + if is_msvc(self): + # TODO: fix MSVC compilation with these options + self.options.with_fftw = False + self.options.with_openmp = False + + def configure(self): + if self.options.shared: + self.options.rm_safe("fPIC") + if not self.options.magickpp: + self.settings.rm_safe("compiler.cppstd") + self.settings.rm_safe("compiler.libcxx") + + def layout(self): + cmake_layout(self) + + def requirements(self): + # None of the dependencies need transitive_headers=True + if self.options.with_bzlib: + self.requires("bzip2/1.0.8") + if self.options.with_cairo: + self.requires("cairo/1.18.0") + if self.options.with_fftw: + self.requires("fftw/3.3.10") + if self.options.with_fontconfig: + self.requires("fontconfig/2.14.2") + if self.options.with_freetype: + self.requires("freetype/2.13.2") + if self.options.with_heic: + self.requires("libheif/1.16.2") + if self.options.with_jbig: + self.requires("jbig/20160605") + if self.options.with_jpeg == "libjpeg": + self.requires("libjpeg/9e") + elif self.options.with_jpeg == "libjpeg-turbo": + self.requires("libjpeg-turbo/3.0.1") + if self.options.with_jxl: + self.requires("libjxl/0.8.2") + if self.options.with_lcms: + self.requires("lcms/2.14") + if self.options.with_ltdl: + self.requires("libtool/2.4.7") + if self.options.with_lzma: + self.requires("xz_utils/5.4.5") + if self.options.with_opencl: + self.requires("opencl-headers/2023.04.17") + if self.options.with_openexr: + self.requires("openexr/3.2.1") + if self.options.with_openjp2: + self.requires("openjpeg/2.5.0") + if self.options.with_openmp: + if self.settings.compiler in ["clang", "apple-clang"]: + self.requires("llvm-openmp/17.0.4") + if self.options.with_pango: + self.requires("pango/1.48.5") + if self.options.with_png: + self.requires("libpng/1.6.40") + if self.options.with_raw: + self.requires("libraw/0.21.1") + if self.options.with_tiff: + self.requires("libtiff/4.6.0") + if self.options.with_webp: + self.requires("libwebp/1.3.2") + if self.options.with_xml2: + self.requires("libxml2/2.12.2") + if self.options.with_zlib: + self.requires("zlib/1.3") + if self.options.with_zstd: + self.requires("zstd/1.5.5") + if self.options.with_djvu: + self.output.warning("Conan package for djvu is not available, this package will be used from system.") + if self.options.get_safe("with_x11"): + self.requires("xorg/system") + + def validate(self): + if self.options.with_opencl and not self.options.with_ltdl: + raise ConanInvalidConfiguration("OpenCL support requires with_ltdl=True") + + def build_requirements(self): + self.tool_requires("cmake/[>=3.19 <4]") + if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str): + self.tool_requires("pkgconf/2.1.0") + + def generate(self): + venv = VirtualBuildEnv(self) + venv.generate() + + tc = CMakeToolchain(self) + tc.variables["MAGICK_BUILD_STATIC"] = not self.options.shared + tc.variables["BUILD_MAGICKPP"] = self.options.magickpp + tc.variables["BUILD_UTILITIES"] = self.options.utilities + tc.variables["BUILD_TESTS"] = False + tc.variables["CIPHER_SUPPORT"] = self.options.cipher_support + tc.variables["EXCLUDE_DEPRECATED"] = self.options.exclude_deprecated + tc.variables["MAGICKCORE_QUANTUM_DEPTH"] = self.options.quantum_depth + tc.variables["MAGICK_HDRI_ENABLE"] = self.options.hdri + + tc.variables["AUTOTRACE_DELEGATE"] = False + tc.variables["BZLIB_DELEGATE"] = self.options.with_bzlib + tc.variables["CAIRO_DELEGATE"] = self.options.with_cairo + tc.variables["DJVU_DELEGATE"] = self.options.with_djvu + tc.variables["DPS_DELEGATE"] = False + tc.variables["FFTW_DELEGATE"] = self.options.with_fftw + tc.variables["FLIF_DELEGATE"] = False + tc.variables["FONTCONFIG_DELEGATE"] = self.options.with_fontconfig + tc.variables["FPX_DELEGATE"] = False + tc.variables["FREETYPE_DELEGATE"] = self.options.with_freetype + tc.variables["GS_DELEGATE"] = False + tc.variables["GVC_DELEGATE"] = False + tc.variables["HAVE_JEMALLOC"] = False + tc.variables["HAVE_UMEM"] = False + tc.variables["HEIC_DELEGATE"] = self.options.with_heic + tc.variables["JBIG_DELEGATE"] = self.options.with_jbig + tc.variables["JPEG_DELEGATE"] = self.options.with_jpeg + tc.variables["JXL_DELEGATE"] = self.options.with_jxl + tc.variables["LCMS_DELEGATE"] = self.options.with_lcms + tc.variables["LIBOPENJP2_DELEGATE"] = self.options.with_openjp2 + tc.variables["LQR"] = False + tc.variables["LTDL_DELEGATE"] = self.options.with_ltdl + tc.variables["LZMA_DELEGATE"] = self.options.with_lzma + tc.variables["OPENCLLIB_DELEGATE"] = self.options.with_opencl + tc.variables["OPENEXR_DELEGATE"] = self.options.with_openexr + tc.variables["OPENMP_SUPPORT"] = self.options.with_openmp + tc.variables["PANGOCAIRO_DELEGATE"] = self.options.with_pango and self.dependencies["pango"].options.with_cairo + tc.variables["PANGO_DELEGATE"] = self.options.with_pango + tc.variables["PNG_DELEGATE"] = self.options.with_png + tc.variables["RAQM_DELEGATE"] = False + tc.variables["RAW_R_DELEGATE"] = self.options.with_raw + tc.variables["RSVG_DELEGATE"] = False + tc.variables["THREADS_SUPPORT"] = self.options.with_threads + tc.variables["TIFF_DELEGATE"] = self.options.with_tiff + tc.variables["WEBPMUX_DELEGATE"] = False + tc.variables["WEBP_DELEGATE"] = self.options.with_webp + tc.variables["WMF_DELEGATE"] = False + tc.variables["X11_DELEGATE"] = self.options.get_safe("with_x11", False) + tc.variables["XML_DELEGATE"] = self.options.with_xml2 + tc.variables["ZLIB_DELEGATE"] = self.options.with_zlib + tc.variables["ZSTD_DELEGATE"] = self.options.with_zstd + + tc.variables["HAVE_LIBRAW_LIBRAW_H"] = True + tc.generate() + + # TODO: fix this bug in the libheif recipe + if self.settings.os in ["Linux", "FreeBSD"]: + self.dependencies["libheif"].cpp_info.components["heif"].system_libs.append("dl") + + cmake_names = { + "autotrace": "AUTOTRACE", + "bzip2": "BZip2", + "cairo": "Cairo", + "djvu": "DJVU", + "dps": "DPS", + "fftw": "FFTW", + "flashpix": "FlashPIX", + "flif": "FLIF", + "fontconfig": "Fontconfig", + "freetype": "Freetype", + "ghostscript": "Ghostscript", + "gvc": "GVC", + "jbig": "JBIG", + "jemalloc": "Jemalloc", + "jpeg": "JPEG", + "lcms": "lcms", + "libheif": "libheif", + "libjxl": "libjxl", + "libpng": "PNG", + "libraw": "libraw", + "libtiff": "TIFF", + "libwebp": "WebP", + "libxml2": "LibXml2", + "lqr": "Lqr", + "libtool": "LTDL", + "opencl-headers": "OpenCL", + "openexr": "OpenEXR", + "openjpeg": "OpenJPEG", + "pango": "Pango", + "raqm": "RAQM", + "rsvg": "Rsvg", + "umem": "UMEM", + "webpmux": "WEBPMUX", + "wmf": "WMF", + "xz_utils": "LibLZMA", + "zlib": "ZLIB", + "zstd": "zstd", + } + deps = CMakeDeps(self) + for dep, cmake_name in cmake_names.items(): + deps.set_property(dep, "cmake_file_name", cmake_name) + deps.set_property(dep, "cmake_target_name", f"{cmake_name}::{cmake_name}") + deps.generate() + + def _patch_sources(self): + # PangoCairo is provided by Pango + replace_in_file(self, os.path.join(self.source_folder, "cmake", "delegates.cmake"), + "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME PangoCairo DEFAULT FALSE)", + "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME Pango DEFAULT FALSE TARGETS Pango::Pango)") + + def build(self): + self._patch_sources() + cmake = CMake(self) + cmake.configure() + cmake.build() + + def package(self): + # License files are installed by the project + cmake = CMake(self) + cmake.install() + + def _libname(self, library): + suffix = "HDRI" if self.options.hdri else "" + major_version = Version(self.version).major + return f"{library}-{major_version}.Q{self.options.quantum_depth}{suffix}" + + def package_info(self): + # FIXME: fully model the official FindImageMagick https://cmake.org/cmake/help/latest/module/FindImageMagick.html + + self.cpp_info.set_property("cmake_find_mode", "both") + self.cpp_info.set_property("cmake_file_name", "ImageMagick") + self.cpp_info.set_property("cmake_target_name", "ImageMagick::ImageMagick") + + core_requires = [] + if self.options.with_bzlib: + core_requires.append("bzip2::bzip2") + if self.options.with_cairo: + core_requires.append("cairo::cairo") + if self.options.with_fftw: + core_requires.append("fftw::fftw") + if self.options.with_fontconfig: + core_requires.append("fontconfig::fontconfig") + if self.options.with_freetype: + core_requires.append("freetype::freetype") + if self.options.with_heic: + core_requires.append("libheif::libheif") + if self.options.with_jbig: + core_requires.append("jbig::jbig") + if self.options.with_jpeg == "libjpeg": + core_requires.append("libjpeg::libjpeg") + elif self.options.with_jpeg == "libjpeg-turbo": + core_requires.append("libjpeg-turbo::jpeg") + if self.options.with_jxl: + core_requires.append("libjxl::libjxl") + if self.options.with_lcms: + core_requires.append("lcms::lcms") + if self.options.with_ltdl: + core_requires.append("libtool::libtool") + if self.options.with_lzma: + core_requires.append("xz_utils::xz_utils") + if self.options.with_opencl: + core_requires.append("opencl-headers::opencl-headers") + if self.options.with_openexr: + core_requires.append("openexr::openexr") + if self.options.with_openjp2: + core_requires.append("openjpeg::openjpeg") + if self.options.with_openmp and self.settings.compiler in ["clang", "apple-clang"]: + core_requires.append("llvm-openmp::llvm-openmp") + if self.options.with_pango: + core_requires.append("pango::pango") + if self.options.with_png: + core_requires.append("libpng::libpng") + if self.options.with_raw: + core_requires.append("libraw::libraw") + if self.options.with_tiff: + core_requires.append("libtiff::libtiff") + if self.options.with_webp: + core_requires.append("libwebp::libwebp") + if self.options.with_xml2: + core_requires.append("libxml2::libxml2") + if self.options.with_zlib: + core_requires.append("zlib::zlib") + if self.options.with_zstd: + core_requires.append("zstd::zstd") + if self.options.get_safe("with_x11"): + core_requires.append("xorg::xorg") + + if self.settings.os in ["Linux", "FreeBSD"]: + self.cpp_info.components["MagickCore"].system_libs.append("pthread") + + self.cpp_info.components["MagickCore"].defines.append(f"MAGICKCORE_QUANTUM_DEPTH={self.options.quantum_depth}") + self.cpp_info.components["MagickCore"].defines.append(f"MAGICKCORE_HDRI_ENABLE={int(bool(self.options.hdri))}") + self.cpp_info.components["MagickCore"].defines.append("_MAGICKDLL_=1" if self.options.shared else "_MAGICKLIB_=1") + + include_dir_root = os.path.join("include", f"ImageMagick-{Version(self.version).major}") + self.cpp_info.components["MagickCore"].includedirs = [include_dir_root] + self.cpp_info.components["MagickCore"].libs.append(self._libname("MagickCore")) + self.cpp_info.components["MagickCore"].requires = core_requires + self.cpp_info.components["MagickCore"].set_property("pkg_config_name", "MagicCore") + + self.cpp_info.components[self._libname("MagickCore")].requires = ["MagickCore"] + self.cpp_info.components[self._libname("MagickCore")].set_property("pkg_config_name", self._libname("MagickCore")) + + if not self.options.shared and self.options.with_openmp: + openmp_flags = [] + if is_msvc(self): + openmp_flags = ["-openmp"] + elif self.settings.compiler == "gcc": + openmp_flags = ["-fopenmp"] + elif self.settings.compiler in ["clang", "apple-clang"]: + openmp_flags = ["-Xpreprocessor", "-fopenmp"] + self.cpp_info.components["MagickCore"].sharedlinkflags = openmp_flags + self.cpp_info.components["MagickCore"].exelinkflags = openmp_flags + + self.cpp_info.components["MagickWand"].includedirs = [os.path.join(include_dir_root, "MagickWand")] + self.cpp_info.components["MagickWand"].libs = [self._libname("MagickWand")] + self.cpp_info.components["MagickWand"].requires = ["MagickCore"] + self.cpp_info.components["MagickWand"].set_property("pkg_config_name", "MagickWand") + + self.cpp_info.components[self._libname("MagickWand")].requires = ["MagickWand"] + self.cpp_info.components[self._libname("MagickWand")].set_property("pkg_config_name", "MagickWand") + + if self.options.magickpp: + self.cpp_info.components["Magick++"].includedirs = [os.path.join(include_dir_root, "Magick++")] + self.cpp_info.components["Magick++"].libs = [self._libname("Magick++")] + self.cpp_info.components["Magick++"].requires = ["MagickWand"] + self.cpp_info.components["Magick++"].set_property("pkg_config_name", ["Magick++", self._libname("Magick++")]) + + self.cpp_info.components[self._libname("Magick++")].requires = ["Magick++"] + self.cpp_info.components[self._libname("Magick++")].set_property("pkg_config_name", self._libname("Magick++")) + + if not self.options.shared: + self.cpp_info.components["MagickCore"].defines.append("STATIC_MAGICK=1") + self.cpp_info.components["MagickCore"].defines.append("NOAUTOLINK_MAGICK=1") + + # TODO: Legacy, to be removed on Conan 2.0 + self.cpp_info.names["cmake_find_package"] = "ImageMagick" + self.cpp_info.names["cmake_find_package_multi"] = "ImageMagick" + bin_path = os.path.join(self.package_folder, "bin") + self.env_info.PATH.append(bin_path) diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt new file mode 100644 index 00000000000..2ff16235d8a --- /dev/null +++ b/config/CMakeLists.txt @@ -0,0 +1,139 @@ +# Copyright 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Fetch some needed values from version.sh and fill the correspondent variables + +if(WIN32) + # Set the ImageMagick.rc file path to be autogenerated + set(MAGICK_RESOURCE_FILE_PATH ${CMAKE_BINARY_DIR}/config/resources/ImageMagick.rc) + configure_file(${CMAKE_SOURCE_DIR}/config/ImageMagick.rc.cmake ${MAGICK_RESOURCE_FILE_PATH}) + # Copy only the needed resource files to output directory + configure_file(${CMAKE_SOURCE_DIR}/images/ImageMagick.ico ${CMAKE_BINARY_DIR}/images/ImageMagick.ico COPYONLY) +endif() + +# Set the version.h file path to be autogenerated +configure_file(${CMAKE_SOURCE_DIR}/MagickCore/version.h.in ${CMAKE_BINARY_DIR}/MagickCore/version.h) + +# Set the config.h file path to be autogenerated +configure_file(${CMAKE_SOURCE_DIR}/config/config.h.cmake ${CMAKE_BINARY_DIR}/config/config.h) + +# Now we need to read its content to generate the magick-baseconfig.h header +file(READ ${CMAKE_BINARY_DIR}/config/config.h CONTENT_CONFIG_H) + +# Now we need to Regex Replace some things in the header file +# All caps defines will be prefixed with a macro MAGICKCORE_ +string(REGEX REPLACE + "\\*\\/\n#define +([A-Z0-9_]+) *([a-zA-Z0-9\":\\\-]*)\n" + "*/\n#ifndef MAGICKCORE_\\1\n#define MAGICKCORE_\\1 \\2\n#endif\n" + CONTENT_CONFIG_H ${CONTENT_CONFIG_H} +) +# All uncaps defines will be prefixed with a macro _magickcore_ +string(REGEX REPLACE + "\\*\\/\n#define +([a-z0-9_]+) *([a-zA-Z0-9 \"_]*)\n" + "*/\n#ifndef _magickcore_\\1\n#define _magickcore_\\1 \\2\n#endif\n" + CONTENT_CONFIG_H ${CONTENT_CONFIG_H} +) +# For some reason (I can't seem to find the logic) there's some defines we need to remove the prefix +string(REGEX REPLACE + "_magickcore___func__" + "__func__" + CONTENT_CONFIG_H ${CONTENT_CONFIG_H} +) +# Also for ssize_t we need to typedef instead of define or else magick++ will not compile +string(REGEX REPLACE + "#ifndef _magickcore_ssize_t\n#define _magickcore_ssize_t ([a-zA-Z ]*)\n#endif" + "typedef \\1 ssize_t;" + CONTENT_CONFIG_H ${CONTENT_CONFIG_H} +) + +# Now we need to append things to the previously read file content +set(CONTENT_CONFIG_H + "#ifndef _MAGICKCORE_MAGICK_BASECONFIG_H +#define _MAGICKCORE_MAGICK_BASECONFIG_H 1 + +/* MagickCore/magick-baseconfig.h. Generated automatically at end of configure. */ +/* config/config.h. Generated from config.h.cmake by CMake. */ +${CONTENT_CONFIG_H} + +/* once: _MAGICKCORE_MAGICK_BASECONFIG_H */ +#endif +" +) + +# Create the magick-baseconfig.h file +file(WRITE ${CMAKE_BINARY_DIR}/MagickCore/magick-baseconfig.h "${CONTENT_CONFIG_H}") + +if(ZERO_CONFIGURATION_SUPPORT) + file(READ ${CMAKE_SOURCE_DIR}/config/thresholds.xml THRESHOLD_XML) + # Convert xml file to header + string(REPLACE "\"" "\\\"" THRESHOLD_XML "${THRESHOLD_XML}") + string(REGEX REPLACE "\n" "\"\n \"" THRESHOLD_XML "${THRESHOLD_XML}") + set(THRESHOLD_H "static const char *const\n BuiltinMap=\n \"${THRESHOLD_XML}") + string(LENGTH ${THRESHOLD_H} THRESHOLD_H_LEN) + math(EXPR THRESHOLD_H_LEN "${THRESHOLD_H_LEN} - 6") + string(SUBSTRING ${THRESHOLD_H} 0 ${THRESHOLD_H_LEN} THRESHOLD_H) + set(THRESHOLD_H "${THRESHOLD_H};\n") + file(WRITE ${CMAKE_BINARY_DIR}/MagickCore/threshold-map.h "${THRESHOLD_H}") +endif() + +configure_file(policy-${SECURITY_POLICY}.xml ${CMAKE_CURRENT_BINARY_DIR}/policy.xml COPYONLY) + +configure_file(configure.xml.in ${CMAKE_CURRENT_BINARY_DIR}/configure.xml @ONLY) +configure_file(delegates.xml.in ${CMAKE_CURRENT_BINARY_DIR}/delegates.xml @ONLY) +configure_file(type-apple.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type-apple.xml @ONLY) +configure_file(type-dejavu.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type-dejavu.xml @ONLY) +configure_file(type-ghostscript.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type-ghostscript.xml @ONLY) +configure_file(type-urw-base35.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type-urw-base35.xml @ONLY) +configure_file(type-windows.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type-windows.xml @ONLY) +configure_file(type.xml.in ${CMAKE_CURRENT_BINARY_DIR}/type.xml @ONLY) + +file(COPY + english.xml + francais.xml + locale.xml + colors.xml + log.xml + mime.xml + quantization-table.xml + thresholds.xml + DESTINATION ${CMAKE_CURRENT_BINARY_DIR} +) + +set(DATA_FILES + ${CMAKE_CURRENT_BINARY_DIR}/english.xml + ${CMAKE_CURRENT_BINARY_DIR}/francais.xml + ${CMAKE_CURRENT_BINARY_DIR}/locale.xml +) +set(PLATFORM_DATA_FILES + ${CMAKE_CURRENT_BINARY_DIR}/configure.xml +) + +set(CONFIG_FILES + ${CMAKE_CURRENT_BINARY_DIR}/colors.xml + ${CMAKE_CURRENT_BINARY_DIR}/delegates.xml + ${CMAKE_CURRENT_BINARY_DIR}/log.xml + ${CMAKE_CURRENT_BINARY_DIR}/mime.xml + ${CMAKE_CURRENT_BINARY_DIR}/policy.xml + ${CMAKE_CURRENT_BINARY_DIR}/quantization-table.xml + ${CMAKE_CURRENT_BINARY_DIR}/thresholds.xml + ${CMAKE_CURRENT_BINARY_DIR}/type-apple.xml + ${CMAKE_CURRENT_BINARY_DIR}/type-dejavu.xml + ${CMAKE_CURRENT_BINARY_DIR}/type-ghostscript.xml + ${CMAKE_CURRENT_BINARY_DIR}/type-urw-base35.xml + ${CMAKE_CURRENT_BINARY_DIR}/type-windows.xml + ${CMAKE_CURRENT_BINARY_DIR}/type.xml +) + +install(FILES ${DATA_FILES} DESTINATION ${SHARE_PATH}) +install(FILES ${PLATFORM_DATA_FILES} DESTINATION ${SHAREARCH_PATH}) +install(FILES ${CONFIG_FILES} DESTINATION ${CONFIGURE_PATH}) diff --git a/config/ImageMagick.rc.cmake b/config/ImageMagick.rc.cmake index 0505ffe29a1..ff1b360c9cd 100644 --- a/config/ImageMagick.rc.cmake +++ b/config/ImageMagick.rc.cmake @@ -10,8 +10,8 @@ ///////////////////////////////////////////////////////////////////////////// VS_VERSION_INFO VERSIONINFO - FILEVERSION @MagickLibVersionNumber@ - PRODUCTVERSION @MagickLibVersionNumber@ + FILEVERSION "@MagickLibVersionNumber@" + PRODUCTVERSION "@MagickLibVersionNumber@" FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -30,11 +30,11 @@ BEGIN VALUE "FileDescription", "ImageMagick Studio library and utility programs\0" VALUE "OriginalFilename", "ImageMagick\0" VALUE "InternalName", "ImageMagick\0" - VALUE "FileVersion", @MagickLibVersionText@ "\0" - VALUE "ProductVersion", @MagickLibVersionText@ "\0" + VALUE "FileVersion", "@MagickLibVersionText@" "\0" + VALUE "ProductVersion", "@MagickLibVersionText@" "\0" VALUE "CompanyName", "ImageMagick Studio\0" - VALUE "LegalCopyright", @MagickCopyright@ "\0" - VALUE "Comments", @MagickVersion@ "\0" + VALUE "LegalCopyright", "@MagickCopyright@" "\0" + VALUE "Comments", "@MagickVersion@" "\0" END END BLOCK "VarFileInfo" @@ -49,16 +49,15 @@ END // ///////////////////////////////////////////////////////////////////////////// -// TODO generate the xml files -//COLORS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\colors.xml" -//CONFIGURE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\configure.xml" -//DELEGATES.XML IMAGEMAGICK DISCARDABLE "..\\bin\\delegates.xml" -//ENGLISH.XML IMAGEMAGICK DISCARDABLE "..\\bin\\english.xml" -//LOCALE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\locale.xml" -//LOG.XML IMAGEMAGICK DISCARDABLE "..\\bin\\log.xml" -//THRESHOLDS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\thresholds.xml" -//TYPE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type.xml" -//TYPE-GHOSTSCRIPT.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type-ghostscript.xml" +COLORS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\colors.xml" +CONFIGURE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\configure.xml" +DELEGATES.XML IMAGEMAGICK DISCARDABLE "..\\bin\\delegates.xml" +ENGLISH.XML IMAGEMAGICK DISCARDABLE "..\\bin\\english.xml" +LOCALE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\locale.xml" +LOG.XML IMAGEMAGICK DISCARDABLE "..\\bin\\log.xml" +THRESHOLDS.XML IMAGEMAGICK DISCARDABLE "..\\bin\\thresholds.xml" +TYPE.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type.xml" +TYPE-GHOSTSCRIPT.XML IMAGEMAGICK DISCARDABLE "..\\bin\\type-ghostscript.xml" ///////////////////////////////////////////////////////////////////////////// diff --git a/config/config.h.cmake b/config/config.h.cmake index 361fdeaab48..6de185b75f9 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -1,144 +1,149 @@ /* config/config.h.cmake. Hand crafted from config/config.h.in. */ -/* config/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ -#cmakedefine AC_APPLE_UNIVERSAL_BUILD +#cmakedefine AC_APPLE_UNIVERSAL_BUILD 1 /* Define if you have AUTOTRACE library */ -#cmakedefine AUTOTRACE_DELEGATE +#cmakedefine AUTOTRACE_DELEGATE 1 /* Define if coders and filters are to be built as modules. */ -#cmakedefine BUILD_MODULES +#cmakedefine BUILD_MODULES 1 /* Define if you have the bzip2 library */ -#cmakedefine BZLIB_DELEGATE +#cmakedefine BZLIB_DELEGATE 1 /* Define if you have CAIRO library */ -#cmakedefine CAIRO_DELEGATE +#cmakedefine CAIRO_DELEGATE 1 -/* permit enciphering and deciphering image pixels */ -#cmakedefine CIPHER_SUPPORT +/* Channel mask depth */ +#cmakedefine CHANNEL_MASK_DEPTH @CHANNEL_MASK_DEPTH@ -/* Define to 1 if the `closedir' function returns void instead of `int'. */ -#cmakedefine CLOSEDIR_VOID @CLOSEDIR_VOID@ +/* permit enciphering and deciphering image pixels */ +#cmakedefine CIPHER_SUPPORT 1 /* coders subdirectory. */ -#cmakedefine CODER_DIRNAME @CODER_DIRNAME@ +#cmakedefine CODER_DIRNAME "@CODER_DIRNAME@" /* Directory where architecture-dependent configuration files live. */ -#cmakedefine CONFIGURE_PATH @CONFIGURE_PATH@ +#cmakedefine CONFIGURE_PATH "@CONFIGURE_PATH@" /* Subdirectory of lib where architecture-dependent configuration files live. */ -#cmakedefine CONFIGURE_RELATIVE_PATH @CONFIGURE_RELATIVE_PATH@ +#cmakedefine CONFIGURE_RELATIVE_PATH "@CONFIGURE_RELATIVE_PATH@" /* Define if you have DJVU library */ -#cmakedefine DJVU_DELEGATE +#cmakedefine DJVU_DELEGATE 1 /* Directory where ImageMagick documents live. */ -#cmakedefine DOCUMENTATION_PATH @DOCUMENTATION_PATH@ +#cmakedefine DOCUMENTATION_PATH "@DOCUMENTATION_PATH@" + +/* Define to 1 to enable distributed pixel cache support. */ +#cmakedefine DPC_SUPPORT 1 /* Define if you have Display Postscript */ -#cmakedefine DPS_DELEGATE +#cmakedefine DPS_DELEGATE 1 /* exclude deprecated methods in MagickCore API */ -#cmakedefine EXCLUDE_DEPRECATED +#cmakedefine EXCLUDE_DEPRECATED "@EXCLUDE_DEPRECATED@" /* Directory where executables are installed. */ -#cmakedefine EXECUTABLE_PATH +#cmakedefine EXECUTABLE_PATH "@EXECUTABLE_PATH@" /* Define if you have FFTW library */ -#cmakedefine FFTW_DELEGATE +#cmakedefine FFTW_DELEGATE 1 /* filter subdirectory. */ -#cmakedefine FILTER_DIRNAME @FILTER_DIRNAME@ +#cmakedefine FILTER_DIRNAME "@FILTER_DIRNAME@" /* Define if you have FLIF library */ -#cmakedefine FLIF_DELEGATE +#cmakedefine FLIF_DELEGATE 1 /* Define if you have FONTCONFIG library */ -#cmakedefine FONTCONFIG_DELEGATE +#cmakedefine FONTCONFIG_DELEGATE 1 /* Define if you have FlashPIX library */ -#cmakedefine FPX_DELEGATE +#cmakedefine FPX_DELEGATE 1 /* Define if you have FREETYPE library */ -#cmakedefine FREETYPE_DELEGATE +#cmakedefine FREETYPE_DELEGATE 1 /* Define if you have Ghostscript library or framework */ -#cmakedefine GS_DELEGATE +#cmakedefine GS_DELEGATE 1 /* Define if you have GVC library */ -#cmakedefine GVC_DELEGATE +#cmakedefine GVC_DELEGATE 1 /* Define to 1 if you have the `acosh' function. */ -#cmakedefine HAVE_ACOSH @HAVE_ACOSH@ +#cmakedefine HAVE_ACOSH 1 + +/* Define to 1 if you have the `aligned_malloc' function. */ +#cmakedefine HAVE_ALIGNED_MALLOC 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ARM_LIMITS_H @HAVE_ARM_LIMITS_H@ +#cmakedefine HAVE_ARM_LIMITS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ARPA_INET_H @HAVE_ARPA_INET_H@ +#cmakedefine HAVE_ARPA_INET_H 1 /* Define to 1 if you have the `asinh' function. */ -#cmakedefine HAVE_ASINH @HAVE_ASINH@ +#cmakedefine HAVE_ASINH 1 /* Define to 1 if you have the `atanh' function. */ -#cmakedefine HAVE_ATANH @HAVE_ATANH@ +#cmakedefine HAVE_ATANH 1 /* Define to 1 if you have the `atexit' function. */ -#cmakedefine HAVE_ATEXIT @HAVE_ATEXIT@ +#cmakedefine HAVE_ATEXIT 1 /* Define to 1 if you have the `atoll' function. */ -#cmakedefine HAVE_ATOLL @HAVE_ATOLL@ +#cmakedefine HAVE_ATOLL 1 /* define if bool is a built-in type */ #cmakedefine HAVE_BOOL /* Define to 1 if you have the `cabs' function. */ -#cmakedefine HAVE_CABS @HAVE_CABS@ +#cmakedefine HAVE_CABS 1 /* Define to 1 if you have the `carg' function. */ -#cmakedefine HAVE_CARG @HAVE_CARG@ +#cmakedefine HAVE_CARG 1 /* Define to 1 if you have the `cimag' function. */ -#cmakedefine HAVE_CIMAG @HAVE_CIMAG@ +#cmakedefine HAVE_CIMAG 1 /* Define to 1 if you have the `clock' function. */ -#cmakedefine HAVE_CLOCK @HAVE_CLOCK@ +#cmakedefine HAVE_CLOCK 1 /* Define to 1 if you have the `clock_getres' function. */ -#cmakedefine HAVE_CLOCK_GETRES @HAVE_CLOCK_GETRES@ +#cmakedefine HAVE_CLOCK_GETRES 1 -/* Define to 1 if you have clock_gettime. */ -#cmakedefine HAVE_CLOCK_GETTIME @HAVE_CLOCK_GETTIME@ +/* Define to 1 if you have the `clock_gettime' function. */ +#cmakedefine HAVE_CLOCK_GETTIME 1 /* Define to 1 if clock_gettime supports CLOCK_REALTIME. */ -#cmakedefine HAVE_CLOCK_REALTIME @HAVE_CLOCK_REALTIME@ +#cmakedefine HAVE_CLOCK_REALTIME 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_CL_CL_H @HAVE_CL_CL_H@ +#cmakedefine HAVE_CL_CL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_COMPLEX_H @HAVE_COMPLEX_H@ +#cmakedefine HAVE_COMPLEX_H 1 /* Define to 1 if you have the `creal' function. */ -#cmakedefine HAVE_CREAL @HAVE_CREAL@ +#cmakedefine HAVE_CREAL 1 /* Define to 1 if you have the `ctime_r' function. */ -#cmakedefine HAVE_CTIME_R @HAVE_CTIME_R@ +#cmakedefine HAVE_CTIME_R 1 /* Define to 1 if you have the declaration of `pread', and to 0 if you don't. */ -#cmakedefine01 HAVE_DECL_PREAD +#cmakedefine HAVE_DECL_PREAD 1 /* Define to 1 if you have the declaration of `pwrite', and to 0 if you don't. */ -#cmakedefine01 HAVE_DECL_PWRITE +#cmakedefine HAVE_DECL_PWRITE 1 /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ -#cmakedefine01 HAVE_DECL_STRERROR_R +#cmakedefine HAVE_DECL_STRERROR_R 1 /* Define to 1 if you have the declaration of `strlcpy', and to 0 if you don't. */ @@ -146,184 +151,199 @@ /* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. */ -#cmakedefine01 HAVE_DECL_TZNAME +#cmakedefine HAVE_DECL_TZNAME 1 /* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you don't. */ -#cmakedefine01 HAVE_DECL_VSNPRINTF +#cmakedefine HAVE_DECL_VSNPRINTF 1 /* Define to 1 if you have the `directio' function. */ -#cmakedefine HAVE_DIRECTIO @HAVE_DIRECTIO@ +#cmakedefine HAVE_DIRECTIO 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ -#cmakedefine HAVE_DIRENT_H @HAVE_DIRENT_H@ +#cmakedefine HAVE_DIRENT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_DLFCN_H @HAVE_DLFCN_H@ - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -#cmakedefine HAVE_DOPRNT @HAVE_DOPRNT@ - -/* Define to 1 if the system has the type `double_t'. */ -#cmakedefine HAVE_DOUBLE_T @HAVE_DOUBLE_T@ +#cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the `erf' function. */ -#cmakedefine HAVE_ERF @HAVE_ERF@ +/* Add conditionally as already defines the macro */ +#ifndef HAVE_ERF +#cmakedefine HAVE_ERF 1 +#endif /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ERRNO_H @HAVE_ERRNO_H@ +#cmakedefine HAVE_ERRNO_H 1 /* Define to 1 if you have the `execvp' function. */ -#cmakedefine HAVE_EXECVP @HAVE_EXECVP@ +#cmakedefine HAVE_EXECVP 1 /* Define to 1 if you have the `fchmod' function. */ -#cmakedefine HAVE_FCHMOD @HAVE_FCHMOD@ +#cmakedefine HAVE_FCHMOD 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@ +#cmakedefine HAVE_FCNTL_H 1 -/* Define to 1 if the system has the type `float_t'. */ -#cmakedefine HAVE_FLOAT_T @HAVE_FLOAT_T@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_FLOAT_H 1 /* Define to 1 if you have the `floor' function. */ -#cmakedefine HAVE_FLOOR @HAVE_FLOOR@ +#cmakedefine HAVE_FLOOR 1 /* Define to 1 if you have the `fork' function. */ -#cmakedefine HAVE_FORK @HAVE_FORK@ +#cmakedefine HAVE_FORK 1 /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ -#cmakedefine HAVE_FSEEKO @HAVE_FSEEKO@ +#cmakedefine HAVE_FSEEKO 1 /* Define to 1 if you have the `ftime' function. */ -#cmakedefine HAVE_FTIME @HAVE_FTIME@ +#cmakedefine HAVE_FTIME 1 /* Define to 1 if you have the `ftruncate' function. */ -#cmakedefine HAVE_FTRUNCATE @HAVE_FTRUNCATE@ +#cmakedefine HAVE_FTRUNCATE 1 /* Define to 1 if you have the `getcwd' function. */ -#cmakedefine HAVE_GETCWD @HAVE_GETCWD@ +#cmakedefine HAVE_GETCWD 1 /* Define to 1 if you have the `getc_unlocked' function. */ -#cmakedefine HAVE_GETC_UNLOCKED @HAVE_GETC_UNLOCKED@ +#cmakedefine HAVE_GETC_UNLOCKED 1 /* Define to 1 if you have the `getdtablesize' function. */ -#cmakedefine HAVE_GETDTABLESIZE @HAVE_GETDTABLESIZE@ +#cmakedefine HAVE_GETDTABLESIZE 1 + +/* Define to 1 if you have the `getentropy' function. */ +#cmakedefine HAVE_GETENTROPY 1 /* Define to 1 if you have the `getexecname' function. */ -#cmakedefine HAVE_GETEXECNAME @HAVE_GETEXECNAME@ +#cmakedefine HAVE_GETEXECNAME 1 /* Define to 1 if you have the `getpagesize' function. */ -#cmakedefine HAVE_GETPAGESIZE @HAVE_GETPAGESIZE@ +#cmakedefine HAVE_GETPAGESIZE 1 /* Define to 1 if you have the `getpid' function. */ -#cmakedefine HAVE_GETPID @HAVE_GETPID@ +#cmakedefine HAVE_GETPID 1 + +/* Define to 1 if you have the `getpwnam_r' function. */ +#cmakedefine HAVE_GETPWNAM_R 1 /* Define to 1 if you have the `getrlimit' function. */ -#cmakedefine HAVE_GETRLIMIT @HAVE_GETRLIMIT@ +#cmakedefine HAVE_GETRLIMIT 1 /* Define to 1 if you have the `getrusage' function. */ -#cmakedefine HAVE_GETRUSAGE @HAVE_GETRUSAGE@ +#cmakedefine HAVE_GETRUSAGE 1 /* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY @HAVE_GETTIMEOFDAY@ +#cmakedefine HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `gmtime_r' function. */ -#cmakedefine HAVE_GMTIME_R @HAVE_GMTIME_R@ +#cmakedefine HAVE_GMTIME_R 1 /* Compile with hugepage support */ -#cmakedefine HAVE_HUGEPAGES +#cmakedefine HAVE_HUGEPAGES 1 /* Define to 1 if the system has the type `intmax_t'. */ -#cmakedefine HAVE_INTMAX_T @HAVE_INTMAX_T@ +#cmakedefine HAVE_INTMAX_T 1 /* Define to 1 if the system has the type `intptr_t'. */ -#cmakedefine HAVE_INTPTR_T @HAVE_INTPTR_T@ +#cmakedefine HAVE_INTPTR_T 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_INTTYPES_H @HAVE_INTTYPES_H@ +#cmakedefine HAVE_INTTYPES_H 1 /* Define to 1 if you have the `isnan' function. */ -#cmakedefine HAVE_ISNAN @HAVE_ISNAN@ +#cmakedefine HAVE_ISNAN 1 /* Define to 1 if you have the `j0' function. */ -#cmakedefine HAVE_J0 @HAVE_J0@ +#cmakedefine HAVE_J0 1 /* Define to 1 if you have the `j1' function. */ -#cmakedefine HAVE_J1 @HAVE_J1@ +#cmakedefine HAVE_J1 1 + +/* Define if you have jemalloc memory allocation library */ +#cmakedefine HAVE_JEMALLOC 1 /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_H +#cmakedefine HAVE_LCMS2_H 1 /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_LCMS2_H +#cmakedefine HAVE_LCMS2_LCMS2_H 1 /* Define if you have the header file. */ -#cmakedefine HAVE_LIBRAW_LIBRAW_H +#cmakedefine HAVE_LIBRAW_LIBRAW_H 1 /* Define if you have the header file. */ -#cmakedefine HAVE_LIBHEIF_LIBHEIF_H +#cmakedefine HAVE_LIBHEIF_LIBHEIF_H 1 /* Define to 1 if you have the `gcov' library (-lgcov). */ -#cmakedefine HAVE_LIBGCOV @HAVE_LIBGCOV@ +#cmakedefine HAVE_LIBGCOV 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LIMITS_H @HAVE_LIMITS_H@ +#cmakedefine HAVE_LIMITS_H 1 + +/* Define if you have Linux-compatible sendfile() */ +#cmakedefine HAVE_LINUX_SENDFILE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LINUX_UNISTD_H @HAVE_LINUX_UNISTD_H@ +#cmakedefine HAVE_LINUX_UNISTD_H 1 /* Define to 1 if you have the `lltostr' function. */ -#cmakedefine HAVE_LLTOSTR @HAVE_LLTOSTR@ +#cmakedefine HAVE_LLTOSTR 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LOCALE_H @HAVE_LOCALE_H@ - -/* Define to 1 if the system has the type `locale_t'. */ -#cmakedefine HAVE_LOCALE_T @HAVE_LOCALE_T@ +#cmakedefine HAVE_LOCALE_H 1 /* Define to 1 if you have the `localtime_r' function. */ -#cmakedefine HAVE_LOCALTIME_R @HAVE_LOCALTIME_R@ +#cmakedefine HAVE_LOCALTIME_R 1 /* Define to 1 if the system has the type `long double'. */ -#cmakedefine HAVE_LONG_DOUBLE @HAVE_LONG_DOUBLE@ +#cmakedefine HAVE_LONG_DOUBLE 1 /* Define to 1 if the type `long double' works and has more range or precision than `double'. */ -#cmakedefine HAVE_LONG_DOUBLE_WIDER @HAVE_LONG_DOUBLE_WIDER@ +#cmakedefine HAVE_LONG_DOUBLE_WIDER 1 /* Define to 1 if the system has the type `long long int'. */ -#cmakedefine HAVE_LONG_LONG_INT @HAVE_LONG_LONG_INT@ +#cmakedefine HAVE_LONG_LONG_INT 1 /* Define to 1 if you have the `lstat' function. */ -#cmakedefine HAVE_LSTAT @HAVE_LSTAT@ +#cmakedefine HAVE_LSTAT 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MACHINE_PARAM_H @HAVE_MACHINE_PARAM_H@ +#cmakedefine HAVE_MACHINE_PARAM_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MACH_O_DYLD_H @HAVE_MACH_O_DYLD_H@ +#cmakedefine HAVE_MACH_O_DYLD_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MALLOC_H 1 /* Define to 1 if declares mbstate_t. */ -#cmakedefine HAVE_MBSTATE_T @HAVE_MBSTATE_T@ +#cmakedefine HAVE_MBSTATE_T 1 /* Define to 1 if you have the `memmove' function. */ -#cmakedefine HAVE_MEMMOVE @HAVE_MEMMOVE@ - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MEMORY_H @HAVE_MEMORY_H@ +#cmakedefine HAVE_MEMMOVE 1 /* Define to 1 if you have the `memset' function. */ -#cmakedefine HAVE_MEMSET @HAVE_MEMSET@ +#cmakedefine HAVE_MEMSET 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MINIX_CONFIG_H 1 + +/* Define to 1 if you have the `mkdir' function. */ +#cmakedefine HAVE_MKDIR 1 /* Define to 1 if you have the `mkstemp' function. */ -#cmakedefine HAVE_MKSTEMP @HAVE_MKSTEMP@ +#cmakedefine HAVE_MKSTEMP 1 /* Define to 1 if you have a working `mmap' system call. */ -#cmakedefine HAVE_MMAP @HAVE_MMAP@ +#cmakedefine HAVE_MMAP 1 + +/* Define if you have the mtmalloc memory allocation library */ +#cmakedefine HAVE_MTMALLOC 1 /* Define to 1 if you have the `munmap' function. */ -#cmakedefine HAVE_MUNMAP @HAVE_MUNMAP@ +#cmakedefine HAVE_MUNMAP 1 /* define if the compiler implements namespaces */ #cmakedefine HAVE_NAMESPACES @@ -332,565 +352,553 @@ #cmakedefine HAVE_NAMESPACE_STD /* Define to 1 if you have the `nanosleep' function. */ -#cmakedefine HAVE_NANOSLEEP @HAVE_NANOSLEEP@ +#cmakedefine HAVE_NANOSLEEP 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ -#cmakedefine HAVE_NDIR_H @HAVE_NDIR_H@ +#cmakedefine HAVE_NDIR_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETDB_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_NETINET_IN_H @HAVE_NETINET_IN_H@ +#cmakedefine HAVE_NETINET_IN_H 1 /* Define to 1 if you have the `newlocale' function. */ -#cmakedefine HAVE_NEWLOCALE @HAVE_NEWLOCALE@ +#cmakedefine HAVE_NEWLOCALE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENCL_CL_H @HAVE_OPENCL_CL_H@ +#cmakedefine HAVE_OPENCL_CL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OS_H @HAVE_OS_H@ +#cmakedefine HAVE_OS_H 1 /* Define to 1 if you have the `pclose' function. */ -#cmakedefine HAVE_PCLOSE @HAVE_PCLOSE@ +#cmakedefine HAVE_PCLOSE 1 /* Define to 1 if you have the `poll' function. */ -#cmakedefine HAVE_POLL @HAVE_POLL@ +#cmakedefine HAVE_POLL 1 /* Define to 1 if you have the `popen' function. */ -#cmakedefine HAVE_POPEN @HAVE_POPEN@ +#cmakedefine HAVE_POPEN 1 /* Define to 1 if you have the `posix_fadvise' function. */ -#cmakedefine HAVE_POSIX_FADVISE @HAVE_POSIX_FADVISE@ +#cmakedefine HAVE_POSIX_FADVISE 1 /* Define to 1 if you have the `posix_fallocate' function. */ -#cmakedefine HAVE_POSIX_FALLOCATE @HAVE_POSIX_FALLOCATE@ +#cmakedefine HAVE_POSIX_FALLOCATE 1 /* Define to 1 if you have the `posix_madvise' function. */ -#cmakedefine HAVE_POSIX_MADVISE @HAVE_POSIX_MADVISE@ +#cmakedefine HAVE_POSIX_MADVISE 1 /* Define to 1 if you have the `posix_memalign' function. */ -#cmakedefine HAVE_POSIX_MEMALIGN @HAVE_POSIX_MEMALIGN@ +#cmakedefine HAVE_POSIX_MEMALIGN 1 /* Define to 1 if you have the `posix_spawnp' function. */ -#cmakedefine HAVE_POSIX_SPAWNP @HAVE_POSIX_SPAWNP@ +#cmakedefine HAVE_POSIX_SPAWNP 1 /* Define to 1 if you have the `pow' function. */ -#cmakedefine HAVE_POW @HAVE_POW@ +#cmakedefine HAVE_POW 1 /* Define to 1 if you have the `pread' function. */ -#cmakedefine HAVE_PREAD @HAVE_PREAD@ +#cmakedefine HAVE_PREAD 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_PROCESS_H @HAVE_PROCESS_H@ +#cmakedefine HAVE_PROCESS_H 1 /* Define if you have POSIX threads libraries and header files. */ -#cmakedefine HAVE_PTHREAD +#cmakedefine HAVE_PTHREAD 1 /* Have PTHREAD_PRIO_INHERIT. */ -#cmakedefine HAVE_PTHREAD_PRIO_INHERIT +#cmakedefine HAVE_PTHREAD_PRIO_INHERIT 1 + +/* Define to 1 if you have the `putenv' function. */ +#cmakedefine HAVE_PUTENV 1 /* Define to 1 if you have the `pwrite' function. */ -#cmakedefine HAVE_PWRITE @HAVE_PWRITE@ +#cmakedefine HAVE_PWRITE 1 /* Define to 1 if you have the `qsort_r' function. */ -#cmakedefine HAVE_QSORT_R @HAVE_QSORT_R@ +#cmakedefine HAVE_QSORT_R 1 /* Define to 1 if you have the `raise' function. */ -#cmakedefine HAVE_RAISE @HAVE_RAISE@ +#cmakedefine HAVE_RAISE 1 /* Define to 1 if you have the `rand_r' function. */ -#cmakedefine HAVE_RAND_R @HAVE_RAND_R@ +#cmakedefine HAVE_RAND_R 1 /* Define to 1 if you have the `readlink' function. */ -#cmakedefine HAVE_READLINK @HAVE_READLINK@ +#cmakedefine HAVE_READLINK 1 /* Define to 1 if you have the `realpath' function. */ -#cmakedefine HAVE_REALPATH @HAVE_REALPATH@ +#cmakedefine HAVE_REALPATH 1 /* Define to 1 if you have the `seekdir' function. */ -#cmakedefine HAVE_SEEKDIR @HAVE_SEEKDIR@ +#cmakedefine HAVE_SEEKDIR 1 /* Define to 1 if you have the `select' function. */ -#cmakedefine HAVE_SELECT @HAVE_SELECT@ +#cmakedefine HAVE_SELECT 1 /* Define to 1 if you have the `sendfile' function. */ -#cmakedefine HAVE_SENDFILE @HAVE_SENDFILE@ +#cmakedefine HAVE_SENDFILE 1 /* Define to 1 if you have the `setlocale' function. */ -#cmakedefine HAVE_SETLOCALE @HAVE_SETLOCALE@ +#cmakedefine HAVE_SETLOCALE 1 /* Define to 1 if you have the `setvbuf' function. */ -#cmakedefine HAVE_SETVBUF @HAVE_SETVBUF@ +#cmakedefine HAVE_SETVBUF 1 /* X11 server supports shape extension */ -#cmakedefine HAVE_SHAPE +#cmakedefine HAVE_SHAPE 1 /* X11 server supports shared memory extension */ -#cmakedefine HAVE_SHARED_MEMORY +#cmakedefine HAVE_SHARED_MEMORY 1 /* Define to 1 if you have the `sigaction' function. */ -#cmakedefine HAVE_SIGACTION @HAVE_SIGACTION@ +#cmakedefine HAVE_SIGACTION 1 /* Define to 1 if you have the `sigemptyset' function. */ -#cmakedefine HAVE_SIGEMPTYSET @HAVE_SIGEMPTYSET@ +#cmakedefine HAVE_SIGEMPTYSET 1 /* Define to 1 if you have the `socket' function. */ -#cmakedefine HAVE_SOCKET @HAVE_SOCKET@ +#cmakedefine HAVE_SOCKET 1 /* Define to 1 if you have the `spawnvp' function. */ -#cmakedefine HAVE_SPAWNVP @HAVE_SPAWNVP@ +#cmakedefine HAVE_SPAWNVP 1 /* Define to 1 if you have the `sqrt' function. */ -#cmakedefine HAVE_SQRT @HAVE_SQRT@ +#cmakedefine HAVE_SQRT 1 /* Define to 1 if you have the `stat' function. */ -#cmakedefine HAVE_STAT @HAVE_STAT@ +#cmakedefine HAVE_STAT 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDARG_H @HAVE_STDARG_H@ +#cmakedefine HAVE_STDARG_H 1 /* Define to 1 if stdbool.h conforms to C99. */ -#cmakedefine HAVE_STDBOOL_H @HAVE_STDBOOL_H@ +#cmakedefine HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDDEF_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDINT_H @HAVE_STDINT_H@ +#cmakedefine HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H @HAVE_STDLIB_H@ +#cmakedefine HAVE_STDLIB_H 1 /* define if the compiler supports ISO C++ standard library */ #cmakedefine HAVE_STD_LIBS /* Define to 1 if you have the `strcasecmp' function. */ -#cmakedefine HAVE_STRCASECMP @HAVE_STRCASECMP@ +#cmakedefine HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strcasestr' function. */ +#cmakedefine HAVE_STRCASESTR 1 /* Define to 1 if you have the `strchr' function. */ -#cmakedefine HAVE_STRCHR @HAVE_STRCHR@ +#cmakedefine HAVE_STRCHR 1 /* Define to 1 if you have the `strcspn' function. */ -#cmakedefine HAVE_STRCSPN @HAVE_STRCSPN@ +#cmakedefine HAVE_STRCSPN 1 /* Define to 1 if you have the `strdup' function. */ -#cmakedefine HAVE_STRDUP @HAVE_STRDUP@ +#cmakedefine HAVE_STRDUP 1 /* Define to 1 if you have the `strerror' function. */ -#cmakedefine HAVE_STRERROR @HAVE_STRERROR@ +#cmakedefine HAVE_STRERROR 1 -/* Define to 1 if you have the `strerror_r' function. */ -#cmakedefine HAVE_STRERROR_R @HAVE_STRERROR_R@ +/* Define if you have `strerror_r'. */ +#cmakedefine HAVE_STRERROR_R 1 /* Define to 1 if cpp supports the ANSI # stringizing operator. */ -#cmakedefine HAVE_STRINGIZE @HAVE_STRINGIZE@ +#cmakedefine HAVE_STRINGIZE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRINGS_H @HAVE_STRINGS_H@ +#cmakedefine HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H @HAVE_STRING_H@ +#cmakedefine HAVE_STRING_H 1 /* Define to 1 if you have the `strlcat' function. */ -#cmakedefine HAVE_STRLCAT @HAVE_STRLCAT@ +#cmakedefine HAVE_STRLCAT 1 /* Define to 1 if you have the `strlcpy' function. */ -#cmakedefine HAVE_STRLCPY @HAVE_STRLCPY@ +#cmakedefine HAVE_STRLCPY 1 /* Define to 1 if you have the `strncasecmp' function. */ -#cmakedefine HAVE_STRNCASECMP @HAVE_STRNCASECMP@ +#cmakedefine HAVE_STRNCASECMP 1 /* Define to 1 if you have the `strpbrk' function. */ -#cmakedefine HAVE_STRPBRK @HAVE_STRPBRK@ +#cmakedefine HAVE_STRPBRK 1 /* Define to 1 if you have the `strrchr' function. */ -#cmakedefine HAVE_STRRCHR @HAVE_STRRCHR@ +#cmakedefine HAVE_STRRCHR 1 /* Define to 1 if you have the `strspn' function. */ -#cmakedefine HAVE_STRSPN @HAVE_STRSPN@ +#cmakedefine HAVE_STRSPN 1 /* Define to 1 if you have the `strstr' function. */ -#cmakedefine HAVE_STRSTR @HAVE_STRSTR@ +#cmakedefine HAVE_STRSTR 1 /* Define to 1 if you have the `strtod' function. */ -#cmakedefine HAVE_STRTOD @HAVE_STRTOD@ +#cmakedefine HAVE_STRTOD 1 /* Define to 1 if you have the `strtod_l' function. */ -#cmakedefine HAVE_STRTOD_L @HAVE_STRTOD_L@ +#cmakedefine HAVE_STRTOD_L 1 /* Define to 1 if you have the `strtol' function. */ -#cmakedefine HAVE_STRTOL @HAVE_STRTOL@ +#cmakedefine HAVE_STRTOL 1 /* Define to 1 if you have the `strtoul' function. */ -#cmakedefine HAVE_STRTOUL @HAVE_STRTOUL@ +#cmakedefine HAVE_STRTOUL 1 /* Define to 1 if `tm_zone' is a member of `struct tm'. */ -#cmakedefine HAVE_STRUCT_TM_TM_ZONE @HAVE_STRUCT_TM_TM_ZONE@ +#cmakedefine HAVE_STRUCT_TM_TM_ZONE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SUN_PREFETCH_H @HAVE_SUN_PREFETCH_H@ +#cmakedefine HAVE_SUN_PREFETCH_H 1 /* Define to 1 if you have the `symlink' function. */ -#cmakedefine HAVE_SYMLINK @HAVE_SYMLINK@ +#cmakedefine HAVE_SYMLINK 1 /* Define to 1 if you have the `sysconf' function. */ -#cmakedefine HAVE_SYSCONF @HAVE_SYSCONF@ +#cmakedefine HAVE_SYSCONF 1 + +/* Define to 1 if you have the `system' function. */ +#cmakedefine HAVE_SYSTEM 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ -#cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@ +#cmakedefine HAVE_SYS_DIR_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_IPC_H @HAVE_SYS_IPC_H@ +#cmakedefine HAVE_SYS_IPC_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_MMAN_H @HAVE_SYS_MMAN_H@ +#cmakedefine HAVE_SYS_MMAN_H 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ -#cmakedefine HAVE_SYS_NDIR_H @HAVE_SYS_NDIR_H@ +#cmakedefine HAVE_SYS_NDIR_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_PARAM_H @HAVE_SYS_PARAM_H@ +#cmakedefine HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_RESOURCE_H @HAVE_SYS_RESOURCE_H@ - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SELECT_H @HAVE_SYS_SELECT_H@ +#cmakedefine HAVE_SYS_RESOURCE_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SENDFILE_H @HAVE_SYS_SENDFILE_H@ +#cmakedefine HAVE_SYS_SENDFILE_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SOCKET_H @HAVE_SYS_SOCKET_H@ +#cmakedefine HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_STAT_H @HAVE_SYS_STAT_H@ +#cmakedefine HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SYSLIMITS_H @HAVE_SYS_SYSLIMITS_H@ - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIMEB_H @HAVE_SYS_TIMEB_H@ +#cmakedefine HAVE_SYS_SYSLIMITS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIMES_H @HAVE_SYS_TIMES_H@ +#cmakedefine HAVE_SYS_TIMES_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIME_H @HAVE_SYS_TIME_H@ +#cmakedefine HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TYPES_H @HAVE_SYS_TYPES_H@ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_UIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_WAIT_H @HAVE_SYS_WAIT_H@ +#cmakedefine HAVE_SYS_WAIT_H 1 + +/* Define if you have the tcmalloc memory allocation library */ +#cmakedefine HAVE_TCMALLOC 1 /* Define to 1 if you have the `telldir' function. */ -#cmakedefine HAVE_TELLDIR @HAVE_TELLDIR@ +#cmakedefine HAVE_TELLDIR 1 /* Define to 1 if you have the `tempnam' function. */ -#cmakedefine HAVE_TEMPNAM @HAVE_TEMPNAM@ +#cmakedefine HAVE_TEMPNAM 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_TIFFCONF_H @HAVE_TIFFCONF_H@ +#cmakedefine HAVE_TIFFCONF_H 1 /* Define to 1 if you have the `TIFFIsBigEndian' function. */ -#cmakedefine HAVE_TIFFISBIGENDIAN @HAVE_TIFFISBIGENDIAN@ +#cmakedefine HAVE_TIFFISBIGENDIAN 1 /* Define to 1 if you have the `TIFFIsCODECConfigured' function. */ -#cmakedefine HAVE_TIFFISCODECCONFIGURED @HAVE_TIFFISCODECCONFIGURED@ +#cmakedefine HAVE_TIFFISCODECCONFIGURED 1 /* Define to 1 if you have the `TIFFMergeFieldInfo' function. */ -#cmakedefine HAVE_TIFFMERGEFIELDINFO @HAVE_TIFFMERGEFIELDINFO@ +#cmakedefine HAVE_TIFFMERGEFIELDINFO 1 /* Define to 1 if you have the `TIFFReadEXIFDirectory' function. */ -#cmakedefine HAVE_TIFFREADEXIFDIRECTORY @HAVE_TIFFREADEXIFDIRECTORY@ +#cmakedefine HAVE_TIFFREADEXIFDIRECTORY 1 + +/* Define to 1 if you have the `TIFFReadGPSDirectory' function. */ +#cmakedefine HAVE_TIFFREADGPSDIRECTORY 1 /* Define to 1 if you have the `TIFFSetErrorHandlerExt' function. */ -#cmakedefine HAVE_TIFFSETERRORHANDLEREXT @HAVE_TIFFSETERRORHANDLEREXT@ +#cmakedefine HAVE_TIFFSETERRORHANDLEREXT 1 /* Define to 1 if you have the `TIFFSetTagExtender' function. */ -#cmakedefine HAVE_TIFFSETTAGEXTENDER @HAVE_TIFFSETTAGEXTENDER@ +#cmakedefine HAVE_TIFFSETTAGEXTENDER 1 /* Define to 1 if you have the `TIFFSetWarningHandlerExt' function. */ -#cmakedefine HAVE_TIFFSETWARNINGHANDLEREXT @HAVE_TIFFSETWARNINGHANDLEREXT@ +#cmakedefine HAVE_TIFFSETWARNINGHANDLEREXT 1 /* Define to 1 if you have the `TIFFSwabArrayOfTriples' function. */ -#cmakedefine HAVE_TIFFSWABARRAYOFTRIPLES @HAVE_TIFFSWABARRAYOFTRIPLES@ +#cmakedefine HAVE_TIFFSWABARRAYOFTRIPLES 1 /* Define to 1 if you have the `times' function. */ -#cmakedefine HAVE_TIMES @HAVE_TIMES@ +#cmakedefine HAVE_TIMES 1 /* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use `HAVE_STRUCT_TM_TM_ZONE' instead. */ -#cmakedefine HAVE_TM_ZONE @HAVE_TM_ZONE@ +#cmakedefine HAVE_TM_ZONE 1 /* Define to 1 if you don't have `tm_zone' but do have the external array `tzname'. */ -#cmakedefine HAVE_TZNAME @HAVE_TZNAME@ +#cmakedefine HAVE_TZNAME 1 /* Define to 1 if the system has the type `uintmax_t'. */ -#cmakedefine HAVE_UINTMAX_T @HAVE_UINTMAX_T@ +#cmakedefine HAVE_UINTMAX_T 1 /* Define to 1 if the system has the type `uintptr_t'. */ -#cmakedefine HAVE_UINTPTR_T @HAVE_UINTPTR_T@ +#cmakedefine HAVE_UINTPTR_T 1 /* Define to 1 if you have the `ulltostr' function. */ -#cmakedefine HAVE_ULLTOSTR @HAVE_ULLTOSTR@ +#cmakedefine HAVE_ULLTOSTR 1 + +/* Define if you have umem memory allocation library */ +#cmakedefine HAVE_UMEM 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H @HAVE_UNISTD_H@ +#cmakedefine HAVE_UNISTD_H 1 /* Define to 1 if the system has the type `unsigned long long int'. */ -#cmakedefine HAVE_UNSIGNED_LONG_LONG_INT @HAVE_UNSIGNED_LONG_LONG_INT@ +#cmakedefine HAVE_UNSIGNED_LONG_LONG_INT 1 /* Define to 1 if you have the `uselocale' function. */ -#cmakedefine HAVE_USELOCALE @HAVE_USELOCALE@ +#cmakedefine HAVE_USELOCALE 1 /* Define to 1 if you have the `usleep' function. */ -#cmakedefine HAVE_USLEEP @HAVE_USLEEP@ +#cmakedefine HAVE_USLEEP 1 /* Define to 1 if you have the `utime' function. */ -#cmakedefine HAVE_UTIME @HAVE_UTIME@ +#cmakedefine HAVE_UTIME 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UTIME_H @HAVE_UTIME_H@ +/* Define to 1 if you have the `utimensat' function. */ +#cmakedefine HAVE_UTIMENSAT 1 -/* Define to 1 if you have the `vfork' function. */ -#cmakedefine HAVE_VFORK @HAVE_VFORK@ - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_VFORK_H @HAVE_VFORK_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UTIME_H 1 /* Define to 1 if you have the `vfprintf' function. */ -#cmakedefine HAVE_VFPRINTF @HAVE_VFPRINTF@ +#cmakedefine HAVE_VFPRINTF 1 /* Define to 1 if you have the `vfprintf_l' function. */ -#cmakedefine HAVE_VFPRINTF_L @HAVE_VFPRINTF_L@ - -/* Define to 1 if you have the `vprintf' function. */ -#cmakedefine HAVE_VPRINTF @HAVE_VPRINTF@ +#cmakedefine HAVE_VFPRINTF_L 1 /* Define to 1 if you have the `vsnprintf' function. */ -#cmakedefine HAVE_VSNPRINTF @HAVE_VSNPRINTF@ +#cmakedefine HAVE_VSNPRINTF 1 /* Define to 1 if you have the `vsnprintf_l' function. */ -#cmakedefine HAVE_VSNPRINTF_L @HAVE_VSNPRINTF_L@ +#cmakedefine HAVE_VSNPRINTF_L 1 /* Define to 1 if you have the `vsprintf' function. */ -#cmakedefine HAVE_VSPRINTF @HAVE_VSPRINTF@ +#cmakedefine HAVE_VSPRINTF 1 /* Define to 1 if you have the `waitpid' function. */ -#cmakedefine HAVE_WAITPID @HAVE_WAITPID@ +#cmakedefine HAVE_WAITPID 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_WCHAR_H @HAVE_WCHAR_H@ +#cmakedefine HAVE_WCHAR_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_WINDOWS_H @HAVE_WINDOWS_H@ - -/* Define to 1 if `fork' works. */ -#cmakedefine HAVE_WORKING_FORK @HAVE_WORKING_FORK@ - -/* Define to 1 if `vfork' works. */ -#cmakedefine HAVE_WORKING_VFORK @HAVE_WORKING_VFORK@ +#cmakedefine HAVE_WINDOWS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_XLOCALE_H @HAVE_XLOCALE_H@ +#cmakedefine HAVE_XLOCALE_H 1 /* Define to 1 if you have the `_aligned_malloc' function. */ -#cmakedefine HAVE__ALIGNED_MALLOC @HAVE__ALIGNED_MALLOC@ +#cmakedefine HAVE__ALIGNED_MALLOC 1 /* Define to 1 if the system has the type `_Bool'. */ -#cmakedefine HAVE__BOOL @HAVE__BOOL@ +#cmakedefine HAVE__BOOL 1 /* Define to 1 if you have the `_exit' function. */ -#cmakedefine HAVE__EXIT @HAVE__EXIT@ +#cmakedefine HAVE__EXIT 1 /* Define to 1 if you have the `_NSGetExecutablePath' function. */ -#cmakedefine HAVE__NSGETEXECUTABLEPATH @HAVE__NSGETEXECUTABLEPATH@ +#cmakedefine HAVE__NSGETEXECUTABLEPATH 1 /* Define to 1 if you have the `_pclose' function. */ -#cmakedefine HAVE__PCLOSE @HAVE__PCLOSE@ +#cmakedefine HAVE__PCLOSE 1 /* Define to 1 if you have the `_popen' function. */ -#cmakedefine HAVE__POPEN @HAVE__POPEN@ +#cmakedefine HAVE__POPEN 1 /* Define to 1 if you have the `_wfopen' function. */ -#cmakedefine HAVE__WFOPEN @HAVE__WFOPEN@ +#cmakedefine HAVE__WFOPEN 1 /* Define to 1 if you have the `_wstat' function. */ -#cmakedefine HAVE__WSTAT @HAVE__WSTAT@ +#cmakedefine HAVE__WSTAT 1 /* define if your compiler has __attribute__ */ -#cmakedefine HAVE___ATTRIBUTE__ - -/* Whether hdri is enabled or not */ -#cmakedefine HDRI_ENABLE_OBSOLETE_IN_H +#cmakedefine HAVE___ATTRIBUTE__ 1 /* Define if you have libheif library */ -#cmakedefine HEIC_DELEGATE - -/* Define if you have jemalloc memory allocation library */ -#cmakedefine HasJEMALLOC - -/* Define if you have umem memory allocation library */ -#cmakedefine HasUMEM +#cmakedefine HEIC_DELEGATE 1 /* Directory where ImageMagick architecture headers live. */ -#cmakedefine INCLUDEARCH_PATH @INCLUDEARCH_PATH@ +#cmakedefine INCLUDEARCH_PATH "@INCLUDEARCH_PATH@" /* Directory where ImageMagick headers live. */ -#cmakedefine INCLUDE_PATH @INCLUDE_PATH +#cmakedefine INCLUDE_PATH "@INCLUDE_PATH@" /* ImageMagick is formally installed under prefix */ -#cmakedefine INSTALLED_SUPPORT +#cmakedefine INSTALLED_SUPPORT 1 /* Define if you have JBIG library */ -#cmakedefine JBIG_DELEGATE +#cmakedefine JBIG_DELEGATE 1 /* Define if you have JPEG library */ -#cmakedefine JPEG_DELEGATE +#cmakedefine JPEG_DELEGATE 1 /* Define if you have JXL library */ -#cmakedefine JXL_DELEGATE +#cmakedefine JXL_DELEGATE 1 /* Define if you have LCMS library */ -#cmakedefine LCMS_DELEGATE +#cmakedefine LCMS_DELEGATE 1 /* Define if you have OPENJP2 library */ -#cmakedefine LIBOPENJP2_DELEGATE +#cmakedefine LIBOPENJP2_DELEGATE 1 /* Directory where architecture-dependent files live. */ -#cmakedefine LIBRARY_PATH @LIBRARY_PATH@ +#cmakedefine LIBRARY_PATH "@LIBRARY_PATH@" /* Subdirectory of lib where ImageMagick architecture dependent files are installed. */ -#cmakedefine LIBRARY_RELATIVE_PATH @LIBRARY_RELATIVE_PATH@ +#cmakedefine LIBRARY_RELATIVE_PATH "@LIBRARY_RELATIVE_PATH@" /* Binaries in libraries path base name (will be during install linked to bin) */ -#cmakedefine LIB_BIN_BASEDIRNAME @LIB_BIN_BASEDIRNAME@ +#cmakedefine LIB_BIN_BASEDIRNAME "@LIB_BIN_BASEDIRNAME@" /* Define if you have LQR library */ -#cmakedefine LQR_DELEGATE +#cmakedefine LQR_DELEGATE 1 /* Define if using libltdl to support dynamically loadable modules and OpenCL */ -#cmakedefine LTDL_DELEGATE +#cmakedefine LTDL_DELEGATE 1 /* Native module suffix */ -#cmakedefine LTDL_MODULE_EXT @LTDL_MODULE_EXT@ +#cmakedefine LTDL_MODULE_EXT "@LTDL_MODULE_EXT@" /* Define to the sub-directory where libtool stores uninstalled libraries. */ -#cmakedefine LT_OBJDIR @LT_OBJDIR@ +#cmakedefine LT_OBJDIR "@LT_OBJDIR@" /* Define if you have LZMA library */ -#cmakedefine LZMA_DELEGATE +#cmakedefine LZMA_DELEGATE 1 /* Define to prepend to default font search path. */ -#cmakedefine MAGICK_FONT_PATH @MAGICK_FONT_PATH@ +#cmakedefine MAGICK_FONT_PATH "@MAGICK_FONT_PATH@" /* Target Host CPU */ -#cmakedefine MAGICK_TARGET_CPU @MAGICK_TARGET_CPU@ +#cmakedefine MAGICK_TARGET_CPU "@MAGICK_TARGET_CPU@" /* Target Host OS */ -#cmakedefine MAGICK_TARGET_OS @MAGICK_TARGET_OS@ +#cmakedefine MAGICK_TARGET_OS "@MAGICK_TARGET_OS@" /* Target Host Vendor */ -#cmakedefine MAGICK_TARGET_VENDOR @MAGICK_TARGET_VENDOR@ +#cmakedefine MAGICK_TARGET_VENDOR "@MAGICK_TARGET_VENDOR@" /* Module directory name without ABI part. */ -#cmakedefine MODULES_BASEDIRNAME @MODULES_BASEDIRNAME@ +#cmakedefine MODULES_BASEDIRNAME "@MODULES_BASEDIRNAME@" /* Module directory dirname */ -#cmakedefine MODULES_DIRNAME @MODULES_DIRNAME@ +#cmakedefine MODULES_DIRNAME "@MODULES_DIRNAME@" /* Magick API method prefix */ -#cmakedefine NAMESPACE_PREFIX @NAMESPACE_PREFIX@ +#cmakedefine NAMESPACE_PREFIX "@NAMESPACE_PREFIX@" /* Magick API method prefix tag */ -#cmakedefine NAMESPACE_PREFIX_TAG @NAMESPACE_PREFIX_TAG@ +#cmakedefine NAMESPACE_PREFIX_TAG "@NAMESPACE_PREFIX_TAG@" /* Define if you have OPENEXR library */ -#cmakedefine OPENEXR_DELEGATE +#cmakedefine OPENEXR_DELEGATE 1 /* Name of package */ -#cmakedefine PACKAGE @PACKAGE@ +#cmakedefine PACKAGE "@PACKAGE@" /* Define to the address where bug reports for this package should be sent. */ -#cmakedefine PACKAGE_BUGREPORT @PACKAGE_BUGREPORT@ +#cmakedefine PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" /* Define to the full name of this package. */ -#cmakedefine PACKAGE_NAME @PACKAGE_NAME@ +#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" /* Define to the full name and version of this package. */ -#cmakedefine PACKAGE_STRING @PACKAGE_STRING@ +#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" /* Define to the one symbol short name of this package. */ -#cmakedefine PACKAGE_TARNAME @PACKAGE_TARNAME@ +#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" /* Define to the home page for this package. */ -#cmakedefine PACKAGE_URL @PACKAGE_URL@ +#cmakedefine PACKAGE_URL "@PACKAGE_URL@" /* Define to the version of this package. */ -#cmakedefine PACKAGE_VERSION @PACKAGE_VERSION@ +#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" /* Define if you have PANGOCAIRO library */ -#cmakedefine PANGOCAIRO_DELEGATE +#cmakedefine PANGOCAIRO_DELEGATE 1 /* Define if you have PANGO library */ -#cmakedefine PANGO_DELEGATE +#cmakedefine PANGO_DELEGATE 1 /* enable pipes (|) in filenames */ -#cmakedefine PIPES_SUPPORT +#cmakedefine PIPES_SUPPORT 1 /* Define if you have PNG library */ -#cmakedefine PNG_DELEGATE +#cmakedefine PNG_DELEGATE 1 /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #cmakedefine PTHREAD_CREATE_JOINABLE @PTHREAD_CREATE_JOINABLE@ -/* Pixel cache threshold in MB (defaults to available memory) */ +/* Pixel cache memory threshold in MB (defaults to available memory) */ #cmakedefine PixelCacheThreshold @PixelCacheThreshold@ /* Number of bits in a pixel Quantum (8/16/32/64) */ #cmakedefine QUANTUM_DEPTH_OBSOLETE_IN_H @QUANTUM_DEPTH_OBSOLETE_IN_H@ /* Define if you have RAQM library */ -#cmakedefine RAQM_DELEGATE @RAQM_DELEGATE@ +#cmakedefine RAQM_DELEGATE 1 /* Define if you have LIBRAW library */ -#cmakedefine RAW_R_DELEGATE @RAW_R_DELEGATE@ - -/* Define as the return type of signal handlers (`int' or `void'). */ -#cmakedefine RETSIGTYPE @RETSIGTYPE@ +#cmakedefine RAW_R_DELEGATE 1 /* Define if you have RSVG library */ -#cmakedefine RSVG_DELEGATE - -/* Define to the type of arg 1 for `select'. */ -#cmakedefine SELECT_TYPE_ARG1 @SELECT_TYPE_ARG1@ - -/* Define to the type of args 2, 3 and 4 for `select'. */ -#cmakedefine SELECT_TYPE_ARG234 @SELECT_TYPE_ARG234@ - -/* Define to the type of arg 5 for `select'. */ -#cmakedefine SELECT_TYPE_ARG5 @SELECT_TYPE_ARG5@ +#cmakedefine RSVG_DELEGATE 1 /* Setjmp/longjmp are thread safe */ -#cmakedefine SETJMP_IS_THREAD_SAFE +#cmakedefine SETJMP_IS_THREAD_SAFE 1 /* Sharearch directory name without ABI part. */ -#cmakedefine SHAREARCH_BASEDIRNAME @SHAREARCH_BASEDIRNAME@ +#cmakedefine SHAREARCH_BASEDIRNAME "@SHAREARCH_BASEDIRNAME@" /* Sharearch directory dirname */ -#cmakedefine SHAREARCH_DIRNAME @SHAREARCH_DIRNAME@ +#cmakedefine SHAREARCH_DIRNAME "@SHAREARCH_DIRNAME@" /* Directory where architecture-independent configuration files live. */ -#cmakedefine SHARE_PATH @SHARE_PATH@ +#cmakedefine SHARE_PATH "@SHARE_PATH@" /* Subdirectory of lib where architecture-independent configuration files live. */ -#cmakedefine SHARE_RELATIVE_PATH @SHARE_RELATIVE_PATH@ +#cmakedefine SHARE_RELATIVE_PATH "@SHARE_RELATIVE_PATH@" /* The size of `double', as computed by sizeof. */ #cmakedefine SIZEOF_DOUBLE @SIZEOF_DOUBLE@ @@ -947,65 +955,130 @@ #cmakedefine SIZEOF_UNSIGNED_SHORT @SIZEOF_UNSIGNED_SHORT@ /* Define to 1 if the `S_IS*' macros in do not work properly. */ -#cmakedefine STAT_MACROS_BROKEN @STAT_MACROS_BROKEN@ +#cmakedefine STAT_MACROS_BROKEN 1 -/* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS @STDC_HEADERS@ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#cmakedefine STDC_HEADERS 1 /* Define to 1 if strerror_r returns char *. */ -#cmakedefine STRERROR_R_CHAR_P @STRERROR_R_CHAR_P@ +#cmakedefine STRERROR_R_CHAR_P 1 /* Define if you have POSIX threads libraries and header files. */ -#cmakedefine THREAD_SUPPORT +#cmakedefine THREAD_SUPPORT 1 /* Define if you have TIFF library */ -#cmakedefine TIFF_DELEGATE - -/* Define to 1 if you can safely include both and . */ -#cmakedefine TIME_WITH_SYS_TIME @TIME_WITH_SYS_TIME@ +#cmakedefine TIFF_DELEGATE 1 /* Define to 1 if your declares `struct tm'. */ -#cmakedefine TM_IN_SYS_TIME @TM_IN_SYS_TIME@ +#cmakedefine TM_IN_SYS_TIME 1 /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE -#cmakedefine _ALL_SOURCE +#cmakedefine _ALL_SOURCE 1 +#endif +/* Enable general extensions on macOS. */ +#ifndef _DARWIN_C_SOURCE +#cmakedefine _DARWIN_C_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +#cmakedefine __EXTENSIONS__ 1 #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE -#cmakedefine _GNU_SOURCE +#cmakedefine _GNU_SOURCE 1 +#endif +/* Enable X/Open compliant socket functions that do not require linking + with -lxnet on HP-UX 11.11. */ +#ifndef _HPUX_ALT_XOPEN_SOCKET_API +#cmakedefine _HPUX_ALT_XOPEN_SOCKET_API 1 +#endif +/* Identify the host operating system as Minix. + This macro does not affect the system headers' behavior. + A future release of Autoconf may stop defining this macro. */ +#ifndef _MINIX +#cmakedefine _MINIX 1 +#endif +/* Enable general extensions on NetBSD. + Enable NetBSD compatibility extensions on Minix. */ +#ifndef _NETBSD_SOURCE +#cmakedefine _NETBSD_SOURCE 1 +#endif +/* Enable OpenBSD compatibility extensions on NetBSD. + Oddly enough, this does nothing on OpenBSD. */ +#ifndef _OPENBSD_SOURCE +#cmakedefine _OPENBSD_SOURCE 1 +#endif +/* Define to 1 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_SOURCE +#cmakedefine _POSIX_SOURCE 1 #endif -/* Enable threading extensions on Solaris. */ +/* Define to 2 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_1_SOURCE +#cmakedefine _POSIX_1_SOURCE 1 +#endif +/* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS -#cmakedefine _POSIX_PTHREAD_SEMANTICS +#cmakedefine _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ +#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +#cmakedefine __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +#cmakedefine __STDC_WANT_IEC_60559_BFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ +#ifndef __STDC_WANT_IEC_60559_DFP_EXT__ +#cmakedefine __STDC_WANT_IEC_60559_DFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ +#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ +#cmakedefine __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +#cmakedefine __STDC_WANT_IEC_60559_TYPES_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ +#ifndef __STDC_WANT_LIB_EXT2__ +#cmakedefine __STDC_WANT_LIB_EXT2__ 1 +#endif +/* Enable extensions specified by ISO/IEC 24747:2009. */ +#ifndef __STDC_WANT_MATH_SPEC_FUNCS__ +#cmakedefine __STDC_WANT_MATH_SPEC_FUNCS__ 1 #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE -#cmakedefine _TANDEM_SOURCE +#cmakedefine _TANDEM_SOURCE 1 #endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -#cmakedefine __EXTENSIONS__ +/* Enable X/Open extensions. Define to 500 only if necessary + to make mbstate_t available. */ +#ifndef _XOPEN_SOURCE +#cmakedefine _XOPEN_SOURCE 1 #endif /* Version number of package */ -#cmakedefine VERSION @VERSION@ +#cmakedefine VERSION "@VERSION@" /* Define if you have WEBPMUX library */ -#cmakedefine WEBPMUX_DELEGATE +#cmakedefine WEBPMUX_DELEGATE 1 /* Define if you have WEBP library */ -#cmakedefine WEBP_DELEGATE +#cmakedefine WEBP_DELEGATE 1 /* Define to use the Windows GDI32 library */ -#cmakedefine WINGDI32_DELEGATE +#cmakedefine WINGDI32_DELEGATE 1 /* Define if using the dmalloc debugging malloc package */ -#cmakedefine WITH_DMALLOC +#cmakedefine WITH_DMALLOC 1 /* Define if you have WMF library */ -#cmakedefine WMF_DELEGATE +#cmakedefine WMF_DELEGATE 1 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ @@ -1015,82 +1088,71 @@ # endif #else # ifndef WORDS_BIGENDIAN -#cmakedefine WORDS_BIGENDIAN +#cmakedefine WORDS_BIGENDIAN 1 # endif #endif /* Location of X11 configure files */ -#cmakedefine X11_CONFIGURE_PATH @X11_CONFIGURE_PATH@ +#cmakedefine X11_CONFIGURE_PATH "@X11_CONFIGURE_PATH@" /* Define if you have X11 library */ -#cmakedefine X11_DELEGATE +#cmakedefine X11_DELEGATE 1 /* Define if you have XML library */ -#cmakedefine XML_DELEGATE +#cmakedefine XML_DELEGATE 1 /* Define to 1 if the X Window System is missing or not being used. */ -#cmakedefine X_DISPLAY_MISSING @X_DISPLAY_MISSING@ +#cmakedefine X_DISPLAY_MISSING 1 /* Build self-contained, embeddable, zero-configuration ImageMagick */ -#cmakedefine01 ZERO_CONFIGURATION_SUPPORT +#cmakedefine ZERO_CONFIGURATION_SUPPORT 1 + +/* Define if you have ZIP library */ +#cmakedefine ZIP_DELEGATE 1 /* Define if you have ZLIB library */ -#cmakedefine ZLIB_DELEGATE +#cmakedefine ZLIB_DELEGATE 1 /* Define if you have ZSTD library */ -#cmakedefine ZSTD_DELEGATE - -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif +#cmakedefine ZSTD_DELEGATE 1 /* Number of bits in a file offset, on hosts where this is settable. */ #cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ /* enable run-time bounds-checking */ -#cmakedefine _FORTIFY_SOURCE +#cmakedefine _FORTIFY_SOURCE 1 /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ -#cmakedefine _LARGEFILE_SOURCE @_LARGEFILE_SOURCE@ +#cmakedefine _LARGEFILE_SOURCE 1 /* Define for large files, on AIX-style hosts. */ -#cmakedefine _LARGE_FILES - -/* Define to 1 if on MINIX. */ -#cmakedefine _MINIX @_MINIX@ +#cmakedefine _LARGE_FILES 1 /* Define this for the OpenCL Accelerator */ -#cmakedefine _OPENCL - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -#cmakedefine _POSIX_1_SOURCE @_POSIX_1_SOURCE@ - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -#cmakedefine _POSIX_SOURCE @_POSIX_SOURCE@ +#cmakedefine _OPENCL 1 /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ -#cmakedefine _UINT32_T @_UINT32_T@ +#cmakedefine _UINT32_T 1 /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ -#cmakedefine _UINT64_T @_UINT64_T@ +#cmakedefine _UINT64_T 1 /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ -#cmakedefine _UINT8_T @_UINT8_T@ +#cmakedefine _UINT8_T 1 -/* Define to 1 if type `char' is unsigned and you are not using gcc. */ +/* Define to 1 if type `char' is unsigned and your compiler does not + predefine this macro. */ #ifndef __CHAR_UNSIGNED__ -#cmakedefine __CHAR_UNSIGNED__ +#cmakedefine __CHAR_UNSIGNED__ 1 #endif -/* Define to appropriate substitue if compiler does not have __func__ */ +/* Define to appropriate substitute if compiler does not have __func__ */ #cmakedefine __func__ @__func__@ /* Define to empty if `const' does not conform to ANSI C. */ @@ -1102,7 +1164,7 @@ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus -#define inline @inline@ +#cmakedefine inline @inline@ #endif /* Define to the type of a signed integer type of width exactly 16 bits if @@ -1138,19 +1200,20 @@ /* Define to `long int' if does not define. */ #cmakedefine off_t @off_t@ -/* Define to `int' if does not define. */ +/* Define as a signed integer type capable of holding a process identifier. */ #cmakedefine pid_t @pid_t@ /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is - supported directly. */ + supported only directly. */ #cmakedefine restrict @restrict@ -/* Work around a bug in Sun C++: it does not support _Restrict or - __restrict__, even though the corresponding Sun C compiler ends up with - "#define restrict _Restrict" or "#define restrict __restrict__" in the - previous line. Perhaps some future version of Sun C++ will work with - restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ -#if defined __SUNPRO_CC && !defined __RESTRICT +/* Work around a bug in older versions of Sun C++, which did not + #define __restrict__ or support _Restrict or __restrict__ + even though the corresponding Sun C compiler ended up with + "#define restrict _Restrict" or "#define restrict __restrict__" + in the previous line. This workaround can be removed once + we assume Oracle Developer Studio 12.5 (2016) or later. */ +#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif @@ -1188,9 +1251,6 @@ pointer, if such a type exists, and if the system does not define it. */ #cmakedefine uintptr_t @uintptr_t@ -/* Define as `fork' if `vfork' does not work. */ -#cmakedefine vfork @vfork@ - /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ -#define volatile @volatile@ +#cmakedefine volatile @volatile@ diff --git a/config/delegates.xml.in b/config/delegates.xml.in index ed6a468e385..a7ee6211f06 100644 --- a/config/delegates.xml.in +++ b/config/delegates.xml.in @@ -63,7 +63,7 @@ - + diff --git a/config/mime.xml b/config/mime.xml index 7ca371622fa..ff1b83b90b4 100644 --- a/config/mime.xml +++ b/config/mime.xml @@ -763,6 +763,8 @@ + + @@ -777,7 +779,9 @@ - + + + diff --git a/configure b/configure index 222be2ddaa3..3789a9d1605 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for ImageMagick 7.1.1-23. +# Generated by GNU Autoconf 2.71 for ImageMagick 7.1.1-26. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ImageMagick' PACKAGE_TARNAME='ImageMagick' -PACKAGE_VERSION='7.1.1-23' -PACKAGE_STRING='ImageMagick 7.1.1-23' +PACKAGE_VERSION='7.1.1-26' +PACKAGE_STRING='ImageMagick 7.1.1-26' PACKAGE_BUGREPORT='https://github.com/ImageMagick/ImageMagick/issues' PACKAGE_URL='https://imagemagick.org' @@ -1915,7 +1915,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ImageMagick 7.1.1-23 to adapt to many kinds of systems. +\`configure' configures ImageMagick 7.1.1-26 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1991,7 +1991,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ImageMagick 7.1.1-23:";; + short | recursive ) echo "Configuration of ImageMagick 7.1.1-26:";; esac cat <<\_ACEOF @@ -2312,7 +2312,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ImageMagick configure 7.1.1-23 +ImageMagick configure 7.1.1-26 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -3263,7 +3263,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ImageMagick $as_me 7.1.1-23, which was +It was created by ImageMagick $as_me 7.1.1-26, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -4879,7 +4879,7 @@ fi # Define the identity of the package. PACKAGE='ImageMagick' - VERSION='7.1.1-23' + VERSION='7.1.1-26' # Some tools Automake needs. @@ -5183,11 +5183,11 @@ MAGICK_MINOR_VERSION=1 MAGICK_MICRO_VERSION=1 -MAGICK_PATCHLEVEL_VERSION=23 +MAGICK_PATCHLEVEL_VERSION=26 -MAGICK_VERSION=7.1.1-23 +MAGICK_VERSION=7.1.1-26 -MAGICK_GIT_REVISION=b135bacc6:20231210 +MAGICK_GIT_REVISION=98e7513a5:20231230 # Substitute library versioning @@ -5209,19 +5209,19 @@ MAGICKPP_LIBRARY_VERSION_INFO=$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISI PACKAGE_BASE_VERSION=7.1.1 -PACKAGE_PATCHLEVEL_VERSION=23 +PACKAGE_PATCHLEVEL_VERSION=26 if test "y" = 'y'; then - PACKAGE_VERSION_ADDENDUM='-23 (Beta)' + PACKAGE_VERSION_ADDENDUM='-26 (Beta)' else - PACKAGE_VERSION_ADDENDUM=-23 + PACKAGE_VERSION_ADDENDUM=-26 fi PACKAGE_LIB_VERSION=0x711 -PACKAGE_LIB_VERSION_NUMBER=7,1,1,23 +PACKAGE_LIB_VERSION_NUMBER=7,1,1,26 -PACKAGE_RELEASE_DATE=2023-12-10 +PACKAGE_RELEASE_DATE=2023-12-30 # Ensure that make can run correctly @@ -10644,7 +10644,7 @@ then : fi -# The presence of a feature test macro requesting reentrant function +# The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled @@ -11905,7 +11905,8 @@ else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - main () { + #include + int main () { exit(!(sizeof(off_t) == 8)); } int @@ -11932,6 +11933,9 @@ fi ;; *) + if test "$ac_cv_sys_file_offset_bits" = ''; then + ac_cv_sys_file_offset_bits=64; + fi LFS_CPPFLAGS="$LFS_CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" ;; esac @@ -23784,53 +23788,6 @@ if test "$with_libstdc" != ''; then fi -# Does gcc required -traditional? -if test $ac_cv_c_compiler_gnu = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 -printf %s "checking whether $CC needs -traditional... " >&6; } -if test ${ac_cv_prog_gcc_traditional+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_pattern="Autoconf.*'x'" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -Autoconf TIOCGETP -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1 -then : - ac_cv_prog_gcc_traditional=yes -else $as_nop - ac_cv_prog_gcc_traditional=no -fi -rm -rf conftest* - - - if test $ac_cv_prog_gcc_traditional = no; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -Autoconf TCGETA -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1 -then : - ac_cv_prog_gcc_traditional=yes -fi -rm -rf conftest* - - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 -printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; } - if test $ac_cv_prog_gcc_traditional = yes; then - CC="$CC -traditional" - fi -fi - - ######## # # Set defines required to build DLLs and modules using MinGW @@ -34925,9 +34882,9 @@ GVCDecodeDelegateDefault='dot' DVIDecodeDelegateDefault='dvips' EditorDelegateDefault='xterm' ConvertDelegateDefault=`echo magick | sed ${configure_transform_name}` -DisplayDelegateDefault=`echo magick display | sed ${configure_transform_name}` +DisplayDelegateDefault=`echo magick | sed ${configure_transform_name}` Fig2devDelegateDefault='fig2dev' -MogrifyDelegateDefault=`echo magick mogrify | sed ${configure_transform_name}` +MogrifyDelegateDefault=`echo magick | sed ${configure_transform_name}` HPGLDecodeDelegateDefault='hp2xx' HTMLDecodeDelegateDefault='html2ps' ILBMDecodeDelegateDefault='ilbmtoppm' @@ -38936,7 +38893,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ImageMagick $as_me 7.1.1-23, which was +This file was extended by ImageMagick $as_me 7.1.1-26, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -39005,7 +38962,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -ImageMagick config.status 7.1.1-23 +ImageMagick config.status 7.1.1-26 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index b19a087a851..99aa9c21af3 100644 --- a/configure.ac +++ b/configure.ac @@ -503,7 +503,8 @@ if test "$enable_largefile" != no; then unknown) AC_MSG_CHECKING([for native large file support]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include - main () { + #include + int main () { exit(!(sizeof(off_t) == 8)); }])], [ac_cv_sys_file_offset_bits=64; AC_DEFINE(_FILE_OFFSET_BITS,64) @@ -511,6 +512,9 @@ if test "$enable_largefile" != no; then [AC_MSG_RESULT([no])]) ;; *) + if test "$ac_cv_sys_file_offset_bits" = ''; then + ac_cv_sys_file_offset_bits=64; + fi LFS_CPPFLAGS="$LFS_CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" ;; esac @@ -929,9 +933,6 @@ if test "$with_libstdc" != ''; then fi AC_SUBST([LIBSTDCLDFLAGS]) -# Does gcc required -traditional? -AC_PROG_GCC_TRADITIONAL - ######## # # Set defines required to build DLLs and modules using MinGW @@ -3242,9 +3243,9 @@ GVCDecodeDelegateDefault='dot' DVIDecodeDelegateDefault='dvips' EditorDelegateDefault='xterm' ConvertDelegateDefault=`echo magick | sed ${configure_transform_name}` -DisplayDelegateDefault=`echo magick display | sed ${configure_transform_name}` +DisplayDelegateDefault=`echo magick | sed ${configure_transform_name}` Fig2devDelegateDefault='fig2dev' -MogrifyDelegateDefault=`echo magick mogrify | sed ${configure_transform_name}` +MogrifyDelegateDefault=`echo magick | sed ${configure_transform_name}` HPGLDecodeDelegateDefault='hp2xx' HTMLDecodeDelegateDefault='html2ps' ILBMDecodeDelegateDefault='ilbmtoppm' diff --git a/m4/Makefile.am b/m4/Makefile.am index 735d4fd1b5b..f70619ddcfd 100644 --- a/m4/Makefile.am +++ b/m4/Makefile.am @@ -15,7 +15,6 @@ # Makefile for building ImageMagick m4 macros. M4_EXTRA_DIST = \ - ac_func_fseeko.m4 \ ax_append_flag.m4 \ ax_c___attribute__.m4 \ ax_cflags_warn_all.m4 \ diff --git a/m4/ac_func_fseeko.m4 b/m4/ac_func_fseeko.m4 deleted file mode 100644 index eaeabb978b4..00000000000 --- a/m4/ac_func_fseeko.m4 +++ /dev/null @@ -1,72 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- -# Checking for functions. -# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software -# Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception, the Free Software Foundation gives unlimited -# permission to copy, distribute and modify the configure scripts that -# are the output of Autoconf. You need not follow the terms of the GNU -# General Public License when using or distributing such scripts, even -# though portions of the text of Autoconf appear in them. The GNU -# General Public License (GPL) does govern all other use of the material -# that constitutes the Autoconf program. -# -# Certain portions of the Autoconf source text are designed to be copied -# (in certain cases, depending on the input) into the output of -# Autoconf. We call these the "data" portions. The rest of the Autoconf -# source text consists of comments plus executable code that decides which -# of the data portions to output in any given case. We call these -# comments and executable code the "non-data" portions. Autoconf never -# copies any of the non-data portions into its output. -# -# This special exception to the GPL applies to versions of Autoconf -# released by the Free Software Foundation. When you make and -# distribute a modified version of Autoconf, you may extend this special -# exception to the GPL to apply to your modified version as well, *unless* -# your modified version has the potential to copy into its output some -# of the text that was the non-data portion of the version that you started -# with. (In other words, unless your change moves or copies text from -# the non-data portions to the data portions.) If your modification has -# such potential, you must delete any notice of this special exception -# to the GPL from your modified version. -# -# Written by David MacKenzie, with help from -# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, -# Roland McGrath, Noah Friedman, david d zuhn, and many others. - -# AC_FUNC_FSEEKO -# -------------- -AN_FUNCTION([ftello], [AC_FUNC_FSEEKO]) -AN_FUNCTION([fseeko], [AC_FUNC_FSEEKO]) -AC_DEFUN([AC_FUNC_FSEEKO], -[_AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1, - [ac_cv_sys_largefile_source], - [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).], - [[#include /* for off_t */ - #include ]], - [[int (*fp) (FILE *, off_t, int) = fseeko; - return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);]]) - -# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug -# in glibc 2.1.3, but that breaks too many other things. -# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. -if test $ac_cv_sys_largefile_source != unknown; then - AC_DEFINE(HAVE_FSEEKO, 1, - [Define to 1 if fseeko (and presumably ftello) exists and is declared.]) -fi -])# AC_FUNC_FSEEKO diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 index 39a7a5ed4b9..9f35d139149 100644 --- a/m4/ax_pthread.m4 +++ b/m4/ax_pthread.m4 @@ -244,7 +244,7 @@ AS_IF([test "x$ax_pthread_clang" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread"]) -# The presence of a feature test macro requesting reentrant function +# The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled diff --git a/m4/version.m4 b/m4/version.m4 index 7c9f29718a9..6a6b627c097 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -27,8 +27,8 @@ m4_define([magick_name], [ImageMagick]) m4_define([magick_major_version], [7]) m4_define([magick_minor_version], [1]) m4_define([magick_micro_version], [1]) -m4_define([magick_patchlevel_version], [23]) -m4_define([magick_is_beta], [n]) +m4_define([magick_patchlevel_version], [26]) +m4_define([magick_is_beta], [y]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) m4_define([magick_url], [https://imagemagick.org]) diff --git a/Magick++/fuzz/build.sh b/oss-fuzz/build.sh old mode 100755 new mode 100644 similarity index 81% rename from Magick++/fuzz/build.sh rename to oss-fuzz/build.sh index a841eca4efc..fb22e18027b --- a/Magick++/fuzz/build.sh +++ b/oss-fuzz/build.sh @@ -3,8 +3,8 @@ MAGICK_COMPILER=$CXX MAGICK_COMPILER_FLAGS=$CXXFLAGS MAGICK_INCLUDE="$WORK/include/ImageMagick-7" -MAGICK_SRC="$SRC/imagemagick/Magick++/fuzz" -MAGICK_LIBS_NO_FUZZ="$WORK/lib/libMagick++-7.Q16HDRI.a $WORK/lib/libMagickWand-7.Q16HDRI.a $WORK/lib/libMagickCore-7.Q16HDRI.a $WORK/lib/libpng.a $WORK/lib/libtiff.a $WORK/lib/libheif.a $WORK/lib/libde265.a $WORK/lib/libopenjp2.a $WORK/lib/libwebp.a $WORK/lib/libwebpmux.a $WORK/lib/libwebpdemux.a $WORK/lib/libsharpyuv.a $WORK/lib/libhwy.a $WORK/lib/libbrotlicommon.a $WORK/lib/libbrotlidec.a $WORK/lib/libbrotlienc.a $WORK/lib/libjxl_threads.a $WORK/lib/libjxl.a $WORK/lib/libturbojpeg.a $WORK/lib/libjpeg.a $WORK/lib/libfreetype.a $WORK/lib/libraw.a $WORK/lib/liblzma.a $WORK/lib/liblcms2.a $WORK/lib/libz.a" +MAGICK_SRC="$SRC/imagemagick/oss-fuzz" +MAGICK_LIBS_NO_FUZZ="$WORK/lib/libMagick++-7.Q16HDRI.a $WORK/lib/libMagickWand-7.Q16HDRI.a $WORK/lib/libMagickCore-7.Q16HDRI.a $WORK/lib/libpng.a $WORK/lib/libtiff.a $WORK/lib/libheif.a $WORK/lib/libde265.a $WORK/lib/libopenjp2.a $WORK/lib/libwebp.a $WORK/lib/libwebpmux.a $WORK/lib/libwebpdemux.a $WORK/lib/libsharpyuv.a $WORK/lib/libhwy.a $WORK/lib/libbrotlicommon.a $WORK/lib/libbrotlidec.a $WORK/lib/libbrotlienc.a $WORK/lib/libjxl_threads.a $WORK/lib/libjxl_cms.a $WORK/lib/libjxl.a $WORK/lib/libturbojpeg.a $WORK/lib/libjpeg.a $WORK/lib/libfreetype.a $WORK/lib/libraw.a $WORK/lib/liblzma.a $WORK/lib/liblcms2.a $WORK/lib/libdeflate.a $WORK/lib/libz.a" MAGICK_LIBS="$LIB_FUZZING_ENGINE $MAGICK_LIBS_NO_FUZZ" MAGICK_OUTPUT=$OUT MAGICK_FAST_BUILD=0 diff --git a/Magick++/fuzz/build_dependencies.sh b/oss-fuzz/build_dependencies.sh old mode 100755 new mode 100644 similarity index 75% rename from Magick++/fuzz/build_dependencies.sh rename to oss-fuzz/build_dependencies.sh index 0ab8f894719..6748c8bed7b --- a/Magick++/fuzz/build_dependencies.sh +++ b/oss-fuzz/build_dependencies.sh @@ -7,6 +7,13 @@ make -j$(nproc) CFLAGS="$CFLAGS -fPIC" make install popd +# build deflate +pushd "$SRC/libdeflate" +cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DLIBDEFLATE_BUILD_SHARED_LIB=off -DLIBDEFLATE_BUILD_GZIP=off +make -j$(nproc) +make install +popd + # Build xz pushd "$SRC/xz" ./autogen.sh --no-po4a --no-doxygen @@ -32,7 +39,7 @@ popd # Build libtiff pushd "$SRC/libtiff" autoreconf -fiv -./configure --disable-shared --prefix="$WORK" +./configure --disable-shared --prefix="$WORK" CFLAGS="$CFLAGS -I$WORK/include" LIBS="-L$WORK/lib" make -j$(nproc) make install popd @@ -93,9 +100,7 @@ popd # Build libjxl pushd "$SRC/libjxl" -cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DBUILD_TESTING=off -DBUILD_SHARED_LIBS=false -DJPEGXL_FORCE_SYSTEM_LCMS2=true -DJPEGXL_ENABLE_EXAMPLES=false -DJPEGXL_ENABLE_FUZZERS=false -DJPEGXL_ENABLE_TOOLS=false -DJPEGXL_ENABLE_JPEGLI=false -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" +cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DBUILD_SHARED_LIBS=off -DBUILD_TESTING=false -DJPEGXL_ENABLE_TOOLS=false -DJPEGXL_ENABLE_SKCMS=false -DJPEGXL_ENABLE_DOXYGEN=false -DJPEGXL_ENABLE_MANPAGES=false -DJPEGXL_ENABLE_SJPEG=false -DJPEGXL_ENABLE_EXAMPLES=false -DJPEGXL_ENABLE_BENCHMARK=false -DJPEGXL_ENABLE_FUZZERS=false -DJPEGXL_BUNDLE_LIBPNG=false -DJPEGXL_ENABLE_JPEGLI_LIBJPEG=false -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" make -j$(nproc) make install -cp third_party/brotli/*.a $WORK/lib -cp third_party/brotli/*.pc $WORK/lib/pkgconfig popd diff --git a/Magick++/fuzz/build_fuzzers.sh b/oss-fuzz/build_fuzzers.sh old mode 100755 new mode 100644 similarity index 100% rename from Magick++/fuzz/build_fuzzers.sh rename to oss-fuzz/build_fuzzers.sh diff --git a/oss-fuzz/build_imagemagick.sh b/oss-fuzz/build_imagemagick.sh new file mode 100644 index 00000000000..4c82ffffc4b --- /dev/null +++ b/oss-fuzz/build_imagemagick.sh @@ -0,0 +1,6 @@ +#!/bin/bash -eu + +autoreconf -fiv +./configure --prefix="$WORK" --disable-shared --disable-docs --with-jxl CFLAGS="$CFLAGS -I$WORK/include" LIBS="-L$WORK/lib -lbrotlidec -lbrotlienc -lbrotlicommon -lde265" PKG_CONFIG_PATH="$WORK/lib/pkgconfig" +make "-j$(nproc)" +make install diff --git a/Magick++/fuzz/crop_fuzzer.cc b/oss-fuzz/crop_fuzzer.cc similarity index 100% rename from Magick++/fuzz/crop_fuzzer.cc rename to oss-fuzz/crop_fuzzer.cc diff --git a/Magick++/fuzz/dictionaries/mvg.dict b/oss-fuzz/dictionaries/mvg.dict similarity index 100% rename from Magick++/fuzz/dictionaries/mvg.dict rename to oss-fuzz/dictionaries/mvg.dict diff --git a/Magick++/fuzz/encoder_format.h b/oss-fuzz/encoder_format.h similarity index 100% rename from Magick++/fuzz/encoder_format.h rename to oss-fuzz/encoder_format.h diff --git a/Magick++/fuzz/encoder_fuzzer.cc b/oss-fuzz/encoder_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_fuzzer.cc rename to oss-fuzz/encoder_fuzzer.cc diff --git a/Magick++/fuzz/encoder_gradient_fuzzer.cc b/oss-fuzz/encoder_gradient_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_gradient_fuzzer.cc rename to oss-fuzz/encoder_gradient_fuzzer.cc diff --git a/Magick++/fuzz/encoder_label_fuzzer.cc b/oss-fuzz/encoder_label_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_label_fuzzer.cc rename to oss-fuzz/encoder_label_fuzzer.cc diff --git a/Magick++/fuzz/encoder_list.cc b/oss-fuzz/encoder_list.cc similarity index 100% rename from Magick++/fuzz/encoder_list.cc rename to oss-fuzz/encoder_list.cc diff --git a/Magick++/fuzz/encoder_pattern_fuzzer.cc b/oss-fuzz/encoder_pattern_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_pattern_fuzzer.cc rename to oss-fuzz/encoder_pattern_fuzzer.cc diff --git a/Magick++/fuzz/encoder_plasma_fuzzer.cc b/oss-fuzz/encoder_plasma_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_plasma_fuzzer.cc rename to oss-fuzz/encoder_plasma_fuzzer.cc diff --git a/Magick++/fuzz/encoder_radial-gradient_fuzzer.cc b/oss-fuzz/encoder_radial-gradient_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_radial-gradient_fuzzer.cc rename to oss-fuzz/encoder_radial-gradient_fuzzer.cc diff --git a/Magick++/fuzz/encoder_utils.cc b/oss-fuzz/encoder_utils.cc similarity index 100% rename from Magick++/fuzz/encoder_utils.cc rename to oss-fuzz/encoder_utils.cc diff --git a/Magick++/fuzz/encoder_xc_fuzzer.cc b/oss-fuzz/encoder_xc_fuzzer.cc similarity index 100% rename from Magick++/fuzz/encoder_xc_fuzzer.cc rename to oss-fuzz/encoder_xc_fuzzer.cc diff --git a/Magick++/fuzz/enhance_fuzzer.cc b/oss-fuzz/enhance_fuzzer.cc similarity index 100% rename from Magick++/fuzz/enhance_fuzzer.cc rename to oss-fuzz/enhance_fuzzer.cc diff --git a/Magick++/fuzz/huffman_decode_fuzzer.cc b/oss-fuzz/huffman_decode_fuzzer.cc similarity index 100% rename from Magick++/fuzz/huffman_decode_fuzzer.cc rename to oss-fuzz/huffman_decode_fuzzer.cc diff --git a/Magick++/fuzz/main.cc b/oss-fuzz/main.cc similarity index 100% rename from Magick++/fuzz/main.cc rename to oss-fuzz/main.cc diff --git a/Magick++/fuzz/ping_fuzzer.cc b/oss-fuzz/ping_fuzzer.cc similarity index 100% rename from Magick++/fuzz/ping_fuzzer.cc rename to oss-fuzz/ping_fuzzer.cc diff --git a/Magick++/fuzz/rotate_fuzzer.cc b/oss-fuzz/rotate_fuzzer.cc similarity index 100% rename from Magick++/fuzz/rotate_fuzzer.cc rename to oss-fuzz/rotate_fuzzer.cc diff --git a/Magick++/fuzz/utils.cc b/oss-fuzz/utils.cc similarity index 100% rename from Magick++/fuzz/utils.cc rename to oss-fuzz/utils.cc diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000000..2dee896f22c --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,43 @@ +# Copyright 1999 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. +# obtain a copy of the License at +# +# https://imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# CMakeLists.txt for the ImageMagick validation suite. + +include(${CMAKE_SOURCE_DIR}/cmake/test_helpers.cmake) + +foreach(executable validate drawtest wandtest) + add_executable(${executable} ${executable}.c) + target_link_libraries(${executable} PRIVATE MagickCore MagickWand) +endforeach() + +copy_test_resources(core) + +add_tap_test(validate-colorspace) +add_tap_test(validate-compare) +add_tap_test(validate-composite) +add_tap_test(validate-convert) +add_tap_test(validate-formats-disk) +add_tap_test(validate-formats-map) +add_tap_test(validate-formats-memory) +add_tap_test(validate-identify) +add_tap_test(validate-import) +add_tap_test(validate-magick) +add_tap_test(validate-montage) +add_tap_test(validate-stream) +add_tap_test(drawtest) +add_tap_test(wandtest) +if(BUILD_UTILITIES) + add_tap_test(cli-colorspace) + add_tap_test(cli-pipe) +endif() diff --git a/tests/cli-colorspace.tap b/tests/cli-colorspace.tap index 97fd6252f01..649a7ee36c6 100755 --- a/tests/cli-colorspace.tap +++ b/tests/cli-colorspace.tap @@ -14,8 +14,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi depth=`eval ${MAGICK} xc:none -format '%[fx:QuantumRange]' info:-` if [ "X$depth" = "X255" ]; then diff --git a/tests/cli-pipe.tap b/tests/cli-pipe.tap index 683e98ed4c9..fc1454b9a76 100755 --- a/tests/cli-pipe.tap +++ b/tests/cli-pipe.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..17" ${MAGICK} pnm:- null: < ${SRCDIR}/rose.pnm && echo "ok" || echo "not ok" diff --git a/tests/drawtest.tap b/tests/drawtest.tap index 2931fd2bcfc..0bde3a82592 100755 --- a/tests/drawtest.tap +++ b/tests/drawtest.tap @@ -5,8 +5,8 @@ # LICENSE. You should have received a copy of LICENSE with this # package; otherwise see https://imagemagick.org/script/license.php. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${DRAWTEST} drawtest_out.miff && echo "ok" || echo "not ok" diff --git a/tests/validate-colorspace.tap b/tests/validate-colorspace.tap index 9a807255512..85dcbfc9256 100755 --- a/tests/validate-colorspace.tap +++ b/tests/validate-colorspace.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate colorspace && echo "ok" || echo "not ok" diff --git a/tests/validate-compare.tap b/tests/validate-compare.tap index 4919444bfdc..32d594ce5e1 100755 --- a/tests/validate-compare.tap +++ b/tests/validate-compare.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate compare && echo "ok" || echo "not ok" diff --git a/tests/validate-composite.tap b/tests/validate-composite.tap index 436a27141ec..9b0581ed51b 100755 --- a/tests/validate-composite.tap +++ b/tests/validate-composite.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate composite && echo "ok" || echo "not ok" diff --git a/tests/validate-convert.tap b/tests/validate-convert.tap index d82d3d00b63..b6ec44a7c56 100755 --- a/tests/validate-convert.tap +++ b/tests/validate-convert.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate convert && echo "ok" || echo "not ok" diff --git a/tests/validate-formats-disk.tap b/tests/validate-formats-disk.tap index 6a338587119..b9560455c0a 100755 --- a/tests/validate-formats-disk.tap +++ b/tests/validate-formats-disk.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate formats-disk && echo "ok" || echo "not ok" diff --git a/tests/validate-formats-map.tap b/tests/validate-formats-map.tap index 4e01fc87f86..3faa1388b00 100755 --- a/tests/validate-formats-map.tap +++ b/tests/validate-formats-map.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate formats-map && echo "ok" || echo "not ok" diff --git a/tests/validate-formats-memory.tap b/tests/validate-formats-memory.tap index f0befdfd1ab..c6d481421b4 100755 --- a/tests/validate-formats-memory.tap +++ b/tests/validate-formats-memory.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate formats-memory && echo "ok" || echo "not ok" diff --git a/tests/validate-identify.tap b/tests/validate-identify.tap index 0d3da9dde7b..485818e6d0f 100755 --- a/tests/validate-identify.tap +++ b/tests/validate-identify.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate identify && echo "ok" || echo "not ok" diff --git a/tests/validate-import.tap b/tests/validate-import.tap index a59fb9e8139..acb1e051151 100755 --- a/tests/validate-import.tap +++ b/tests/validate-import.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate import-export && echo "ok" || echo "not ok" diff --git a/tests/validate-magick.tap b/tests/validate-magick.tap index 9ce6ed85760..bba902553be 100755 --- a/tests/validate-magick.tap +++ b/tests/validate-magick.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate magick && echo "ok" || echo "not ok" diff --git a/tests/validate-montage.tap b/tests/validate-montage.tap index e8d7bd3c457..0e166ded3aa 100755 --- a/tests/validate-montage.tap +++ b/tests/validate-montage.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate montage && echo "ok" || echo "not ok" diff --git a/tests/validate-stream.tap b/tests/validate-stream.tap index 562457d9d78..736b25f12a4 100755 --- a/tests/validate-stream.tap +++ b/tests/validate-stream.tap @@ -16,8 +16,8 @@ # # Test for 'validate' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${VALIDATE} -validate stream && echo "ok" || echo "not ok" diff --git a/tests/wandtest.tap b/tests/wandtest.tap index 89142495a57..c6212d8dc8e 100755 --- a/tests/wandtest.tap +++ b/tests/wandtest.tap @@ -7,8 +7,8 @@ # # Test for '${CONVERT}' utility. # -. ./common.shi -. ${srcdir}/tests/common.shi +# . ./common.shi +# . ${srcdir}/tests/common.shi echo "1..1" ${WANDTEST} wandtest_out.miff -validate compare && echo "ok" || echo "not ok" diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index e2048ae3f5b..c8d62e83e7d 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -11,21 +11,52 @@ # under the License. # # CMake script file to build ImageMagick -# - -project(Magick C) +# set(MAGICK_SRC magick.c ) -add_executable(${MAGICK_BINARY_NAME} ${MAGICK_SRC} ${MAGICK_RESOURCE_FILE_PATH}) +add_executable(magick ${MAGICK_SRC} ${MAGICK_RESOURCE_FILE_PATH}) -target_include_directories(${MAGICK_BINARY_NAME} PRIVATE ${IMAGEMAGICK_BASE_PATH}) -target_compile_definitions(${MAGICK_BINARY_NAME} PRIVATE ${MAGICK_BUILD_DEFINES}) -target_link_libraries(${MAGICK_BINARY_NAME} PRIVATE ${MAGICKWAND_BINARY_NAME}) +target_include_directories(magick PRIVATE ${IMAGEMAGICK_BASE_PATH}) +target_link_libraries(magick PRIVATE MagickWand) -install(TARGETS ${MAGICK_BINARY_NAME} - RUNTIME DESTINATION bin - BUNDLE DESTINATION bin +set(MAGICK_LINKED_UTILITIES + animate + compare + composite + conjure + convert + display + identify + import + magick-script + mogrify + montage + stream ) +option(WINDOWS_COPY_EXTRA_UTILITIES "Copy extra utilities to the binary directory" OFF) +foreach(utility ${MAGICK_LINKED_UTILITIES}) + if(NOT WIN32) + add_custom_command(TARGET magick POST_BUILD + COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${utility} + WORKING_DIRECTORY $ + ) + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${utility})") + elseif(WINDOWS_COPY_EXTRA_UTILITIES) + add_custom_command(TARGET magick POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy magick.exe ${utility}.exe + WORKING_DIRECTORY $ + ) + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E copy $ \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${utility}.exe)") + endif() + list(APPEND BINARY_DIR_SYMLINKS ${CMAKE_CURRENT_BINARY_DIR}/${utility}) +endforeach() + +install(TARGETS magick + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${BINARY_DIR_SYMLINKS}") diff --git a/www/jp2.html b/www/jp2.html index 7c7808ffb41..3d00d6dffb5 100644 --- a/www/jp2.html +++ b/www/jp2.html @@ -116,7 +116,7 @@

Specify a subsampling factor:

-
magick wizard.png -colorspace YUV -sampling-factor 2,2 wizard.jp2 
+
magick wizard.png -colorspace YUV -sampling-factor 2:2 wizard.jp2 

Save a tiled JPEG-2000 image:

@@ -190,4 +190,4 @@ - \ No newline at end of file + diff --git a/www/mirror.html b/www/mirror.html index 67e4786de5d..daf170a2da2 100644 --- a/www/mirror.html +++ b/www/mirror.html @@ -103,7 +103,7 @@

Mirrors

https://ftp.acc.umu.se/mirror/imagemagick.org/ftp/
rsync://ftp.acc.umu.se/mirror/imagemagick.org/ftp/
Russia
-
https://mirror.surf/imagemagick/
+
https://mirror.su/imagemagick/
Switzerland
https://mirror.metanet.ch/imagemagick/
United States
@@ -113,7 +113,7 @@

Mirrors

http://www.macports.org/ports.html?by=name&substr=imagemagick (Mac OS X)
http://hpux.connect.org.uk/hppd/hpux/X11/Viewers/ (HP-UX 10.20 and 11.00)
Rsync Mirrors
-
rsync://mirror.surf/imagemagick//
+
rsync://mirror.su/imagemagick//
rsync://rsync.is.co.za/IS-Mirror/mirror.imagemagick.org/
rsync://mirror.imagemagick.org/magick_html/ (Web site mirror)
rsync://mirror.imagemagick.org/magick_ftp/ (FTP mirror)
@@ -148,4 +148,4 @@

Mirrors

- \ No newline at end of file +