Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
49adc4f
Use advanced PNG options for imagepng
pierrejoye Jun 29, 2026
9b7f9d0
Synchronize bundled PNG implementation with libgd 2.4
pierrejoye Jun 29, 2026
30f7bec
sync gd_jpeg
pierrejoye Jun 30, 2026
edf6950
add qoi
pierrejoye Jun 30, 2026
d886dc4
more match between upstream<>php, add no-op BGD_DECLARE
pierrejoye Jun 30, 2026
483c68c
sync gd_webp
pierrejoye Jun 30, 2026
90bce49
sync gd_avif
pierrejoye Jun 30, 2026
2b72144
sync gd_jxl
pierrejoye Jun 30, 2026
d0cd0ab
sync gd_jxl
pierrejoye Jun 30, 2026
29491bf
sync gd tga
pierrejoye Jun 30, 2026
5a5be00
add webmux to config.*. preserve the warnings in php's version. add g…
pierrejoye Jun 30, 2026
147a1cb
sync gd heif
pierrejoye Jun 30, 2026
70b1d07
ws
pierrejoye Jun 30, 2026
1430213
sync gd wbmp
pierrejoye Jun 30, 2026
26c65ed
sync gd BMP
pierrejoye Jun 30, 2026
2a6aa88
fix signature, step 1
pierrejoye Jun 30, 2026
3dfe937
sync uhdr, need some other parts in the process. Sync gd interpolatio…
pierrejoye Jun 30, 2026
2ea92a0
sync gd rotate
pierrejoye Jun 30, 2026
3be4900
sync gd_security
pierrejoye Jun 30, 2026
93bcaba
sync topal, keep BC for image tc to palette
pierrejoye Jun 30, 2026
f7cb0c7
sync gd_crop, this is actually a BC break, or more make these functio…
pierrejoye Jun 30, 2026
2ad8070
sync matrix/transform/filter
pierrejoye Jun 30, 2026
5d58b0a
sync grouped gd.h, gd2, xbm, tiff
pierrejoye Jun 30, 2026
02a7e18
sync gdPngGetVersionString to libgd, and check for its existing in ph…
pierrejoye Jul 1, 2026
194706a
missing that mapping for gdPngGetVersionString
pierrejoye Jul 1, 2026
f9ac483
add gdImageRead*, add BGD_DECLARE to gif in
pierrejoye Jul 1, 2026
1d06062
reorder and add missing in php_compat
pierrejoye Jul 1, 2026
d49cb93
sync gif in/out, add gd_filename
pierrejoye Jul 1, 2026
c34edb2
sync gd_io_dp
pierrejoye Jul 1, 2026
8e07d95
sync gd_io_ss
pierrejoye Jul 1, 2026
1459f0e
more gd_io/ss
pierrejoye Jul 1, 2026
9a31ba9
gd.c sync some drawing and colors parts
pierrejoye Jul 1, 2026
c7b4650
gd.c part 2 sync
pierrejoye Jul 1, 2026
9ee30fe
sync gdfont*, and gdcache
pierrejoye Jul 1, 2026
871f0f1
sync gdft, RAQM and FC added but disabled. Added missing enconding fr…
pierrejoye Jul 1, 2026
e56e637
sync gdkanji
pierrejoye Jul 1, 2026
64a6030
small sync for ifdef
pierrejoye Jul 1, 2026
47d9249
sync gd_gd2
pierrejoye Jul 1, 2026
0a90a3b
sync gd gd format
pierrejoye Jul 1, 2026
3a292ac
2D Vector APIs and gd version APIs
pierrejoye Jul 1, 2026
7fcc584
2D Vector APIs and gd version APIs
pierrejoye Jul 1, 2026
0347bb0
missing gdfx.*
pierrejoye Jul 1, 2026
e4e3a43
not needed here, fix const disqualifiers
pierrejoye Jul 1, 2026
8506431
disable assert NDEBUG
pierrejoye Jul 1, 2026
9b4d5e3
SIZEOF_LONG not used and avoid redefine, unused BYTE_MULOF and bits_i…
pierrejoye Jul 1, 2026
f10607e
trailing space after the ending slash
pierrejoye Jul 1, 2026
339e4fb
not used yet
pierrejoye Jul 1, 2026
afdd712
let try it again. this is a valid formatting, both used...
pierrejoye Jul 1, 2026
6d27338
assemble using uint32_t
pierrejoye Jul 1, 2026
f7b9e66
fix header location for uhdr, add the with for next ones (tiff and nn…
pierrejoye Jul 2, 2026
9f305d0
disable heif
pierrejoye Jul 2, 2026
d1598d5
define SSIZE_MAX and alias strcasecmp to _stricmp
pierrejoye Jul 2, 2026
e479bff
alias strcasecmp to gd_strcasecmp
pierrejoye Jul 2, 2026
93cb1b6
put the gd_strcasecmp alias in gd_intern.h
pierrejoye Jul 2, 2026
bbda9fe
let build ftraster in ftraser/
pierrejoye Jul 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 130 additions & 1 deletion ext/gd/config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ PHP_ARG_WITH([avif],
[no],
[no])

PHP_ARG_WITH([uhdr],
[for libuhdr],
[AS_HELP_STRING([--with-uhdr],
[GD: Enable UltraHDR support (only for bundled libgd)])],
[no],
[no])

PHP_ARG_WITH([webp],
[for libwebp],
[AS_HELP_STRING([--with-webp],
Expand Down Expand Up @@ -55,6 +62,27 @@ PHP_ARG_ENABLE([gd-jis-conv],
[no],
[no])

PHP_ARG_WITH([heif],
[for libheif],
[AS_HELP_STRING([--with-heif],
[GD: Enable HEIF support (only for bundled libgd)])],
[no],
[no])

PHP_ARG_WITH([imagequant],
[for libimagequant],
[AS_HELP_STRING([--with-imagequant],
[GD: Enable libimagequant support (only for bundled libgd)])],
[no],
[no])

PHP_ARG_WITH([tiff],
[for libtiff],
[AS_HELP_STRING([--with-tiff],
[GD: Enable TIFF support (only for bundled libgd)])],
[no],
[no])

dnl
dnl Checks for the configure options
dnl
Expand All @@ -80,9 +108,39 @@ AC_DEFUN([PHP_GD_AVIF], [
])
])

AC_DEFUN([PHP_GD_HEIF], [
AS_VAR_IF([PHP_HEIF], [no],, [
PKG_CHECK_MODULES([HEIF], [libheif >= 1.7.0])
PHP_EVAL_LIBLINE([$HEIF_LIBS], [GD_SHARED_LIBADD])
PHP_EVAL_INCLINE([$HEIF_CFLAGS])
AC_DEFINE([HAVE_LIBHEIF], [1],
[Define to 1 if you have the libheif library.])
AC_DEFINE([HAVE_GD_HEIF], [1],
[Define to 1 if gd extension has HEIF support.])
])
])

AC_DEFUN([PHP_GD_UHDR], [
AS_VAR_IF([PHP_UHDR], [no],, [
PKG_CHECK_MODULES([UHDR], [libuhdr >= 1.4.0])
PHP_EVAL_LIBLINE([$UHDR_LIBS], [GD_SHARED_LIBADD])
PHP_EVAL_INCLINE([$UHDR_CFLAGS])

PKG_CHECK_VAR([UHDR_WRITE_XMP], [libuhdr], [UHDR_WRITE_XMP])
AS_VAR_IF([UHDR_WRITE_XMP], [], [],
[AC_MSG_ERROR([libuhdr was compiled with UHDR_WRITE_XMP enabled, but this extension requires it to be OFF.])])

AC_DEFINE([HAVE_LIBUHDR], [1],
[Define to 1 if you have the libuhdr library.])
AC_DEFINE([HAVE_GD_UHDR], [1],
[Define to 1 if gd extension has UltraHDR support.])
])
])

AC_DEFUN([PHP_GD_WEBP],[
AS_VAR_IF([PHP_WEBP], [no],, [
PKG_CHECK_MODULES([WEBP], [libwebp >= 0.2.0])
PKG_CHECK_MODULES([WEBP],
[libwebp >= 0.2.0 libwebpdemux libwebpmux])
PHP_EVAL_LIBLINE([$WEBP_LIBS], [GD_SHARED_LIBADD])
PHP_EVAL_INCLINE([$WEBP_CFLAGS])
AC_DEFINE([HAVE_LIBWEBP], [1],
Expand Down Expand Up @@ -110,6 +168,7 @@ AC_DEFUN([PHP_GD_XPM],[
PHP_EVAL_LIBLINE([$XPM_LIBS], [GD_SHARED_LIBADD])
PHP_EVAL_INCLINE([$XPM_CFLAGS])
AC_DEFINE([HAVE_XPM], [1], [Define to 1 if you have the xpm library.])
AC_DEFINE([HAVE_LIBXPM], [1], [Define to 1 if you have the xpm library.])
AC_DEFINE([HAVE_GD_XPM], [1],
[Define to 1 if gd extension has XPM support.])
])
Expand All @@ -136,6 +195,35 @@ AC_DEFUN([PHP_GD_JISX0208],[
])
])

AC_DEFUN([PHP_GD_IMAGEQUANT], [
AS_VAR_IF([PHP_IMAGEQUANT], [no],, [
AC_CHECK_HEADER([libimagequant.h], [],
[AC_MSG_ERROR([libimagequant header not found])])
PHP_CHECK_LIBRARY([imagequant], [liq_attr_create],
[
PHP_ADD_LIBRARY([imagequant], [], [GD_SHARED_LIBADD])
AC_DEFINE([HAVE_LIBIMAGEQUANT], [1],
[Define to 1 if you have the libimagequant library.])
AC_DEFINE([HAVE_GD_IMAGEQUANT], [1],
[Define to 1 if gd extension has libimagequant support.])
],
[AC_MSG_ERROR([libimagequant library not found])],
[-limagequant])
])
])

AC_DEFUN([PHP_GD_TIFF], [
AS_VAR_IF([PHP_TIFF], [no],, [
PKG_CHECK_MODULES([TIFF], [libtiff-4])
PHP_EVAL_LIBLINE([$TIFF_LIBS], [GD_SHARED_LIBADD])
PHP_EVAL_INCLINE([$TIFF_CFLAGS])
AC_DEFINE([HAVE_LIBTIFF], [1],
[Define to 1 if you have the libtiff library.])
AC_DEFINE([HAVE_GD_TIFF], [1],
[Define to 1 if gd extension has TIFF support.])
])
])

dnl
dnl PHP_GD_CHECK_FORMAT(format, [action-if-found])
dnl
Expand Down Expand Up @@ -194,6 +282,7 @@ AS_VAR_POPDEF([php_var])
AC_DEFUN([PHP_GD_CHECK_VERSION],[
PHP_GD_CHECK_FORMAT([Png], [AC_DEFINE([HAVE_GD_PNG], [1])])
PHP_GD_CHECK_FORMAT([Avif], [AC_DEFINE([HAVE_GD_AVIF], [1])])
PHP_GD_CHECK_FORMAT([Heif], [AC_DEFINE([HAVE_GD_HEIF], [1])])
PHP_GD_CHECK_FORMAT([Webp], [AC_DEFINE([HAVE_GD_WEBP], [1])])
PHP_GD_CHECK_FORMAT([Jpeg], [AC_DEFINE([HAVE_GD_JPG], [1])])
PHP_GD_CHECK_FORMAT([Xpm], [AC_DEFINE([HAVE_GD_XPM], [1])])
Expand All @@ -206,6 +295,11 @@ AC_DEFUN([PHP_GD_CHECK_VERSION],[
[Define to 1 if GD library has the 'gdVersionString' function.])],
[],
[$GD_SHARED_LIBADD])
PHP_CHECK_LIBRARY([gd], [gdPngGetVersionString],
[AC_DEFINE([HAVE_GD_PNG_GET_VERSION_STRING], [1],
[Define to 1 if GD library has the 'gdPngGetVersionString' function.])],
[],
[$GD_SHARED_LIBADD])
PHP_CHECK_LIBRARY([gd], [gdImageGetInterpolationMethod],
[AC_DEFINE([HAVE_GD_GET_INTERPOLATION], [1],
[Define to 1 if GD library has the 'gdImageGetInterpolationMethod'
Expand Down Expand Up @@ -237,6 +331,7 @@ if test "$PHP_GD" != "no"; then
libgd/gd_io.c
libgd/gd_jpeg.c
libgd/gd_matrix.c
libgd/gd_metadata.c
libgd/gd_png.c
libgd/gd_rotate.c
libgd/gd_security.c
Expand All @@ -260,6 +355,32 @@ if test "$PHP_GD" != "no"; then
libgd/gdtables.c
libgd/gdxpm.c
libgd/wbmp.c
libgd/gd_qoi.c
libgd/gd_jxl.c
libgd/gd_color_map.c
libgd/gd_heif.c
libgd/gd_uhdr.c
libgd/gd_nnquant.c
libgd/gd_color.c
libgd/gd_tiff.c
libgd/gd_readimage.c
libgd/gd_filename.c
libgd/ftraster/gd_ft_math.c
libgd/ftraster/gd_ft_raster.c
libgd/ftraster/gd_ft_stroker.c
libgd/gd_array.c
libgd/gd_span_rle.c
libgd/gd_surface.c
libgd/gd_version.c
libgd/gd_compositor.c
libgd/gd_gradient.c
libgd/gd_path.c
libgd/gd_path_arc.c
libgd/gd_path_dash.c
libgd/gd_path_matrix.c
libgd/gd_path_stroke.c
libgd/gd_draw.c
libgd/gd_draw_blend.c
"])

AC_DEFINE([HAVE_GD_BUNDLED], [1],
Expand All @@ -269,21 +390,29 @@ if test "$PHP_GD" != "no"; then
[Define to 1 if GD library has the 'gdImageGetInterpolationMethod'
function.])

AC_DEFINE([HAVE_GD_PNG_GET_VERSION_STRING], [1],
[Define to 1 if GD library has the 'gdPngGetVersionString' function.])

dnl Various checks for GD features
PHP_SETUP_ZLIB([GD_SHARED_LIBADD])
PHP_GD_PNG
PHP_GD_AVIF
PHP_GD_HEIF
PHP_GD_UHDR
PHP_GD_WEBP
PHP_GD_JPEG
PHP_GD_XPM
PHP_GD_FREETYPE2
PHP_GD_JISX0208
PHP_GD_IMAGEQUANT
PHP_GD_TIFF

PHP_NEW_EXTENSION([gd],
[gd.c $extra_sources],
[$ext_shared],,
[-Wno-strict-prototypes -I@ext_srcdir@/libgd])
PHP_ADD_BUILD_DIR([$ext_builddir/libgd])
PHP_ADD_BUILD_DIR([$ext_builddir/libgd/ftraster])

PHP_INSTALL_HEADERS([ext/gd], [php_gd.h libgd/])

Expand Down
59 changes: 56 additions & 3 deletions ext/gd/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
ARG_WITH("gd", "Bundled GD support", "yes,shared");
ARG_WITH("libwebp", "webp support", "yes");
ARG_WITH("libavif", "avif support", "yes");
ARG_WITH("heif", "HEIF support", "no");
ARG_WITH("uhdr", "UltraHDR support", "yes");
ARG_WITH("imagequant", "libimagequant support", "no");
ARG_WITH("tiff", "TIFF support", "no");

if (PHP_GD != "no") {
if (
Expand All @@ -25,12 +29,17 @@ if (PHP_GD != "no") {
CHECK_HEADER("xpm.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\X11")
) {
AC_DEFINE('HAVE_XPM', 1, "Define to 1 if you have the xpm library.");
AC_DEFINE('HAVE_LIBXPM', 1, "Define to 1 if you have the xpm library.");
AC_DEFINE('HAVE_GD_XPM', 1, "Define to 1 if gd extension has XPM support.");
}
if (PHP_LIBWEBP != "no") {
if ((CHECK_LIB("libwebp_a.lib", "gd", PHP_GD) || CHECK_LIB("libwebp.lib", "gd", PHP_GD)) &&
(CHECK_LIB("libwebpdemux_a.lib", "gd", PHP_GD) || CHECK_LIB("libwebpdemux.lib", "gd", PHP_GD)) &&
(CHECK_LIB("libwebpmux_a.lib", "gd", PHP_GD) || CHECK_LIB("libwebpmux.lib", "gd", PHP_GD)) &&
CHECK_HEADER("decode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") &&
CHECK_HEADER("encode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp")) {
CHECK_HEADER("demux.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") &&
CHECK_HEADER("encode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") &&
CHECK_HEADER("mux.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp")) {
AC_DEFINE("HAVE_LIBWEBP", 1, "Define to 1 if you have the libwebp library.");
AC_DEFINE("HAVE_GD_WEBP", 1, "Define to 1 if gd extension has WebP support.");
} else {
Expand All @@ -49,18 +58,62 @@ if (PHP_GD != "no") {
WARNING("libavif not enabled; libraries and headers not found");
}
}

if (PHP_HEIF != "no") {
if (CHECK_LIB("heif.lib", "gd", PHP_GD) &&
CHECK_HEADER("heif.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\heif")) {
ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBHEIF /D HAVE_GD_HEIF");
} else {
WARNING("libheif not enabled; library and headers not found");
}
}

// requires UHDR_WRITE_XMP=Off, for the windows build team, when adding/updating libuhdr
if (PHP_UHDR != "no") {
if (CHECK_LIB("uhdr.lib", "gd", PHP_GD) &&
CHECK_HEADER("ultrahdr_api.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include")) {
ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBUHDR /D HAVE_GD_UHDR");
} else {
WARNING("libuhdr not enabled; library and headers not found");
}
}

if (PHP_IMAGEQUANT != "no") {
if (CHECK_LIB("imagequant.lib", "gd", PHP_GD) &&
CHECK_HEADER("libimagequant.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include")) {
ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBIMAGEQUANT /D HAVE_GD_IMAGEQUANT");
} else {
WARNING("libimagequant not enabled; library and headers not found");
}
}

if (PHP_TIFF != "no") {
if (CHECK_LIB("tiff.lib", "gd", PHP_GD) &&
CHECK_HEADER("tiff.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include")) {
ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBTIFF /D HAVE_GD_TIFF");
} else {
WARNING("libtiff not enabled; library and headers not found");
}
}

CHECK_LIB("User32.lib", "gd", PHP_GD);
CHECK_LIB("Gdi32.lib", "gd", PHP_GD);

EXTENSION("gd", "gd.c", null, "-Iext/gd/libgd");
ADD_SOURCES("ext/gd/libgd", "gd2copypal.c gd.c \
gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c \
gdft.c gd_gd2.c gd_gd.c gd_gif_in.c gd_gif_out.c gdhelpers.c gd_io.c gd_io_dp.c \
gd_io_file.c gd_io_ss.c gd_jpeg.c gdkanji.c gd_png.c gd_ss.c \
gd_io_file.c gd_io_ss.c gd_jpeg.c gdkanji.c gd_metadata.c gd_png.c gd_ss.c \
gdtables.c gd_topal.c gd_wbmp.c gdxpm.c wbmp.c gd_xbm.c gd_security.c gd_transform.c \
gd_filter.c gd_rotate.c gd_color_match.c gd_webp.c gd_avif.c \
gd_crop.c gd_interpolation.c gd_matrix.c gd_bmp.c gd_tga.c", "gd");
gd_crop.c gd_interpolation.c gd_matrix.c gd_bmp.c gd_tga.c gd_qoi.c gd_jxl.c gd_color_map.c \
gd_heif.c gd_uhdr.c gd_nnquant.c gd_color.c gd_readimage.c gd_filename.c \
gd_array.c gd_span_rle.c \
gd_surface.c gd_version.c gd_compositor.c gd_gradient.c gd_path.c gd_path_arc.c gd_path_dash.c \
gd_path_matrix.c gd_path_stroke.c gd_draw.c gd_draw_blend.c", "gd");
ADD_SOURCES("ext/gd/libgd/ftraster", "gd_ft_math.c gd_ft_raster.c gd_ft_stroker.c", "gd");
AC_DEFINE('HAVE_GD_BUNDLED', 1, "Define to 1 if gd extension uses GD library bundled in PHP.");
AC_DEFINE('HAVE_GD_PNG_GET_VERSION_STRING', 1, "Define to 1 if GD library has the 'gdPngGetVersionString' function.");
AC_DEFINE('HAVE_GD_PNG', 1, "Define to 1 if gd extension has PNG support.");
AC_DEFINE('HAVE_LIBPNG', 1, "Define to 1 if you have the libpng library.");
AC_DEFINE('HAVE_LIBJPEG', 1, "Define to 1 if you have the libjpeg library.");
Expand Down
Loading
Loading