From 9e5eb3a099cab17e895a55a53df2fb01610e299a Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 10 Dec 2023 19:24:55 -0500 Subject: [PATCH 001/156] beta release --- configure | 2 +- m4/version.m4 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 222be2ddaa3..8f089cf8218 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=23 MAGICK_VERSION=7.1.1-23 -MAGICK_GIT_REVISION=b135bacc6:20231210 +MAGICK_GIT_REVISION=54b13e91d:20231210 # Substitute library versioning diff --git a/m4/version.m4 b/m4/version.m4 index 7c9f29718a9..d416bfd9465 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -28,7 +28,7 @@ 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_is_beta], [y]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) m4_define([magick_url], [https://imagemagick.org]) From 22ca5177369707d7eaf56c311643ecce704e6910 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 10 Dec 2023 19:35:24 -0500 Subject: [PATCH 002/156] ... --- configure | 34 +++++++++++++++++----------------- m4/version.m4 | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/configure b/configure index 8f089cf8218..6751df748f1 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-24. # # 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-24' +PACKAGE_STRING='ImageMagick 7.1.1-24' 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-24 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-24:";; 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-24 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-24, 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-24' # Some tools Automake needs. @@ -5183,11 +5183,11 @@ MAGICK_MINOR_VERSION=1 MAGICK_MICRO_VERSION=1 -MAGICK_PATCHLEVEL_VERSION=23 +MAGICK_PATCHLEVEL_VERSION=24 -MAGICK_VERSION=7.1.1-23 +MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=54b13e91d:20231210 +MAGICK_GIT_REVISION=9e5eb3a09:20231210 # Substitute library versioning @@ -5209,17 +5209,17 @@ MAGICKPP_LIBRARY_VERSION_INFO=$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISI PACKAGE_BASE_VERSION=7.1.1 -PACKAGE_PATCHLEVEL_VERSION=23 +PACKAGE_PATCHLEVEL_VERSION=24 if test "y" = 'y'; then - PACKAGE_VERSION_ADDENDUM='-23 (Beta)' + PACKAGE_VERSION_ADDENDUM='-24 (Beta)' else - PACKAGE_VERSION_ADDENDUM=-23 + PACKAGE_VERSION_ADDENDUM=-24 fi PACKAGE_LIB_VERSION=0x711 -PACKAGE_LIB_VERSION_NUMBER=7,1,1,23 +PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 PACKAGE_RELEASE_DATE=2023-12-10 @@ -38936,7 +38936,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-24, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -39005,7 +39005,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-24 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/m4/version.m4 b/m4/version.m4 index d416bfd9465..a9d9e48047a 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -27,7 +27,7 @@ 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_patchlevel_version], [24]) m4_define([magick_is_beta], [y]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) From 8d015de00c3e98f648b74f9a72233daa03319947 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 10 Dec 2023 21:07:53 -0500 Subject: [PATCH 003/156] cosmetic --- coders/jbig.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) 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. From 8d08f856456e57ab2ec72b19860e6dc2364e555d Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 11 Dec 2023 08:17:42 +0100 Subject: [PATCH 004/156] Added extra check for rare case when ImageMagick is build without any delegates. --- MagickCore/version.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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); } From 935f2c288173117ed2d71e991db641512ded381a Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 11 Dec 2023 16:48:38 +0100 Subject: [PATCH 005/156] Corrected order to fix invalid matches. --- MagickCore/geometry.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c index 40ff83fa98c..78b8ad1499c 100644 --- a/MagickCore/geometry.c +++ b/MagickCore/geometry.c @@ -85,17 +85,17 @@ 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"), @@ -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"), From cf821b18cc6ac2230b5e7c36c7e0d0e566b3f864 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 11 Dec 2023 17:11:34 +0100 Subject: [PATCH 006/156] b10 should also be moved. --- MagickCore/geometry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c index 78b8ad1499c..1d596eaf1ac 100644 --- a/MagickCore/geometry.c +++ b/MagickCore/geometry.c @@ -102,8 +102,8 @@ static const PageInfo 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"), From ef87dfdf18acd1b017e02b5f55e4c8d1b716d1b4 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 11 Dec 2023 20:40:08 -0500 Subject: [PATCH 007/156] only fill the alpha channel for `alpha` floodfill --- MagickCore/paint.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/MagickCore/paint.c b/MagickCore/paint.c index acb3f6a7236..2d0a3cb0e55 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -353,7 +353,17 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, if (GetPixelGray(floodplane_image,p) != 0) { 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); From 3924a2a9e24a1833544902ca2f68c95eac2f71ef Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 11:17:15 +0200 Subject: [PATCH 008/156] CMake: Improve compatibility with Conan's CMakeDeps --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 874be1f887f..d78a4c54e79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,8 @@ macro(magick_find_delegate) 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}) + 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) From adfba31d3d8a67738ccc8a49489b8f6e8ed3acf1 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 12:26:22 +0200 Subject: [PATCH 009/156] CMake: HDRI_ENABLE_OBSOLETE_IN_H has been removed --- config/config.h.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/config/config.h.cmake b/config/config.h.cmake index 361fdeaab48..090771bba63 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -722,9 +722,6 @@ /* define if your compiler has __attribute__ */ #cmakedefine HAVE___ATTRIBUTE__ -/* Whether hdri is enabled or not */ -#cmakedefine HDRI_ENABLE_OBSOLETE_IN_H - /* Define if you have libheif library */ #cmakedefine HEIC_DELEGATE From a5fea866315006ff7283d593323003cd9ccd37cf Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 13:12:30 +0200 Subject: [PATCH 010/156] CMake: add SECURITY_POLICY option, nominally https://github.com/ImageMagick/ImageMagick/commit/8ada13b51a7639fbe4fcc347e3a4e0cc79059d7f#diff-49473dca262eeab3b4a43002adb08b4db31020d190caaad1594b47f1d5daa810 --- CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d78a4c54e79..f35ff09d8cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,15 @@ set(PixelCacheThreshold "" CACHE STRING "Set pixel cache threshhold in MB (defau option(WITH_DMALLOC "Use dmalloc for memory profiling" FALSE) option(ZERO_CONFIGURATION_SUPPORT "Build self-contained, embeddable, zero-configuration ImageMagick" 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") +message(STATUS "Security policy variant to enforce: ${SECURITY_POLICY}") +if(NOT SECURITY_POLICY STREQUAL "open") + message(FATAL_ERROR "Only 'open' security policy is supported at this time.") + # TODO: Implement installation of config/ files + # Copy config/policy-${SECURITY_POLICY}.xml to ${MAGICK_CONFIGURE_PATH}/policy.xml +endif() + # Fetch some needed values from version.sh and fill the correspondent variables file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure CONTENT_CONFIGURE) From 8ec88b68d271a33dd71323b61a413304d5a89867 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 13:24:16 +0200 Subject: [PATCH 011/156] CMake: add DPC_SUPPORT option https://github.com/ImageMagick/ImageMagick/commit/fc7bb1d8609d01082b9244a595db433365c7218c --- CMakeLists.txt | 1 + config/config.h.cmake | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f35ff09d8cd..fd862292a0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,7 @@ set(NAMESPACE_PREFIX_TAG ${NAMESPACE_PREFIX}) set(PixelCacheThreshold "" CACHE STRING "Set pixel cache threshhold 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) set(SECURITY_POLICY "open" CACHE STRING "Set the security policy variant to enforce") set_property(CACHE SECURITY_POLICY PROPERTY STRINGS "open;limited;secure;websafe") diff --git a/config/config.h.cmake b/config/config.h.cmake index 090771bba63..4a9f41a6bff 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -38,6 +38,9 @@ /* Directory where ImageMagick documents live. */ #cmakedefine DOCUMENTATION_PATH @DOCUMENTATION_PATH@ +/* Define to 1 to enable distributed pixel cache support. */ +#cmakedefine DPC_SUPPORT + /* Define if you have Display Postscript */ #cmakedefine DPS_DELEGATE From 6fe5e769bf43750845635b1a0b144dcf15a3d780 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 14:35:26 +0200 Subject: [PATCH 012/156] CMake: add WITH_64BIT_CHANNEL_MASK_SUPPORT option https://github.com/ImageMagick/ImageMagick/commit/226a66f51e53a39beceb49fa7f29bd0c1ff53155 --- CMakeLists.txt | 7 +++++++ config/config.h.cmake | 3 +++ 2 files changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index fd862292a0c..190ecc2f4d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,6 +127,13 @@ 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) +if(WITH_64BIT_CHANNEL_MASK_SUPPORT) + set(CHANNEL_MASK_DEPTH 64) +else() + set(CHANNEL_MASK_DEPTH 32) +endif() + set(SECURITY_POLICY "open" CACHE STRING "Set the security policy variant to enforce") set_property(CACHE SECURITY_POLICY PROPERTY STRINGS "open;limited;secure;websafe") message(STATUS "Security policy variant to enforce: ${SECURITY_POLICY}") diff --git a/config/config.h.cmake b/config/config.h.cmake index 4a9f41a6bff..166e90beaeb 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -16,6 +16,9 @@ /* Define if you have CAIRO library */ #cmakedefine CAIRO_DELEGATE +/* Channel mask depth */ +#cmakedefine CHANNEL_MASK_DEPTH @CHANNEL_MASK_DEPTH@ + /* permit enciphering and deciphering image pixels */ #cmakedefine CIPHER_SUPPORT From b6e29ea2715126c5e837354c72007a5ebc98ca74 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 15:02:54 +0200 Subject: [PATCH 013/156] CMake: add DMR (MagickCache) lib support https://github.com/ImageMagick/ImageMagick/commit/0a439abbf12035b3d55ea214d1c36d8fa6a788c0 https://github.com/ImageMagick/MagickCache --- CMakeLists.txt | 1 + MagickCore/CMakeLists.txt | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 190ecc2f4d9..2847de47843 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -353,6 +353,7 @@ 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) diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index d5cc6588c84..d68878d2107 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -11,7 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# +# project(MagickCore C) @@ -420,6 +420,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,6 +652,9 @@ 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++ From bbd9bd097440cced9b54831d52289948e169f798 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 17:19:20 +0200 Subject: [PATCH 014/156] CMake: add HAVE_MTMALLOC option, rename HasJEMALLOC and HasUMEM https://github.com/ImageMagick/ImageMagick/commit/88e39641b2e71e94a77cefdf4c9186543975931d --- CMakeLists.txt | 37 +++++++++++++++++++------------------ config/config.h.cmake | 9 +++------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2847de47843..ee2ca292a30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# +# cmake_minimum_required(VERSION 3.19.0) cmake_policy(VERSION 3.19.0) @@ -211,7 +211,7 @@ set(PACKAGE_TARNAME "") set(PACKAGE_URL "") set(PACKAGE_VERSION "") -# Set if pipe (|) is enabled on filenames +# 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) @@ -248,7 +248,7 @@ 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 +# Not sure on Windows if code is made to work with 64 bits set(_FILE_OFFSET_BITS 32) endif() @@ -372,8 +372,9 @@ 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 HAVE_JEMALLOC NAME Jemalloc DEFAULT FALSE) +magick_find_delegate(DELEGATE HAVE_UMEM NAME UMEM DEFAULT FALSE) +magick_find_delegate(DELEGATE HAVE_MTMALLOC NAME MTMalloc DEFAULT FALSE) magick_find_delegate(DELEGATE OPENCLLIB_DELEGATE NAME OpenCL DEFAULT FALSE) if(OpenCL_FOUND) @@ -422,7 +423,7 @@ endif() 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) @@ -430,16 +431,16 @@ if(WIN32) 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) @@ -447,12 +448,12 @@ if(WIN32) 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) + 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 @@ -466,14 +467,14 @@ 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" +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" +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} ) @@ -484,14 +485,14 @@ string(REGEX REPLACE 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" +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 +set(CONTENT_CONFIG_H "#ifndef _MAGICKCORE_MAGICK_BASECONFIG_H #define _MAGICKCORE_MAGICK_BASECONFIG_H 1 diff --git a/config/config.h.cmake b/config/config.h.cmake index 166e90beaeb..36e21edce1e 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -328,6 +328,9 @@ /* Define to 1 if you have a working `mmap' system call. */ #cmakedefine HAVE_MMAP @HAVE_MMAP@ +/* Define if you have the mtmalloc memory allocation library */ +#cmakedefine HAVE_MTMALLOC @HAVE_MTMALLOC@ + /* Define to 1 if you have the `munmap' function. */ #cmakedefine HAVE_MUNMAP @HAVE_MUNMAP@ @@ -731,12 +734,6 @@ /* 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 - /* Directory where ImageMagick architecture headers live. */ #cmakedefine INCLUDEARCH_PATH @INCLUDEARCH_PATH@ From 339f4c1575a63bb3de286444ed14b1ab2bb84728 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 12:35:04 +0200 Subject: [PATCH 015/156] CMake: apply changes to config.h.in Only symbol/header flags, not feature flags. Diff: https://gist.github.com/valgur/b408e251b790f9f320262ed50b6ae0f3 --- cmake/checks.cmake | 103 ++---------------------------------------- config/config.h.cmake | 37 +-------------- 2 files changed, 6 insertions(+), 134 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 2f3688e813f..016e2b22be4 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -13,17 +13,8 @@ include(CheckSourceRuns) include(TestBigEndian) macro(magick_check_env) - # Check if `closedir' function returns void instead of `int' + # 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) @@ -137,9 +128,6 @@ macro(magick_check_env) # Check if `floor' exists check_function_exists(floor HAVE_FLOOR) - # Check if `fork' exists - check_function_exists(fork HAVE_FORK) - # Check if `fseeko' exists check_function_exists(fseeko HAVE_FSEEKO) @@ -529,9 +517,6 @@ macro(magick_check_env) # 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) @@ -612,25 +597,12 @@ macro(magick_check_env) # 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 +622,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 @@ -747,11 +679,6 @@ macro(magick_check_env) 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) @@ -797,8 +724,8 @@ macro(magick_check_env) # Check `size_t' size check_type_size("size_t" SIZEOF_SIZE_T) - # Check `ssize_t' size - check_type_size("ssize_t" SIZEOF_SSIZE_T) + # Check `size_t' size + check_type_size("size_t" SIZEOF_SIZE_T) # Check `unsigned int' size check_type_size("unsigned int" SIZEOF_UNSIGNED_INT) @@ -988,23 +915,6 @@ macro(magick_check_env) endif() endif() - # Check if doesn't define `ssize_t' - if(HAVE_SYS_TYPES_H) - if(SIZEOF_SSIZE_T) - set(HAVE_SSIZE_T 1) - else() - check_symbol_exists(ssize_t sys/types.h HAVE_SSIZE_T) - if(NOT HAVE_SSIZE_T) - if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") - set(ssize_t int) - else() - set(ssize_t "long long") - endif() - set(SIZEOF_SSIZE_T ${CMAKE_SIZEOF_VOID_P}) - endif() - endif() - endif() - # Check if doesn't define `uid_t' if(HAVE_SYS_TYPES_H) check_symbol_exists(uid_t sys/types.h HAVE_UID_T) @@ -1021,11 +931,6 @@ 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( " @@ -1041,4 +946,4 @@ macro(magick_check_env) #TODO check if this is actually true set(SETJMP_IS_THREAD_SAFE TRUE) -endmacro() \ No newline at end of file +endmacro() diff --git a/config/config.h.cmake b/config/config.h.cmake index 36e21edce1e..6a82d2ea662 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -22,9 +22,6 @@ /* permit enciphering and deciphering image pixels */ #cmakedefine CIPHER_SUPPORT -/* Define to 1 if the `closedir' function returns void instead of `int'. */ -#cmakedefine CLOSEDIR_VOID @CLOSEDIR_VOID@ - /* coders subdirectory. */ #cmakedefine CODER_DIRNAME @CODER_DIRNAME@ @@ -561,9 +558,6 @@ /* 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@ - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_SENDFILE_H @HAVE_SYS_SENDFILE_H@ @@ -662,21 +656,12 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UTIME_H @HAVE_UTIME_H@ -/* 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 `vfprintf' function. */ #cmakedefine HAVE_VFPRINTF @HAVE_VFPRINTF@ /* 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@ - /* Define to 1 if you have the `vsnprintf' function. */ #cmakedefine HAVE_VSNPRINTF @HAVE_VSNPRINTF@ @@ -695,12 +680,6 @@ /* 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@ - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_XLOCALE_H @HAVE_XLOCALE_H@ @@ -867,15 +846,6 @@ /* 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@ - /* Setjmp/longjmp are thread safe */ #cmakedefine SETJMP_IS_THREAD_SAFE @@ -925,8 +895,8 @@ /* The size of `size_t', as computed by sizeof. */ #cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ -/* The size of `ssize_t', as computed by sizeof. */ -#cmakedefine SIZEOF_SSIZE_T @SIZEOF_SSIZE_T@ +/* The size of `size_t', as computed by sizeof. */ +#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ /* The size of `unsigned int', as computed by sizeof. */ #cmakedefine SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@ @@ -1188,9 +1158,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@ From 53f37c169eaa78b9f9eacad9cf901e6565b0ba1e Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 14:21:39 +0200 Subject: [PATCH 016/156] CMake: update config.h.cmake to match config.h.in And rename HasJMALLOC and HasUMEM. --- cmake/checks.cmake | 60 +++++++++++++++++++--------- config/config.h.cmake | 91 +++++++++++++++++++++++++++++-------------- 2 files changed, 103 insertions(+), 48 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 016e2b22be4..da34eb515e9 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -19,6 +19,9 @@ macro(magick_check_env) # 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) @@ -73,6 +76,9 @@ macro(magick_check_env) # Check if `pread' exists check_function_exists(pread HAVE_DECL_PREAD) + # Check if `putenv' exists + check_function_exists(putenv HAVE_PUTENV) + # Check if `pwrite' exists check_function_exists(pwrite HAVE_DECL_PWRITE) @@ -117,13 +123,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(fcntl.h HAVE_FLOAT_H) # Check if `floor' exists check_function_exists(floor HAVE_FLOOR) @@ -140,6 +141,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) @@ -155,6 +159,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) @@ -200,6 +207,9 @@ macro(magick_check_env) # Check if exists check_include_file(limits.h HAVE_LIMITS_H) + # Check if you have Linux-compatible sendfile() + # HAVE_LINUX_SENDFILE ? + # Check if exists check_include_file(linux/unistd.h HAVE_LINUX_UNISTD_H) @@ -209,12 +219,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) @@ -244,18 +248,24 @@ macro(magick_check_env) # 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) # 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) @@ -423,6 +433,9 @@ macro(magick_check_env) # 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) @@ -499,6 +512,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) @@ -511,6 +527,9 @@ 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) @@ -529,9 +548,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) @@ -541,6 +557,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) @@ -594,6 +613,9 @@ 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) diff --git a/config/config.h.cmake b/config/config.h.cmake index 6a82d2ea662..4be36bf11fd 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -77,6 +77,9 @@ /* Define to 1 if you have the `acosh' function. */ #cmakedefine HAVE_ACOSH @HAVE_ACOSH@ +/* Define to 1 if you have the `aligned_malloc' function. */ +#cmakedefine HAVE_ALIGNED_MALLOC @HAVE_ALIGNED_MALLOC@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_ARM_LIMITS_H @HAVE_ARM_LIMITS_H@ @@ -96,7 +99,7 @@ #cmakedefine HAVE_ATOLL @HAVE_ATOLL@ /* define if bool is a built-in type */ -#cmakedefine HAVE_BOOL +#cmakedefine HAVE_BOOL @HAVE_BOOL@ /* Define to 1 if you have the `cabs' function. */ #cmakedefine HAVE_CABS @HAVE_CABS@ @@ -113,7 +116,7 @@ /* Define to 1 if you have the `clock_getres' function. */ #cmakedefine HAVE_CLOCK_GETRES @HAVE_CLOCK_GETRES@ -/* Define to 1 if you have clock_gettime. */ +/* Define to 1 if you have the `clock_gettime' function. */ #cmakedefine HAVE_CLOCK_GETTIME @HAVE_CLOCK_GETTIME@ /* Define to 1 if clock_gettime supports CLOCK_REALTIME. */ @@ -165,12 +168,6 @@ /* 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@ - /* Define to 1 if you have the `erf' function. */ #cmakedefine HAVE_ERF @HAVE_ERF@ @@ -186,8 +183,8 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@ -/* 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 @HAVE_FLOAT_H@ /* Define to 1 if you have the `floor' function. */ #cmakedefine HAVE_FLOOR @HAVE_FLOOR@ @@ -213,6 +210,9 @@ /* Define to 1 if you have the `getdtablesize' function. */ #cmakedefine HAVE_GETDTABLESIZE @HAVE_GETDTABLESIZE@ +/* Define to 1 if you have the `getentropy' function. */ +#cmakedefine HAVE_GETENTROPY @HAVE_GETENTROPY@ + /* Define to 1 if you have the `getexecname' function. */ #cmakedefine HAVE_GETEXECNAME @HAVE_GETEXECNAME@ @@ -222,6 +222,9 @@ /* Define to 1 if you have the `getpid' function. */ #cmakedefine HAVE_GETPID @HAVE_GETPID@ +/* Define to 1 if you have the `getpwnam_r' function. */ +#cmakedefine HAVE_GETPWNAM_R @HAVE_GETPWNAM_R@ + /* Define to 1 if you have the `getrlimit' function. */ #cmakedefine HAVE_GETRLIMIT @HAVE_GETRLIMIT@ @@ -235,7 +238,7 @@ #cmakedefine HAVE_GMTIME_R @HAVE_GMTIME_R@ /* Compile with hugepage support */ -#cmakedefine HAVE_HUGEPAGES +#cmakedefine HAVE_HUGEPAGES @HAVE_HUGEPAGES@ /* Define to 1 if the system has the type `intmax_t'. */ #cmakedefine HAVE_INTMAX_T @HAVE_INTMAX_T@ @@ -255,11 +258,14 @@ /* Define to 1 if you have the `j1' function. */ #cmakedefine HAVE_J1 @HAVE_J1@ +/* Define if you have jemalloc memory allocation library */ +#cmakedefine HAVE_JEMALLOC @HAVE_JEMALLOC@ + /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_H +#cmakedefine HAVE_LCMS2_H @HAVE_LCMS2_H@ /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_LCMS2_H +#cmakedefine HAVE_LCMS2_LCMS2_H @HAVE_LCMS2_LCMS2_H@ /* Define if you have the header file. */ #cmakedefine HAVE_LIBRAW_LIBRAW_H @@ -273,6 +279,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LIMITS_H @HAVE_LIMITS_H@ +/* Define if you have Linux-compatible sendfile() */ +#cmakedefine HAVE_LINUX_SENDFILE @HAVE_LINUX_SENDFILE@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LINUX_UNISTD_H @HAVE_LINUX_UNISTD_H@ @@ -282,9 +291,6 @@ /* 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@ - /* Define to 1 if you have the `localtime_r' function. */ #cmakedefine HAVE_LOCALTIME_R @HAVE_LOCALTIME_R@ @@ -307,18 +313,24 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_MACH_O_DYLD_H @HAVE_MACH_O_DYLD_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MALLOC_H @HAVE_MALLOC_H@ + /* Define to 1 if declares mbstate_t. */ #cmakedefine HAVE_MBSTATE_T @HAVE_MBSTATE_T@ /* 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@ - /* Define to 1 if you have the `memset' function. */ #cmakedefine HAVE_MEMSET @HAVE_MEMSET@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MINIX_CONFIG_H @HAVE_MINIX_CONFIG_H@ + +/* Define to 1 if you have the `mkdir' function. */ +#cmakedefine HAVE_MKDIR @HAVE_MKDIR@ + /* Define to 1 if you have the `mkstemp' function. */ #cmakedefine HAVE_MKSTEMP @HAVE_MKSTEMP@ @@ -343,6 +355,9 @@ /* Define to 1 if you have the header file, and it defines `DIR'. */ #cmakedefine HAVE_NDIR_H @HAVE_NDIR_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETDB_H @HAVE_NETDB_H@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_NETINET_IN_H @HAVE_NETINET_IN_H@ @@ -389,10 +404,13 @@ #cmakedefine HAVE_PROCESS_H @HAVE_PROCESS_H@ /* Define if you have POSIX threads libraries and header files. */ -#cmakedefine HAVE_PTHREAD +#cmakedefine HAVE_PTHREAD @HAVE_PTHREAD@ /* Have PTHREAD_PRIO_INHERIT. */ -#cmakedefine HAVE_PTHREAD_PRIO_INHERIT +#cmakedefine HAVE_PTHREAD_PRIO_INHERIT @HAVE_PTHREAD_PRIO_INHERIT@ + +/* Define to 1 if you have the `putenv' function. */ +#cmakedefine HAVE_PUTENV @HAVE_PUTENV@ /* Define to 1 if you have the `pwrite' function. */ #cmakedefine HAVE_PWRITE @HAVE_PWRITE@ @@ -428,10 +446,10 @@ #cmakedefine HAVE_SETVBUF @HAVE_SETVBUF@ /* X11 server supports shape extension */ -#cmakedefine HAVE_SHAPE +#cmakedefine HAVE_SHAPE @HAVE_SHAPE@ /* X11 server supports shared memory extension */ -#cmakedefine HAVE_SHARED_MEMORY +#cmakedefine HAVE_SHARED_MEMORY @HAVE_SHARED_MEMORY@ /* Define to 1 if you have the `sigaction' function. */ #cmakedefine HAVE_SIGACTION @HAVE_SIGACTION@ @@ -469,6 +487,9 @@ /* Define to 1 if you have the `strcasecmp' function. */ #cmakedefine HAVE_STRCASECMP @HAVE_STRCASECMP@ +/* Define to 1 if you have the `strcasestr' function. */ +#cmakedefine HAVE_STRCASESTR @HAVE_STRCASESTR@ + /* Define to 1 if you have the `strchr' function. */ #cmakedefine HAVE_STRCHR @HAVE_STRCHR@ @@ -481,7 +502,7 @@ /* Define to 1 if you have the `strerror' function. */ #cmakedefine HAVE_STRERROR @HAVE_STRERROR@ -/* Define to 1 if you have the `strerror_r' function. */ +/* Define if you have `strerror_r'. */ #cmakedefine HAVE_STRERROR_R @HAVE_STRERROR_R@ /* Define to 1 if cpp supports the ANSI # stringizing operator. */ @@ -538,6 +559,9 @@ /* Define to 1 if you have the `sysconf' function. */ #cmakedefine HAVE_SYSCONF @HAVE_SYSCONF@ +/* Define to 1 if you have the `system' function. */ +#cmakedefine HAVE_SYSTEM @HAVE_SYSTEM@ + /* Define to 1 if you have the header file, and it defines `DIR'. */ #cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@ @@ -570,9 +594,6 @@ /* 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@ - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_TIMES_H @HAVE_SYS_TIMES_H@ @@ -582,6 +603,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_TYPES_H @HAVE_SYS_TYPES_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_UIO_H @HAVE_SYS_UIO_H@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_WAIT_H @HAVE_SYS_WAIT_H@ @@ -638,6 +662,9 @@ /* Define to 1 if you have the `ulltostr' function. */ #cmakedefine HAVE_ULLTOSTR @HAVE_ULLTOSTR@ +/* Define if you have umem memory allocation library */ +#cmakedefine HAVE_UMEM @HAVE_UMEM@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UNISTD_H @HAVE_UNISTD_H@ @@ -653,6 +680,9 @@ /* Define to 1 if you have the `utime' function. */ #cmakedefine HAVE_UTIME @HAVE_UTIME@ +/* Define to 1 if you have the `utimensat' function. */ +#cmakedefine HAVE_UTIMENSAT @HAVE_UTIMENSAT@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UTIME_H @HAVE_UTIME_H@ @@ -828,7 +858,7 @@ 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) */ @@ -1004,6 +1034,9 @@ /* Build self-contained, embeddable, zero-configuration ImageMagick */ #cmakedefine01 ZERO_CONFIGURATION_SUPPORT +/* Define if you have ZIP library */ +#cmakedefine ZIP_DELEGATE + /* Define if you have ZLIB library */ #cmakedefine ZLIB_DELEGATE @@ -1160,4 +1193,4 @@ /* 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@ From ff80de71b868c22e8334af4641bbfbdfb9e145c4 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 15:43:54 +0200 Subject: [PATCH 017/156] CMake: fix the define value formats in config.h.cmake --- CMakeLists.txt | 24 +- cmake/checks.cmake | 6 +- config/config.h.cmake | 533 +++++++++++++++++++++--------------------- 3 files changed, 281 insertions(+), 282 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ee2ca292a30..3f9eb62a4b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,27 +259,27 @@ set(_FORTIFY_SOURCE FALSE) # TODO Configure these correctly set(CODER_DIRNAME "") set(CONFIGURE_PATH "") -set(CONFIGURE_RELATIVE_PATH "\"ImageMagick-7\"") +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(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(SHARE_RELATIVE_PATH "ImageMagick-7") set(MODULES_BASEDIRNAME "") set(MODULES_DIRNAME "") set(LT_OBJDIR "") # Set the default font search path if(WIN32) - set(MAGICK_FONT_PATH "\"$ENV{WINDIR}\\FONTS\\\"") + 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) @@ -422,7 +422,7 @@ endif() # rc files are only used on Windows binaries if(WIN32) set(MagickLibVersionNumber ${MAGICK_LIB_VERSION_NUMBER}) - set(MagickLibVersionText \"${MAGICK_LIB_VERSION_TEXT}\") + set(MagickLibVersionText ${MAGICK_LIB_VERSION_TEXT}) if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) set(MagickPlatform "x86") @@ -436,18 +436,18 @@ if(WIN32) 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}) + 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}) + 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(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) @@ -457,7 +457,7 @@ if(WIN32) endif() # Before making the config.h we still need to do somethings -set(PACKAGE_NAME \"${PACKAGE_NAME}\") +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) @@ -468,13 +468,13 @@ 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#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#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} ) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index da34eb515e9..f7ffd6d53b9 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -960,10 +960,8 @@ macro(magick_check_env) " 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 diff --git a/config/config.h.cmake b/config/config.h.cmake index 4be36bf11fd..9963b33b8d5 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -23,38 +23,38 @@ #cmakedefine CIPHER_SUPPORT /* 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 /* 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 +#cmakedefine DPC_SUPPORT 1 /* Define if you have Display Postscript */ #cmakedefine DPS_DELEGATE /* 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 /* filter subdirectory. */ -#cmakedefine FILTER_DIRNAME @FILTER_DIRNAME@ +#cmakedefine FILTER_DIRNAME "@FILTER_DIRNAME@" /* Define if you have FLIF library */ #cmakedefine FLIF_DELEGATE @@ -75,197 +75,197 @@ #cmakedefine GVC_DELEGATE /* 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 @HAVE_ALIGNED_MALLOC@ +#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 @HAVE_BOOL@ +#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 the `clock_gettime' function. */ -#cmakedefine HAVE_CLOCK_GETTIME @HAVE_CLOCK_GETTIME@ +#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. */ -#cmakedefine01 HAVE_DECL_STRLCPY +#cmakedefine HAVE_DECL_STRLCPY 1 /* 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@ +#cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the `erf' function. */ -#cmakedefine HAVE_ERF @HAVE_ERF@ +#cmakedefine HAVE_ERF 1 /* 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 you have the header file. */ -#cmakedefine HAVE_FLOAT_H @HAVE_FLOAT_H@ +#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 /* Define to 1 if you have the `getentropy' function. */ -#cmakedefine HAVE_GETENTROPY @HAVE_GETENTROPY@ +#cmakedefine HAVE_GETENTROPY /* Define to 1 if you have the `getexecname' function. */ -#cmakedefine HAVE_GETEXECNAME @HAVE_GETEXECNAME@ +#cmakedefine HAVE_GETEXECNAME /* Define to 1 if you have the `getpagesize' function. */ -#cmakedefine HAVE_GETPAGESIZE @HAVE_GETPAGESIZE@ +#cmakedefine HAVE_GETPAGESIZE /* Define to 1 if you have the `getpid' function. */ -#cmakedefine HAVE_GETPID @HAVE_GETPID@ +#cmakedefine HAVE_GETPID /* Define to 1 if you have the `getpwnam_r' function. */ -#cmakedefine HAVE_GETPWNAM_R @HAVE_GETPWNAM_R@ +#cmakedefine HAVE_GETPWNAM_R /* Define to 1 if you have the `getrlimit' function. */ -#cmakedefine HAVE_GETRLIMIT @HAVE_GETRLIMIT@ +#cmakedefine HAVE_GETRLIMIT /* Define to 1 if you have the `getrusage' function. */ -#cmakedefine HAVE_GETRUSAGE @HAVE_GETRUSAGE@ +#cmakedefine HAVE_GETRUSAGE /* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY @HAVE_GETTIMEOFDAY@ +#cmakedefine HAVE_GETTIMEOFDAY /* Define to 1 if you have the `gmtime_r' function. */ -#cmakedefine HAVE_GMTIME_R @HAVE_GMTIME_R@ +#cmakedefine HAVE_GMTIME_R /* Compile with hugepage support */ -#cmakedefine HAVE_HUGEPAGES @HAVE_HUGEPAGES@ +#cmakedefine HAVE_HUGEPAGES /* 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 @HAVE_JEMALLOC@ +#cmakedefine HAVE_JEMALLOC /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_H @HAVE_LCMS2_H@ +#cmakedefine HAVE_LCMS2_H /* Define if you have the header file. */ -#cmakedefine HAVE_LCMS2_LCMS2_H @HAVE_LCMS2_LCMS2_H@ +#cmakedefine HAVE_LCMS2_LCMS2_H /* Define if you have the header file. */ #cmakedefine HAVE_LIBRAW_LIBRAW_H @@ -274,74 +274,74 @@ #cmakedefine HAVE_LIBHEIF_LIBHEIF_H /* 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 @HAVE_LINUX_SENDFILE@ +#cmakedefine HAVE_LINUX_SENDFILE /* 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@ +#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 @HAVE_MALLOC_H@ +#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@ +#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 @HAVE_MINIX_CONFIG_H@ +#cmakedefine HAVE_MINIX_CONFIG_H 1 /* Define to 1 if you have the `mkdir' function. */ -#cmakedefine HAVE_MKDIR @HAVE_MKDIR@ +#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 @HAVE_MTMALLOC@ +#cmakedefine HAVE_MTMALLOC /* 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 @@ -350,392 +350,392 @@ #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 @HAVE_NETDB_H@ +#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 @HAVE_PTHREAD@ +#cmakedefine HAVE_PTHREAD /* Have PTHREAD_PRIO_INHERIT. */ -#cmakedefine HAVE_PTHREAD_PRIO_INHERIT @HAVE_PTHREAD_PRIO_INHERIT@ +#cmakedefine HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the `putenv' function. */ -#cmakedefine HAVE_PUTENV @HAVE_PUTENV@ +#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 @HAVE_SHAPE@ +#cmakedefine HAVE_SHAPE /* X11 server supports shared memory extension */ -#cmakedefine HAVE_SHARED_MEMORY @HAVE_SHARED_MEMORY@ +#cmakedefine HAVE_SHARED_MEMORY /* 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_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 @HAVE_STRCASESTR@ +#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 if you have `strerror_r'. */ -#cmakedefine HAVE_STRERROR_R @HAVE_STRERROR_R@ +#cmakedefine HAVE_STRERROR_R /* 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 @HAVE_SYSTEM@ +#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@ +#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@ +#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 @HAVE_SYS_UIO_H@ +#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 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 `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 @HAVE_UMEM@ +#cmakedefine HAVE_UMEM /* 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 `utimensat' function. */ -#cmakedefine HAVE_UTIMENSAT @HAVE_UTIMENSAT@ +#cmakedefine HAVE_UTIMENSAT 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UTIME_H @HAVE_UTIME_H@ +#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@ +#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@ +#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__ @@ -744,10 +744,10 @@ #cmakedefine HEIC_DELEGATE /* 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 @@ -768,15 +768,15 @@ #cmakedefine LIBOPENJP2_DELEGATE /* 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 @@ -786,61 +786,61 @@ #cmakedefine LTDL_DELEGATE /* 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 /* 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 /* 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 @@ -865,10 +865,10 @@ #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 /* Define if you have LIBRAW library */ -#cmakedefine RAW_R_DELEGATE @RAW_R_DELEGATE@ +#cmakedefine RAW_R_DELEGATE /* Define as the return type of signal handlers (`int' or `void'). */ #cmakedefine RETSIGTYPE @RETSIGTYPE@ @@ -880,17 +880,17 @@ #cmakedefine SETJMP_IS_THREAD_SAFE /* 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@ @@ -902,7 +902,7 @@ #cmakedefine SIZEOF_FLOAT @SIZEOF_FLOAT@ /* The size of `float_t', as computed by sizeof. */ -#cmakedefine SIZEOF_FLOAT_T @SIZEOF_FLOAT_T@ +#cmakedefine SIZEOF_FLOAT_T @SIZEOF_FLOAT_T@" /* The size of `long double', as computed by sizeof. */ #cmakedefine SIZEOF_LONG_DOUBLE @SIZEOF_LONG_DOUBLE@ @@ -947,13 +947,13 @@ #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@ +#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 @@ -962,10 +962,10 @@ #cmakedefine TIFF_DELEGATE /* Define to 1 if you can safely include both and . */ -#cmakedefine TIME_WITH_SYS_TIME @TIME_WITH_SYS_TIME@ +#cmakedefine TIME_WITH_SYS_TIME 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 @@ -990,7 +990,7 @@ /* Version number of package */ -#cmakedefine VERSION @VERSION@ +#cmakedefine VERSION "@VERSION@" /* Define if you have WEBPMUX library */ #cmakedefine WEBPMUX_DELEGATE @@ -1020,7 +1020,7 @@ #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 @@ -1029,10 +1029,10 @@ #cmakedefine XML_DELEGATE /* 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 @@ -1055,38 +1055,38 @@ #cmakedefine _FORTIFY_SOURCE /* 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 _MINIX 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@ +#cmakedefine _POSIX_1_SOURCE 2 /* Define to 1 if you need to in order for `stat' and other things to work. */ -#cmakedefine _POSIX_SOURCE @_POSIX_SOURCE@ +#cmakedefine _POSIX_SOURCE 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 /* 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 /* 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 /* Define to 1 if type `char' is unsigned and you are not using gcc. */ #ifndef __CHAR_UNSIGNED__ @@ -1105,7 +1105,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 @@ -1148,6 +1148,7 @@ nothing if this is not supported. Do not define if restrict is supported 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 From a3f46d4a74ee2ca2496862259057578cc893c0d2 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 16:54:37 +0200 Subject: [PATCH 018/156] CMake: fix OpenCL header check --- CMakeLists.txt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f9eb62a4b5..d95000689a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,10 +308,10 @@ if(CMAKE_USE_PTHREADS_INIT) set(THREADS_PREFER_PTHREAD_FLAG TRUE) set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} Threads::Threads) endif() -CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H) +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) + 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 "") @@ -379,8 +379,12 @@ magick_find_delegate(DELEGATE HAVE_MTMALLOC NAME MTMalloc 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) + 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? From c208caa30d9ab49224b0619a22bb50a0e8eb9fec Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 17:05:37 +0200 Subject: [PATCH 019/156] CMake: fix complex.h function detection, which broke fftw --- cmake/checks.cmake | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index f7ffd6d53b9..7c4034e20c5 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -13,6 +13,13 @@ include(CheckSourceRuns) include(TestBigEndian) macro(magick_check_env) + # libm is required for complex.h checks + check_library_exists(m pow "" LIBM) + if (LIBM) + set(CMAKE_REQUIRED_LIBRARIES m) + link_libraries(m) + endif() + # Check if `' exists check_include_file(dirent.h HAVE_DIRENT_H) @@ -44,13 +51,13 @@ macro(magick_check_env) check_cxx_source_compiles ("void main () {bool b = false;}" HAVE_BOOL) # 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) @@ -68,7 +75,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) From 3bd26985ad39c01a80e3130c59b45d60219aa0c6 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 17:26:43 +0200 Subject: [PATCH 020/156] Add conanfile.py --- conanfile.py | 428 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 428 insertions(+) create mode 100644 conanfile.py diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000000..876918594b2 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,428 @@ +import os + +from conan import ConanFile +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_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_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/**", + "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 + + 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_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 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["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"] = False + 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", + "ltdl": "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, "CMakeLists.txt"), + "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME PangoCairo DEFAULT FALSE)\n", + "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME Pango DEFAULT FALSE TARGETS Pango::Pango)\n") + + 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_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) From 8306809b38b43671ee06b7f142ccdb9be9fc32c6 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 17:38:37 +0200 Subject: [PATCH 021/156] opencl.c: replace lt_dlclose() with dlclose() / FreeLibrary() --- MagickCore/opencl.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index a683ed15e16..7fb87bc8701 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -90,9 +90,6 @@ #include "MagickCore/utility-private.h" #if defined(MAGICKCORE_OPENCL_SUPPORT) -#if defined(MAGICKCORE_LTDL_DELEGATE) -#include "ltdl.h" -#endif #ifndef MAGICKCORE_WINDOWS_SUPPORT #include @@ -2598,8 +2595,13 @@ MagickPrivate void OpenCLTerminus() RelinquishSemaphoreInfo(&openCL_lock); if (openCL_library != (MagickLibrary *) NULL) { - if (openCL_library->library != (void *) NULL) - (void) lt_dlclose(openCL_library->library); + if (openCL_library->library != (void *) NULL) { +#ifdef MAGICKCORE_WINDOWS_SUPPORT + (void) FreeLibrary((HMODULE)openCL_library->library); +#else + (void) dlclose(openCL_library->library); +#endif + } openCL_library=(MagickLibrary *) RelinquishMagickMemory(openCL_library); } } @@ -2759,7 +2761,7 @@ MagickPrivate MagickBooleanType RecordProfileData(MagickCLDevice device, return(MagickTrue); } start/=1000; /* usecs */ - end/=1000; + end/=1000; elapsed=end-start; LockSemaphoreInfo(device->lock); i=0; From c1888e75a2c989cbdf7cb5310bef89975da61b57 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 10 Dec 2023 22:26:43 +0200 Subject: [PATCH 022/156] CMake: fix errors in checks.cmake --- cmake/checks.cmake | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 7c4034e20c5..d494baddddf 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -33,7 +33,7 @@ macro(magick_check_env) 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) @@ -109,7 +109,7 @@ macro(magick_check_env) " #include void main () {double_t d = 0;} - " + " HAVE_DOUBLE_T) # Check if `erf' exists @@ -131,7 +131,7 @@ macro(magick_check_env) check_include_file(fcntl.h HAVE_FCNTL_H) # Check if exists - check_include_file(fcntl.h HAVE_FLOAT_H) + check_include_file(float.h HAVE_FLOAT_H) # Check if `floor' exists check_function_exists(floor HAVE_FLOOR) @@ -179,7 +179,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) @@ -288,7 +288,7 @@ macro(magick_check_env) # Check if `std::' exists check_cxx_source_compiles ( " - #include + #include void main() {std::istream& is = std::cin;} " HAVE_NAMESPACE_STD) @@ -374,7 +374,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) @@ -407,7 +407,7 @@ macro(magick_check_env) # Check if exists and conforms to C99 check_cxx_source_compiles ( " - #include + #include void main() {bool b = __bool_true_false_are_defined;} " HAVE_STDBOOL_H) @@ -431,7 +431,7 @@ macro(magick_check_env) #ifdef HAVE_NAMESPACES using namespace std; #endif - + void main() {} " HAVE_STD_LIBS) @@ -496,7 +496,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) @@ -775,7 +775,7 @@ 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 @@ -784,7 +784,7 @@ macro(magick_check_env) # Check strerror_r returns `char *' check_cxx_source_compiles( " - void main() + void main() { char buf[100]; char x = *strerror_r(0, buf, sizeof buf); @@ -843,13 +843,13 @@ macro(magick_check_env) if(HAVE___FUNC__) set(__func__ __func__) - elseif(HAVE___FUNCTION__) + elseif(HAVE___FUNCTION__) set(__func__ __FUNCTION__) else() set(__func__ "") endif() - # Check if `const' is supported by compiler + # Check if `const' is supported by compiler check_c_source_compiles("void 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) From 690547b29128b3675e40aa8c79089c3abf9524ca Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 00:03:29 +0200 Subject: [PATCH 023/156] CMake: further config.h.cmake fixes --- cmake/checks.cmake | 145 ++++++++++---------- config/config.h.cmake | 306 +++++++++++++++++++++++++----------------- 2 files changed, 256 insertions(+), 195 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index d494baddddf..69134f173d6 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -17,7 +17,7 @@ macro(magick_check_env) check_library_exists(m pow "" LIBM) if (LIBM) set(CMAKE_REQUIRED_LIBRARIES m) - link_libraries(m) + set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES}) endif() # Check if `' exists @@ -48,7 +48,7 @@ macro(magick_check_env) 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) + check_cxx_source_compiles ("int main () {bool b = false;}" HAVE_BOOL) # Check if `carg' exists check_symbol_exists(carg complex.h HAVE_CARG) @@ -83,6 +83,16 @@ 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) @@ -105,10 +115,18 @@ macro(magick_check_env) check_include_file(dlfcn.h HAVE_DLFCN_H) # Check if `double_t' exists - check_cxx_source_compiles ( + check_c_source_compiles ( + " + #include + int main () {float_t f = 0;} + " + HAVE_FLOAT_T) + + # Check if `double_t' exists + check_c_source_compiles ( " #include - void main () {double_t d = 0;} + int main () {double_t d = 0;} " HAVE_DOUBLE_T) @@ -136,6 +154,9 @@ macro(magick_check_env) # Check if `floor' exists check_function_exists(floor HAVE_FLOOR) + # Check if `fork' exists + check_function_exists(fork HAVE_FORK) + # Check if `fseeko' exists check_function_exists(fseeko HAVE_FSEEKO) @@ -215,7 +236,16 @@ macro(magick_check_env) check_include_file(limits.h HAVE_LIMITS_H) # Check if you have Linux-compatible sendfile() - # HAVE_LINUX_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) @@ -249,6 +279,9 @@ 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) @@ -259,7 +292,14 @@ macro(magick_check_env) 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) @@ -283,13 +323,13 @@ macro(magick_check_env) check_function_exists(munmap HAVE_MUNMAP) # Check if `namespace' exists - check_cxx_source_compiles ("namespace test {} void main() {using namespace ::test;}" HAVE_NAMESPACES) + 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;} + int main() {std::istream& is = std::cin;} " HAVE_NAMESPACE_STD) @@ -401,17 +441,20 @@ 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;} + int main() {bool b = __bool_true_false_are_defined;} " HAVE_STDBOOL_H) + # Check if exists + check_include_file(stddef.h HAVE_STDDEF_H) + # Check if exists check_include_file(stdint.h HAVE_STDINT_H) @@ -432,7 +475,7 @@ macro(magick_check_env) using namespace std; #endif - void main() {} + int main() {} " HAVE_STD_LIBS) set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) @@ -683,31 +726,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) - # Check `double' size check_type_size(double SIZEOF_DOUBLE) @@ -753,8 +775,8 @@ macro(magick_check_env) # Check `size_t' size check_type_size("size_t" SIZEOF_SIZE_T) - # Check `size_t' size - check_type_size("size_t" SIZEOF_SIZE_T) + # Check `ssize_t' size + check_type_size("ssize_t" SIZEOF_SSIZE_T) # Check `unsigned int' size check_type_size("unsigned int" SIZEOF_UNSIGNED_INT) @@ -784,24 +806,14 @@ macro(magick_check_env) # Check strerror_r returns `char *' check_cxx_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) @@ -811,21 +823,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) @@ -838,19 +847,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__) + 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_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 " ") @@ -868,23 +876,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 @@ -894,7 +900,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) @@ -963,7 +968,7 @@ macro(magick_check_env) # Check if `volatile' works check_cxx_source_compiles( " - void main() { volatile int i = 1; } + int main() { volatile int i = 1; } " HAVE_VOLATILE) diff --git a/config/config.h.cmake b/config/config.h.cmake index 9963b33b8d5..c5593f47b2e 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -1,26 +1,25 @@ /* 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 /* Channel mask depth */ #cmakedefine CHANNEL_MASK_DEPTH @CHANNEL_MASK_DEPTH@ /* permit enciphering and deciphering image pixels */ -#cmakedefine CIPHER_SUPPORT +#cmakedefine CIPHER_SUPPORT 1 /* coders subdirectory. */ #cmakedefine CODER_DIRNAME "@CODER_DIRNAME@" @@ -33,7 +32,7 @@ #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@" @@ -42,7 +41,7 @@ #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 "@EXCLUDE_DEPRECATED@" @@ -51,28 +50,28 @@ #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@" /* 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 1 @@ -148,7 +147,7 @@ /* Define to 1 if you have the declaration of `strlcpy', and to 0 if you don't. */ -#cmakedefine HAVE_DECL_STRLCPY 1 +#cmakedefine01 HAVE_DECL_STRLCPY /* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. */ @@ -208,37 +207,37 @@ #cmakedefine HAVE_GETC_UNLOCKED 1 /* Define to 1 if you have the `getdtablesize' function. */ -#cmakedefine HAVE_GETDTABLESIZE +#cmakedefine HAVE_GETDTABLESIZE 1 /* Define to 1 if you have the `getentropy' function. */ -#cmakedefine HAVE_GETENTROPY +#cmakedefine HAVE_GETENTROPY 1 /* Define to 1 if you have the `getexecname' function. */ -#cmakedefine HAVE_GETEXECNAME +#cmakedefine HAVE_GETEXECNAME 1 /* Define to 1 if you have the `getpagesize' function. */ -#cmakedefine HAVE_GETPAGESIZE +#cmakedefine HAVE_GETPAGESIZE 1 /* Define to 1 if you have the `getpid' function. */ -#cmakedefine HAVE_GETPID +#cmakedefine HAVE_GETPID 1 /* Define to 1 if you have the `getpwnam_r' function. */ -#cmakedefine HAVE_GETPWNAM_R +#cmakedefine HAVE_GETPWNAM_R 1 /* Define to 1 if you have the `getrlimit' function. */ -#cmakedefine HAVE_GETRLIMIT +#cmakedefine HAVE_GETRLIMIT 1 /* Define to 1 if you have the `getrusage' function. */ -#cmakedefine HAVE_GETRUSAGE +#cmakedefine HAVE_GETRUSAGE 1 /* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY +#cmakedefine HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `gmtime_r' function. */ -#cmakedefine 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 1 @@ -259,19 +258,19 @@ #cmakedefine HAVE_J1 1 /* Define if you have jemalloc memory allocation library */ -#cmakedefine HAVE_JEMALLOC +#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 1 @@ -280,7 +279,7 @@ #cmakedefine HAVE_LIMITS_H 1 /* Define if you have Linux-compatible sendfile() */ -#cmakedefine HAVE_LINUX_SENDFILE +#cmakedefine HAVE_LINUX_SENDFILE 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LINUX_UNISTD_H 1 @@ -338,7 +337,7 @@ #cmakedefine HAVE_MMAP 1 /* Define if you have the mtmalloc memory allocation library */ -#cmakedefine HAVE_MTMALLOC +#cmakedefine HAVE_MTMALLOC 1 /* Define to 1 if you have the `munmap' function. */ #cmakedefine HAVE_MUNMAP 1 @@ -404,10 +403,10 @@ #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 @@ -446,10 +445,10 @@ #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 1 @@ -475,6 +474,9 @@ /* Define to 1 if stdbool.h conforms to C99. */ #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 1 @@ -503,7 +505,7 @@ #cmakedefine HAVE_STRERROR 1 /* Define if you have `strerror_r'. */ -#cmakedefine HAVE_STRERROR_R +#cmakedefine HAVE_STRERROR_R 1 /* Define to 1 if cpp supports the ANSI # stringizing operator. */ #cmakedefine HAVE_STRINGIZE 1 @@ -609,6 +611,9 @@ /* Define to 1 if you have the header file. */ #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 1 @@ -630,6 +635,9 @@ /* Define to 1 if you have the `TIFFReadEXIFDirectory' function. */ #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 1 @@ -663,7 +671,7 @@ #cmakedefine HAVE_ULLTOSTR 1 /* Define if you have umem memory allocation library */ -#cmakedefine HAVE_UMEM +#cmakedefine HAVE_UMEM 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UNISTD_H 1 @@ -738,10 +746,10 @@ #cmakedefine HAVE__WSTAT 1 /* define if your compiler has __attribute__ */ -#cmakedefine HAVE___ATTRIBUTE__ +#cmakedefine HAVE___ATTRIBUTE__ 1 /* Define if you have libheif library */ -#cmakedefine HEIC_DELEGATE +#cmakedefine HEIC_DELEGATE 1 /* Directory where ImageMagick architecture headers live. */ #cmakedefine INCLUDEARCH_PATH "@INCLUDEARCH_PATH@" @@ -750,22 +758,22 @@ #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@" @@ -779,11 +787,11 @@ #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@" @@ -792,7 +800,7 @@ #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@" @@ -819,7 +827,7 @@ #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@" @@ -843,16 +851,16 @@ #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. */ @@ -865,19 +873,16 @@ #cmakedefine QUANTUM_DEPTH_OBSOLETE_IN_H @QUANTUM_DEPTH_OBSOLETE_IN_H@ /* Define if you have RAQM library */ -#cmakedefine RAQM_DELEGATE +#cmakedefine RAQM_DELEGATE 1 /* Define if you have LIBRAW library */ -#cmakedefine 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 +#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@" @@ -902,7 +907,7 @@ #cmakedefine SIZEOF_FLOAT @SIZEOF_FLOAT@ /* The size of `float_t', as computed by sizeof. */ -#cmakedefine SIZEOF_FLOAT_T @SIZEOF_FLOAT_T@" +#cmakedefine SIZEOF_FLOAT_T @SIZEOF_FLOAT_T@ /* The size of `long double', as computed by sizeof. */ #cmakedefine SIZEOF_LONG_DOUBLE @SIZEOF_LONG_DOUBLE@ @@ -925,8 +930,8 @@ /* The size of `size_t', as computed by sizeof. */ #cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ -/* The size of `size_t', as computed by sizeof. */ -#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@ +/* The size of `ssize_t', as computed by sizeof. */ +#cmakedefine SIZEOF_SSIZE_T @SIZEOF_SSIZE_T@ /* The size of `unsigned int', as computed by sizeof. */ #cmakedefine SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@ @@ -949,43 +954,108 @@ /* Define to 1 if the `S_IS*' macros in do not work properly. */ #cmakedefine STAT_MACROS_BROKEN 1 -/* Define to 1 if you have the ANSI C header files. */ +/* 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 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 1 +#cmakedefine TIFF_DELEGATE 1 /* Define to 1 if your declares `struct tm'. */ #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 +/* Define to 2 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_1_SOURCE +#cmakedefine _POSIX_1_SOURCE 1 #endif -/* Enable threading extensions on Solaris. */ +/* 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 @@ -993,19 +1063,19 @@ #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,7 +1085,7 @@ # endif #else # ifndef WORDS_BIGENDIAN -#cmakedefine WORDS_BIGENDIAN +#cmakedefine WORDS_BIGENDIAN 1 # endif #endif @@ -1023,10 +1093,10 @@ #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 1 @@ -1035,65 +1105,51 @@ #cmakedefine ZERO_CONFIGURATION_SUPPORT 1 /* Define if you have ZIP library */ -#cmakedefine ZIP_DELEGATE +#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 1 /* Define for large files, on AIX-style hosts. */ -#cmakedefine _LARGE_FILES - -/* Define to 1 if on MINIX. */ -#cmakedefine _MINIX 1 +#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 2 - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -#cmakedefine _POSIX_SOURCE 1 +#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 +#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 +#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 +#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. */ @@ -1141,20 +1197,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 From 07fa530852b1a0ab1df21eb058a0c8d63b004f12 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 00:04:18 +0200 Subject: [PATCH 024/156] CMake: add HAVE_TCMALLOC option --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d95000689a0..e659918b8eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -373,8 +373,9 @@ 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_UMEM NAME UMEM 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) From 9ba29d85fcbc9c3a0b5f157d9d482d10cb888e0a Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 00:05:50 +0200 Subject: [PATCH 025/156] CMake: add BUILD_TESTS, cleaner library names in CMakeLists.txt --- CMakeLists.txt | 32 ++++++++++++++++++-------------- Magick++/CMakeLists.txt | 21 ++++++++++----------- MagickCore/CMakeLists.txt | 22 ++++++++++------------ MagickWand/CMakeLists.txt | 23 +++++++++++------------ tests/CMakeLists.txt | 34 ++++++++++++++++++++++++++++++++++ utilities/CMakeLists.txt | 12 ++++++------ 6 files changed, 89 insertions(+), 55 deletions(-) create mode 100644 tests/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index e659918b8eb..e4115346439 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,25 +98,29 @@ magick_check_env() ####### 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}) +add_compile_definitions(-DMAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) +set(QUANTUM_DEPTH_OBSOLETE_IN_H ${MAGICKCORE_QUANTUM_DEPTH}) option(MAGICK_BUILD_STATIC "Build ImageMagick statically" FALSE) if(MAGICK_BUILD_STATIC) - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -D_LIB) + add_compile_definitions(-D_LIB) + set(BUILD_SHARED_LIBS FALSE) else() - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -D_DLL) + add_compile_definitions(-D_DLL) + set(BUILD_SHARED_LIBS TRUE) 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) + add_compile_definitions(-DMAGICKCORE_HDRI_ENABLE=1) else() - set(MAGICK_BUILD_DEFINES ${MAGICK_BUILD_DEFINES} -DMAGICKCORE_HDRI_ENABLE=0) + add_compile_definitions(-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) @@ -298,7 +302,7 @@ 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}) + add_compile_definitions(-D_OPENMP=${OpenMP_C_SPEC_DATE}) endif() magick_find_delegate(DELEGATE THREADS_SUPPORT NAME Threads DEFAULT TRUE TARGETS) @@ -323,6 +327,7 @@ if(TIFF_FOUND) 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) @@ -528,19 +533,18 @@ 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") # Add the subdirectories to be compiled -add_subdirectory("MagickCore") -add_subdirectory("MagickWand") +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) + add_subdirectory(tests) endif() install(FILES diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index 03b390a3b37..a39e2ce7a8b 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -11,7 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# +# project(Magick++ CXX) @@ -77,18 +77,17 @@ 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 -D_MAGICKLIB_) +target_link_libraries(Magick++ PUBLIC MagickWand) -install(TARGETS ${MAGICKXX_BINARY_NAME} +install(TARGETS Magick++ RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index d68878d2107..34e1cb50943 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -702,23 +702,21 @@ 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 -lm) 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 -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") -install(TARGETS ${MAGICKCORE_BINARY_NAME} +install(TARGETS MagickCore RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib diff --git a/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 50e22a78c2f..4436d62306f 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -11,7 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# +# project(MagickWand C) @@ -99,20 +99,19 @@ 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_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}) # 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}) +target_compile_definitions(MagickWand PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") +target_link_libraries(MagickWand PUBLIC MagickCore) -install(TARGETS ${MAGICKWAND_BINARY_NAME} +install(TARGETS MagickWand RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000000..96724609208 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,34 @@ +# 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. + +enable_testing() + +# Validate Test +add_executable(validate validate.c) +target_link_libraries(validate PRIVATE MagickCore MagickWand) +add_test(NAME validate_test COMMAND validate) + +# Drawtest +add_executable(drawtest drawtest.c) +target_link_libraries(drawtest PRIVATE MagickCore MagickWand) +add_test(NAME drawtest_test COMMAND drawtest) + +# Wandtest +add_executable(wandtest wandtest.c) +target_link_libraries(wandtest PRIVATE MagickCore MagickWand) +add_test(NAME wandtest_test COMMAND wandtest) + +set_directory_properties(PROPERTIES ADDITIONAL_CLEAN_FILES "tests/*_out.*") diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index e2048ae3f5b..1a8b4905d66 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -11,7 +11,7 @@ # under the License. # # CMake script file to build ImageMagick -# +# project(Magick C) @@ -19,13 +19,13 @@ 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_compile_definitions(magick PRIVATE ${MAGICK_BUILD_DEFINES}) +target_link_libraries(magick PRIVATE MagickWand) -install(TARGETS ${MAGICK_BINARY_NAME} +install(TARGETS magick RUNTIME DESTINATION bin BUNDLE DESTINATION bin ) From 4b16d5455f008da4ee081a65a6f77ce650d59527 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 14:07:16 +0200 Subject: [PATCH 026/156] CMake: run TAP tests with CTest --- tests/CMakeLists.txt | 69 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 96724609208..8fad00e3d7b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,21 +14,68 @@ # # CMakeLists.txt for the ImageMagick validation suite. -enable_testing() - -# Validate Test add_executable(validate validate.c) target_link_libraries(validate PRIVATE MagickCore MagickWand) -add_test(NAME validate_test COMMAND validate) - -# Drawtest add_executable(drawtest drawtest.c) target_link_libraries(drawtest PRIVATE MagickCore MagickWand) -add_test(NAME drawtest_test COMMAND drawtest) - -# Wandtest add_executable(wandtest wandtest.c) target_link_libraries(wandtest PRIVATE MagickCore MagickWand) -add_test(NAME wandtest_test COMMAND wandtest) -set_directory_properties(PROPERTIES ADDITIONAL_CLEAN_FILES "tests/*_out.*") +enable_testing() + +set(TEST_ENV + "CONVERT=${CMAKE_BINARY_DIR}/utilities/magick" + "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/magick" + "VALIDATE=${CMAKE_BINARY_DIR}/tests/validate" + "DRAWTEST=${CMAKE_BINARY_DIR}/tests/drawtest" + "WANDTEST=${CMAKE_BINARY_DIR}/tests/wandtest" + "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}" + "srcdir=${CMAKE_CURRENT_BINARY_DIR}" + "TOPSRCDIR=${CMAKE_SOURCE_DIR}" + "REFERENCE_IMAGE=${CMAKE_SOURCE_DIR}/images/rose.pnm" +) + +macro(add_tap_test TEST_NAME) + add_test( + NAME ${TEST_NAME} + COMMAND sh -c "sh ${TEST_NAME}.tap | tee /dev/fd/2 | grep -q 'not ok' && exit 1 || exit 0" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "${TEST_ENV}") +endmacro() + +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(cli-colorspace) +add_tap_test(cli-pipe) +add_tap_test(drawtest) +add_tap_test(wandtest) + +add_custom_target(copy_test_resources ALL) +file(GLOB TEST_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.tap *.miff *.pnm) +foreach(TEST_RESOURCE ${TEST_RESOURCES}) + set(SRC ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_RESOURCE}) + set(DST ${CMAKE_CURRENT_BINARY_DIR}/${TEST_RESOURCE}) + add_custom_command( + OUTPUT ${DST} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} ${DST} + DEPENDS ${SRC} + ) + add_custom_target(copy_${TEST_RESOURCE} ALL DEPENDS ${SRC} ${DST}) + add_dependencies(copy_test_resources copy_${TEST_RESOURCE}) +endforeach() + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/common.shi "") +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tests/common.shi "") + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") From e2fe103aeede79f1bc67f4c9b1d0b87343e75ef6 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 15:01:31 +0200 Subject: [PATCH 027/156] CMake: set project() only once --- CMakeLists.txt | 4 +--- Magick++/CMakeLists.txt | 2 +- MagickCore/CMakeLists.txt | 2 -- MagickWand/CMakeLists.txt | 2 -- utilities/CMakeLists.txt | 2 -- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4115346439..2fb356c9e90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,9 +13,7 @@ # CMake script file to build ImageMagick # cmake_minimum_required(VERSION 3.19.0) -cmake_policy(VERSION 3.19.0) - -project(ImageMagick) +project(ImageMagick LANGUAGES C) include(cmake/checks.cmake) diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index a39e2ce7a8b..7e633c5c342 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -13,7 +13,7 @@ # CMake script file to build ImageMagick # -project(Magick++ CXX) +enable_language(CXX) SET(MAGICKXX_PUBLIC_HEADERS lib/Magick++/Blob.h diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index 34e1cb50943..14add14f86a 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -13,8 +13,6 @@ # CMake script file to build ImageMagick # -project(MagickCore C) - set(MAGICKCORE_SRC MagickCore.h accelerate.c diff --git a/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 4436d62306f..9dd45d45b04 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -13,8 +13,6 @@ # CMake script file to build ImageMagick # -project(MagickWand C) - set(MAGICKWAND_SRC MagickWand.h animate.c diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index 1a8b4905d66..cfa936eaca9 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -13,8 +13,6 @@ # CMake script file to build ImageMagick # -project(Magick C) - set(MAGICK_SRC magick.c ) From ddd5a3e2dc9f3093f8f110b5aefe4e25168cf970 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 15:01:55 +0200 Subject: [PATCH 028/156] CMake: add symlinked executables --- tests/CMakeLists.txt | 17 +++++++++++++++-- utilities/CMakeLists.txt | 11 ++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8fad00e3d7b..f3130363ab3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -21,14 +21,27 @@ target_link_libraries(drawtest PRIVATE MagickCore MagickWand) add_executable(wandtest wandtest.c) target_link_libraries(wandtest PRIVATE MagickCore MagickWand) +# Adding CTEST_PARALLEL_LEVEL=15 env var to the ctest command is recommended. enable_testing() set(TEST_ENV - "CONVERT=${CMAKE_BINARY_DIR}/utilities/magick" - "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/magick" + "MAGICK=${CMAKE_BINARY_DIR}/utilities/magick" + "ANIMATE=${CMAKE_BINARY_DIR}/utilities/animate" + "COMPARE=${CMAKE_BINARY_DIR}/utilities/compare" + "COMPOSITE=${CMAKE_BINARY_DIR}/utilities/composite" + "CONJURE=${CMAKE_BINARY_DIR}/utilities/conjure" + "CONVERT=${CMAKE_BINARY_DIR}/utilities/convert" + "DISPLAY=${CMAKE_BINARY_DIR}/utilities/display" + "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/identify" + "IMPORT=${CMAKE_BINARY_DIR}/utilities/import" + "MOGRIFY=${CMAKE_BINARY_DIR}/utilities/mogrify" + "MONTAGE=${CMAKE_BINARY_DIR}/utilities/montage" + "STREAM=${CMAKE_BINARY_DIR}/utilities/stream" + "VALIDATE=${CMAKE_BINARY_DIR}/tests/validate" "DRAWTEST=${CMAKE_BINARY_DIR}/tests/drawtest" "WANDTEST=${CMAKE_BINARY_DIR}/tests/wandtest" + "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}" "srcdir=${CMAKE_CURRENT_BINARY_DIR}" "TOPSRCDIR=${CMAKE_SOURCE_DIR}" diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index cfa936eaca9..d21f02de05a 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -20,10 +20,19 @@ set(MAGICK_SRC add_executable(magick ${MAGICK_SRC} ${MAGICK_RESOURCE_FILE_PATH}) target_include_directories(magick PRIVATE ${IMAGEMAGICK_BASE_PATH}) -target_compile_definitions(magick PRIVATE ${MAGICK_BUILD_DEFINES}) target_link_libraries(magick PRIVATE MagickWand) +set(MAGICK_LINKED_UTILITIES animate compare composite conjure convert display identify import magick-script mogrify montage stream) +foreach(utility ${MAGICK_LINKED_UTILITIES}) + add_custom_command(TARGET magick POST_BUILD + COMMAND ${CMAKE_COMMAND} -E create_symlink magick $/${utility} + ) +endforeach() + install(TARGETS magick RUNTIME DESTINATION bin BUNDLE DESTINATION bin ) +foreach(utility ${MAGICK_LINKED_UTILITIES}) + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${CMAKE_INSTALL_PREFIX}/bin/${utility})") +endforeach() From 7f19aea5c39a802039577868e638a029fc79185d Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 15:02:14 +0200 Subject: [PATCH 029/156] conanfile.py: set BUILD_TEST=FALSE --- conanfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conanfile.py b/conanfile.py index 876918594b2..dea60f3772a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -193,6 +193,7 @@ def generate(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 From c3f1159bbb8cced4a852185afe791d3442ce5cf9 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 15:43:07 +0200 Subject: [PATCH 030/156] CMake: improve CMake project structure --- CMakeLists.txt | 494 ++------------------------------------ MagickCore/CMakeLists.txt | 13 +- cmake/checks.cmake | 117 +++++---- cmake/configure.cmake | 211 ++++++++++++++++ cmake/delegates.cmake | 147 ++++++++++++ cmake/parse_version.cmake | 55 +++++ cmake/platform_vars.cmake | 49 ++++ 7 files changed, 557 insertions(+), 529 deletions(-) create mode 100644 cmake/configure.cmake create mode 100644 cmake/delegates.cmake create mode 100644 cmake/parse_version.cmake create mode 100644 cmake/platform_vars.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fb356c9e90..3cb49e0b167 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,91 +15,31 @@ cmake_minimum_required(VERSION 3.19.0) project(ImageMagick LANGUAGES C) -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}) - 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() - -# 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() - -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") +option(MAGICK_BUILD_STATIC "Build ImageMagick statically" FALSE) +option(MAGICK_HDRI_ENABLE "Build ImageMagick with High dynamic-range imaging" TRUE) +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(PixelCacheThreshold "" CACHE STRING "Set pixel cache threshhold 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") + add_compile_definitions(-DMAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) set(QUANTUM_DEPTH_OBSOLETE_IN_H ${MAGICKCORE_QUANTUM_DEPTH}) -option(MAGICK_BUILD_STATIC "Build ImageMagick statically" FALSE) if(MAGICK_BUILD_STATIC) add_compile_definitions(-D_LIB) set(BUILD_SHARED_LIBS FALSE) @@ -108,7 +48,6 @@ else() set(BUILD_SHARED_LIBS TRUE) endif() -option(MAGICK_HDRI_ENABLE "Build ImageMagick with High dynamic-range imaging" TRUE) if(MAGICK_HDRI_ENABLE) set(HDRI_SUFFIX HDRI) add_compile_definitions(-DMAGICKCORE_HDRI_ENABLE=1) @@ -116,28 +55,14 @@ else() add_compile_definitions(-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)") -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) if(WITH_64BIT_CHANNEL_MASK_SUPPORT) set(CHANNEL_MASK_DEPTH 64) else() set(CHANNEL_MASK_DEPTH 32) endif() -set(SECURITY_POLICY "open" CACHE STRING "Set the security policy variant to enforce") -set_property(CACHE SECURITY_POLICY PROPERTY STRINGS "open;limited;secure;websafe") message(STATUS "Security policy variant to enforce: ${SECURITY_POLICY}") if(NOT SECURITY_POLICY STREQUAL "open") message(FATAL_ERROR "Only 'open' security policy is supported at this time.") @@ -145,390 +70,17 @@ if(NOT SECURITY_POLICY STREQUAL "open") # Copy config/policy-${SECURITY_POLICY}.xml to ${MAGICK_CONFIGURE_PATH}/policy.xml endif() -# 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() - -# 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) -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) - -####### 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 "") - -# 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) - add_compile_definitions(-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_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) -# 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 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() - -# 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_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) -set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) - -set(IMAGEMAGICK_INC_DIR "include/ImageMagick-${MAGICK_VERSION_MAJOR}") +include(cmake/delegates.cmake) ####### 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() +include(cmake/configure.cmake) +####### BUILD ####### # Set the binaries name set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MagickQuantumDepth}${HDRI_SUFFIX}") diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index 14add14f86a..c563c8d6e39 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -238,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 @@ -655,8 +655,7 @@ if(DMR_DELEGATE) 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) @@ -690,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) @@ -709,7 +710,7 @@ set_target_properties(MagickCore PROPERTIES target_include_directories(MagickCore PUBLIC ${IMAGEMAGICK_BASE_PATH}) target_link_libraries(MagickCore PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES}) if(UNIX) - target_link_libraries(MagickCore 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 PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 69134f173d6..bf168c24048 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -1,18 +1,23 @@ -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) + 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() + # libm is required for complex.h checks check_library_exists(m pow "" LIBM) if (LIBM) @@ -47,8 +52,10 @@ 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 ("int 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_symbol_exists(carg complex.h HAVE_CARG) @@ -322,16 +329,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 {} int 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 - int 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) @@ -444,13 +453,15 @@ macro(magick_check_env) # Check if `' exists check_include_file(stdarg.h HAVE_STDARG_H) - # Check if exists and conforms to C99 - check_cxx_source_compiles ( - " - #include - int 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) @@ -461,24 +472,26 @@ 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 - - int main() {} - " - HAVE_STD_LIBS) - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) # Check if `strcasecmp' exists check_function_exists(strcasecmp HAVE_STRCASECMP) @@ -504,7 +517,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]); } @@ -804,7 +817,7 @@ macro(magick_check_env) 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( " #include int main() { @@ -966,7 +979,7 @@ macro(magick_check_env) set(uintptr_t "") # Check if `volatile' works - check_cxx_source_compiles( + check_c_source_compiles( " int main() { volatile int i = 1; } " diff --git a/cmake/configure.cmake b/cmake/configure.cmake new file mode 100644 index 00000000000..c618809d67e --- /dev/null +++ b/cmake/configure.cmake @@ -0,0 +1,211 @@ +include(${CMAKE_CURRENT_LIST_DIR}/checks.cmake) +magick_check_env() + +include(${CMAKE_CURRENT_LIST_DIR}/parse_version.cmake) + +# 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) +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) + +####### 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 "") + +# 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 the version.h file path to be autogenerated +configure_file(${CMAKE_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() \ No newline at end of file diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake new file mode 100644 index 00000000000..2dc500042c9 --- /dev/null +++ b/cmake/delegates.cmake @@ -0,0 +1,147 @@ +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}) + 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(-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_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) +# 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 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() + +# 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_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) +set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) + +set(IMAGEMAGICK_INC_DIR "include/ImageMagick-${MAGICK_VERSION_MAJOR}") diff --git a/cmake/parse_version.cmake b/cmake/parse_version.cmake new file mode 100644 index 00000000000..3dcee627970 --- /dev/null +++ b/cmake/parse_version.cmake @@ -0,0 +1,55 @@ +# 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() + +# 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() diff --git a/cmake/platform_vars.cmake b/cmake/platform_vars.cmake new file mode 100644 index 00000000000..26bedcee374 --- /dev/null +++ b/cmake/platform_vars.cmake @@ -0,0 +1,49 @@ +# 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() From 8bb482bf8131b6819ecb0ccdaed0ac494909b478 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 15:45:15 +0200 Subject: [PATCH 031/156] CMake: fix typo --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cb49e0b167..c07364c336f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ 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(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) From 8d3fdb5b33e9e00b3883da214c22bb15a88f685b Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 16:48:34 +0200 Subject: [PATCH 032/156] CMake: add Magick++ tests --- CMakeLists.txt | 6 ++++ Magick++/demo/CMakeLists.txt | 26 +++++++++++++++ Magick++/tests/CMakeLists.txt | 26 +++++++++++++++ cmake/test_helpers.cmake | 58 ++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 63 ++++------------------------------- 5 files changed, 122 insertions(+), 57 deletions(-) create mode 100644 Magick++/demo/CMakeLists.txt create mode 100644 Magick++/tests/CMakeLists.txt create mode 100644 cmake/test_helpers.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c07364c336f..d9b872ce5b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,13 @@ if(BUILD_UTILITIES) add_subdirectory(utilities) endif() if(BUILD_TESTS) + # Running ctest with CTEST_PARALLEL_LEVEL=15 env var is recommended. + enable_testing() add_subdirectory(tests) + if(BUILD_MAGICKPP) + add_subdirectory(Magick++/tests) + add_subdirectory(Magick++/demo) + endif() endif() install(FILES diff --git a/Magick++/demo/CMakeLists.txt b/Magick++/demo/CMakeLists.txt new file mode 100644 index 00000000000..387aac9a80b --- /dev/null +++ b/Magick++/demo/CMakeLists.txt @@ -0,0 +1,26 @@ +# 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) + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") diff --git a/Magick++/tests/CMakeLists.txt b/Magick++/tests/CMakeLists.txt new file mode 100644 index 00000000000..c0bb0517c8a --- /dev/null +++ b/Magick++/tests/CMakeLists.txt @@ -0,0 +1,26 @@ +# 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) + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") diff --git a/cmake/test_helpers.cmake b/cmake/test_helpers.cmake new file mode 100644 index 00000000000..577544a1749 --- /dev/null +++ b/cmake/test_helpers.cmake @@ -0,0 +1,58 @@ +function(add_tap_test TEST_FILE) + set(TEST_ENV + "MAGICK=${CMAKE_BINARY_DIR}/utilities/magick" + "ANIMATE=${CMAKE_BINARY_DIR}/utilities/animate" + "COMPARE=${CMAKE_BINARY_DIR}/utilities/compare" + "COMPOSITE=${CMAKE_BINARY_DIR}/utilities/composite" + "CONJURE=${CMAKE_BINARY_DIR}/utilities/conjure" + "CONVERT=${CMAKE_BINARY_DIR}/utilities/convert" + "DISPLAY=${CMAKE_BINARY_DIR}/utilities/display" + "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/identify" + "IMPORT=${CMAKE_BINARY_DIR}/utilities/import" + "MOGRIFY=${CMAKE_BINARY_DIR}/utilities/mogrify" + "MONTAGE=${CMAKE_BINARY_DIR}/utilities/montage" + "STREAM=${CMAKE_BINARY_DIR}/utilities/stream" + + "VALIDATE=${CMAKE_BINARY_DIR}/tests/validate" + "DRAWTEST=${CMAKE_BINARY_DIR}/tests/drawtest" + "WANDTEST=${CMAKE_BINARY_DIR}/tests/wandtest" + + "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}/" + "srcdir=${CMAKE_CURRENT_BINARY_DIR}/" + "TOPSRCDIR=${CMAKE_SOURCE_DIR}/" + "REFERENCE_IMAGE=${CMAKE_SOURCE_DIR}/images/rose.pnm" + ) + + if(ARGC GREATER 1) + set(TEST_NAME ${ARGV1}) + else() + set(TEST_NAME ${TEST_FILE}) + endif() + add_test( + NAME ${TEST_NAME} + COMMAND sh -c "sh ${CMAKE_CURRENT_BINARY_DIR}/${TEST_FILE}.tap | tee /dev/fd/2 | grep -q 'not ok' && 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() + + file(WRITE ${CMAKE_BINARY_DIR}/common.shi "") + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/common.shi "") + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tests/common.shi "") +endfunction() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f3130363ab3..a61989039cc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,48 +14,14 @@ # # CMakeLists.txt for the ImageMagick validation suite. -add_executable(validate validate.c) -target_link_libraries(validate PRIVATE MagickCore MagickWand) -add_executable(drawtest drawtest.c) -target_link_libraries(drawtest PRIVATE MagickCore MagickWand) -add_executable(wandtest wandtest.c) -target_link_libraries(wandtest PRIVATE MagickCore MagickWand) +include(${CMAKE_SOURCE_DIR}/cmake/test_helpers.cmake) -# Adding CTEST_PARALLEL_LEVEL=15 env var to the ctest command is recommended. -enable_testing() - -set(TEST_ENV - "MAGICK=${CMAKE_BINARY_DIR}/utilities/magick" - "ANIMATE=${CMAKE_BINARY_DIR}/utilities/animate" - "COMPARE=${CMAKE_BINARY_DIR}/utilities/compare" - "COMPOSITE=${CMAKE_BINARY_DIR}/utilities/composite" - "CONJURE=${CMAKE_BINARY_DIR}/utilities/conjure" - "CONVERT=${CMAKE_BINARY_DIR}/utilities/convert" - "DISPLAY=${CMAKE_BINARY_DIR}/utilities/display" - "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/identify" - "IMPORT=${CMAKE_BINARY_DIR}/utilities/import" - "MOGRIFY=${CMAKE_BINARY_DIR}/utilities/mogrify" - "MONTAGE=${CMAKE_BINARY_DIR}/utilities/montage" - "STREAM=${CMAKE_BINARY_DIR}/utilities/stream" - - "VALIDATE=${CMAKE_BINARY_DIR}/tests/validate" - "DRAWTEST=${CMAKE_BINARY_DIR}/tests/drawtest" - "WANDTEST=${CMAKE_BINARY_DIR}/tests/wandtest" - - "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}" - "srcdir=${CMAKE_CURRENT_BINARY_DIR}" - "TOPSRCDIR=${CMAKE_SOURCE_DIR}" - "REFERENCE_IMAGE=${CMAKE_SOURCE_DIR}/images/rose.pnm" -) +foreach(executable validate drawtest wandtest) + add_executable(${executable} ${executable}.c) + target_link_libraries(${executable} PRIVATE MagickCore MagickWand) +endforeach() -macro(add_tap_test TEST_NAME) - add_test( - NAME ${TEST_NAME} - COMMAND sh -c "sh ${TEST_NAME}.tap | tee /dev/fd/2 | grep -q 'not ok' && exit 1 || exit 0" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "${TEST_ENV}") -endmacro() +copy_test_resources(core) add_tap_test(validate-colorspace) add_tap_test(validate-compare) @@ -74,21 +40,4 @@ add_tap_test(cli-pipe) add_tap_test(drawtest) add_tap_test(wandtest) -add_custom_target(copy_test_resources ALL) -file(GLOB TEST_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.tap *.miff *.pnm) -foreach(TEST_RESOURCE ${TEST_RESOURCES}) - set(SRC ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_RESOURCE}) - set(DST ${CMAKE_CURRENT_BINARY_DIR}/${TEST_RESOURCE}) - add_custom_command( - OUTPUT ${DST} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} ${DST} - DEPENDS ${SRC} - ) - add_custom_target(copy_${TEST_RESOURCE} ALL DEPENDS ${SRC} ${DST}) - add_dependencies(copy_test_resources copy_${TEST_RESOURCE}) -endforeach() - -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/common.shi "") -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tests/common.shi "") - set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") From 3d2aef1227a63d2bf766d1c48155019d1ff0b23d Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 16:58:04 +0200 Subject: [PATCH 033/156] CMake: restore ssize_t check --- cmake/checks.cmake | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index bf168c24048..2092be88c37 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -121,7 +121,7 @@ macro(magick_check_env) # Check if exists check_include_file(dlfcn.h HAVE_DLFCN_H) - # Check if `double_t' exists + # Check if `float_t' exists check_c_source_compiles ( " #include @@ -962,6 +962,23 @@ macro(magick_check_env) endif() endif() + # Check if doesn't define `ssize_t' + if(HAVE_SYS_TYPES_H) + if(SIZEOF_SSIZE_T) + set(HAVE_SSIZE_T 1) + else() + check_symbol_exists(ssize_t sys/types.h HAVE_SSIZE_T) + if(NOT HAVE_SSIZE_T) + if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") + set(ssize_t int) + else() + set(ssize_t "long long") + endif() + set(SIZEOF_SSIZE_T ${CMAKE_SIZEOF_VOID_P}) + endif() + endif() + endif() + # Check if doesn't define `uid_t' if(HAVE_SYS_TYPES_H) check_symbol_exists(uid_t sys/types.h HAVE_UID_T) From 709aa946990ef20ce4e4111d96cb90e6d48cd0b3 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 17:10:40 +0200 Subject: [PATCH 034/156] CMake: reorganize a bit --- CMakeLists.txt | 10 ++++++++++ cmake/delegates.cmake | 9 --------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d9b872ce5b9..5c7a9af34a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,16 @@ include(cmake/delegates.cmake) include(cmake/configure.cmake) ####### 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_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) +set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) + +set(IMAGEMAGICK_INC_DIR "include/ImageMagick-${MAGICK_VERSION_MAJOR}") + # Set the binaries name set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MagickQuantumDepth}${HDRI_SUFFIX}") diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake index 2dc500042c9..be594ded359 100644 --- a/cmake/delegates.cmake +++ b/cmake/delegates.cmake @@ -136,12 +136,3 @@ magick_find_delegate(DELEGATE X11_DELEGATE NAME X11 DEFAULT TRUE) if(X11_DELEGATE) set(IMAGEMAGICK_DELEGATES_LIBRARIES ${IMAGEMAGICK_DELEGATES_LIBRARIES} X11::Xext) endif() - -# 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_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) -set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) - -set(IMAGEMAGICK_INC_DIR "include/ImageMagick-${MAGICK_VERSION_MAJOR}") From 1f732c8c0a9d91cf9103a35c679238b0fcd82178 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 17:26:01 +0200 Subject: [PATCH 035/156] CMake: improve testing --- Magick++/demo/CMakeLists.txt | 2 -- Magick++/tests/CMakeLists.txt | 2 -- cmake/test_helpers.cmake | 6 ++++-- tests/CMakeLists.txt | 8 ++++---- utilities/CMakeLists.txt | 3 +++ 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Magick++/demo/CMakeLists.txt b/Magick++/demo/CMakeLists.txt index 387aac9a80b..a26c9732db7 100644 --- a/Magick++/demo/CMakeLists.txt +++ b/Magick++/demo/CMakeLists.txt @@ -22,5 +22,3 @@ endforeach() copy_test_resources(magickpp-demo) add_tap_test(demos magick++-demos) - -set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") diff --git a/Magick++/tests/CMakeLists.txt b/Magick++/tests/CMakeLists.txt index c0bb0517c8a..ae2c15d327f 100644 --- a/Magick++/tests/CMakeLists.txt +++ b/Magick++/tests/CMakeLists.txt @@ -22,5 +22,3 @@ endforeach() copy_test_resources(magickpp-tests) add_tap_test(tests magick++-tests) - -set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") diff --git a/cmake/test_helpers.cmake b/cmake/test_helpers.cmake index 577544a1749..ecff8f050a1 100644 --- a/cmake/test_helpers.cmake +++ b/cmake/test_helpers.cmake @@ -19,8 +19,8 @@ function(add_tap_test TEST_FILE) "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}/" "srcdir=${CMAKE_CURRENT_BINARY_DIR}/" - "TOPSRCDIR=${CMAKE_SOURCE_DIR}/" - "REFERENCE_IMAGE=${CMAKE_SOURCE_DIR}/images/rose.pnm" + "TOPSRCDIR=${CMAKE_BINARY_DIR}/" + "top_srcdir=${CMAKE_BINARY_DIR}/" ) if(ARGC GREATER 1) @@ -56,3 +56,5 @@ function(copy_test_resources suffix) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/common.shi "") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tests/common.shi "") endfunction() + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_BINARY_DIR}/*_out.*") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a61989039cc..2dee896f22c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -35,9 +35,9 @@ add_tap_test(validate-import) add_tap_test(validate-magick) add_tap_test(validate-montage) add_tap_test(validate-stream) -add_tap_test(cli-colorspace) -add_tap_test(cli-pipe) add_tap_test(drawtest) add_tap_test(wandtest) - -set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*_out.*") +if(BUILD_UTILITIES) + add_tap_test(cli-colorspace) + add_tap_test(cli-pipe) +endif() diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index d21f02de05a..c7e0e777090 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -35,4 +35,7 @@ install(TARGETS magick ) foreach(utility ${MAGICK_LINKED_UTILITIES}) install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${CMAKE_INSTALL_PREFIX}/bin/${utility})") + list(APPEND BINARY_DIR_SYMLINKS ${CMAKE_CURRENT_BINARY_DIR}/${utility}) endforeach() + +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${BINARY_DIR_SYMLINKS}") From 72c9ba448752aac2a6be2f994e8cb6a8879836d9 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 17:41:08 +0200 Subject: [PATCH 036/156] CMake: install config, wip --- CMakeLists.txt | 1 + config/CMakeLists.txt | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 config/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c7a9af34a5..4ec65c98993 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ if(BUILD_TESTS) add_subdirectory(Magick++/demo) endif() endif() +add_subdirectory(config) install(FILES LICENSE diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt new file mode 100644 index 00000000000..a5cd03ae9c7 --- /dev/null +++ b/config/CMakeLists.txt @@ -0,0 +1,52 @@ +# 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. + +# Where architecture-independent configuration files get installed +set(SHARE_PATH share/ImageMagick-${MAGICK_VERSION_MAJOR}) +# Where architecture-dependent configuration files get installed +set(SHAREARCH_PATH lib/ImageMagick-${MAGICK_VERSION_MAJOR}) +# Where architecture-dependent configuration files get installed +set(CONFIGURE_PATH ${SHARE_PATH}/config) + +install( + FILES + english.xml + francais.xml + locale.xml + DESTINATION ${SHARE_PATH}/config +) + +install( + FILES + configure.xml + DESTINATION ${SHAREARCH_PATH}/config +) + +install( + FILES + colors.xml + delegates.xml + log.xml + mime.xml + policy.xml + quantization-table.xml + thresholds.xml + type.xml + type-apple.xml + type-dejavu.xml + type-ghostscript.xml + type-urw-base35.xml + type-windows.xml + DESTINATION ${CONFIGURE_PATH}/config +) From ebdd4670a2eda837c81b2ebaf4343587726b6aec Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 19:47:05 +0200 Subject: [PATCH 037/156] CMake: add installation of config files --- CMakeLists.txt | 5 ---- cmake/test_helpers.cmake | 1 + config/CMakeLists.txt | 55 ++++++++++++++++++++++------------------ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ec65c98993..e73d36fcfa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,11 +64,6 @@ else() endif() message(STATUS "Security policy variant to enforce: ${SECURITY_POLICY}") -if(NOT SECURITY_POLICY STREQUAL "open") - message(FATAL_ERROR "Only 'open' security policy is supported at this time.") - # TODO: Implement installation of config/ files - # Copy config/policy-${SECURITY_POLICY}.xml to ${MAGICK_CONFIGURE_PATH}/policy.xml -endif() if(BUILD_MAGICKPP) enable_language(CXX) diff --git a/cmake/test_helpers.cmake b/cmake/test_helpers.cmake index ecff8f050a1..f3b07c5993a 100644 --- a/cmake/test_helpers.cmake +++ b/cmake/test_helpers.cmake @@ -21,6 +21,7 @@ function(add_tap_test TEST_FILE) "srcdir=${CMAKE_CURRENT_BINARY_DIR}/" "TOPSRCDIR=${CMAKE_BINARY_DIR}/" "top_srcdir=${CMAKE_BINARY_DIR}/" + "MAGICK_CONFIGURE_PATH=${CMAKE_BINARY_DIR}/config/" ) if(ARGC GREATER 1) diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index a5cd03ae9c7..1c7a15e7d9a 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -12,41 +12,46 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Where architecture-independent configuration files get installed -set(SHARE_PATH share/ImageMagick-${MAGICK_VERSION_MAJOR}) -# Where architecture-dependent configuration files get installed -set(SHAREARCH_PATH lib/ImageMagick-${MAGICK_VERSION_MAJOR}) -# Where architecture-dependent configuration files get installed -set(CONFIGURE_PATH ${SHARE_PATH}/config) +set(SHARE_PATH share/ImageMagick-${MAGICK_VERSION_MAJOR} CACHE INTERNAL "Installation path for platform-independent data") +set(SHAREARCH_PATH lib/ImageMagick-${MAGICK_VERSION}/config-${MagickQuantumDepth}${HDRI_SUFFIX} CACHE INTERNAL "Installation path for platform-dependent data") +set(CONFIGURE_PATH etc/ImageMagick-${MAGICK_VERSION_MAJOR} CACHE INTERNAL "Installation path for configuration files") -install( - FILES +set(DATA_FILES english.xml francais.xml locale.xml - DESTINATION ${SHARE_PATH}/config ) -install( - FILES - configure.xml - DESTINATION ${SHAREARCH_PATH}/config -) +# TODO: needs to be generated +#set(PLATFORM_DATA_FILES +# configure.xml +#) -install( - FILES +set(CONFIG_FILES colors.xml - delegates.xml +# delegates.xml log.xml mime.xml - policy.xml quantization-table.xml thresholds.xml - type.xml - type-apple.xml - type-dejavu.xml - type-ghostscript.xml - type-urw-base35.xml - type-windows.xml - DESTINATION ${CONFIGURE_PATH}/config +# type.xml +# type-apple.xml +# type-dejavu.xml +# type-ghostscript.xml +# type-urw-base35.xml +# type-windows.xml ) + +if(BUILD_TESTS) + file(COPY ${DATA_FILES} ${PLATFORM_DATA_FILES} ${CONFIG_FILES} + DESTINATION ${CMAKE_BINARY_DIR}/config + ) + file(COPY policy-${SECURITY_POLICY}.xml + DESTINATION ${CMAKE_BINARY_DIR}/config/policy.xml + ) +endif() + +install(FILES ${DATA_FILES} DESTINATION ${SHARE_PATH}) +#install(FILES ${PLATFORM_DATA_FILES} DESTINATION ${SHAREARCH_PATH}) +install(FILES ${CONFIG_FILES} DESTINATION ${CONFIGURE_PATH}) +install(FILES policy-${SECURITY_POLICY}.xml DESTINATION ${CONFIGURE_PATH}/policy.xml) From ace2aed5e20a7a988acf0fca3579205e546a2884 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 23:17:40 +0200 Subject: [PATCH 038/156] conanfile.py: update delegates patch --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index dea60f3772a..1463132d140 100644 --- a/conanfile.py +++ b/conanfile.py @@ -295,7 +295,7 @@ def generate(self): def _patch_sources(self): # PangoCairo is provided by Pango - replace_in_file(self, os.path.join(self.source_folder, "CMakeLists.txt"), + replace_in_file(self, os.path.join(self.source_folder, "cmake", "delegates.cmake"), "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME PangoCairo DEFAULT FALSE)\n", "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME Pango DEFAULT FALSE TARGETS Pango::Pango)\n") From b21c2abb0ef005f6f17af5c5845c7e95e462b0d1 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Dec 2023 23:18:23 +0200 Subject: [PATCH 039/156] CMake: generate config files, fill in most config params --- CMakeLists.txt | 14 +- Magick++/CMakeLists.txt | 10 +- MagickCore/CMakeLists.txt | 10 +- MagickWand/CMakeLists.txt | 8 +- cmake/configure.cmake | 288 +++++++++++++++++++++++--------------- cmake/parse_version.cmake | 2 +- cmake/test_helpers.cmake | 1 + config/CMakeLists.txt | 144 +++++++++++++++---- utilities/CMakeLists.txt | 9 +- 9 files changed, 314 insertions(+), 172 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e73d36fcfa4..136256ff2e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,16 +80,15 @@ include(cmake/configure.cmake) # 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}") - # Set the binaries name -set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MagickQuantumDepth}${HDRI_SUFFIX}") +set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MAGICK_ABI_SUFFIX}") # Add the subdirectories to be compiled +add_subdirectory(config) add_subdirectory(MagickCore) add_subdirectory(MagickWand) if(BUILD_MAGICKPP) @@ -107,10 +106,9 @@ if(BUILD_TESTS) add_subdirectory(Magick++/demo) endif() endif() -add_subdirectory(config) install(FILES - LICENSE - NOTICE - DESTINATION licenses + LICENSE + NOTICE + DESTINATION licenses ) diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index 7e633c5c342..e1c1720279f 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -88,12 +88,12 @@ target_compile_definitions(Magick++ PRIVATE -D_MAGICKLIB_) target_link_libraries(Magick++ PUBLIC MagickWand) install(TARGETS Magick++ - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/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 ${IMAGEMAGICK_INC_DIR} + lib/Magick++.h DESTINATION ${INCLUDE_PATH} ) diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index c563c8d6e39..ca81909aa5c 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -716,14 +716,14 @@ endif() target_compile_definitions(MagickCore PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") install(TARGETS MagickCore - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/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 ) diff --git a/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 9dd45d45b04..7e94283b354 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -110,8 +110,8 @@ target_compile_definitions(MagickWand PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREAR target_link_libraries(MagickWand PUBLIC MagickCore) install(TARGETS MagickWand - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION ${IMAGEMAGICK_INC_DIR}/MagickWand + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${INCLUDE_PATH}/MagickWand ) diff --git a/cmake/configure.cmake b/cmake/configure.cmake index c618809d67e..55725d22716 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -1,19 +1,52 @@ +# 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(PACKAGE_VERSION ${MAGICK_VERSION}) +set(QUANTUM_DEPTH ${MAGICKCORE_QUANTUM_DEPTH}) +set(VERSION ${MAGICK_VERSION}) + # 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(MAGICK_DELEGATES) +# set(MAGICK_FEATURES) +# set(MAGICK_TARGET_CPU) +# set(MAGICK_TARGET_OS) +# set(MAGICK_TARGET_VENDOR) +# set(PACKAGE) +# set(PACKAGE_BASE_VERSION) +# set(PACKAGE_BUGREPORT) +# set(PACKAGE_LIB_VERSION_NUMBER) +# set(PACKAGE_STRING) +# set(PACKAGE_TARNAME) +# set(PACKAGE_URL) +# set(host) # Set if pipe (|) is enabled on filenames # TODO Add linux and mac os X @@ -29,7 +62,7 @@ if(AIX) endif() # Check if we're on Solaris -IF (SOLARIS) +IF(SOLARIS) set(_POSIX_PTHREAD_SEMANTICS TRUE) set(__EXTENSIONS__ TRUE) # TODO restrict the system version and check if the define should be these @@ -42,7 +75,7 @@ endif() 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 "") +set(X11_CONFIGURE_PATH) # TODO should this be an option ?? set(X_DISPLAY_MISSING 1) @@ -59,42 +92,43 @@ 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) + ####### 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 "") +include(GNUInstallDirs) -# 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(RELATIVE_PATH ${PACKAGE_NAME}-${MAGICK_VERSION_MAJOR}) +set(MAGICK_ABI_SUFFIX ${MagickQuantumDepth}${HDRI_SUFFIX}) -# Set the version.h file path to be autogenerated -configure_file(${CMAKE_SOURCE_DIR}/MagickCore/version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/MagickCore/version.h) +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(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}/${RELATIVE_PATH}/${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}) if(${MAGICKCORE_QUANTUM_DEPTH} EQUAL 8) set(MagickQuantumDepth "Q8") @@ -122,7 +156,7 @@ if(WIN32) 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) + file(READ ${CMAKE_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}) @@ -137,75 +171,101 @@ if(WIN32) 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 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) +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() -# 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() \ No newline at end of file +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/parse_version.cmake b/cmake/parse_version.cmake index 3dcee627970..98c14bba544 100644 --- a/cmake/parse_version.cmake +++ b/cmake/parse_version.cmake @@ -1,5 +1,5 @@ # Fetch some needed values from version.sh and fill the correspondent variables -file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure CONTENT_CONFIGURE) +file(READ ${CMAKE_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}") diff --git a/cmake/test_helpers.cmake b/cmake/test_helpers.cmake index f3b07c5993a..2da3c796f7d 100644 --- a/cmake/test_helpers.cmake +++ b/cmake/test_helpers.cmake @@ -22,6 +22,7 @@ function(add_tap_test TEST_FILE) "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(ARGC GREATER 1) diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index 1c7a15e7d9a..6cd81a99bbd 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -11,47 +11,129 @@ # 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 -set(SHARE_PATH share/ImageMagick-${MAGICK_VERSION_MAJOR} CACHE INTERNAL "Installation path for platform-independent data") -set(SHAREARCH_PATH lib/ImageMagick-${MAGICK_VERSION}/config-${MagickQuantumDepth}${HDRI_SUFFIX} CACHE INTERNAL "Installation path for platform-dependent data") -set(CONFIGURE_PATH etc/ImageMagick-${MAGICK_VERSION_MAJOR} CACHE INTERNAL "Installation path for configuration files") +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(DATA_FILES - english.xml - francais.xml - locale.xml +# Set the version.h file path to be autogenerated +configure_file(${CMAKE_SOURCE_DIR}/MagickCore/version.h.cmake ${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} ) -# TODO: needs to be generated -#set(PLATFORM_DATA_FILES -# configure.xml -#) +# 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 -set(CONFIG_FILES +/* 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 -# delegates.xml log.xml mime.xml quantization-table.xml thresholds.xml -# type.xml -# type-apple.xml -# type-dejavu.xml -# type-ghostscript.xml -# type-urw-base35.xml -# type-windows.xml -) - -if(BUILD_TESTS) - file(COPY ${DATA_FILES} ${PLATFORM_DATA_FILES} ${CONFIG_FILES} - DESTINATION ${CMAKE_BINARY_DIR}/config - ) - file(COPY policy-${SECURITY_POLICY}.xml - DESTINATION ${CMAKE_BINARY_DIR}/config/policy.xml - ) -endif() + 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 ${PLATFORM_DATA_FILES} DESTINATION ${SHAREARCH_PATH}) install(FILES ${CONFIG_FILES} DESTINATION ${CONFIGURE_PATH}) -install(FILES policy-${SECURITY_POLICY}.xml DESTINATION ${CONFIGURE_PATH}/policy.xml) diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index c7e0e777090..6b471935142 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -25,16 +25,17 @@ target_link_libraries(magick PRIVATE MagickWand) set(MAGICK_LINKED_UTILITIES animate compare composite conjure convert display identify import magick-script mogrify montage stream) foreach(utility ${MAGICK_LINKED_UTILITIES}) add_custom_command(TARGET magick POST_BUILD - COMMAND ${CMAKE_COMMAND} -E create_symlink magick $/${utility} + COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${utility} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endforeach() install(TARGETS magick - RUNTIME DESTINATION bin - BUNDLE DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} ) foreach(utility ${MAGICK_LINKED_UTILITIES}) - install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${CMAKE_INSTALL_PREFIX}/bin/${utility})") + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${utility})") list(APPEND BINARY_DIR_SYMLINKS ${CMAKE_CURRENT_BINARY_DIR}/${utility}) endforeach() From 1d6cef0593264b777848c93de802b61103f53ade Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 00:31:24 +0200 Subject: [PATCH 040/156] CMake: improve version parsing --- CMakeLists.txt | 2 +- cmake/configure.cmake | 37 +++++-------- cmake/parse_version.cmake | 110 ++++++++++++++++++++++---------------- 3 files changed, 80 insertions(+), 69 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 136256ff2e7..283d8baeca2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ set(CODERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/coders) set(FILTERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/filters) # Set the binaries name -set(MAGICK_BINARY_SUFFIX "${MAGICK_VERSION_MAJOR}.${MAGICK_ABI_SUFFIX}") +set(MAGICK_BINARY_SUFFIX "${PACKAGE_MAJOR_VERSION}.${MAGICK_ABI_SUFFIX}") # Add the subdirectories to be compiled add_subdirectory(config) diff --git a/cmake/configure.cmake b/cmake/configure.cmake index 55725d22716..8e175b6f879 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -29,9 +29,7 @@ set(MAGICK_LDFLAGS) set(MAGICK_LIBS) set(MAGICK_PCFLAGS) set(MAGICK_SECURITY_POLICY ${SECURITY_POLICY}) -set(PACKAGE_VERSION ${MAGICK_VERSION}) set(QUANTUM_DEPTH ${MAGICKCORE_QUANTUM_DEPTH}) -set(VERSION ${MAGICK_VERSION}) # TODO # set(MAGICK_DELEGATES) @@ -39,13 +37,6 @@ set(VERSION ${MAGICK_VERSION}) # set(MAGICK_TARGET_CPU) # set(MAGICK_TARGET_OS) # set(MAGICK_TARGET_VENDOR) -# set(PACKAGE) -# set(PACKAGE_BASE_VERSION) -# set(PACKAGE_BUGREPORT) -# set(PACKAGE_LIB_VERSION_NUMBER) -# set(PACKAGE_STRING) -# set(PACKAGE_TARNAME) -# set(PACKAGE_URL) # set(host) # Set if pipe (|) is enabled on filenames @@ -96,10 +87,22 @@ set(_FORTIFY_SOURCE FALSE) # 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}-${MAGICK_VERSION_MAJOR}) +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") @@ -121,7 +124,7 @@ set(MODULES_PATH ${CMAKE_INSTALL_LIBDIR}/${RELATIVE_PATH}/${MODULES_DIRNAME} CAC set(PREFIX_DIR ${CMAKE_INSTALL_PREFIX}) set(SHAREARCH_BASEDIRNAME config) set(SHAREARCH_DIRNAME ${SHAREARCH_BASEDIRNAME}-${MAGICK_ABI_SUFFIX}) -set(SHAREARCH_PATH ${CMAKE_INSTALL_LIBDIR}/${RELATIVE_PATH}/${SHAREARCH_DIRNAME} CACHE INTERNAL "Installation path for platform-dependent data") +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}) @@ -130,18 +133,6 @@ set(CODER_PATH ${MODULES_PATH}/${CODER_DIRNAME}) set(FILTER_DIRNAME filters) set(FILTER_PATH ${MODULES_PATH}/${FILTER_DIRNAME}) -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}) diff --git a/cmake/parse_version.cmake b/cmake/parse_version.cmake index 98c14bba544..84e0c725715 100644 --- a/cmake/parse_version.cmake +++ b/cmake/parse_version.cmake @@ -1,55 +1,75 @@ -# Fetch some needed values from version.sh and fill the correspondent variables -file(READ ${CMAKE_SOURCE_DIR}/configure CONTENT_CONFIGURE) +file(READ ${CMAKE_SOURCE_DIR}/m4/version.m4 CONTENT_VERSION_M4) -# 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() +# 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() -# 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() +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) -# 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() +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}) -# 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() +set(VERSION ${MAGICK_VERSION}) -# 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}) +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() -# 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() +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}") -# 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() +set(MAGICK_LIB_VERSION_TEXT ${PACKAGE_BASE_VERSION}) +set(MAGICKPP_LIB_VERSION_TEXT ${PACKAGE_BASE_VERSION}) -# 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}) +# 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() From 6e644df479ef850fc828ec85da2ba29b374fd76a Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 00:52:40 +0200 Subject: [PATCH 041/156] CMake: fix ImageMagick.rc quoting --- config/ImageMagick.rc.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ImageMagick.rc.cmake b/config/ImageMagick.rc.cmake index 0505ffe29a1..ebc1fb2b29a 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" From 607ae581b4b2de8c2e8f89bde6d5b9bc0aa7f6ee Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 01:02:55 +0200 Subject: [PATCH 042/156] CMake: install config scripts --- Magick++/CMakeLists.txt | 6 ++++++ MagickCore/CMakeLists.txt | 9 +++++++-- MagickWand/CMakeLists.txt | 9 +++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index e1c1720279f..da596b84a77 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -97,3 +97,9 @@ install(TARGETS Magick++ install(FILES lib/Magick++.h DESTINATION ${INCLUDE_PATH} ) + +configure_file(bin/Magick++-config.in ${CMAKE_CURRENT_BINARY_DIR}/Magick++-config @ONLY) +install(FILES + ${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/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index ca81909aa5c..478f8f4da97 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -712,8 +712,7 @@ target_link_libraries(MagickCore PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES}) if(UNIX) 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 PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") +target_compile_definitions(MagickCore PRIVATE -D_MAGICKLIB_) install(TARGETS MagickCore RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -727,3 +726,9 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version.h 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/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 7e94283b354..5f36a9c2701 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -105,8 +105,7 @@ set_target_properties(MagickWand PROPERTIES ) target_include_directories(MagickWand PUBLIC ${IMAGEMAGICK_BASE_PATH}) target_include_directories(MagickWand 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 PRIVATE -D_MAGICKLIB_ -DMAGICKCORE_SHAREARCH_BASEDIRNAME=\"config\") +target_compile_definitions(MagickWand PRIVATE -D_MAGICKLIB_) target_link_libraries(MagickWand PUBLIC MagickCore) install(TARGETS MagickWand @@ -115,3 +114,9 @@ install(TARGETS MagickWand ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${INCLUDE_PATH}/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 +) From 1df6477b9791f18789024d89b475ecf3705a7fc5 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 09:14:58 +0200 Subject: [PATCH 043/156] CMake: no need for a separate version.h.cmake --- MagickCore/version.h.cmake | 97 -------------------------------------- cmake/configure.cmake | 2 +- config/CMakeLists.txt | 2 +- 3 files changed, 2 insertions(+), 99 deletions(-) delete mode 100644 MagickCore/version.h.cmake 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/cmake/configure.cmake b/cmake/configure.cmake index 8e175b6f879..6f030bf6fb9 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -147,7 +147,7 @@ if(WIN32) endif() # Read the version.h file so we can get some needed values using regex - file(READ ${CMAKE_BINARY_DIR}/MagickCore/version.h CONTENT_VERSION_H) + 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}) diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index 6cd81a99bbd..2ff16235d8a 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -22,7 +22,7 @@ if(WIN32) endif() # Set the version.h file path to be autogenerated -configure_file(${CMAKE_SOURCE_DIR}/MagickCore/version.h.cmake ${CMAKE_BINARY_DIR}/MagickCore/version.h) +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) From 5c51815dace2f5882424a4688ecffd64b1fea3e1 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 10:04:11 +0200 Subject: [PATCH 044/156] CMake: fix broken defines on MSVC --- CMakeLists.txt | 10 +++++----- Magick++/CMakeLists.txt | 2 +- MagickCore/CMakeLists.txt | 2 +- MagickWand/CMakeLists.txt | 2 +- cmake/delegates.cmake | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 283d8baeca2..5145d662c40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,22 +37,22 @@ 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") -add_compile_definitions(-DMAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) +add_compile_definitions(MAGICKCORE_QUANTUM_DEPTH=${MAGICKCORE_QUANTUM_DEPTH}) set(QUANTUM_DEPTH_OBSOLETE_IN_H ${MAGICKCORE_QUANTUM_DEPTH}) if(MAGICK_BUILD_STATIC) - add_compile_definitions(-D_LIB) + add_compile_definitions(_LIB) set(BUILD_SHARED_LIBS FALSE) else() - add_compile_definitions(-D_DLL) + add_compile_definitions(_DLL) set(BUILD_SHARED_LIBS TRUE) endif() if(MAGICK_HDRI_ENABLE) set(HDRI_SUFFIX HDRI) - add_compile_definitions(-DMAGICKCORE_HDRI_ENABLE=1) + add_compile_definitions(MAGICKCORE_HDRI_ENABLE=1) else() - add_compile_definitions(-DMAGICKCORE_HDRI_ENABLE=0) + add_compile_definitions(MAGICKCORE_HDRI_ENABLE=0) endif() set(NAMESPACE_PREFIX_TAG ${NAMESPACE_PREFIX}) diff --git a/Magick++/CMakeLists.txt b/Magick++/CMakeLists.txt index da596b84a77..6d87e83a536 100644 --- a/Magick++/CMakeLists.txt +++ b/Magick++/CMakeLists.txt @@ -84,7 +84,7 @@ set_target_properties(Magick++ PROPERTIES PUBLIC_HEADER "${MAGICKXX_PUBLIC_HEADERS}" ) target_include_directories(Magick++ PUBLIC ${IMAGEMAGICK_BASE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib) -target_compile_definitions(Magick++ PRIVATE -D_MAGICKLIB_) +target_compile_definitions(Magick++ PRIVATE _MAGICKLIB_) target_link_libraries(Magick++ PUBLIC MagickWand) install(TARGETS Magick++ diff --git a/MagickCore/CMakeLists.txt b/MagickCore/CMakeLists.txt index 478f8f4da97..64f70a95edb 100644 --- a/MagickCore/CMakeLists.txt +++ b/MagickCore/CMakeLists.txt @@ -712,7 +712,7 @@ target_link_libraries(MagickCore PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES}) if(UNIX) target_link_libraries(MagickCore PUBLIC m) endif() -target_compile_definitions(MagickCore PRIVATE -D_MAGICKLIB_) +target_compile_definitions(MagickCore PRIVATE _MAGICKLIB_) install(TARGETS MagickCore RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} diff --git a/MagickWand/CMakeLists.txt b/MagickWand/CMakeLists.txt index 5f36a9c2701..dbc43d8d72b 100644 --- a/MagickWand/CMakeLists.txt +++ b/MagickWand/CMakeLists.txt @@ -105,7 +105,7 @@ set_target_properties(MagickWand PROPERTIES ) target_include_directories(MagickWand PUBLIC ${IMAGEMAGICK_BASE_PATH}) target_include_directories(MagickWand PRIVATE ${IMAGEMAGICK_DELEGATES_INCLUDE_DIRS}) -target_compile_definitions(MagickWand PRIVATE -D_MAGICKLIB_) +target_compile_definitions(MagickWand PRIVATE _MAGICKLIB_) target_link_libraries(MagickWand PUBLIC MagickCore) install(TARGETS MagickWand diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake index be594ded359..be7bd18db76 100644 --- a/cmake/delegates.cmake +++ b/cmake/delegates.cmake @@ -35,7 +35,7 @@ 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(-D_OPENMP=${OpenMP_C_SPEC_DATE}) + add_compile_definitions(_OPENMP=${OpenMP_C_SPEC_DATE}) endif() magick_find_delegate(DELEGATE THREADS_SUPPORT NAME Threads DEFAULT TRUE TARGETS) From 687e401c6578cce22aea8a2540e54116b571e24f Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 10:02:23 +0200 Subject: [PATCH 045/156] CMake: skip most checks on MSVC --- cmake/checks.cmake | 247 +++++++++++++++++++++++++++++++++++++++++- config/config.h.cmake | 3 + 2 files changed, 244 insertions(+), 6 deletions(-) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 2092be88c37..63f9c93c754 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -18,7 +18,244 @@ macro(magick_check_env) include(CheckCXXSourceRuns) endif() - # libm is required for complex.h checks + 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) @@ -139,9 +376,7 @@ macro(magick_check_env) # 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) @@ -228,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) @@ -275,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() diff --git a/config/config.h.cmake b/config/config.h.cmake index c5593f47b2e..6de185b75f9 100644 --- a/config/config.h.cmake +++ b/config/config.h.cmake @@ -168,7 +168,10 @@ #cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the `erf' function. */ +/* 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 1 From aaf8f1fba15c5ab5af6113c48d682b5f77dd5552 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 10:36:16 +0200 Subject: [PATCH 046/156] CMake: fix symlinking of executables on Windows --- utilities/CMakeLists.txt | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt index 6b471935142..c8d62e83e7d 100644 --- a/utilities/CMakeLists.txt +++ b/utilities/CMakeLists.txt @@ -22,21 +22,41 @@ add_executable(magick ${MAGICK_SRC} ${MAGICK_RESOURCE_FILE_PATH}) target_include_directories(magick PRIVATE ${IMAGEMAGICK_BASE_PATH}) target_link_libraries(magick PRIVATE MagickWand) -set(MAGICK_LINKED_UTILITIES animate compare composite conjure convert display identify import magick-script mogrify montage stream) +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}) - add_custom_command(TARGET magick POST_BUILD - COMMAND ${CMAKE_COMMAND} -E create_symlink magick ${utility} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) + 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} ) -foreach(utility ${MAGICK_LINKED_UTILITIES}) - install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink magick \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${utility})") - list(APPEND BINARY_DIR_SYMLINKS ${CMAKE_CURRENT_BINARY_DIR}/${utility}) -endforeach() set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${BINARY_DIR_SYMLINKS}") From e55a5b0eacb0abdc55b42706cff14eaef39a8f76 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 10:54:02 +0200 Subject: [PATCH 047/156] conanfile.py: update --- conanfile.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/conanfile.py b/conanfile.py index 1463132d140..7a688845de5 100644 --- a/conanfile.py +++ b/conanfile.py @@ -102,6 +102,8 @@ class ImageMagicConan(ConanFile): "coders/**", "config/**", "filters/**", + "images/**", + "m4/**", "Magick++/**", "MagickCore/**", "MagickWand/**", @@ -113,6 +115,10 @@ def config_options(self): 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: @@ -296,8 +302,8 @@ def generate(self): 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)\n", - "magick_find_delegate(DELEGATE PANGOCAIRO_DELEGATE NAME Pango DEFAULT FALSE TARGETS Pango::Pango)\n") + "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() From 46a38e7cfd52ff65cea5ca062ca83eb6c34a89bd Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 11:29:35 +0200 Subject: [PATCH 048/156] CMake: re-enable ImageMagick.rc.cmake paths --- config/ImageMagick.rc.cmake | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/config/ImageMagick.rc.cmake b/config/ImageMagick.rc.cmake index ebc1fb2b29a..ff1b360c9cd 100644 --- a/config/ImageMagick.rc.cmake +++ b/config/ImageMagick.rc.cmake @@ -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" ///////////////////////////////////////////////////////////////////////////// From 04dbfebd2211a264542748826d5cb2799e230738 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 11:45:34 +0200 Subject: [PATCH 049/156] CMake: fix tests on Windows --- CMakeLists.txt | 2 +- Magick++/demo/demos.tap | 8 +++--- Magick++/tests/tests.tap | 4 +-- cmake/test_helpers.cmake | 48 +++++++++++++++++-------------- tests/cli-colorspace.tap | 4 +-- tests/cli-pipe.tap | 4 +-- tests/drawtest.tap | 4 +-- tests/validate-colorspace.tap | 4 +-- tests/validate-compare.tap | 4 +-- tests/validate-composite.tap | 4 +-- tests/validate-convert.tap | 4 +-- tests/validate-formats-disk.tap | 4 +-- tests/validate-formats-map.tap | 4 +-- tests/validate-formats-memory.tap | 4 +-- tests/validate-identify.tap | 4 +-- tests/validate-import.tap | 4 +-- tests/validate-magick.tap | 4 +-- tests/validate-montage.tap | 4 +-- tests/validate-stream.tap | 4 +-- tests/wandtest.tap | 4 +-- 20 files changed, 66 insertions(+), 60 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5145d662c40..c9f94cbd2c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,7 @@ if(BUILD_UTILITIES) add_subdirectory(utilities) endif() if(BUILD_TESTS) - # Running ctest with CTEST_PARALLEL_LEVEL=15 env var is recommended. + # Running ctest with CTEST_PARALLEL_LEVEL=20 env var is recommended. enable_testing() add_subdirectory(tests) if(BUILD_MAGICKPP) 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++/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/cmake/test_helpers.cmake b/cmake/test_helpers.cmake index 2da3c796f7d..56fbd22c961 100644 --- a/cmake/test_helpers.cmake +++ b/cmake/test_helpers.cmake @@ -1,21 +1,21 @@ function(add_tap_test TEST_FILE) set(TEST_ENV - "MAGICK=${CMAKE_BINARY_DIR}/utilities/magick" - "ANIMATE=${CMAKE_BINARY_DIR}/utilities/animate" - "COMPARE=${CMAKE_BINARY_DIR}/utilities/compare" - "COMPOSITE=${CMAKE_BINARY_DIR}/utilities/composite" - "CONJURE=${CMAKE_BINARY_DIR}/utilities/conjure" - "CONVERT=${CMAKE_BINARY_DIR}/utilities/convert" - "DISPLAY=${CMAKE_BINARY_DIR}/utilities/display" - "IDENTIFY=${CMAKE_BINARY_DIR}/utilities/identify" - "IMPORT=${CMAKE_BINARY_DIR}/utilities/import" - "MOGRIFY=${CMAKE_BINARY_DIR}/utilities/mogrify" - "MONTAGE=${CMAKE_BINARY_DIR}/utilities/montage" - "STREAM=${CMAKE_BINARY_DIR}/utilities/stream" + "MAGICK=$" + "ANIMATE=$ animate" + "COMPARE=$ compare" + "COMPOSITE=$ composite" + "CONJURE=$ conjure" + "CONVERT=$ convert" + "DISPLAY=$ display" + "IDENTIFY=$ identify" + "IMPORT=$ import" + "MOGRIFY=$ mogrify" + "MONTAGE=$ montage" + "STREAM=$ stream" - "VALIDATE=${CMAKE_BINARY_DIR}/tests/validate" - "DRAWTEST=${CMAKE_BINARY_DIR}/tests/drawtest" - "WANDTEST=${CMAKE_BINARY_DIR}/tests/wandtest" + "VALIDATE=$" + "DRAWTEST=$" + "WANDTEST=$" "SRCDIR=${CMAKE_CURRENT_BINARY_DIR}/" "srcdir=${CMAKE_CURRENT_BINARY_DIR}/" @@ -24,15 +24,22 @@ function(add_tap_test TEST_FILE) "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 /dev/fd/2 | grep -q 'not ok' && exit 1 || exit 0" + 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}") @@ -53,10 +60,9 @@ function(copy_test_resources suffix) add_custom_target(copy_${NAME} ALL DEPENDS ${SRC} ${DST}) add_dependencies(copy_test_resources_${suffix} copy_${NAME}) endforeach() - - file(WRITE ${CMAKE_BINARY_DIR}/common.shi "") - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/common.shi "") - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tests/common.shi "") endfunction() -set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_BINARY_DIR}/*_out.*") +set_property(DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES + "${CMAKE_BINARY_DIR}/*_out.*" + "${CMAKE_BINARY_DIR}/tests/*.log" +) 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" From 2cc554e78d3701070a8d704e1e82c78be8301142 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 12 Dec 2023 12:11:05 +0200 Subject: [PATCH 050/156] CMake: add host and target triplets info --- cmake/configure.cmake | 4 ---- cmake/platform_vars.cmake | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/cmake/configure.cmake b/cmake/configure.cmake index 6f030bf6fb9..e19a1aea768 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -34,10 +34,6 @@ set(QUANTUM_DEPTH ${MAGICKCORE_QUANTUM_DEPTH}) # TODO # set(MAGICK_DELEGATES) # set(MAGICK_FEATURES) -# set(MAGICK_TARGET_CPU) -# set(MAGICK_TARGET_OS) -# set(MAGICK_TARGET_VENDOR) -# set(host) # Set if pipe (|) is enabled on filenames # TODO Add linux and mac os X diff --git a/cmake/platform_vars.cmake b/cmake/platform_vars.cmake index 26bedcee374..e1249b6b993 100644 --- a/cmake/platform_vars.cmake +++ b/cmake/platform_vars.cmake @@ -1,4 +1,5 @@ # Get the platform + if(WIN32) if(NOT WINDOWS) set(WINDOWS TRUE) @@ -47,3 +48,26 @@ endif() 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}") From da099f2d2f62613644a942a8369bf986d9bfdf09 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Tue, 12 Dec 2023 22:00:28 +0100 Subject: [PATCH 051/156] Make sure we use the lt_ methods like we do elsewhere. --- MagickCore/opencl.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) 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) \ From 1b042b26bd0ef575906c93079c5686bc9eb7ef23 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 12 Dec 2023 19:12:27 -0500 Subject: [PATCH 052/156] support dng:max-raw-memory define (https://github.com/ImageMagick/ImageMagick/discussions/6922) --- coders/dng.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/coders/dng.c b/coders/dng.c index 7bf44d63718..81d46676328 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -333,6 +333,10 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, const char *option; + raw_info->rawparams.max_raw_memory_mb=8192; + option=GetImageOption(image_info,"dng:max-raw-memory"); + if (option != (const char *) NULL) + raw_info->rawparams.max_raw_memory_mb=StringToInteger(option); raw_info->params.user_flip=0; raw_info->params.output_bps=16; raw_info->params.use_camera_wb=1; From 8365814e48d92a9974d19311652cf2d042e95583 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 12 Dec 2023 19:21:35 -0500 Subject: [PATCH 053/156] cosmetic --- MagickCore/cache-view.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 804e2b73a400d77270a0912f6f63a6f4fecf5dc4 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 12 Dec 2023 21:40:59 -0500 Subject: [PATCH 054/156] properly export YUV JP2 images (https://github.com/ImageMagick/ImageMagick/issues/6943) --- coders/jp2.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/coders/jp2.c b/coders/jp2.c index 556f88cc83e..aac007a1af9 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. */ @@ -1048,10 +1046,7 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image, 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) From 66a3868a4da949aff7b65b6f7e480f09a9fd7464 Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 13 Dec 2023 06:16:26 -0500 Subject: [PATCH 055/156] use `:` specifier --- www/jp2.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 + From a0aca550b2d02a901759ba8a048a51985be3b789 Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 13 Dec 2023 10:47:01 -0500 Subject: [PATCH 056/156] correct display program name --- configure | 8 ++++---- configure.ac | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 6751df748f1..8b583af6104 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=9e5eb3a09:20231210 +MAGICK_GIT_REVISION=66a3868a4:20231213 # Substitute library versioning @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 -PACKAGE_RELEASE_DATE=2023-12-10 +PACKAGE_RELEASE_DATE=2023-12-13 # Ensure that make can run correctly @@ -34925,9 +34925,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/configure.ac b/configure.ac index b19a087a851..0b7042f1d18 100644 --- a/configure.ac +++ b/configure.ac @@ -3242,9 +3242,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' From f65eba252e3aa387bd99297a750a2ee250664f8c Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 13 Dec 2023 19:55:11 -0500 Subject: [PATCH 057/156] check for corrupt DJVU images (https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-wv9p-78jx-g7fv) --- coders/djvu.c | 2 ++ 1 file changed, 2 insertions(+) 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; From e46e2eff03cbf5780a0e169ea187348b7799674f Mon Sep 17 00:00:00 2001 From: Cristy Date: Fri, 15 Dec 2023 20:58:55 -0500 Subject: [PATCH 058/156] support UTF-8 comments (https://github.com/ImageMagick/ImageMagick/issues/6949) --- coders/png.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/coders/png.c b/coders/png.c index ac5c5aa60a3..13b416663d4 100644 --- a/coders/png.c +++ b/coders/png.c @@ -11208,20 +11208,22 @@ static MagickBooleanType WriteOnePNGImage(MngWriteInfo *mng_info, #else text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); #endif + (void) memset(text,0,sizeof(png_text)); text[0].key=(char *) property; text[0].text=(char *) value; - text[0].text_length=strlen(value); + text[0].text_length=0; + text[0].itxt_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; + text[0].compression=PNG_ITXT_COMPRESSION_zTXt; 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 (mng_info->exclude_zTXt != MagickFalse) + text[0].compression=PNG_ITXT_COMPRESSION_NONE; + else + text[0].compression= + image_info->compression == NoCompression || + (image_info->compression == UndefinedCompression && + (text[0].text_length < 128)) ? PNG_ITXT_COMPRESSION_NONE : + PNG_ITXT_COMPRESSION_zTXt; if (logging != MagickFalse) { (void) LogMagickEvent(CoderEvent,GetMagickModule(), From 558e25579012caa4113c559a86a8e8374c9bbc08 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 16 Dec 2023 16:02:47 -0500 Subject: [PATCH 059/156] do not prefix iTxt key with 'png:' --- coders/png.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/coders/png.c b/coders/png.c index 13b416663d4..e2d6029fe55 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); From 640af74bfc5091496d16f446e659276e949d2867 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 16 Dec 2023 21:51:48 -0500 Subject: [PATCH 060/156] latest autoconf update --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 8b583af6104..4d9941405a9 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=66a3868a4:20231213 +MAGICK_GIT_REVISION=558e25579:20231216 # Substitute library versioning @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 -PACKAGE_RELEASE_DATE=2023-12-13 +PACKAGE_RELEASE_DATE=2023-12-16 # Ensure that make can run correctly From 4011e631b0c9c168a875a170b3a5e286ddcbbc2c Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 17 Dec 2023 07:23:49 -0500 Subject: [PATCH 061/156] enhance sampling factor parser (https://github.com/ImageMagick/ImageMagick/issues/6943) --- coders/jp2.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/coders/jp2.c b/coders/jp2.c index aac007a1af9..815235bbb42 100644 --- a/coders/jp2.c +++ b/coders/jp2.c @@ -1037,9 +1037,21 @@ 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; From 6c52fda2bdcc2a4a27640495f5f24e7020e553f7 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 17 Dec 2023 22:00:29 +0100 Subject: [PATCH 062/156] Corrected length check. --- coders/png.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coders/png.c b/coders/png.c index e2d6029fe55..b087a9752be 100644 --- a/coders/png.c +++ b/coders/png.c @@ -11220,7 +11220,7 @@ static MagickBooleanType WriteOnePNGImage(MngWriteInfo *mng_info, text[0].compression= image_info->compression == NoCompression || (image_info->compression == UndefinedCompression && - (text[0].text_length < 128)) ? PNG_ITXT_COMPRESSION_NONE : + (text[0].itxt_length < 128)) ? PNG_ITXT_COMPRESSION_NONE : PNG_ITXT_COMPRESSION_zTXt; if (logging != MagickFalse) { From be19e3573735f66762b577805b59fd04c9feb452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 03:20:12 +0000 Subject: [PATCH 063/156] Bump actions/upload-artifact from 3 to 4 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/app-image.yml | 2 +- .github/workflows/daily.yml | 2 +- .github/workflows/release.yml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index ac500d44787..b989450366e 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -90,7 +90,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 diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index ad3cb3d2a65..8250450716c 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 029a86a1471..7ac361080e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 @@ -184,7 +184,7 @@ jobs: timestamp-digest: SHA256 timeout: 600 - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: installers path: 'ImageMagick-Windows\VisualMagick\installer\output' @@ -220,7 +220,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' @@ -339,7 +339,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 From ed5ac6d69c2f54af6b0371e7021aae4c32623548 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 03:20:09 +0000 Subject: [PATCH 064/156] Bump actions/download-artifact from 3 to 4 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/app-image.yml | 2 +- .github/workflows/daily.yml | 2 +- .github/workflows/release.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index b989450366e..6a1422a2e2c 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -104,7 +104,7 @@ jobs: steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: artifacts diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 8250450716c..4380c01fc3f 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ac361080e2..9ad50bdffb3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 @@ -209,7 +209,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 @@ -264,7 +264,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 From b85f14385a84e52e045148e4393d951a9c4e3483 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 03:20:18 +0000 Subject: [PATCH 065/156] Bump github/codeql-action from 2 to 3 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 208a56963fd..5d73d294fcc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -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 From 1c229f2ec7338c1ee1633b0ac837a866b91449cd Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Tue, 19 Dec 2023 21:54:31 +0100 Subject: [PATCH 066/156] Give artifacts a unique name. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ad50bdffb3..a0b161628b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: installers + name: installer-${{matrix.platform}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.quantum}} path: 'ImageMagick-Windows\VisualMagick\installer\output' release_windows_source: From 08131032a7008c31eb41463963caa0b37ae80dd3 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 20 Dec 2023 05:46:03 +0100 Subject: [PATCH 067/156] Use different name for the installers. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a0b161628b0..4fe9f6c9f95 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: installer-${{matrix.platform}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.quantum}} + name: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}' path: 'ImageMagick-Windows\VisualMagick\installer\output' release_windows_source: From 7d907ea75a2731ad3479f55ac4f14dbecd77cd2d Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 20 Dec 2023 14:48:51 +0100 Subject: [PATCH 068/156] Also include type in artifact name. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4fe9f6c9f95..28e7f0eb595 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}' + name: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}-${{matrix.type}}' path: 'ImageMagick-Windows\VisualMagick\installer\output' release_windows_source: From 490e9ab40877f716225c2404d1c4d275093e2172 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 20 Dec 2023 14:51:22 +0100 Subject: [PATCH 069/156] Swap order. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 28e7f0eb595..5a3a595d6ef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}-${{matrix.type}}' + name: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.platform}}' path: 'ImageMagick-Windows\VisualMagick\installer\output' release_windows_source: From 7f8aab2eb90354bd87943652813a5a197ef3d8c0 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 21 Dec 2023 18:35:53 +0100 Subject: [PATCH 070/156] Switch to ubuntu 20.04 in the app-image build. --- .github/workflows/app-image.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index 6a1422a2e2c..1d2c490356a 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -5,9 +5,13 @@ on: push: tags: - '*' + paths: + - '.github/workflows/app-image.yml' pull_request: branches: - main + paths: + - '.github/workflows/app-image.yml' permissions: contents: write @@ -18,7 +22,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: @@ -109,6 +113,7 @@ jobs: path: artifacts - name: Publish release + if: contains(github.event.ref_type, 'tag') uses: softprops/action-gh-release@v1 with: generate_release_notes: true From 94d5512c66fb4c30c9e67c77ea39b6da7683da01 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 21 Dec 2023 18:40:21 +0100 Subject: [PATCH 071/156] Revert path filter. --- .github/workflows/app-image.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index 1d2c490356a..a582febbcc0 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -5,8 +5,6 @@ on: push: tags: - '*' - paths: - - '.github/workflows/app-image.yml' pull_request: branches: - main From 12ecacf95ecd4140ddef23b85e4a3162b5838e25 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 21 Dec 2023 19:05:19 +0100 Subject: [PATCH 072/156] Corrected packages that need to be install due to ubuntu upgrade. --- .github/workflows/app-image.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index a582febbcc0..131761fbf69 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -29,28 +29,27 @@ 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 }} - - name: Download AppImage run: | mkdir /app-image From 092b8fa848f0c6c9ba34c0af6dd5e60f722893a5 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 21 Dec 2023 19:10:31 +0100 Subject: [PATCH 073/156] Removed duplicate if statement. --- .github/workflows/app-image.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index 131761fbf69..8ea573c4746 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -110,7 +110,6 @@ jobs: path: artifacts - name: Publish release - if: contains(github.event.ref_type, 'tag') uses: softprops/action-gh-release@v1 with: generate_release_notes: true From d1cd21ccc0db09020ef2333cc6040fe4b7b6010e Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 21 Dec 2023 19:14:58 +0100 Subject: [PATCH 074/156] Silence warning --- MagickCore/fx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MagickCore/fx.c b/MagickCore/fx.c index fa0c4f51172..50596ffbdf5 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -3174,12 +3174,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; From 1f241fd314bd03acdfe58bab13f85e3c757feeb9 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 21 Dec 2023 17:30:43 -0500 Subject: [PATCH 075/156] improve accuracy of image statistics (https://github.com/ImageMagick/ImageMagick/issues/6924) --- MagickCore/statistic.c | 297 +++++++++++++++++++++++++---------------- MagickCore/statistic.h | 9 ++ 2 files changed, 191 insertions(+), 115 deletions(-) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 67282ff6426..44e45c82107 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; @@ -2073,9 +2088,16 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, 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 +2124,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. + */ + 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,15 +2234,23 @@ 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 @@ -2198,43 +2258,14 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, count=area*histogram[(ssize_t) GetPixelChannels(image)*j+i]; channel_statistics[channel].entropy+=-count*MagickLog10(count)* - PerceptibleReciprocal(MagickLog10(number_bins)); + PerceptibleReciprocalLD(MagickLog10(number_bins)); channel_statistics[CompositePixelChannel].entropy+=-count* - MagickLog10(count)*PerceptibleReciprocal(MagickLog10(number_bins))/ + MagickLog10(count)*PerceptibleReciprocalLD(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 +2314,63 @@ 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; + 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 +3065,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 +3092,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 +3117,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..4fcdc0139ae 100644 --- a/MagickCore/statistic.h +++ b/MagickCore/statistic.h @@ -46,6 +46,15 @@ typedef struct _ChannelStatistics skewness, entropy, median; + + long double + sumLD, + M1; + + double + M2, + M3, + M4; } ChannelStatistics; typedef struct _ChannelMoments From fffda833e847732654d54b823267204b1e24a1d1 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 21 Dec 2023 20:31:26 -0500 Subject: [PATCH 076/156] fx calculations of skewness and kurtosis (https://github.com/ImageMagick/ImageMagick/issues/6964) --- MagickCore/fx.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/MagickCore/fx.c b/MagickCore/fx.c index 50596ffbdf5..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; From f21cd542a989a6e6a973752f1a41b40afd1c8297 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 22 Dec 2023 17:22:42 +0100 Subject: [PATCH 077/156] Only write comments as itxt when the string contains non ansi chars. --- coders/png.c | 97 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/coders/png.c b/coders/png.c index b087a9752be..1b08be76072 100644 --- a/coders/png.c +++ b/coders/png.c @@ -7911,6 +7911,67 @@ 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; + + c=key; + while(*c != '\0') + { + if (*c < 0 || *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) @@ -11173,9 +11234,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 */ @@ -11200,38 +11258,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 - (void) memset(text,0,sizeof(png_text)); - text[0].key=(char *) property; - text[0].text=(char *) value; - text[0].text_length=0; - text[0].itxt_length=strlen(value); - if (mng_info->exclude_tEXt != MagickFalse) - text[0].compression=PNG_ITXT_COMPRESSION_zTXt; - else - if (mng_info->exclude_zTXt != MagickFalse) - text[0].compression=PNG_ITXT_COMPRESSION_NONE; - else - text[0].compression= - image_info->compression == NoCompression || - (image_info->compression == UndefinedCompression && - (text[0].itxt_length < 128)) ? PNG_ITXT_COMPRESSION_NONE : - PNG_ITXT_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); } } From 854b3a4a449cba3666a752b0dd33e2e6b2ae2368 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 18:11:21 +0000 Subject: [PATCH 078/156] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/app-image.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/daily.yml | 14 +++++++------- .github/workflows/main.yml | 12 ++++++------ .github/workflows/release.yml | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/app-image.yml b/.github/workflows/app-image.yml index 8ea573c4746..febb1d83ed8 100644 --- a/.github/workflows/app-image.yml +++ b/.github/workflows/app-image.yml @@ -48,7 +48,7 @@ jobs: apt install libheif-dev -y - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download AppImage run: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 5d73d294fcc..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 diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 4380c01fc3f..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 @@ -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 @@ -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 5a3a595d6ef..3a8d6227483 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 @@ -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 @@ -196,7 +196,7 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows @@ -251,7 +251,7 @@ jobs: hdri_flag: '-HDRI' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ImageMagick/ImageMagick-Windows path: ImageMagick-Windows From a07eac13c12b2498c37eda7a9c6cbc13c3d716c6 Mon Sep 17 00:00:00 2001 From: Cristy Date: Fri, 22 Dec 2023 21:31:47 -0500 Subject: [PATCH 079/156] check if the string contains non-Latin1 characters --- coders/png.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/coders/png.c b/coders/png.c index 1b08be76072..564b31182df 100644 --- a/coders/png.c +++ b/coders/png.c @@ -7931,10 +7931,13 @@ static void Magick_png_set_text(png_struct *ping,png_info *ping_info, size_t length; + /* + Check if the string contains non-Latin1 characters. + */ c=key; while(*c != '\0') { - if (*c < 0 || *c > 127) { + if (((const unsigned char) *c) > 255) { write_itxt=MagickTrue; compresion_none=PNG_ITXT_COMPRESSION_NONE; compresion_zTXt=PNG_ITXT_COMPRESSION_zTXt; @@ -7943,8 +7946,7 @@ static void Magick_png_set_text(png_struct *ping,png_info *ping_info, c++; } #if PNG_LIBPNG_VER >= 10400 - text=(png_textp) png_malloc(ping, - (png_alloc_size_t) sizeof(png_text)); + 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 From 73ad1b7524219babcc7a811e3a631a3f973f2198 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sat, 23 Dec 2023 20:03:30 +0100 Subject: [PATCH 080/156] Corrected patch to check for non-Latin1 characters. --- coders/png.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coders/png.c b/coders/png.c index 564b31182df..32227a1b04a 100644 --- a/coders/png.c +++ b/coders/png.c @@ -7934,10 +7934,10 @@ static void Magick_png_set_text(png_struct *ping,png_info *ping_info, /* Check if the string contains non-Latin1 characters. */ - c=key; + c=value; while(*c != '\0') { - if (((const unsigned char) *c) > 255) { + if (((const unsigned char) *c) > 127) { write_itxt=MagickTrue; compresion_none=PNG_ITXT_COMPRESSION_NONE; compresion_zTXt=PNG_ITXT_COMPRESSION_zTXt; From 7ccf6e87e53dd42b9eeed62a223fd65f72e8b769 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 23 Dec 2023 15:39:21 -0500 Subject: [PATCH 081/156] invalid JSON with -ping (https://github.com/ImageMagick/ImageMagick/issues/6966) --- MagickCore/statistic.c | 6 ++++-- coders/json.c | 17 +++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 44e45c82107..0b8c71eef5f 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2070,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) || @@ -2082,6 +2082,8 @@ 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)* 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,"]"); From 9c85f8f8282c10214b3cd7e8504e8ee9c891ab42 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 23 Dec 2023 17:02:49 -0500 Subject: [PATCH 082/156] throw exception if # of meta channels exceed max (https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-hx5j-pxvh-rj7r) --- MagickCore/pixel.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c index 4f18d88e40b..e9bade87e50 100644 --- a/MagickCore/pixel.c +++ b/MagickCore/pixel.c @@ -6410,8 +6410,9 @@ 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); InitializePixelChannelMap(image); return(SyncImagePixelCache(image,exception)); } From 828463261d0b3c4d67fb0f9c2b2c829dde82eb8b Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 23 Dec 2023 17:04:42 -0500 Subject: [PATCH 083/156] https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-hx5j-pxvh-rj7r --- MagickCore/pixel.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c index e9bade87e50..9f36afc5329 100644 --- a/MagickCore/pixel.c +++ b/MagickCore/pixel.c @@ -6413,6 +6413,7 @@ MagickExport MagickBooleanType SetPixelMetaChannels(Image *image, if (number_meta_channels >= (MaxPixelChannels-MetaPixelChannels)) ThrowBinaryException(CorruptImageError,"MaximumChannelsExceeded", image->filename); + image->number_meta_channels=number_meta_channels; InitializePixelChannelMap(image); return(SyncImagePixelCache(image,exception)); } From c3bb6f6c4a2d87942c31087e774571fdcffc3a0a Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 23 Dec 2023 17:09:06 -0500 Subject: [PATCH 084/156] multiplication result converted to larger type --- MagickCore/statistic.c | 8 ++++---- MagickCore/statistic.h | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 0b8c71eef5f..4152a256ccd 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2259,11 +2259,11 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, count; count=area*histogram[(ssize_t) GetPixelChannels(image)*j+i]; - channel_statistics[channel].entropy+=-count*MagickLog10(count)* - PerceptibleReciprocalLD(MagickLog10(number_bins)); - channel_statistics[CompositePixelChannel].entropy+=-count* + channel_statistics[channel].entropy+=(double) (-count*MagickLog10(count)* + PerceptibleReciprocalLD(MagickLog10(number_bins))); + channel_statistics[CompositePixelChannel].entropy+=(double) (-count* MagickLog10(count)*PerceptibleReciprocalLD(MagickLog10(number_bins))/ - GetPixelChannels(image); + GetPixelChannels(image)); } } histogram=(double *) RelinquishMagickMemory(histogram); diff --git a/MagickCore/statistic.h b/MagickCore/statistic.h index 4fcdc0139ae..93e472f66dd 100644 --- a/MagickCore/statistic.h +++ b/MagickCore/statistic.h @@ -49,9 +49,7 @@ typedef struct _ChannelStatistics long double sumLD, - M1; - - double + M1, M2, M3, M4; From 62e67a265a8ec9f272fe50fdc313ec07c7dad9a3 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 23 Dec 2023 17:12:39 -0500 Subject: [PATCH 085/156] invalid HTTPS certificates are no longer ignored (https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-3r24-6m6q-vxmr) --- config/delegates.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@ - + From d146660d9858ba42704f9c9fc85b9b6b7208527f Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Sun, 24 Dec 2023 14:19:31 +0100 Subject: [PATCH 086/156] Add Canon Raw v2 (CR2) as mime type (#6968) And represent the magic signature in hexadecimal. --- coders/dng.h | 4 ++-- config/mime.xml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/coders/dng.h b/coders/dng.h index 3695bf5d548..ed4e36d8920 100644 --- a/coders/dng.h +++ b/coders/dng.h @@ -17,8 +17,8 @@ #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") \ diff --git a/config/mime.xml b/config/mime.xml index 7ca371622fa..cf94f0d085e 100644 --- a/config/mime.xml +++ b/config/mime.xml @@ -763,6 +763,8 @@ + + From 6c14db7d79b9ee3b8b71aa59b97d45526a05fbed Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Sun, 24 Dec 2023 14:19:55 +0100 Subject: [PATCH 087/156] Add Panasonic Raw v2 (RW2) as mime type (#6967) --- coders/dng.h | 4 +++- config/mime.xml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/coders/dng.h b/coders/dng.h index ed4e36d8920..ef32aff0f97 100644 --- a/coders/dng.h +++ b/coders/dng.h @@ -23,7 +23,9 @@ 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/config/mime.xml b/config/mime.xml index cf94f0d085e..ff1b83b90b4 100644 --- a/config/mime.xml +++ b/config/mime.xml @@ -779,7 +779,9 @@ - + + + From 0882713cebb0ace6965a2f56664b5f931f2c607f Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 08:31:50 -0500 Subject: [PATCH 088/156] multiplication result converted to larger type --- MagickCore/statistic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 4152a256ccd..e07b88e8135 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2172,7 +2172,7 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, { /* Calculate running totals for Welford's method. */ - double delta, delta_n, delta_n2, term1; + long double delta, delta_n, delta_n2, term1; double n1 = cs->area-1; double n = cs->area; @@ -2255,7 +2255,7 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, area=PerceptibleReciprocalLD(channel_statistics[channel].area); for (j=0; j <= (ssize_t) MaxMap; j++) { - double + long double count; count=area*histogram[(ssize_t) GetPixelChannels(image)*j+i]; From e88b9aa79fb8fad0b2677104f6713d51907bb9a5 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 08:37:07 -0500 Subject: [PATCH 089/156] eliminate compiler warning --- coders/dng.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coders/dng.c b/coders/dng.c index 81d46676328..2ee4dc63da9 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -336,7 +336,8 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, raw_info->rawparams.max_raw_memory_mb=8192; option=GetImageOption(image_info,"dng:max-raw-memory"); if (option != (const char *) NULL) - raw_info->rawparams.max_raw_memory_mb=StringToInteger(option); + raw_info->rawparams.max_raw_memory_mb=(unsigned int) + StringToInteger(option); raw_info->params.user_flip=0; raw_info->params.output_bps=16; raw_info->params.use_camera_wb=1; From 4e1feed86220638b3ec296ef99605587e90da245 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 10:00:53 -0500 Subject: [PATCH 090/156] don't include the index channel in the overall image statistics --- MagickCore/statistic.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index e07b88e8135..5196836c2f6 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2341,6 +2341,8 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, 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; From 91d8a329a02883d4f7c2e7a180a2d3fedfcea295 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 13:39:09 -0500 Subject: [PATCH 091/156] multiplication result converted to larger type --- MagickCore/statistic.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index 5196836c2f6..e305d829087 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -2255,15 +2255,16 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, area=PerceptibleReciprocalLD(channel_statistics[channel].area); for (j=0; j <= (ssize_t) MaxMap; j++) { - long double + double count; count=area*histogram[(ssize_t) GetPixelChannels(image)*j+i]; - channel_statistics[channel].entropy+=(double) (-count*MagickLog10(count)* - PerceptibleReciprocalLD(MagickLog10(number_bins))); - channel_statistics[CompositePixelChannel].entropy+=(double) (-count* - MagickLog10(count)*PerceptibleReciprocalLD(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); From 1c14ca384e60cc203c1c72fa0a5721a68c2c5afe Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 19:19:53 -0500 Subject: [PATCH 092/156] release --- configure | 6 +++--- m4/version.m4 | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 4d9941405a9..805d8494d45 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=558e25579:20231216 +MAGICK_GIT_REVISION=91d8a329a:20231224 # Substitute library versioning @@ -5211,7 +5211,7 @@ PACKAGE_BASE_VERSION=7.1.1 PACKAGE_PATCHLEVEL_VERSION=24 -if test "y" = 'y'; then +if test "n" = 'y'; then PACKAGE_VERSION_ADDENDUM='-24 (Beta)' else PACKAGE_VERSION_ADDENDUM=-24 @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 -PACKAGE_RELEASE_DATE=2023-12-16 +PACKAGE_RELEASE_DATE=2023-12-24 # Ensure that make can run correctly diff --git a/m4/version.m4 b/m4/version.m4 index a9d9e48047a..f6ff349c844 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -28,7 +28,7 @@ m4_define([magick_major_version], [7]) m4_define([magick_minor_version], [1]) m4_define([magick_micro_version], [1]) m4_define([magick_patchlevel_version], [24]) -m4_define([magick_is_beta], [y]) +m4_define([magick_is_beta], [n]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) m4_define([magick_url], [https://imagemagick.org]) From 57ff82753e8de6eff1b2143dcd24f7613a448a2f Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 24 Dec 2023 22:40:07 -0500 Subject: [PATCH 093/156] no member named 'rawparams' (https://github.com/ImageMagick/ImageMagick/issues/6969) --- coders/dng.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/coders/dng.c b/coders/dng.c index 2ee4dc63da9..3a9716c3db1 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -333,11 +333,13 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, const char *option; +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18) raw_info->rawparams.max_raw_memory_mb=8192; option=GetImageOption(image_info,"dng:max-raw-memory"); if (option != (const char *) NULL) raw_info->rawparams.max_raw_memory_mb=(unsigned int) StringToInteger(option); +#endif raw_info->params.user_flip=0; raw_info->params.output_bps=16; raw_info->params.use_camera_wb=1; @@ -433,10 +435,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); From 883eaa2b457dab61e1decaf99d13931acf1ddaf5 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 25 Dec 2023 07:43:40 -0500 Subject: [PATCH 094/156] release --- configure | 2 +- m4/version.m4 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 805d8494d45..761bbeeb74e 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=91d8a329a:20231224 +MAGICK_GIT_REVISION=57ff82753:20231224 # Substitute library versioning diff --git a/m4/version.m4 b/m4/version.m4 index f6ff349c844..4a3c4c919fa 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -35,6 +35,7 @@ m4_define([magick_url], [https://imagemagick.org]) m4_define([magick_lib_version], [0x711]) m4_define([magick_tarname], [ImageMagick]) + # # If the library source code has changed at all since the last update, # increment revision (‘c:r:a’ becomes ‘c:r+1:a’). If any interfaces have been From b2fb6f1872629aeecc09769e7b813bc1b967f61c Mon Sep 17 00:00:00 2001 From: Sam James Date: Mon, 25 Dec 2023 13:32:34 +0000 Subject: [PATCH 095/156] =?UTF-8?q?configure:=20drop=20backported=20ac=5Ff?= =?UTF-8?q?unc=5Ffseeko.m4=20for=20autoconf-2.72=20compat=E2=80=A6=20(#697?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * configure: drop backported ac_func_fseeko.m4 for autoconf-2.72 compatibility Drop the bundled / backported ac_func_fseeko.m4 as it breaks compatibility with autoconf-2.72: ``` ./lib/autoconf/c.m4:1676: AC_PROG_GCC_TRADITIONAL is expanded from... configure.ac:932: the top level configure:11706: error: possibly undefined macro: _AC_SYS_LARGEFILE_MACRO_VALUE If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. ``` m4/ac_func_fseeko.m4 was added in 3ed852eea50f9d4cd633efb8c2b054b8e33c2530 (which is a huge VCS import commit, so it goes back way further than even 2009). From what I can tell, it was added to backport a fix to the fseeko detection which later landed in autoconf-2.69 (which IM already requires nowadays in configure.ac): ``` commit f0c325537a22105536ac8c4e88656e50f9946486 Author: Paul Eggert Date: Mon Dec 4 23:54:25 2006 +0000 * lib/autoconf/functions.m4 (AC_FUNC_FSEEKO): Check that fseeko can be assigned to a function pointer. Problem reported by Peter Palfrader in . Based on part of a patch by Ralf Wildenhues in that same bug report. commit 7736fa2754db830a05eea6c21b9449cdddc412be Author: Paul Eggert Date: Tue Oct 24 19:34:09 2006 +0000 * lib/autoconf/specific.m4 (_AC_SYS_LARGEFILE_MACRO_VALUE): If FUNCTION-BODY is nonempty, use AC_LINK_IFELSE rather than AC_COMPILE_IFELSE, to work around problem with OSF/1 4.0F fseeko reported by Nelson H. F. Beebe for Coreutils 6.4. commit 90fcd46f016bac1f427e91040f2dfd8319d382bc Author: Paul Eggert Date: Tue Sep 26 20:57:16 2006 +0000 * lib/autoconf/functions.m4 (AC_FUNC_FSEEKO): Don't compile the fseeko testing program twice; just use the earlier result. * lib/autoconf/specific.m4 (_AC_SYS_LARGEFILE_MACRO_VALUE): Set cache var to 'unknown' (not 'no') if leaving the macro unset still doesn't let the program compile. (AC_SYS_LARGEFILE): Test for _LARGE_FILES only if earlier tests failed. * lib/autoconf/functions.m4: Fix problems reported by Ralf Wildenhues. (AC_FUNC_ERROR_AT_LINE): Don't bother to check for error.h. Just include it, without including anything else. (AC_FUNC_FSEEKO): Avoid gcc -Wall warnings about constant expressions. (AC_FUNC_STRNLEN): Require AC_USE_SYSTEM_EXTENSIONS. * lib/autoconf/functions.m4 (AC_FUNC_ERROR_AT_LINE): Check for `error.h', and include it, for a `error_at_line' prototype. Use a nonempty format string in the link test. * lib/autoconf/functions.m4 (AC_FUNC_WAIT3): Include , for a declaration of wait3. ``` The backported version (which was relying on autoconf internals) ended up breaking with autoconf-2.72: ``` commit cf09f48841b66fe76f606dd6018bb3a93242a7c9 Author: Zack Weinberg Date: Sat Dec 24 23:24:51 2022 -0800 AC_SYS_LARGEFILE: Don’t enlarge time_t by default [...] * lib/autoconf/functions.m4 (AC_FUNC_FSEEKO): Rewrite to avoid dependency on internal subroutines of AC_SYS_LARGEFILE. ``` So, rely on the fixed version which is already in 2.69, and drop the backport which is poking around with internals. Signed-off-by: Sam James * ax_pthread.m4: sync with autoconf-archive Signed-off-by: Sam James * configure.ac: drop AC_PROG_GCC_TRADITIONAL This was marked obsolescent in 2.60 even. GCC hasn't supported -traditional in over 20 years anyway. This isn't strictly required for autoconf-2.72 compatibility so can be dropped if desired but I think it's likely to be removed soon. Signed-off-by: Sam James --------- Signed-off-by: Sam James --- aclocal.m4 | 1 - configure.ac | 3 -- m4/Makefile.am | 1 - m4/ac_func_fseeko.m4 | 72 -------------------------------------------- m4/ax_pthread.m4 | 2 +- 5 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 m4/ac_func_fseeko.m4 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/configure.ac b/configure.ac index 0b7042f1d18..57c21edb772 100644 --- a/configure.ac +++ b/configure.ac @@ -929,9 +929,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 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 From 963f5fa2a3c87b362e2b6b29a31bff447b75925b Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 25 Dec 2023 08:35:07 -0500 Subject: [PATCH 096/156] release --- Makefile.in | 4 +--- configure | 53 +++-------------------------------------------------- 2 files changed, 4 insertions(+), 53 deletions(-) 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/configure b/configure index 761bbeeb74e..bfe103ed0f3 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=57ff82753:20231224 +MAGICK_GIT_REVISION=b2fb6f187:20231225 # Substitute library versioning @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 -PACKAGE_RELEASE_DATE=2023-12-24 +PACKAGE_RELEASE_DATE=2023-12-25 # 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 @@ -23784,53 +23784,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 From 3e8b0fa1cf084ac5073d5249bd7c702b1b7ae5f8 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 25 Dec 2023 14:33:18 -0500 Subject: [PATCH 097/156] beta release --- configure | 4 ++-- m4/version.m4 | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/configure b/configure index bfe103ed0f3..e4a2d452aef 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=24 MAGICK_VERSION=7.1.1-24 -MAGICK_GIT_REVISION=b2fb6f187:20231225 +MAGICK_GIT_REVISION=963f5fa2a:20231225 # Substitute library versioning @@ -5211,7 +5211,7 @@ PACKAGE_BASE_VERSION=7.1.1 PACKAGE_PATCHLEVEL_VERSION=24 -if test "n" = 'y'; then +if test "y" = 'y'; then PACKAGE_VERSION_ADDENDUM='-24 (Beta)' else PACKAGE_VERSION_ADDENDUM=-24 diff --git a/m4/version.m4 b/m4/version.m4 index 4a3c4c919fa..a9d9e48047a 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -28,14 +28,13 @@ m4_define([magick_major_version], [7]) m4_define([magick_minor_version], [1]) m4_define([magick_micro_version], [1]) m4_define([magick_patchlevel_version], [24]) -m4_define([magick_is_beta], [n]) +m4_define([magick_is_beta], [y]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) m4_define([magick_url], [https://imagemagick.org]) m4_define([magick_lib_version], [0x711]) m4_define([magick_tarname], [ImageMagick]) - # # If the library source code has changed at all since the last update, # increment revision (‘c:r:a’ becomes ‘c:r+1:a’). If any interfaces have been From 093065376493d981efd758d971026da40fbffc52 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 25 Dec 2023 14:47:00 -0500 Subject: [PATCH 098/156] beta release --- configure | 34 +++++++++++++++++----------------- m4/version.m4 | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/configure b/configure index e4a2d452aef..dec2c6298f4 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-24. +# Generated by GNU Autoconf 2.71 for ImageMagick 7.1.1-25. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ImageMagick' PACKAGE_TARNAME='ImageMagick' -PACKAGE_VERSION='7.1.1-24' -PACKAGE_STRING='ImageMagick 7.1.1-24' +PACKAGE_VERSION='7.1.1-25' +PACKAGE_STRING='ImageMagick 7.1.1-25' 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-24 to adapt to many kinds of systems. +\`configure' configures ImageMagick 7.1.1-25 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-24:";; + short | recursive ) echo "Configuration of ImageMagick 7.1.1-25:";; 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-24 +ImageMagick configure 7.1.1-25 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-24, which was +It was created by ImageMagick $as_me 7.1.1-25, 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-24' + VERSION='7.1.1-25' # Some tools Automake needs. @@ -5183,11 +5183,11 @@ MAGICK_MINOR_VERSION=1 MAGICK_MICRO_VERSION=1 -MAGICK_PATCHLEVEL_VERSION=24 +MAGICK_PATCHLEVEL_VERSION=25 -MAGICK_VERSION=7.1.1-24 +MAGICK_VERSION=7.1.1-25 -MAGICK_GIT_REVISION=963f5fa2a:20231225 +MAGICK_GIT_REVISION=3e8b0fa1c:20231225 # Substitute library versioning @@ -5209,17 +5209,17 @@ MAGICKPP_LIBRARY_VERSION_INFO=$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISI PACKAGE_BASE_VERSION=7.1.1 -PACKAGE_PATCHLEVEL_VERSION=24 +PACKAGE_PATCHLEVEL_VERSION=25 if test "y" = 'y'; then - PACKAGE_VERSION_ADDENDUM='-24 (Beta)' + PACKAGE_VERSION_ADDENDUM='-25 (Beta)' else - PACKAGE_VERSION_ADDENDUM=-24 + PACKAGE_VERSION_ADDENDUM=-25 fi PACKAGE_LIB_VERSION=0x711 -PACKAGE_LIB_VERSION_NUMBER=7,1,1,24 +PACKAGE_LIB_VERSION_NUMBER=7,1,1,25 PACKAGE_RELEASE_DATE=2023-12-25 @@ -38889,7 +38889,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-24, which was +This file was extended by ImageMagick $as_me 7.1.1-25, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -38958,7 +38958,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-24 +ImageMagick config.status 7.1.1-25 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/m4/version.m4 b/m4/version.m4 index a9d9e48047a..50661821ef2 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -27,7 +27,7 @@ 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], [24]) +m4_define([magick_patchlevel_version], [25]) m4_define([magick_is_beta], [y]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) From 87f4a6266e1e910050d2c62d057332edb9c083f7 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 25 Dec 2023 20:58:40 +0100 Subject: [PATCH 099/156] Correct flags for jpeg-xl build. --- Magick++/fuzz/build_dependencies.sh | 4 +--- Magick++/fuzz/build_imagemagick.sh | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Magick++/fuzz/build_dependencies.sh b/Magick++/fuzz/build_dependencies.sh index 0ab8f894719..eb7271131d9 100755 --- a/Magick++/fuzz/build_dependencies.sh +++ b/Magick++/fuzz/build_dependencies.sh @@ -93,9 +93,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_imagemagick.sh b/Magick++/fuzz/build_imagemagick.sh index 170a3ac0b77..4c82ffffc4b 100755 --- a/Magick++/fuzz/build_imagemagick.sh +++ b/Magick++/fuzz/build_imagemagick.sh @@ -1,6 +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 -lhwy -lbrotlidec -lbrotlienc -lbrotlicommon -lde265" PKG_CONFIG_PATH="$WORK/lib/pkgconfig" +./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 From 26e6cf7d59b07d3d7920b476665f5637c2e330cd Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 25 Dec 2023 20:59:12 +0100 Subject: [PATCH 100/156] Include deflate in the security/oss-fuzz build. --- .devcontainer/security/Dockerfile | 1 + Magick++/fuzz/build_dependencies.sh | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/.devcontainer/security/Dockerfile b/.devcontainer/security/Dockerfile index 64bf100ad7d..0e50678ce07 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 diff --git a/Magick++/fuzz/build_dependencies.sh b/Magick++/fuzz/build_dependencies.sh index eb7271131d9..fae1d41da5f 100755 --- a/Magick++/fuzz/build_dependencies.sh +++ b/Magick++/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 From 0d36830878bb55fe7dbd7f7f4150f343b108fab9 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 25 Dec 2023 21:00:01 +0100 Subject: [PATCH 101/156] Include more features in the tiff build. --- Magick++/fuzz/build_dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magick++/fuzz/build_dependencies.sh b/Magick++/fuzz/build_dependencies.sh index fae1d41da5f..6748c8bed7b 100755 --- a/Magick++/fuzz/build_dependencies.sh +++ b/Magick++/fuzz/build_dependencies.sh @@ -39,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 From f5329add7450ed188e96d957bd0933efa7c81ebe Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 25 Dec 2023 16:48:32 -0500 Subject: [PATCH 102/156] check for version 0.20 instead --- coders/dng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coders/dng.c b/coders/dng.c index 3a9716c3db1..2078936e69c 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -333,7 +333,7 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, const char *option; -#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18) +#if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,20) raw_info->rawparams.max_raw_memory_mb=8192; option=GetImageOption(image_info,"dng:max-raw-memory"); if (option != (const char *) NULL) From a29b58cb7b9870cb1912ba10921871d11b14903b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Tue, 26 Dec 2023 11:59:06 +0100 Subject: [PATCH 103/156] Also include -ldeflate in the LIBS for the oss-fuzz build. --- Magick++/fuzz/build_imagemagick.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magick++/fuzz/build_imagemagick.sh b/Magick++/fuzz/build_imagemagick.sh index 4c82ffffc4b..cc3e08a3167 100755 --- a/Magick++/fuzz/build_imagemagick.sh +++ b/Magick++/fuzz/build_imagemagick.sh @@ -1,6 +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" +./configure --prefix="$WORK" --disable-shared --disable-docs --with-jxl CFLAGS="$CFLAGS -I$WORK/include" LIBS="-L$WORK/lib -lbrotlidec -lbrotlienc -lbrotlicommon -lde265 -ldeflate" PKG_CONFIG_PATH="$WORK/lib/pkgconfig" make "-j$(nproc)" make install From c02326baa4de3736341092e2d17002c0c6475ed0 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Tue, 26 Dec 2023 12:16:56 +0100 Subject: [PATCH 104/156] Corrected oss-fuzz build. --- Magick++/fuzz/build.sh | 2 +- Magick++/fuzz/build_imagemagick.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Magick++/fuzz/build.sh b/Magick++/fuzz/build.sh index a841eca4efc..e407acc0aca 100755 --- a/Magick++/fuzz/build.sh +++ b/Magick++/fuzz/build.sh @@ -4,7 +4,7 @@ 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_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_imagemagick.sh b/Magick++/fuzz/build_imagemagick.sh index cc3e08a3167..4c82ffffc4b 100755 --- a/Magick++/fuzz/build_imagemagick.sh +++ b/Magick++/fuzz/build_imagemagick.sh @@ -1,6 +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 -ldeflate" PKG_CONFIG_PATH="$WORK/lib/pkgconfig" +./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 From 1dfcae1472e77a77dc118ecc90ffe6639dd5aba1 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 26 Dec 2023 14:14:56 -0500 Subject: [PATCH 105/156] display hidden image --- PerlMagick/demo/steganography.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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"); From b333c1aa4561f058383d386b836fbc4f46e33598 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 27 Dec 2023 18:25:38 +0100 Subject: [PATCH 106/156] Start of moving the oss-fuzz files. --- oss-fuzz/build.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 oss-fuzz/build.sh diff --git a/oss-fuzz/build.sh b/oss-fuzz/build.sh new file mode 100644 index 00000000000..e407acc0aca --- /dev/null +++ b/oss-fuzz/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash -eu + +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_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 + +. $MAGICK_SRC/build_dependencies.sh +. $MAGICK_SRC/build_imagemagick.sh +. $MAGICK_SRC/build_fuzzers.sh + +mkdir afl_testcases +(cd afl_testcases; tar xvf "$SRC/afl_testcases.tgz") +for format in gif jpg png bmp ico webp tif; do + mkdir $format + find afl_testcases -type f -name '*.'$format -exec mv -n {} $format/ \; + zip -rj $format.zip $format/ + cp $format.zip "$OUT/encoder_${format}_fuzzer_seed_corpus.zip" +done From 1cec9327e53b3c3ffbc51023cf3540c0b5da676f Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 27 Dec 2023 18:29:20 -0500 Subject: [PATCH 107/156] cosmetic --- coders/jxl.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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) From e119d19f1bae4c75f381544a33759b15e2dca4b5 Mon Sep 17 00:00:00 2001 From: Sam James Date: Thu, 28 Dec 2023 03:08:02 +0000 Subject: [PATCH 108/156] configure.ac: fixup LFS check for autoconf-2.72 (#6978) There are two problems with the check: 1) The 'unknown' case has a problem which is rejected by stricter C compilers because it has -Wimplicit-int and -Wimplicit-function-declaration warnings. Fix that. 2) For the 'other' case, we were using the value of ac_cv_sys_file_offset_bits for -D_FILE_OFFSET_BITS to pass down into the Perl module build, but autoconf-2.72 drops the use of ac_cv_sys_file_offset_bits in cf09f48841b66fe76f606dd6018bb3a93242a7c9, so this ends up defining '-D_FILE_OFFSET_BITS=' which then breaks the build. I've added a hack for 2) to preserve the old behavior. Signed-off-by: Sam James --- configure.ac | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 57c21edb772..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 From 44ca83b1d91d2a87d9c07e8869de350fed970678 Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 27 Dec 2023 22:10:02 -0500 Subject: [PATCH 109/156] latest autoconf/automake --- configure | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/configure b/configure index dec2c6298f4..83e84d03039 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=25 MAGICK_VERSION=7.1.1-25 -MAGICK_GIT_REVISION=3e8b0fa1c:20231225 +MAGICK_GIT_REVISION=e119d19f1:20231227 # Substitute library versioning @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,25 -PACKAGE_RELEASE_DATE=2023-12-25 +PACKAGE_RELEASE_DATE=2023-12-27 # Ensure that make can run correctly @@ -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 From fd412d124db9f9236755b3aed8bb26bce73c01c1 Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 27 Dec 2023 22:11:21 -0500 Subject: [PATCH 110/156] latest autoconf/automake update --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 83e84d03039..67c1edf4f70 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=25 MAGICK_VERSION=7.1.1-25 -MAGICK_GIT_REVISION=e119d19f1:20231227 +MAGICK_GIT_REVISION=44ca83b1d:20231227 # Substitute library versioning From 6aac88223316abe5a699a22c9657074809e7bd21 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 28 Dec 2023 09:36:00 -0500 Subject: [PATCH 111/156] identify image time-to-live --- MagickCore/identify.c | 17 +++++++++++++++++ MagickCore/image.c | 7 +------ MagickCore/timer-private.h | 22 +++++++++++----------- MagickCore/timer.c | 2 +- coders/cin.c | 2 +- coders/mat.c | 2 +- coders/pdf.c | 4 ++-- 7 files changed, 34 insertions(+), 22 deletions(-) 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..94679308a0d 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=(int) GetMagickResourceLimit(TimeResource); image->debug=(GetLogEventMask() & (ImageEvent | TransformEvent | CoderEvent)) != 0 ? MagickTrue : MagickFalse; image->reference_count=1; diff --git a/MagickCore/timer-private.h b/MagickCore/timer-private.h index 967115bf763..9457acc199c 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,16 @@ 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) + return(MagickFalse); + return((image->timestamp+image->ttl) < GetMagickTime() ? MagickTrue : MagickFalse); +} + static inline time_t ParseMagickTimeToLive(const char *time_to_live) { char @@ -90,19 +100,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/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/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); From a8a6a61f9118b76d87b9fce6c6cce12ef1379977 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 28 Dec 2023 10:00:06 -0500 Subject: [PATCH 112/156] set errno if time-to-live exceeded --- MagickCore/cache.c | 1 + MagickCore/image.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 711c7a42e94..8e740076d1f 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -1696,6 +1696,7 @@ static Cache GetImagePixelCache(Image *image,const MagickBooleanType clone, if (IsImageTTLExpired(image) != MagickFalse) { + errno=ESTALE; (void) ThrowMagickException(exception,GetMagickModule(), ResourceLimitError,"TimeLimitExceeded","`%s'",image->filename); return((Cache) NULL); diff --git a/MagickCore/image.c b/MagickCore/image.c index 94679308a0d..f1d66cbef33 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -184,7 +184,7 @@ MagickExport Image *AcquireImage(const ImageInfo *image_info, image->channel_map=AcquirePixelChannelMap(); image->blob=CloneBlobInfo((BlobInfo *) NULL); image->timestamp=GetMagickTime(); - image->ttl=(int) GetMagickResourceLimit(TimeResource); + image->ttl=(time_t) GetMagickResourceLimit(TimeResource); image->debug=(GetLogEventMask() & (ImageEvent | TransformEvent | CoderEvent)) != 0 ? MagickTrue : MagickFalse; image->reference_count=1; From 3396dd1783c9e2da8a3cc1cb54c6792f9c29c896 Mon Sep 17 00:00:00 2001 From: Yoshihiro Yamazaki Date: Fri, 29 Dec 2023 10:28:18 +0900 Subject: [PATCH 113/156] When writing BMP to v3 or lower, ignore the ICC profile. (#6979) --- coders/bmp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coders/bmp.c b/coders/bmp.c index 53b84f45ee9..7cef0201d3b 100644 --- a/coders/bmp.c +++ b/coders/bmp.c @@ -2016,7 +2016,10 @@ 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=(StringInfo *) NULL; + else + profile=GetImageProfile(image,"icc"); have_color_info=(image->rendering_intent != UndefinedIntent) || (profile != (StringInfo *) NULL) || (image->gamma != 0.0) ? MagickTrue : MagickFalse; From c59b33446da2debdd67f550dfd8513ce98c0d571 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 28 Dec 2023 20:32:21 -0500 Subject: [PATCH 114/156] cosmetic --- coders/bmp.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/coders/bmp.c b/coders/bmp.c index 7cef0201d3b..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,9 +2016,7 @@ 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; - if (type <= 3) - profile=(StringInfo *) NULL; - else + if (type > 3) profile=GetImageProfile(image,"icc"); have_color_info=(image->rendering_intent != UndefinedIntent) || (profile != (StringInfo *) NULL) || (image->gamma != 0.0) ? MagickTrue : From 43a44ea57e3c89b96139153fc297e74f9397bab4 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 28 Dec 2023 20:44:41 -0500 Subject: [PATCH 115/156] conditionally set errno to ESTALE --- MagickCore/cache.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 8e740076d1f..0822ba34afd 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -1696,7 +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); From 371c8da8d6a58f5d6a955f6230160f327e4ebf41 Mon Sep 17 00:00:00 2001 From: Cristy Date: Thu, 28 Dec 2023 21:01:53 -0500 Subject: [PATCH 116/156] cosmetic --- MagickCore/timer-private.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MagickCore/timer-private.h b/MagickCore/timer-private.h index 9457acc199c..7ecc0457bff 100644 --- a/MagickCore/timer-private.h +++ b/MagickCore/timer-private.h @@ -61,9 +61,10 @@ extern MagickExport time_t static inline MagickBooleanType IsImageTTLExpired(const Image* image) { - if (image->ttl == (time_t) 0) - return(MagickFalse); - return((image->timestamp+image->ttl) < GetMagickTime() ? MagickTrue : MagickFalse); + 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) From 75c72e1a91ccbfd726fff2fcaa0a3965d118b338 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 29 Dec 2023 10:23:29 +0100 Subject: [PATCH 117/156] Moved oss-fuzz files to a different folder. --- Magick++/fuzz/build.sh | 23 ------------------- .../fuzz => oss-fuzz}/build_dependencies.sh | 0 {Magick++/fuzz => oss-fuzz}/build_fuzzers.sh | 0 .../fuzz => oss-fuzz}/build_imagemagick.sh | 0 {Magick++/fuzz => oss-fuzz}/crop_fuzzer.cc | 0 .../fuzz => oss-fuzz}/dictionaries/mvg.dict | 0 {Magick++/fuzz => oss-fuzz}/encoder_format.h | 0 {Magick++/fuzz => oss-fuzz}/encoder_fuzzer.cc | 0 .../encoder_gradient_fuzzer.cc | 0 .../fuzz => oss-fuzz}/encoder_label_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/encoder_list.cc | 0 .../encoder_pattern_fuzzer.cc | 0 .../encoder_plasma_fuzzer.cc | 0 .../encoder_radial-gradient_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/encoder_utils.cc | 0 .../fuzz => oss-fuzz}/encoder_xc_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/enhance_fuzzer.cc | 0 .../huffman_decode_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/main.cc | 0 {Magick++/fuzz => oss-fuzz}/ping_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/rotate_fuzzer.cc | 0 {Magick++/fuzz => oss-fuzz}/utils.cc | 0 22 files changed, 23 deletions(-) delete mode 100755 Magick++/fuzz/build.sh rename {Magick++/fuzz => oss-fuzz}/build_dependencies.sh (100%) mode change 100755 => 100644 rename {Magick++/fuzz => oss-fuzz}/build_fuzzers.sh (100%) mode change 100755 => 100644 rename {Magick++/fuzz => oss-fuzz}/build_imagemagick.sh (100%) mode change 100755 => 100644 rename {Magick++/fuzz => oss-fuzz}/crop_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/dictionaries/mvg.dict (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_format.h (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_gradient_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_label_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_list.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_pattern_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_plasma_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_radial-gradient_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_utils.cc (100%) rename {Magick++/fuzz => oss-fuzz}/encoder_xc_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/enhance_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/huffman_decode_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/main.cc (100%) rename {Magick++/fuzz => oss-fuzz}/ping_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/rotate_fuzzer.cc (100%) rename {Magick++/fuzz => oss-fuzz}/utils.cc (100%) diff --git a/Magick++/fuzz/build.sh b/Magick++/fuzz/build.sh deleted file mode 100755 index e407acc0aca..00000000000 --- a/Magick++/fuzz/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -eu - -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_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 - -. $MAGICK_SRC/build_dependencies.sh -. $MAGICK_SRC/build_imagemagick.sh -. $MAGICK_SRC/build_fuzzers.sh - -mkdir afl_testcases -(cd afl_testcases; tar xvf "$SRC/afl_testcases.tgz") -for format in gif jpg png bmp ico webp tif; do - mkdir $format - find afl_testcases -type f -name '*.'$format -exec mv -n {} $format/ \; - zip -rj $format.zip $format/ - cp $format.zip "$OUT/encoder_${format}_fuzzer_seed_corpus.zip" -done diff --git a/Magick++/fuzz/build_dependencies.sh b/oss-fuzz/build_dependencies.sh old mode 100755 new mode 100644 similarity index 100% rename from Magick++/fuzz/build_dependencies.sh rename to oss-fuzz/build_dependencies.sh 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/Magick++/fuzz/build_imagemagick.sh b/oss-fuzz/build_imagemagick.sh old mode 100755 new mode 100644 similarity index 100% rename from Magick++/fuzz/build_imagemagick.sh rename to oss-fuzz/build_imagemagick.sh 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 From abc23f11bacbc4dc498eaabfbc02e965ced60825 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 29 Dec 2023 10:35:19 +0100 Subject: [PATCH 118/156] Changes due to moving the oss-fuzz files. --- .devcontainer/security/Dockerfile | 2 +- .devcontainer/security/build_imagemagick.sh | 2 +- oss-fuzz/build.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/security/Dockerfile b/.devcontainer/security/Dockerfile index 0e50678ce07..dd866a48316 100644 --- a/.devcontainer/security/Dockerfile +++ b/.devcontainer/security/Dockerfile @@ -24,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/oss-fuzz/build.sh b/oss-fuzz/build.sh index e407acc0aca..fb22e18027b 100644 --- a/oss-fuzz/build.sh +++ b/oss-fuzz/build.sh @@ -3,7 +3,7 @@ MAGICK_COMPILER=$CXX MAGICK_COMPILER_FLAGS=$CXXFLAGS MAGICK_INCLUDE="$WORK/include/ImageMagick-7" -MAGICK_SRC="$SRC/imagemagick/Magick++/fuzz" +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 From 9a7e87a89f92ee525c4e2c077a8a128e7796c897 Mon Sep 17 00:00:00 2001 From: Cristy Date: Fri, 29 Dec 2023 13:13:15 -0500 Subject: [PATCH 119/156] ensure video can be read from stdin (https://github.com/ImageMagick/ImageMagick/issues/6980) --- coders/video.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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); } From 30274e544e79ab2a53a95b1a9ad6d52cec314220 Mon Sep 17 00:00:00 2001 From: Cristy Date: Fri, 29 Dec 2023 22:06:36 -0500 Subject: [PATCH 120/156] ignore SyncBlob() status in CloseBlob() (https://github.com/ImageMagick/ImageMagick/issues/6984) --- MagickCore/blob.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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) From ca392c79e28778606e2a0e0fb2c2d5bc38e58f8e Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 30 Dec 2023 07:47:25 -0500 Subject: [PATCH 121/156] repo change --- www/mirror.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 + From d4298eab18d1d39d80a32f983ed99b5443ad5fe5 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 30 Dec 2023 09:05:52 -0500 Subject: [PATCH 122/156] update manifest --- PerlMagick/MANIFEST | 2 -- 1 file changed, 2 deletions(-) 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 From 054b98c80fe9b5d09db095f8a4e03586f0ef6e31 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 30 Dec 2023 11:32:05 -0500 Subject: [PATCH 123/156] release --- coders/url.c | 2 +- configure | 6 +++--- m4/version.m4 | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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/configure b/configure index 67c1edf4f70..6fa4a5d8d57 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=25 MAGICK_VERSION=7.1.1-25 -MAGICK_GIT_REVISION=44ca83b1d:20231227 +MAGICK_GIT_REVISION=d4298eab1:20231230 # Substitute library versioning @@ -5211,7 +5211,7 @@ PACKAGE_BASE_VERSION=7.1.1 PACKAGE_PATCHLEVEL_VERSION=25 -if test "y" = 'y'; then +if test "n" = 'y'; then PACKAGE_VERSION_ADDENDUM='-25 (Beta)' else PACKAGE_VERSION_ADDENDUM=-25 @@ -5221,7 +5221,7 @@ PACKAGE_LIB_VERSION=0x711 PACKAGE_LIB_VERSION_NUMBER=7,1,1,25 -PACKAGE_RELEASE_DATE=2023-12-27 +PACKAGE_RELEASE_DATE=2023-12-30 # Ensure that make can run correctly diff --git a/m4/version.m4 b/m4/version.m4 index 50661821ef2..f80a9eb7b2d 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -28,7 +28,7 @@ m4_define([magick_major_version], [7]) m4_define([magick_minor_version], [1]) m4_define([magick_micro_version], [1]) m4_define([magick_patchlevel_version], [25]) -m4_define([magick_is_beta], [y]) +m4_define([magick_is_beta], [n]) m4_define([magick_bugreport], [https://github.com/ImageMagick/ImageMagick/issues]) m4_define([magick_url], [https://imagemagick.org]) From 98e7513a5b28adb5f39855a27108fd9a2a01c202 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 30 Dec 2023 14:44:43 -0500 Subject: [PATCH 124/156] release --- configure | 2 +- m4/version.m4 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 6fa4a5d8d57..3a8073af273 100755 --- a/configure +++ b/configure @@ -5187,7 +5187,7 @@ MAGICK_PATCHLEVEL_VERSION=25 MAGICK_VERSION=7.1.1-25 -MAGICK_GIT_REVISION=d4298eab1:20231230 +MAGICK_GIT_REVISION=054b98c80:20231230 # Substitute library versioning diff --git a/m4/version.m4 b/m4/version.m4 index f80a9eb7b2d..ce6a67c7fb4 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -35,6 +35,7 @@ m4_define([magick_url], [https://imagemagick.org]) m4_define([magick_lib_version], [0x711]) m4_define([magick_tarname], [ImageMagick]) + # # If the library source code has changed at all since the last update, # increment revision (‘c:r:a’ becomes ‘c:r+1:a’). If any interfaces have been From 15b1a5d99d742c4a8254ccbe6b2e6d42b73be675 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 30 Dec 2023 16:51:23 -0500 Subject: [PATCH 125/156] beta release --- configure | 36 ++++++++++++++++++------------------ m4/version.m4 | 5 ++--- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/configure b/configure index 3a8073af273..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-25. +# 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-25' -PACKAGE_STRING='ImageMagick 7.1.1-25' +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-25 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-25:";; + 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-25 +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-25, 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-25' + VERSION='7.1.1-26' # Some tools Automake needs. @@ -5183,11 +5183,11 @@ MAGICK_MINOR_VERSION=1 MAGICK_MICRO_VERSION=1 -MAGICK_PATCHLEVEL_VERSION=25 +MAGICK_PATCHLEVEL_VERSION=26 -MAGICK_VERSION=7.1.1-25 +MAGICK_VERSION=7.1.1-26 -MAGICK_GIT_REVISION=054b98c80:20231230 +MAGICK_GIT_REVISION=98e7513a5:20231230 # Substitute library versioning @@ -5209,17 +5209,17 @@ MAGICKPP_LIBRARY_VERSION_INFO=$MAGICKPP_LIBRARY_CURRENT:$MAGICKPP_LIBRARY_REVISI PACKAGE_BASE_VERSION=7.1.1 -PACKAGE_PATCHLEVEL_VERSION=25 +PACKAGE_PATCHLEVEL_VERSION=26 -if test "n" = 'y'; then - PACKAGE_VERSION_ADDENDUM='-25 (Beta)' +if test "y" = 'y'; then + PACKAGE_VERSION_ADDENDUM='-26 (Beta)' else - PACKAGE_VERSION_ADDENDUM=-25 + PACKAGE_VERSION_ADDENDUM=-26 fi PACKAGE_LIB_VERSION=0x711 -PACKAGE_LIB_VERSION_NUMBER=7,1,1,25 +PACKAGE_LIB_VERSION_NUMBER=7,1,1,26 PACKAGE_RELEASE_DATE=2023-12-30 @@ -38893,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-25, 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 @@ -38962,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-25 +ImageMagick config.status 7.1.1-26 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/m4/version.m4 b/m4/version.m4 index ce6a67c7fb4..6a6b627c097 100644 --- a/m4/version.m4 +++ b/m4/version.m4 @@ -27,15 +27,14 @@ 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], [25]) -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]) m4_define([magick_lib_version], [0x711]) m4_define([magick_tarname], [ImageMagick]) - # # If the library source code has changed at all since the last update, # increment revision (‘c:r:a’ becomes ‘c:r+1:a’). If any interfaces have been From 2d36d1af07e9bcc5d0a43584d61210781affec8a Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 31 Dec 2023 12:16:16 +0100 Subject: [PATCH 126/156] Improved name of installer artifacts --- .github/workflows/release.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a8d6227483..7f99f105c42 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -184,9 +184,19 @@ jobs: timestamp-digest: SHA256 timeout: 600 + - 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: 'ImageMagick-${{steps.package.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.platform}}' + 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: From 6c76d71a80d50a389f89905c86bd54e7f6e2d2ee Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 31 Dec 2023 13:20:38 +0100 Subject: [PATCH 127/156] Trim version to avoid trailing - --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f99f105c42..d800a066834 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -190,6 +190,7 @@ jobs: 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.Trim() $version = $version -Replace "`n|`r|""","" $version = $version -Replace " ","-" echo "version=$version" >> $env:GITHUB_OUTPUT @@ -345,6 +346,7 @@ jobs: $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.Trim() $version = $version -Replace "`n|`r|""","" $version = $version -Replace " ","-" echo "version=$version" >> $env:GITHUB_OUTPUT From 0ce621fe81bbfb2087e4deaef1992b3815e4a221 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 31 Dec 2023 07:43:19 -0500 Subject: [PATCH 128/156] support -alpha remove-opaque option --- MagickCore/channel.c | 43 +++++++++++++++++++++++++++++++++++++++++++ MagickCore/channel.h | 21 +++++++++++++++++++++ MagickCore/image.h | 20 -------------------- MagickCore/option.c | 2 ++ 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/MagickCore/channel.c b/MagickCore/channel.c index fa027c7e24d..c0d29b39769 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -1261,6 +1261,49 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image->alpha_trait=image->background_color.alpha_trait; break; } + case RemoveOpaqueAlphaChannel: + { + 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,1) +#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; + p+=GetPixelChannels(image); + } + } + image_view=DestroyCacheView(image_view); + if (opaque != MagickFalse) + image->alpha_trait=UndefinedPixelTrait; + break; + } case SetAlphaChannel: { if ((image->alpha_trait & BlendPixelTrait) == 0) diff --git a/MagickCore/channel.h b/MagickCore/channel.h index 5ef504b8f1a..ed0d9052f56 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, + RemoveOpaqueAlphaChannel +} AlphaChannelOption; + extern MagickExport Image *ChannelFxImage(const Image *,const char *,ExceptionInfo *), *CombineImages(const Image *,const ColorspaceType,ExceptionInfo *), 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/option.c b/MagickCore/option.c index 3e848024f5d..0c832f5b70e 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" @@ -115,6 +116,7 @@ static const OptionInfo { "On", OnAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Opaque", OpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Remove", RemoveAlphaChannel, UndefinedOptionFlag, MagickFalse }, + { "RemoveOpaque", RemoveOpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Set", SetAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Shape", ShapeAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Reset", SetAlphaChannel, DeprecateOptionFlag, MagickTrue }, From 3ee902d23a43f2fd91eb92676280e76642675d17 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 31 Dec 2023 14:13:57 +0100 Subject: [PATCH 129/156] Reverted incorrect patch. --- .github/workflows/release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d800a066834..7f99f105c42 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -190,7 +190,6 @@ jobs: 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.Trim() $version = $version -Replace "`n|`r|""","" $version = $version -Replace " ","-" echo "version=$version" >> $env:GITHUB_OUTPUT @@ -346,7 +345,6 @@ jobs: $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.Trim() $version = $version -Replace "`n|`r|""","" $version = $version -Replace " ","-" echo "version=$version" >> $env:GITHUB_OUTPUT From 8876f135a90ba2e1d5621a3239a21fc02e0e0c07 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 31 Dec 2023 10:43:50 -0500 Subject: [PATCH 130/156] reduce # threads for -alpha option --- MagickCore/channel.c | 12 ++++++------ MagickCore/thread-private.h | 15 ++++++++------- MagickCore/thread.c | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/MagickCore/channel.c b/MagickCore/channel.c index c0d29b39769..c55a90be409 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -1014,7 +1014,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,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1074,7 +1074,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,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1134,7 +1134,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,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1229,7 +1229,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,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1274,7 +1274,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, 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,1) + magick_number_threads(image,image,image->rows,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1327,7 +1327,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,4) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/thread-private.h b/MagickCore/thread-private.h index 291a6e467b9..ad3424295ed 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,int factor) { +#define WorkLoadFactor (32 << factor) + const CacheType destination_type = (CacheType) GetImagePixelCacheType(destination), source_type = (CacheType) GetImagePixelCacheType(source); @@ -61,14 +62,14 @@ static inline int GetMagickNumberThreads(const Image *source, /* Return number of threads dependent on cache type and work load. */ - if (multithreaded == 0) + if (factor == 0) return(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); + number_threads=(int) MagickMin((ssize_t) GetMagickResourceLimit( + ThreadResource),(ssize_t) (chunk)/WorkLoadFactor); return(MagickMax(number_threads,1)); } 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 % From 66ef7585ed386af240f24495507168e6e2d2cd54 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 31 Dec 2023 20:36:39 -0500 Subject: [PATCH 131/156] -alpha deactivate-if-opaque disables the alpha channel if and only if its entirely opaque --- MagickCore/channel.c | 2 +- MagickCore/channel.h | 2 +- MagickCore/option.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MagickCore/channel.c b/MagickCore/channel.c index c55a90be409..2e5ef479496 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -1261,7 +1261,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image->alpha_trait=image->background_color.alpha_trait; break; } - case RemoveOpaqueAlphaChannel: + case DeactivateIfOpaqueAlphaChannel: { MagickBooleanType opaque = MagickTrue; diff --git a/MagickCore/channel.h b/MagickCore/channel.h index ed0d9052f56..65c45276853 100644 --- a/MagickCore/channel.h +++ b/MagickCore/channel.h @@ -42,7 +42,7 @@ typedef enum SetAlphaChannel, ShapeAlphaChannel, TransparentAlphaChannel, - RemoveOpaqueAlphaChannel + DeactivateIfOpaqueAlphaChannel } AlphaChannelOption; extern MagickExport Image diff --git a/MagickCore/option.c b/MagickCore/option.c index 0c832f5b70e..d107ab611ce 100644 --- a/MagickCore/option.c +++ b/MagickCore/option.c @@ -109,6 +109,7 @@ static const OptionInfo { "Background", BackgroundAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Copy", CopyAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Deactivate", DeactivateAlphaChannel, UndefinedOptionFlag, MagickFalse }, + { "DeactivateIfOpaque", DeactivateIfOpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Discrete", DiscreteAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Disassociate", DisassociateAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Extract", ExtractAlphaChannel, UndefinedOptionFlag, MagickFalse }, @@ -116,7 +117,6 @@ static const OptionInfo { "On", OnAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Opaque", OpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Remove", RemoveAlphaChannel, UndefinedOptionFlag, MagickFalse }, - { "RemoveOpaque", RemoveOpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Set", SetAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Shape", ShapeAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Reset", SetAlphaChannel, DeprecateOptionFlag, MagickTrue }, From e9a68f03e4955058218da7f2d5df659812270c26 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 31 Dec 2023 20:52:50 -0500 Subject: [PATCH 132/156] -alpha off-if-opaque turns off the alpha channel if its entirely opaque --- MagickCore/channel.c | 86 ++++++++++++++++++++++---------------------- MagickCore/channel.h | 2 +- MagickCore/option.c | 2 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/MagickCore/channel.c b/MagickCore/channel.c index 2e5ef479496..e42ab2c1df4 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -1204,6 +1204,49 @@ 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,4) +#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; + p+=GetPixelChannels(image); + } + } + image_view=DestroyCacheView(image_view); + if (opaque != MagickFalse) + image->alpha_trait=UndefinedPixelTrait; + break; + } case OnAlphaChannel: { if ((image->alpha_trait & BlendPixelTrait) == 0) @@ -1261,49 +1304,6 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, image->alpha_trait=image->background_color.alpha_trait; break; } - case DeactivateIfOpaqueAlphaChannel: - { - 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,4) -#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; - p+=GetPixelChannels(image); - } - } - image_view=DestroyCacheView(image_view); - if (opaque != MagickFalse) - image->alpha_trait=UndefinedPixelTrait; - break; - } case SetAlphaChannel: { if ((image->alpha_trait & BlendPixelTrait) == 0) diff --git a/MagickCore/channel.h b/MagickCore/channel.h index 65c45276853..641ba79acbc 100644 --- a/MagickCore/channel.h +++ b/MagickCore/channel.h @@ -42,7 +42,7 @@ typedef enum SetAlphaChannel, ShapeAlphaChannel, TransparentAlphaChannel, - DeactivateIfOpaqueAlphaChannel + OffIfOpaqueAlphaChannel } AlphaChannelOption; extern MagickExport Image diff --git a/MagickCore/option.c b/MagickCore/option.c index d107ab611ce..abd64d8e592 100644 --- a/MagickCore/option.c +++ b/MagickCore/option.c @@ -109,11 +109,11 @@ static const OptionInfo { "Background", BackgroundAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Copy", CopyAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Deactivate", DeactivateAlphaChannel, UndefinedOptionFlag, MagickFalse }, - { "DeactivateIfOpaque", DeactivateIfOpaqueAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "Discrete", DiscreteAlphaChannel, UndefinedOptionFlag, MagickFalse }, { "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 }, From e6f053085447e82657755b44e53c27059f5eca6c Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 31 Dec 2023 20:55:43 -0500 Subject: [PATCH 133/156] slight optimization --- MagickCore/channel.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MagickCore/channel.c b/MagickCore/channel.c index e42ab2c1df4..ab8bddc4c68 100644 --- a/MagickCore/channel.c +++ b/MagickCore/channel.c @@ -1238,7 +1238,10 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, for (x=0; x < (ssize_t) image->columns; x++) { if (GetPixelAlpha(image,p) != OpaqueAlpha) - opaque=MagickFalse; + { + opaque=MagickFalse; + break; + } p+=GetPixelChannels(image); } } From 1294dac3875b26c40f4701c9d5d5ffc39c22ecac Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 1 Jan 2024 09:00:14 +0100 Subject: [PATCH 134/156] fix error: 'libraw_data_t' has no member named 'rawparams' --- coders/dng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coders/dng.c b/coders/dng.c index 2078936e69c..3c6db83c7b3 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -333,7 +333,7 @@ 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; option=GetImageOption(image_info,"dng:max-raw-memory"); if (option != (const char *) NULL) From c29cf7f1135c297bd9c30caf1c9ae446980ae784 Mon Sep 17 00:00:00 2001 From: Cristy Date: Mon, 1 Jan 2024 16:40:18 -0500 Subject: [PATCH 135/156] thread tuning --- MagickCore/annotate.c | 23 ++++++-- MagickCore/attribute.c | 101 ++++++++++++++++++++++-------------- MagickCore/cache.c | 6 +-- MagickCore/channel.c | 24 +++++---- MagickCore/colormap.c | 23 +++++--- MagickCore/colorspace.c | 28 +++++----- MagickCore/composite.c | 10 ++-- MagickCore/draw.c | 2 +- MagickCore/effect.c | 20 ++++--- MagickCore/image.c | 28 ++++++---- MagickCore/matrix.c | 2 +- MagickCore/paint.c | 8 ++- MagickCore/shear.c | 10 ++-- MagickCore/threshold.c | 26 +++++----- MagickCore/transform.c | 20 +++---- MagickCore/vision.c | 6 +-- MagickCore/visual-effects.c | 10 ++-- 17 files changed, 202 insertions(+), 145 deletions(-) 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/cache.c b/MagickCore/cache.c index 0822ba34afd..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++) { @@ -5226,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 ab8bddc4c68..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,4) + 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,4) + 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,4) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1217,7 +1219,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, 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,4) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1275,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,4) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -1330,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,4) + magick_number_threads(image,image,image->rows,2) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/colormap.c b/MagickCore/colormap.c index 2a29441df8a..3902cee7fcc 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++) { @@ -345,25 +345,34 @@ MagickExport MagickBooleanType SortColormapByIntensity(Image *image, pixels[(ssize_t) image->colormap[i].alpha]=(unsigned short) i; 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/image.c b/MagickCore/image.c index f1d66cbef33..60cedb01234 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -542,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++) { @@ -1086,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++) { @@ -1480,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 @@ -1821,7 +1825,7 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(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++) { @@ -2071,7 +2075,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++) { @@ -2271,7 +2275,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++) { @@ -2350,7 +2354,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++) { @@ -2438,6 +2442,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 @@ -2550,7 +2558,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++) { @@ -3268,7 +3276,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++) { @@ -3427,7 +3435,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++) { @@ -3932,7 +3940,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/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/paint.c b/MagickCore/paint.c index 2d0a3cb0e55..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,6 +355,9 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image, { if (GetPixelGray(floodplane_image,p) != 0) { + PixelInfo + fill_color; + GetFillColor(draw_info,x,y,&fill_color,exception); if ((image->channel_mask & RedChannel) != 0) SetPixelRed(image,(Quantum) fill_color.red,q); 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/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/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/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++) { From b8fd1e7af732289c62019fe573c2c1515ce63e28 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Tue, 2 Jan 2024 08:06:06 +0100 Subject: [PATCH 136/156] Silenced warning. --- MagickCore/colormap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MagickCore/colormap.c b/MagickCore/colormap.c index 3902cee7fcc..91b90f9f872 100644 --- a/MagickCore/colormap.c +++ b/MagickCore/colormap.c @@ -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,8 +341,8 @@ 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) From 80cb07da4df28677c8069082ab39fb222c98e0b3 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 2 Jan 2024 12:28:49 -0500 Subject: [PATCH 137/156] thread tunuing --- MagickCore/resize.c | 2 +- MagickCore/resource.c | 10 ++++++---- MagickCore/thread-private.h | 15 ++++++--------- 3 files changed, 13 insertions(+), 14 deletions(-) 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/thread-private.h b/MagickCore/thread-private.h index ad3424295ed..9458f546bc5 100644 --- a/MagickCore/thread-private.h +++ b/MagickCore/thread-private.h @@ -50,7 +50,7 @@ extern "C" { static inline int GetMagickNumberThreads(const Image *source, const Image *destination,const size_t chunk,int factor) { -#define WorkLoadFactor (32 << factor) +#define WorkLoadFactor (64UL << factor) const CacheType destination_type = (CacheType) GetImagePixelCacheType(destination), @@ -62,15 +62,12 @@ static inline int GetMagickNumberThreads(const Image *source, /* Return number of threads dependent on cache type and work load. */ - if (factor == 0) - return(1); + number_threads=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)/WorkLoadFactor); - return(MagickMax(number_threads,1)); + number_threads=MagickMin(number_threads,2); + return(number_threads); } static inline MagickThreadType GetMagickThreadId(void) @@ -161,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 } From f8ba2781a6fbe9c7a8b0568f461ee1c5b1e43b1d Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 2 Jan 2024 15:31:49 -0500 Subject: [PATCH 138/156] optimize HDRI detection --- MagickCore/image.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/MagickCore/image.c b/MagickCore/image.c index 60cedb01234..745035b1e0c 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -1812,7 +1812,7 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, *image_view; MagickBooleanType - status; + hdri = MagickFalse; ssize_t y; @@ -1821,10 +1821,9 @@ 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) \ + #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++) @@ -1835,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 @@ -1862,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 } From 3e2879ec690b83698490fff33a8aef00da459dd2 Mon Sep 17 00:00:00 2001 From: Cristy Date: Tue, 2 Jan 2024 19:54:41 -0500 Subject: [PATCH 139/156] factor is a const argument --- MagickCore/thread-private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagickCore/thread-private.h b/MagickCore/thread-private.h index 9458f546bc5..4effddc9709 100644 --- a/MagickCore/thread-private.h +++ b/MagickCore/thread-private.h @@ -48,7 +48,7 @@ extern "C" { #endif static inline int GetMagickNumberThreads(const Image *source, - const Image *destination,const size_t chunk,int factor) + const Image *destination,const size_t chunk,const int factor) { #define WorkLoadFactor (64UL << factor) From 0f0ccfd9d44c9f36d174b066b15db563af332eec Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Wed, 3 Jan 2024 08:37:39 +0100 Subject: [PATCH 140/156] Fixed build on Windows. --- MagickCore/thread-private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagickCore/thread-private.h b/MagickCore/thread-private.h index 4effddc9709..23ba9b6ce14 100644 --- a/MagickCore/thread-private.h +++ b/MagickCore/thread-private.h @@ -62,7 +62,7 @@ static inline int GetMagickNumberThreads(const Image *source, /* Return number of threads dependent on cache type and work load. */ - number_threads=MagickMax(MagickMin(chunk/WorkLoadFactor, + number_threads=(int) MagickMax(MagickMin(chunk/WorkLoadFactor, GetMagickResourceLimit(ThreadResource)),1); if (((source_type != MemoryCache) && (source_type != MapCache)) || ((destination_type != MemoryCache) && (destination_type != MapCache))) From 79e742a3369add2e236f0f9a7bb1f64a7bfa3146 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 5 Jan 2024 11:30:43 +0100 Subject: [PATCH 141/156] Removed duplicate define. --- MagickWand/studio.h | 4 ---- 1 file changed, 4 deletions(-) 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 From e5162e69d945d81405687f4fc773863c49ba9168 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 5 Jan 2024 11:32:45 +0100 Subject: [PATCH 142/156] The CheckPSDChannels method should not check empty layers. --- coders/psd.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/coders/psd.c b/coders/psd.c index ee7b0e67e07..599fb23cc1f 100644 --- a/coders/psd.c +++ b/coders/psd.c @@ -1670,6 +1670,13 @@ static MagickBooleanType ReadPSDLayer(Image *image,const ImageInfo *image_info, return(status); } +static MagickBooleanType IsEmptyLayer(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 (IsEmptyLayer(layer_info) != MagickFalse) + return(MagickTrue); if (layer_info->channels < psd_info->min_channels) return(MagickFalse); channel_type=RedChannel; @@ -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 (IsEmptyLayer(&layer_info[i]) != MagickFalse) { if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), From cbf79ad2000805a25ebe72d91604cd7831905946 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 5 Jan 2024 11:39:13 +0100 Subject: [PATCH 143/156] Use consistent casing of method names. --- coders/psd.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/coders/psd.c b/coders/psd.c index 599fb23cc1f..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,7 +1670,7 @@ static MagickBooleanType ReadPSDLayer(Image *image,const ImageInfo *image_info, return(status); } -static MagickBooleanType IsEmptyLayer(LayerInfo *layer_info) +static MagickBooleanType IsEmptyPSDLayer(LayerInfo *layer_info) { if ((layer_info->page.width == 0) || (layer_info->page.height == 0)) return(MagickTrue); @@ -1689,7 +1689,7 @@ static MagickBooleanType CheckPSDChannels(const Image *image, ssize_t i; - if (IsEmptyLayer(layer_info) != MagickFalse) + if (IsEmptyPSDLayer(layer_info) != MagickFalse) return(MagickTrue); if (layer_info->channels < psd_info->min_channels) return(MagickFalse); @@ -2015,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, @@ -2176,7 +2176,7 @@ static MagickBooleanType ReadPSDLayersInternal(Image *image, for (i=0; i < number_layers; i++) { - if (IsEmptyLayer(&layer_info[i]) != MagickFalse) + if (IsEmptyPSDLayer(&layer_info[i]) != MagickFalse) { if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), @@ -2312,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(), From 99c9ee4b03571e10348c96b5923e01cdb4f67820 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Fri, 5 Jan 2024 17:12:07 +0100 Subject: [PATCH 144/156] Allow invalid webp files that incorrectly include the size of the header in the length. --- coders/webp.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) 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"); From 8e1b405179adee514f178c911a1ca20060a1125f Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 07:08:58 -0500 Subject: [PATCH 145/156] https://github.com/ImageMagick/ImageMagick/issues/7006 --- coders/dng.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/coders/dng.c b/coders/dng.c index 3c6db83c7b3..80b715231c3 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -333,11 +333,19 @@ 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) +#else + raw_info->params.max_raw_memory_mb=(unsigned int) +#endif StringToInteger(option); #endif raw_info->params.user_flip=0; From 9033dea0ff8e5694e70d2a6a11f29407a0e4c85d Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 07:12:14 -0500 Subject: [PATCH 146/156] cosmetic --- coders/dng.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coders/dng.c b/coders/dng.c index 80b715231c3..e183bfa1608 100644 --- a/coders/dng.c +++ b/coders/dng.c @@ -343,10 +343,10 @@ static void SetLibRawParams(const ImageInfo *image_info,Image *image, 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) + raw_info->params.max_raw_memory_mb=(unsigned int) StringToInteger(option); #endif - StringToInteger(option); #endif raw_info->params.user_flip=0; raw_info->params.output_bps=16; From 802ffae7781dd635e25edef86e8357c93b17bf5a Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 08:06:45 -0500 Subject: [PATCH 147/156] improve RSVG exception checking (https://github.com/ImageMagick/ImageMagick/issues/7005) --- coders/svg.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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); From e80133bc76f549156e3437b62c3699850e020a16 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 09:09:01 -0500 Subject: [PATCH 148/156] fix off-by-one issue for captions/labels (https://github.com/ImageMagick/ImageMagick/issues/7004) --- coders/caption.c | 20 +++++++++++--------- coders/label.c | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/coders/caption.c b/coders/caption.c index af4a82f432e..58b0a1c78ab 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,14 +317,14 @@ 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; diff --git a/coders/label.c b/coders/label.c index 5d08035a25f..024038f1350 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) @@ -254,14 +256,14 @@ static Image *ReadLABELImage(const ImageInfo *image_info, 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; From 2d24367dc971dcf61afe65dc65aba4519ea1d20f Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 10:12:50 -0500 Subject: [PATCH 149/156] fix caption sizing issue (https://github.com/ImageMagick/ImageMagick/issues/7004) --- coders/caption.c | 14 +++++++------- coders/label.c | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/coders/caption.c b/coders/caption.c index 58b0a1c78ab..4f8aa5e4c6f 100644 --- a/coders/caption.c +++ b/coders/caption.c @@ -284,14 +284,14 @@ 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)) 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; @@ -317,14 +317,14 @@ 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; diff --git a/coders/label.c b/coders/label.c index 024038f1350..815b4d3fd45 100644 --- a/coders/label.c +++ b/coders/label.c @@ -221,14 +221,14 @@ static Image *ReadLABELImage(const ImageInfo *image_info, 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) @@ -240,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", @@ -256,14 +256,14 @@ static Image *ReadLABELImage(const ImageInfo *image_info, 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; From 90ac70a9b725aee99b62851b5927429a66c68d80 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 17:50:13 -0500 Subject: [PATCH 150/156] correct off by one issue --- coders/caption.c | 17 +++++++++-------- coders/label.c | 19 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/coders/caption.c b/coders/caption.c index 4f8aa5e4c6f..30b4dcc4516 100644 --- a/coders/caption.c +++ b/coders/caption.c @@ -284,14 +284,14 @@ 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)) 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; @@ -317,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/label.c b/coders/label.c index 815b4d3fd45..121c6cf666d 100644 --- a/coders/label.c +++ b/coders/label.c @@ -221,14 +221,14 @@ static Image *ReadLABELImage(const ImageInfo *image_info, 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) @@ -269,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) @@ -282,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) From 41015d0d119a8c7301834aae5607d928ac5b50e3 Mon Sep 17 00:00:00 2001 From: Ted Lyngmo Date: Sat, 6 Jan 2024 23:57:16 +0100 Subject: [PATCH 151/156] Make Magick++-config work from non-standard places (#7008) When the .pc file is installed in a location not searched by pkg-config by default, Magick++-config failed. Fixes #7007 Signed-off-by: Ted Lyngmo --- Magick++/bin/Magick++-config.in | 1 + MagickCore/MagickCore-config.in | 1 + MagickWand/MagickWand-config.in | 1 + 3 files changed, 3 insertions(+) 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/MagickCore/MagickCore-config.in b/MagickCore/MagickCore-config.in index c6631b6984d..ecb02ee35a5 100644 --- a/MagickCore/MagickCore-config.in +++ b/MagickCore/MagickCore-config.in @@ -6,6 +6,7 @@ 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]" 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]" From a5dbba6494663c3d067e7eb1f2fdf3a776acfb07 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 6 Jan 2024 19:01:27 -0500 Subject: [PATCH 152/156] correct usage --- MagickCore/MagickCore-config.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagickCore/MagickCore-config.in b/MagickCore/MagickCore-config.in index ecb02ee35a5..ab790055d19 100644 --- a/MagickCore/MagickCore-config.in +++ b/MagickCore/MagickCore-config.in @@ -13,7 +13,7 @@ Usage: MagickCore-config [--cflags] [--cppflags] [--exec-prefix] [--ldflags] [-- 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 From dbf838e98fc4b4605d2c0e37851f7a4e535d1d78 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 7 Jan 2024 14:09:41 +0200 Subject: [PATCH 153/156] Revert "opencl.c: replace lt_dlclose() with dlclose() / FreeLibrary()" Has been fixed upstream. --- MagickCore/opencl.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index 2db301449a3..142c9011cb1 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -90,6 +90,9 @@ #include "MagickCore/utility-private.h" #if defined(MAGICKCORE_OPENCL_SUPPORT) +#if defined(MAGICKCORE_LTDL_DELEGATE) +#include "ltdl.h" +#endif /* Define declarations. @@ -2587,13 +2590,8 @@ MagickPrivate void OpenCLTerminus() RelinquishSemaphoreInfo(&openCL_lock); if (openCL_library != (MagickLibrary *) NULL) { - if (openCL_library->library != (void *) NULL) { -#ifdef MAGICKCORE_WINDOWS_SUPPORT - (void) FreeLibrary((HMODULE)openCL_library->library); -#else - (void) dlclose(openCL_library->library); -#endif - } + if (openCL_library->library != (void *) NULL) + (void) lt_dlclose(openCL_library->library); openCL_library=(MagickLibrary *) RelinquishMagickMemory(openCL_library); } } @@ -2753,7 +2751,7 @@ MagickPrivate MagickBooleanType RecordProfileData(MagickCLDevice device, return(MagickTrue); } start/=1000; /* usecs */ - end/=1000; + end/=1000; elapsed=end-start; LockSemaphoreInfo(device->lock); i=0; From d7c60b0be0e7431798f1fb671ddced984c7cc8f0 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 7 Jan 2024 14:09:56 +0200 Subject: [PATCH 154/156] Revert a minor whitespace discrepancy --- MagickWand/MagickWand.h | 1 + 1 file changed, 1 insertion(+) 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) From fcecc0a040e8d2a5bf866fb4daadc3e05e17282a Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 7 Jan 2024 14:43:29 +0200 Subject: [PATCH 155/156] CMake: fix CMake delegate var handling --- cmake/delegates.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake index be7bd18db76..f6b8315064d 100644 --- a/cmake/delegates.cmake +++ b/cmake/delegates.cmake @@ -1,8 +1,8 @@ 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) + 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}) From adf2813a611603f588b6a62f99f0feb604fbbeda Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 7 Jan 2024 14:44:45 +0200 Subject: [PATCH 156/156] conanfile.py: add support for ltdl delegate --- cmake/configure.cmake | 1 + cmake/delegates.cmake | 2 -- conanfile.py | 15 +++++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cmake/configure.cmake b/cmake/configure.cmake index e19a1aea768..f43c97bc7b4 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -114,6 +114,7 @@ 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") diff --git a/cmake/delegates.cmake b/cmake/delegates.cmake index f6b8315064d..a304b7e2e87 100644 --- a/cmake/delegates.cmake +++ b/cmake/delegates.cmake @@ -101,8 +101,6 @@ 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) diff --git a/conanfile.py b/conanfile.py index 7a688845de5..7e46708de24 100644 --- a/conanfile.py +++ b/conanfile.py @@ -1,6 +1,7 @@ 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 @@ -41,6 +42,7 @@ class ImageMagicConan(ConanFile): "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], @@ -77,6 +79,7 @@ class ImageMagicConan(ConanFile): "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, @@ -154,6 +157,8 @@ def requirements(self): 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: @@ -186,6 +191,10 @@ def requirements(self): 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): @@ -226,7 +235,7 @@ def generate(self): tc.variables["LCMS_DELEGATE"] = self.options.with_lcms tc.variables["LIBOPENJP2_DELEGATE"] = self.options.with_openjp2 tc.variables["LQR"] = False - tc.variables["LTDL_DELEGATE"] = 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 @@ -279,7 +288,7 @@ def generate(self): "libwebp": "WebP", "libxml2": "LibXml2", "lqr": "Lqr", - "ltdl": "LTDL", + "libtool": "LTDL", "opencl-headers": "OpenCL", "openexr": "OpenEXR", "openjpeg": "OpenJPEG", @@ -351,6 +360,8 @@ def package_info(self): 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: