From f2aa2836ed910ca3510585a47a8a064b5140e148 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Wed, 3 Mar 2021 21:35:56 -0500 Subject: [PATCH] AVIF support (#671) Demand for AVIF support on the web is growing, as the word gets out about this new file format which allows higher-quality encoding at smaller sizes. Core contributors to major open-source CMSs are interested in auto-generating AVIF images! They've been simply waiting for support to appear in libgd. This PR aims to meet the growing demand, and to help bring smaller, more beautiful images to more of the web - to sites created by experienced developers and CMS users alike. This PR adds support by incorporating libavif in addition to the existing libheif support. It's generally felt that libavif has more complete support for the AVIF format. libavif is also used by the Chromium project and squoosh.app. In this PR, I've endeavored to incorporate the latest research into best practices for AVIF encoding - not just for default quantizer values, but also an algorithm for determining the number of horizontal tiles, vertical tiles, and threads. Fixes #557. --- CMakeLists.txt | 8 + CONTRIBUTORS | 1 + README.md | 3 +- configure.ac | 8 + docs/README.CMAKE | 1 + docs/naturaldocs/project/Menu.txt | 1 + examples/avif2jpeg.c | 55 +++ examples/jpeg2avif.c | 57 +++ examples/jpeg2avifex.c | 98 +++++ examples/png2avif.c | 58 +++ src/CMakeLists.txt | 2 + src/Makefile.am | 1 + src/config.h.cmake | 9 +- src/gd.h | 9 + src/gd_avif.c | 680 +++++++++++++++++++++++++++++ src/gd_filename.c | 4 + src/gd_webp.c | 4 +- tests/CMakeLists.txt | 1 + tests/Makefile.am | 2 + tests/avif/.gitignore | 5 + tests/avif/CMakeLists.txt | 17 + tests/avif/Makemodule.am | 16 + tests/avif/avif_im2im.c | 67 +++ tests/avif/avif_null.c | 23 + tests/avif/avif_ptr_double_free.c | 34 ++ tests/avif/baboon.avif | Bin 0 -> 16521 bytes tests/avif/baboon.png | Bin 0 -> 49030 bytes tests/avif/bad_input.c | 72 +++ tests/avif/compare_avif_to_png.c | 100 +++++ tests/avif/dice_with_alpha.avif | Bin 0 -> 6248 bytes tests/avif/dice_with_alpha.png | Bin 0 -> 48210 bytes tests/avif/plum_blossom_12bit.avif | Bin 0 -> 5202 bytes tests/avif/plum_blossom_12bit.png | Bin 0 -> 10185 bytes tests/avif/sunset.avif | Bin 0 -> 1174 bytes tests/avif/sunset.png | Bin 0 -> 47803 bytes travis/main.sh | 5 +- windows/Makefile.vc | 11 +- windows/Makefiletest.vc | 5 + windows/msys/Makefile | 3 +- 39 files changed, 1351 insertions(+), 9 deletions(-) create mode 100644 examples/avif2jpeg.c create mode 100644 examples/jpeg2avif.c create mode 100644 examples/jpeg2avifex.c create mode 100644 examples/png2avif.c create mode 100644 src/gd_avif.c create mode 100644 tests/avif/.gitignore create mode 100644 tests/avif/CMakeLists.txt create mode 100644 tests/avif/Makemodule.am create mode 100644 tests/avif/avif_im2im.c create mode 100644 tests/avif/avif_null.c create mode 100644 tests/avif/avif_ptr_double_free.c create mode 100644 tests/avif/baboon.avif create mode 100644 tests/avif/baboon.png create mode 100644 tests/avif/bad_input.c create mode 100644 tests/avif/compare_avif_to_png.c create mode 100644 tests/avif/dice_with_alpha.avif create mode 100644 tests/avif/dice_with_alpha.png create mode 100644 tests/avif/plum_blossom_12bit.avif create mode 100644 tests/avif/plum_blossom_12bit.png create mode 100644 tests/avif/sunset.avif create mode 100644 tests/avif/sunset.png diff --git a/CMakeLists.txt b/CMakeLists.txt index b13767d..57cd95d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ OPTION(ENABLE_FREETYPE "Enable Freetype2 support" 0) OPTION(ENABLE_FONTCONFIG "Enable FontConfig support" 0) OPTION(ENABLE_WEBP "Enable WebP support" 0) OPTION(ENABLE_HEIF "Enable HEIF support" 0) +OPTION(ENABLE_AVIF "Enable AVIF support" 0) OPTION(ENABLE_RAQM "Enable RAQM support" 0) if (BUILD_TEST) @@ -124,6 +125,13 @@ else (USE_EXT_GD) FIND_PACKAGE(HEIF REQUIRED) ENDIF (ENABLE_HEIF) + IF (ENABLE_AVIF) + FIND_PACKAGE(libavif 0.8.2 REQUIRED CONFIG) + SET(HAVE_LIBAVIF 1) + SET(AVIF_LIBRARIES avif) + SET(AVIF_FOUND 1) + ENDIF (ENABLE_AVIF) + IF (ENABLE_LIQ) FIND_PACKAGE(LIQ REQUIRED) ENDIF (ENABLE_LIQ) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 55f386f..cdb066a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,3 +1,4 @@ +Ben Morss (morsssss) chapg Chen Pingping (Wilson) Chris Reuter diff --git a/README.md b/README.md index 96268ea..aa8fa3f 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,9 @@ GD has builtin support for: It also has optional support for more formats via external libraries: +* [AVIF](https://en.wikipedia.org/wiki/AV1#AV1_Image_File_Format_(AVIF)) via [libavif](https://github.com/AOMediaCodec/libavif) * [HEIF](https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format) via [libheif](https://github.com/strukturag/libheif/) - * Also it includes [AVIF](https://en.wikipedia.org/wiki/AV1#AV1_Image_File_Format_%28AVIF%29) read support if your system's `libheif` has AV1 decoding. + * This includes [AVIF](https://en.wikipedia.org/wiki/AV1#AV1_Image_File_Format_%28AVIF%29) read support if your system's `libheif` has AV1 decoding. * [JPEG](https://en.wikipedia.org/wiki/JPEG) via [IJG/libjpeg](http://www.ijg.org/) or [libjpeg-turbo](http://libjpeg-turbo.virtualgl.org/) * Does not include [JPEG 2000](https://en.wikipedia.org/wiki/JPEG_2000) * [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics) via [libpng](http://www.libpng.org/) diff --git a/configure.ac b/configure.ac index 5a4c357..535db68 100644 --- a/configure.ac +++ b/configure.ac @@ -289,6 +289,13 @@ dnl Check for heif support. GD_LIB_PKG_CHECK([LIBHEIF], [HEIF], [heif], [libheif >= 1.7.0], [ AC_CHECK_LIB([heif], [heif_get_version], [dnl AS_VAR_APPEND([LIBHEIF_LIBS], [" -lheif"]) + ]) +]) + +dnl Check for avif support. +GD_LIB_PKG_CHECK([LIBAVIF], [AVIF], [avif], [libavif >= 0.8.2], [ + AC_CHECK_LIB([avif], [avifVersion], [dnl + AS_VAR_APPEND([LIBAVIF_LIBS], [" -lavif"]) gd_found_lib=yes ]) ]) @@ -323,6 +330,7 @@ AC_MSG_RESULT([ Support for JPEG library: $gd_with_LIBJPEG Support for WebP library: $gd_with_LIBWEBP Support for HEIF library: $gd_with_LIBHEIF + Support for AVIF library: $gd_with_LIBAVIF Support for TIFF library: $gd_with_LIBTIFF Support for Freetype 2.x library: $gd_with_LIBFREETYPE Support for Fontconfig library: $gd_with_LIBFONTCONFIG diff --git a/docs/README.CMAKE b/docs/README.CMAKE index 2be2045..c9356b2 100644 --- a/docs/README.CMAKE +++ b/docs/README.CMAKE @@ -20,6 +20,7 @@ ENABLE_FREETYPE=1 ENABLE_FONTCONFIG=1 ENABLE_XPM=1 ENABLE_WEBP=1 +ENABLE_AVIF=1 ENABLE_RAQM=1 You can optionally run our tests suite using: diff --git a/docs/naturaldocs/project/Menu.txt b/docs/naturaldocs/project/Menu.txt index 250d988..12df023 100644 --- a/docs/naturaldocs/project/Menu.txt +++ b/docs/naturaldocs/project/Menu.txt @@ -50,6 +50,7 @@ File: About LibGD 2.3.0-dev (no auto-title, preamble.txt) Group: Image Formats { + File: AVIF IO (no auto-title, gd_avif.c) File: BMP IO (no auto-title, gd_bmp.c) File: GD IO (no auto-title, gd_gd.c) File: GD2 IO (no auto-title, gd_gd2.c) diff --git a/examples/avif2jpeg.c b/examples/avif2jpeg.c new file mode 100644 index 0000000..6ced15d --- /dev/null +++ b/examples/avif2jpeg.c @@ -0,0 +1,55 @@ +/** + * A short program which converts a .avif file into a .jpg file - + * just to get a little practice with the basic functionality. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include "gd.h" + +int main(int argc, char **argv) +{ + gdImagePtr im; + FILE *in, *out; + + if (argc != 3) { + fprintf(stderr, "Usage: avif2jpeg infile.avif outfile.jpg\n"); + exit(1); + } + + printf("Reading infile %s\n", argv[1]); + + in = fopen(argv[1], "rb"); + if (!in) { + fprintf(stderr, "\nError: input file %s does not exist.\n", argv[1]); + exit(1); + } + + im = gdImageCreateFromAvif(in); + fclose(in); + if (!im) { + fprintf(stderr, "\nError: input file %s is not in AVIF format.\n", argv[1]); + exit(1); + } + + out = fopen(argv[2], "wb"); + if (!out) { + fprintf(stderr, "\nError: can't write to output file %s\n", argv[2]); + gdImageDestroy(im); + exit(1); + } + + gdImageJpeg(im, out, 75); + + printf("Wrote outfile %s.\n", argv[2]); + + fclose(out); + gdImageDestroy(im); + + return 0; +} diff --git a/examples/jpeg2avif.c b/examples/jpeg2avif.c new file mode 100644 index 0000000..af55201 --- /dev/null +++ b/examples/jpeg2avif.c @@ -0,0 +1,57 @@ +/** + * A short program which converts a .jpg file into a .avif file - + * just to get a little practice with the basic functionality. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include "gd.h" + +int main(int argc, char **argv) +{ + gdImagePtr im; + FILE *in, *out; + + if (argc != 3) { + fprintf(stderr, "Usage: jpeg2avif filename.jpg filename.avif\n"); + exit(1); + } + + printf("Reading infile %s\n", argv[1]); + + in = fopen(argv[1], "rb"); + if (!in) { + fprintf(stderr, "Error: input file %s does not exist.\n", argv[1]); + exit(1); + } + + im = gdImageCreateFromJpeg(in); + fclose(in); + if (!im) { + fprintf(stderr, "Error: input file %s is not in JPEG format.\n", argv[1]); + exit(1); + } + + out = fopen(argv[2], "wb"); + if (!out) { + fprintf(stderr, "Error: can't write to output file %s\n", argv[2]); + gdImageDestroy(im); + exit(1); + } + + fprintf(stderr, "Encoding...\n"); + + gdImageAvif(im, out); + + printf("Wrote outfile %s.\n", argv[2]); + + fclose(out); + gdImageDestroy(im); + + return 0; +} diff --git a/examples/jpeg2avifex.c b/examples/jpeg2avifex.c new file mode 100644 index 0000000..a8afb3b --- /dev/null +++ b/examples/jpeg2avifex.c @@ -0,0 +1,98 @@ +/** + * A short program which converts a .jpg file into a .avif file - + * just to get a little practice with the basic functionality. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gd.h" + +static void usage() { + fprintf(stderr, "Usage: jpeg2avifex [-q quality] [-s speed] infile.jpg outfile.avif\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + gdImagePtr im; + FILE *in, *out; + int c; + int speed = -1, quality = -1; // use default values if unspecified + char *infile, *outfile; + int failed = 0; + + if (argc < 3) { + usage(); + } + + while ((c = getopt(argc, argv, "q:s:")) != -1) { + switch (c) { + case 'q': + quality = atoi(optarg); + break; + + case 's': + speed = atoi(optarg); + break; + + default: + usage(); + } + } + + if (optind > argc - 2) + usage(); + + infile = strdup(argv[optind++]); + outfile = strdup(argv[optind]); + + printf("Reading infile %s\n", infile); + + in = fopen(infile, "rb"); + if (!in) { + fprintf(stderr, "\nError: input file %s does not exist.\n", infile); + failed = 1; + goto cleanup; + } + + im = gdImageCreateFromJpeg(in); + fclose(in); + if (!im) { + fprintf(stderr, "\nError: input file %s is not in JPEG format.\n", infile); + failed = 1; + goto cleanup; + } + + out = fopen(outfile, "wb"); + if (!out) { + fprintf(stderr, "\nError: can't write to output file %s\n", outfile); + failed = 1; + goto cleanup; + } + + fprintf(stderr, "Encoding...\n"); + + gdImageAvifEx(im, out, quality, speed); + + printf("Wrote outfile %s.\n", outfile); + + fclose(out); + +cleanup: + if (im) + gdImageDestroy(im); + + gdFree(infile); + gdFree(outfile); + + exit(failed); +} diff --git a/examples/png2avif.c b/examples/png2avif.c new file mode 100644 index 0000000..18463e7 --- /dev/null +++ b/examples/png2avif.c @@ -0,0 +1,58 @@ +/** + * A short program which converts a .png file into a .avif file - + * just to get a little practice with the basic functionality. + * We convert losslessly. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include "gd.h" + +int main(int argc, char **argv) +{ + gdImagePtr im; + FILE *in, *out; + + if (argc != 3) { + fprintf(stderr, "Usage: png2avif infile.png outfile.avif\n"); + exit(1); + } + + printf("Reading infile %s\n", argv[1]); + + in = fopen(argv[1], "rb"); + if (!in) { + fprintf(stderr, "Error: input file %s does not exist.\n", argv[1]); + exit(1); + } + + im = gdImageCreateFromPng(in); + fclose(in); + if (!im) { + fprintf(stderr, "Error: input file %s is not in PNG format.\n", argv[1]); + exit(1); + } + + out = fopen(argv[2], "wb"); + if (!out) { + fprintf(stderr, "Error: can't write to output file %s\n", argv[2]); + gdImageDestroy(im); + exit(1); + } + + fprintf(stderr, "Encoding...\n"); + + gdImageAvifEx(im, out, 100, 0); + + printf("Wrote outfile %s.\n", argv[2]); + + fclose(out); + gdImageDestroy(im); + + return 0; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ccd76e9..509c422 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,7 @@ SET (LIBGD_SRC_FILES bmp.h gd.c gd.h + gd_avif.c gd_bmp.c gd_color.c gd_color.h @@ -130,6 +131,7 @@ SET(LIBGD_DEP_LIBS ${XPM_LIBRARIES} ${FONTCONFIG_LIBRARY} ${WEBP_LIBRARIES} + ${AVIF_LIBRARIES} ${RAQM_LIBRARIES} ${HEIF_LIBRARIES} ) diff --git a/src/Makefile.am b/src/Makefile.am index 69a5c18..09bf192 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -60,6 +60,7 @@ libgd_la_SOURCES = \ bmp.h \ gd.c \ gd.h \ + gd_avif.c \ gd_bmp.c \ gd_color.c \ gd_color.h \ diff --git a/src/config.h.cmake b/src/config.h.cmake index fb86f3c..2b46a17 100644 --- a/src/config.h.cmake +++ b/src/config.h.cmake @@ -27,12 +27,18 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_INTTYPES_H +/* Define if you have avif */ +#cmakedefine HAVE_LIBAVIF + /* Define if you have fontconfig */ #cmakedefine HAVE_LIBFONTCONFIG /* Define if you have freetype */ #cmakedefine HAVE_LIBFREETYPE +/* Define if you have heif */ +#cmakedefine HAVE_LIBHEIF + /* Define if you have liq */ #cmakedefine HAVE_LIBIMAGEQUANT @@ -54,9 +60,6 @@ /* Define if you have webp */ #cmakedefine HAVE_LIBWEBP -/* Define if you have heif */ -#cmakedefine HAVE_LIBHEIF - /* Define if you have xpm */ #cmakedefine HAVE_LIBXPM diff --git a/src/gd.h b/src/gd.h index 55fa5b3..7b5870f 100644 --- a/src/gd.h +++ b/src/gd.h @@ -668,6 +668,10 @@ BGD_DECLARE(gdImagePtr) gdImageCreateFromHeif(FILE *inFile); BGD_DECLARE(gdImagePtr) gdImageCreateFromHeifPtr(int size, void *data); BGD_DECLARE(gdImagePtr) gdImageCreateFromHeifCtx(gdIOCtx *infile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvif(FILE *inFile); +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifPtr(int size, void *data); +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifCtx(gdIOCtx *infile); + BGD_DECLARE(gdImagePtr) gdImageCreateFromTiff(FILE *inFile); BGD_DECLARE(gdImagePtr) gdImageCreateFromTiffCtx(gdIOCtx *infile); BGD_DECLARE(gdImagePtr) gdImageCreateFromTiffPtr(int size, void *data); @@ -1131,6 +1135,11 @@ BGD_DECLARE(void *) gdImageHeifPtr(gdImagePtr im, int *size); BGD_DECLARE(void *) gdImageHeifPtrEx(gdImagePtr im, int *size, int quality, gdHeifCodec codec, gdHeifChroma chroma); BGD_DECLARE(void) gdImageHeifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, gdHeifCodec codec, gdHeifChroma chroma); +BGD_DECLARE(void) gdImageAvif(gdImagePtr im, FILE *outFile); +BGD_DECLARE(void) gdImageAvifEx(gdImagePtr im, FILE *outFile, int quality, int speed); +BGD_DECLARE(void *) gdImageAvifPtr(gdImagePtr im, int *size); +BGD_DECLARE(void *) gdImageAvifPtrEx(gdImagePtr im, int *size, int quality, int speed); +BGD_DECLARE(void) gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed); /** * Group: GifAnim diff --git a/src/gd_avif.c b/src/gd_avif.c new file mode 100644 index 0000000..d8f8284 --- /dev/null +++ b/src/gd_avif.c @@ -0,0 +1,680 @@ +/** + * File: AVIF IO + * + * Read and write AVIF images using libavif (https://github.com/AOMediaCodec/libavif) . + * Currently, the only ICC profile we support is sRGB. + * Since that's what web browsers use, it's sufficient for now. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "gd.h" +#include "gd_errors.h" +#include "gdhelpers.h" +#include "gd_intern.h" + +#ifdef HAVE_LIBAVIF +#include + +/* + Define defaults for encoding images: + CHROMA_SUBSAMPLING_DEFAULT: 4:2:0 is commonly used for Chroma subsampling. + CHROMA_SUBAMPLING_HIGH_QUALITY: Use 4:4:4, or no subsampling, when a sufficient high quality is requested. + SUBAMPLING_HIGH_QUALITY_THRESHOLD: At or above this value, use CHROMA_SUBAMPLING_HIGH_QUALITY + QUANTIZER_DEFAULT: + We need more testing to really know what quantizer settings are optimal, + but teams at Google have been using maximum=30 as a starting point. + QUALITY_DEFAULT: following gd conventions, -1 indicates the default. + SPEED_DEFAULT: AVIF_SPEED_DEFAULT is -1. This simply tells the AVIF encoder to use the default speed. +*/ + +#define CHROMA_SUBSAMPLING_DEFAULT AVIF_PIXEL_FORMAT_YUV420 +#define CHROMA_SUBAMPLING_HIGH_QUALITY AVIF_PIXEL_FORMAT_YUV444 +#define HIGH_QUALITY_SUBSAMPLING_THRESHOLD 90 +#define QUANTIZER_DEFAULT 30 +#define QUALITY_DEFAULT -1 +#define SPEED_DEFAULT AVIF_SPEED_DEFAULT + +// This initial size for the gdIOCtx is standard among GD image conversion functions. +#define NEW_DYNAMIC_CTX_SIZE 2048 + +// Our quality param ranges from 0 to 100. +// To calculate quality, we convert from AVIF's quantizer scale, which runs from 63 to 0. +#define MAX_QUALITY 100 + +// These constants are for computing the number of tiles and threads to use during encoding. +// Maximum threads are from libavif/contrib/gkd-pixbuf/loader.c. +#define MIN_TILE_AREA (512 * 512) +#define MAX_TILES 8 +#define MAX_THREADS 64 + +/*** Macros ***/ + +/* + From gd_png.c: + convert the 7-bit alpha channel to an 8-bit alpha channel. + We do a little bit-flipping magic, repeating the MSB + as the LSB, to ensure that 0 maps to 0 and + 127 maps to 255. We also have to invert to match + PNG's convention in which 255 is opaque. +*/ +#define alpha7BitTo8Bit(alpha7Bit) \ + (alpha7Bit == 127 ? \ + 0 : \ + 255 - ((alpha7Bit << 1) + (alpha7Bit >> 6))) + +#define alpha8BitTo7Bit(alpha8Bit) (gdAlphaMax - (alpha8Bit >> 1)) + + +/*** Helper functions ***/ + +/* Convert the quality param we expose to the quantity params used by libavif. + The *Quantizer* params values can range from 0 to 63, with 0 = highest quality and 63 = worst. + We make the scale 0-100, and we reverse this, so that 0 = worst quality and 100 = highest. + + Values below 0 are set to 0, and values below MAX_QUALITY are set to MAX_QUALITY. +*/ +static int quality2Quantizer(int quality) { + int clampedQuality = CLAMP(quality, 0, MAX_QUALITY); + + float scaleFactor = (float) AVIF_QUANTIZER_WORST_QUALITY / (float) MAX_QUALITY; + + return round(scaleFactor * (MAX_QUALITY - clampedQuality)); +} + +/* + As of February 2021, this algorithm reflects the latest research on how many tiles + and threads to include for a given image size. + This is subject to change as research continues. + + Returns false if there was an error, true if all was well. + */ +static avifBool setEncoderTilesAndThreads(avifEncoder *encoder, avifRGBImage *rgb) { + int imageArea, tiles, tilesLog2, encoderTiles; + + // _gdImageAvifCtx(), the calling function, checks this operation for overflow + imageArea = rgb->width * rgb->height; + + tiles = (int) ceil((double) imageArea / MIN_TILE_AREA); + tiles = MIN(tiles, MAX_TILES); + tiles = MIN(tiles, MAX_THREADS); + + // The number of tiles in any dimension will always be a power of 2. We can only specify log(2)tiles. + + tilesLog2 = floor(log2(tiles)); + + // If the image's width is greater than the height, use more tile columns + // than tile rows to make the tile size close to a square. + + if (rgb->width >= rgb->height) { + encoder->tileRowsLog2 = tilesLog2 / 2; + encoder->tileColsLog2 = tilesLog2 - encoder->tileRowsLog2; + } else { + encoder->tileColsLog2 = tilesLog2 / 2; + encoder->tileRowsLog2 = tilesLog2 - encoder->tileColsLog2; + } + + // It's good to have one thread per tile. + encoderTiles = (1 << encoder->tileRowsLog2) * (1 << encoder->tileColsLog2); + encoder->maxThreads = encoderTiles; + + return AVIF_TRUE; +} + +/* + We can handle AVIF images whose color profile is sRGB, or whose color profile isn't set. +*/ +static avifBool isAvifSrgbImage(avifImage *avifIm) { + return + (avifIm->colorPrimaries == AVIF_COLOR_PRIMARIES_BT709 || + avifIm->colorPrimaries == AVIF_COLOR_PRIMARIES_UNSPECIFIED) && + (avifIm->transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_SRGB || + avifIm->transferCharacteristics == AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED) + ; +} + +/* + Check the result from an Avif function to see if it's an error. + If so, decode the error and output it, and return true. + Otherwise, return false. +*/ +static avifBool isAvifError(avifResult result, const char *msg) { + if (result != AVIF_RESULT_OK) { + gd_error("avif error - %s: %s", msg, avifResultToString(result)); + return AVIF_TRUE; + } + + return AVIF_FALSE; +} + + +/* + implements the avifIOReadFunc interface by calling the relevant functions + in the gdIOCtx. Our logic is inspired by avifIOMemoryReaderRead() and avifIOFileReaderRead(). + We don't know whether we're reading from a file or from memory. We don't have to know, + since we rely on the helper functions in the gdIOCtx. + We assume we've stashed the gdIOCtx in io->data, as we do in createAvifIOFromCtx(). + + We ignore readFlags, just as the avifIO*ReaderRead() functions do. + + If there's a problem, this returns an avifResult error. + If things go well, return AVIF_RESULT_OK. + Of course these AVIF codes shouldn't be returned by any top-level GD function. +*/ +static avifResult readFromCtx(avifIO *io, uint32_t readFlags, uint64_t offset, size_t size, avifROData *out) +{ + void *dataBuf = NULL; + gdIOCtx *ctx = (gdIOCtx *) io->data; + + // TODO: if we set sizeHint, this will be more efficient. + + if (offset > LONG_MAX || size < 0) + return AVIF_RESULT_IO_ERROR; + + // Try to seek offset bytes forward. If we pass the end of the buffer, throw an error. + if (!ctx->seek(ctx, offset)) + return AVIF_RESULT_IO_ERROR; + + dataBuf = gdMalloc(size); + if (!dataBuf) { + gd_error("avif error - couldn't allocate memory"); + return AVIF_RESULT_UNKNOWN_ERROR; + } + + // Read the number of bytes requested. + // If getBuf() returns a negative value, that means there was an error. + int charsRead = ctx->getBuf(ctx, dataBuf, size); + if (charsRead < 0) { + gdFree(dataBuf); + return AVIF_RESULT_IO_ERROR; + } + + out->data = dataBuf; + out->size = charsRead; + return charsRead == size ? AVIF_RESULT_OK : AVIF_RESULT_TRUNCATED_DATA; +} + +// avif.h says this is optional, but it seemed easy to implement. +static void destroyAvifIO(struct avifIO *io) { + avifFree(io); +} + +/* Set up an avifIO object. + The functions in the gdIOCtx struct may point either to a file or a memory buffer. + To us, that's immaterial. + Our task is simply to assign avifIO functions to the proper functions from gdIOCtx. + The destroy function needs to destroy the avifIO object and anything else it uses. + + Returns NULL if memory for the object can't be allocated. +*/ + +// TODO: can we get sizeHint somehow? +static avifIO *createAvifIOFromCtx(gdIOCtx *ctx) { + avifIO *io; + + io = gdMalloc(sizeof(*io)); + if (io == NULL) + return NULL; + + // TODO: setting persistent=FALSE is safe, but it's less efficient. Is it necessary? + io->persistent = AVIF_FALSE; + io->read = readFromCtx; + io->write = NULL; // this function is currently unused; see avif.h + io->destroy = destroyAvifIO; + io->sizeHint = 0; // sadly, we don't get this information from the gdIOCtx. + io->data = ctx; + + return io; +} + + +/*** Decoding functions ***/ + +/* + Function: gdImageCreateFromAvif + + is called to load truecolor images from + AVIF format files. Invoke with an + already opened pointer to a file containing the desired + image. returns a to the new + truecolor image, or NULL if unable to load the image (most often + because the file is corrupt or does not contain a AVIF + image). does not close the file. + + This function creates a gdIOCtx struct from the file pointer it's passed. + And then it relies on to do the real decoding work. + If the file contains an image sequence, we simply read the first one, discarding the rest. + + Variants: + + creates an image from AVIF data + already in memory. + + reads data from the function + pointers in a structure. + + Parameters: + + infile - pointer to the input file + + Returns: + + A pointer to the new truecolor image. This will need to be + destroyed with once it is no longer needed. + + On error, returns 0. +*/ +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvif(FILE *infile) +{ + gdImagePtr im; + gdIOCtx *ctx = gdNewFileCtx(infile); + + if (!ctx) + return NULL; + + im = gdImageCreateFromAvifCtx(ctx); + ctx->gd_free(ctx); + + return im; +} + +/* + Function: gdImageCreateFromAvifPtr + + See . + + Parameters: + + size - size of Avif data in bytes. + data - pointer to Avif data. +*/ +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifPtr(int size, void *data) +{ + gdImagePtr im; + gdIOCtx *ctx = gdNewDynamicCtxEx(size, data, 0); + + if (!ctx) + return 0; + + im = gdImageCreateFromAvifCtx(ctx); + ctx->gd_free(ctx); + + return im; +} + +/* + Function: gdImageCreateFromAvifCtx + + See . + + Additional details: the AVIF library comes with functions to create an IO object from + a file and from a memory pointer. Of course, it doesn't have a way to create an IO object + from a gdIOCtx. So, here, we use our own helper function, . + + Otherwise, we create the image by calling AVIF library functions in order: + * avifDecoderCreate(), to create the decoder + * avifDecoderSetIO(), to tell libavif how to read from our data structure + * avifDecoderParse(), to parse the image + * avifDecoderNextImage(), to read the first image from the decoder + * avifRGBImageSetDefaults(), to create the avifRGBImage + * avifRGBImageAllocatePixels(), to allocate memory for the pixels + * avifImageYUVToRGB(), to convert YUV to RGB + + Finally, we create a new gd image and copy over the pixel data. + + Parameters: + + ctx - a gdIOCtx struct +*/ +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifCtx (gdIOCtx *ctx) +{ + int x, y; + gdImage *im = NULL; + avifResult result; + avifIO *io; + avifDecoder *decoder; + avifRGBImage rgb; + + // this lets us know that memory hasn't been allocated yet for the pixels + rgb.pixels = NULL; + + decoder = avifDecoderCreate(); + + io = createAvifIOFromCtx(ctx); + if (!io) { + gd_error("avif error - Could not allocate memory"); + goto cleanup; + } + + avifDecoderSetIO(decoder, io); + + result = avifDecoderParse(decoder); + if (isAvifError(result, "Could not parse image")) + goto cleanup; + + // Note again that, for an image sequence, we read only the first image, ignoring the rest. + result = avifDecoderNextImage(decoder); + if (isAvifError(result, "Could not decode image")) + goto cleanup; + + if (!isAvifSrgbImage(decoder->image)) + gd_error_ex(LOG_WARNING, "Image's color profile is not sRGB"); + + // Set up the avifRGBImage, and convert it from YUV to an 8-bit RGB image. + // (While AVIF image pixel depth can be 8, 10, or 12 bits, GD truecolor images are 8-bit.) + avifRGBImageSetDefaults(&rgb, decoder->image); + rgb.depth = 8; + avifRGBImageAllocatePixels(&rgb); + + result = avifImageYUVToRGB(decoder->image, &rgb); + if (isAvifError(result, "Conversion from YUV to RGB failed")) + goto cleanup; + + im = gdImageCreateTrueColor(decoder->image->width, decoder->image->height); + if (!im) { + gd_error("avif error - Could not create GD truecolor image"); + goto cleanup; + } + + im->saveAlphaFlag = 1; + + // Read the pixels from the AVIF image and copy them into the GD image. + + uint8_t *p = rgb.pixels; + + for (y = 0; y < decoder->image->height; y++) { + for (x = 0; x < decoder->image->width; x++) { + uint8_t r = *(p++); + uint8_t g = *(p++); + uint8_t b = *(p++); + uint8_t a = alpha8BitTo7Bit(*(p++)); + im->tpixels[y][x] = gdTrueColorAlpha(r, g, b, a); + } + } + +cleanup: + // if io has been allocated, this frees it + avifDecoderDestroy(decoder); + + if (rgb.pixels) + avifRGBImageFreePixels(&rgb); + + return im; +} + + +/*** Encoding functions ***/ + +/* + Function: gdImageAvifEx + + outputs the specified image to the specified file in + AVIF format. The file must be open for writing. Under MSDOS and + all versions of Windows, it is important to use "wb" as opposed to + simply "w" as the mode when opening the file, and under Unix there + is no penalty for doing so. does not close the file; + your code must do so. + + Variants: + + writes the image to a file, encoding with the default quality and speed. + + stores the image in RAM. + + stores the image in RAM, encoding with the default quality and speed. + + stores the image using a struct. + + Parameters: + + im - The image to save. + outFile - The FILE pointer to write to. + quality - Compression quality (0-100). 0 is lowest-quality, 100 is highest. + speed - The speed of compression (0-10). 0 is slowest, 10 is fastest. + + Notes on parameters: + quality - If quality = -1, we use a default quality as defined in QUALITY_DEFAULT. + For information on how we convert this quality to libavif's quantity param, see . + + speed - At slower speeds, encoding may be quite slow. Use judiciously. + + Qualities or speeds that are lower than the minimum value get clamped to the minimum value, + abd qualities or speeds that are lower than the maximum value get clamped to the maxmum value. + + + Returns: + + * for , , and , nothing. + * for and , a pointer to the image in memory. +*/ + +/* + Function: _gdImageAvifCtx + + We need this underscored function because gdImageAvifCtx() can't return anything. + And our functions that operate on a memory buffer need to know whether the encoding has succeeded. + + If we're passed the QUALITY_DEFAULT of -1, set the quantizer params to QUANTIZER_DEFAULT. + + This function returns 0 on success, or 1 on failure. + */ +static avifBool _gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed) +{ + avifResult result; + avifRGBImage rgb; + avifRWData avifOutput = AVIF_DATA_EMPTY; + avifBool failed = AVIF_FALSE; + avifBool lossless = quality == 100; + avifEncoder *encoder = NULL; + + uint32_t val; + uint8_t *p; + uint8_t a; + int x, y; + + if (im == NULL) + return 1; + + if (!gdImageTrueColor(im)) { + gd_error("avif doesn't support palette images"); + return 1; + } + + if (!gdImageSX(im) || !gdImageSY(im)) { + gd_error("image dimensions must not be zero"); + return 1; + } + + if (overflow2(gdImageSX(im), gdImageSY(im))) { + gd_error("image dimensions are too large"); + return 1; + } + + if (speed != AVIF_SPEED_DEFAULT) + speed = CLAMP(speed, AVIF_SPEED_SLOWEST, AVIF_SPEED_FASTEST); + + avifPixelFormat subsampling = quality >= HIGH_QUALITY_SUBSAMPLING_THRESHOLD ? + CHROMA_SUBAMPLING_HIGH_QUALITY : CHROMA_SUBSAMPLING_DEFAULT; + + // Create the AVIF image. + // Set the ICC to sRGB, as that's what gd supports right now. + // Note that MATRIX_COEFFICIENTS_IDENTITY enables lossless conversion from RGB to YUV. + + avifImage *avifIm = avifImageCreate(gdImageSX(im), gdImageSY(im), 8, subsampling); + + avifIm->colorPrimaries = AVIF_COLOR_PRIMARIES_BT709; + avifIm->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB; + avifIm->matrixCoefficients = lossless ? AVIF_MATRIX_COEFFICIENTS_IDENTITY : AVIF_MATRIX_COEFFICIENTS_BT709; + + avifRGBImageSetDefaults(&rgb, avifIm); + // this allocates memory, and sets rgb.rowBytes and rgb.pixels. + avifRGBImageAllocatePixels(&rgb); + + // Parse RGB data from the GD image, and copy it into the AVIF RGB image. + // Convert 7-bit GD alpha channel values to 8-bit AVIF values. + + p = rgb.pixels; + for (y = 0; y < rgb.height; y++) { + for (x = 0; x < rgb.width; x++) { + val = im->tpixels[y][x]; + + *(p++) = gdTrueColorGetRed(val); + *(p++) = gdTrueColorGetGreen(val); + *(p++) = gdTrueColorGetBlue(val); + *(p++) = alpha7BitTo8Bit(gdTrueColorGetAlpha(val)); + } + } + + // Convert the RGB image to YUV. + + result = avifImageRGBToYUV(avifIm, &rgb); + failed = isAvifError(result, "Could not convert image to YUV"); + if (failed) + goto cleanup; + + // Encode the image in AVIF format. + + encoder = avifEncoderCreate(); + int quantizerQuality = quality == QUALITY_DEFAULT ? + QUANTIZER_DEFAULT : quality2Quantizer(quality); + + encoder->minQuantizer = quantizerQuality; + encoder->maxQuantizer = quantizerQuality; + encoder->minQuantizerAlpha = quantizerQuality; + encoder->maxQuantizerAlpha = quantizerQuality; + encoder->speed = speed; + + failed = !setEncoderTilesAndThreads(encoder, &rgb); + if (failed) + goto cleanup; + + //TODO: is there a reason to use timeSscales != 1? + result = avifEncoderAddImage(encoder, avifIm, 1, AVIF_ADD_IMAGE_FLAG_SINGLE); + failed = isAvifError(result, "Could not encode image"); + if (failed) + goto cleanup; + + result = avifEncoderFinish(encoder, &avifOutput); + failed = isAvifError(result, "Could not finish encoding"); + if (failed) + goto cleanup; + + // Write the AVIF image bytes to the GD ctx. + + gdPutBuf(avifOutput.data, avifOutput.size, outfile); + +cleanup: + if (rgb.pixels) + avifRGBImageFreePixels(&rgb); + + if (encoder) + avifEncoderDestroy(encoder); + + if (avifOutput.data) + avifRWDataFree(&avifOutput); + + return failed; +} + +BGD_DECLARE(void) gdImageAvifEx(gdImagePtr im, FILE *outFile, int quality, int speed) +{ + gdIOCtx *out = gdNewFileCtx(outFile); + + if (out == NULL) + return; + + gdImageAvifCtx(im, out, quality, speed); + out->gd_free(out); +} + +BGD_DECLARE(void) gdImageAvif(gdImagePtr im, FILE *outFile) +{ + gdImageAvifEx(im, outFile, QUALITY_DEFAULT, AVIF_SPEED_DEFAULT); +} + +BGD_DECLARE(void *) gdImageAvifPtrEx(gdImagePtr im, int *size, int quality, int speed) +{ + void *rv; + gdIOCtx *out = gdNewDynamicCtx(NEW_DYNAMIC_CTX_SIZE, NULL); + + if (out == NULL) { + return NULL; + } + + if (_gdImageAvifCtx(im, out, quality, speed)) + rv = NULL; + else + rv = gdDPExtractData(out, size); + + out->gd_free(out); + return rv; +} + +BGD_DECLARE(void *) gdImageAvifPtr(gdImagePtr im, int *size) +{ + return gdImageAvifPtrEx(im, size, QUALITY_DEFAULT, AVIF_SPEED_DEFAULT); +} + + +BGD_DECLARE(void) gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed) +{ + _gdImageAvifCtx(im, outfile, quality, speed); +} + +#else /* !HAVE_LIBAVIF */ + +static void *_noAvifError(void) +{ + gd_error("AVIF image support has been disabled\n"); + return NULL; +} + +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvif(FILE *ctx) +{ + return _noAvifError(); +} + +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifPtr(int size, void *data) +{ + return _noAvifError(); +} + +BGD_DECLARE(gdImagePtr) gdImageCreateFromAvifCtx(gdIOCtx *ctx) +{ + return _noAvifError(); +} + +BGD_DECLARE(void) gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed) +{ + _noAvifError(); +} + +BGD_DECLARE(void) gdImageAvifEx(gdImagePtr im, FILE *outFile, int quality, int speed) +{ + _noAvifError(); +} + +BGD_DECLARE(void) gdImageAvif(gdImagePtr im, FILE *outFile) +{ + _noAvifError(); +} + +BGD_DECLARE(void *) gdImageAvifPtr(gdImagePtr im, int *size) +{ + return _noAvifError(); +} + +BGD_DECLARE(void *) gdImageAvifPtrEx(gdImagePtr im, int *size, int quality, int speed) +{ + return _noAvifError(); +} + +#endif /* HAVE_LIBAVIF */ diff --git a/src/gd_filename.c b/src/gd_filename.c index 6b67c3a..ddfaa02 100644 --- a/src/gd_filename.c +++ b/src/gd_filename.c @@ -51,6 +51,10 @@ static const struct FileType { {".xbm", gdImageCreateFromXbm, NULL, NULL}, {".tga", gdImageCreateFromTga, NULL, NULL}, +#ifdef HAVE_LIBAVIF + {".avif", gdImageCreateFromAvif, gdImageAvif, NULL}, +#endif + #ifdef HAVE_LIBPNG {".png", gdImageCreateFromPng, gdImagePng, NULL}, #endif diff --git a/src/gd_webp.c b/src/gd_webp.c index ab15109..a0b4787 100644 --- a/src/gd_webp.c +++ b/src/gd_webp.c @@ -42,10 +42,10 @@ Variants: - creates an image from WebP data + creates an image from WebP data already in memory. - reads its data via the function + reads its data via the function pointers in a structure. Parameters: diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6775948..b279f63 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,6 +17,7 @@ if (BUILD_TEST) include_directories (BEFORE ${GD_INCLUDE_DIR} "${GDTEST_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/tests/gdtest") SET(TESTS_DIRS + avif bmp fontconfig freetype diff --git a/tests/Makefile.am b/tests/Makefile.am index efbe26a..3630810 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -13,6 +13,7 @@ CLEANFILES = EXTRA_DIST = TESTS = +include avif/Makemodule.am include bmp/Makemodule.am include fontconfig/Makemodule.am include freetype/Makemodule.am @@ -99,6 +100,7 @@ EXTRA_DIST += \ # We don't keep any media files in the top dir ... just generated outputs. CLEANFILES += \ + *.avif \ *.bmp \ *.gd \ *.gd2 \ diff --git a/tests/avif/.gitignore b/tests/avif/.gitignore new file mode 100644 index 0000000..66233b0 --- /dev/null +++ b/tests/avif/.gitignore @@ -0,0 +1,5 @@ +/avif_im2im +/avif_null +/avif_ptr_double_free +/bad_input +/compare_avif_to_png diff --git a/tests/avif/CMakeLists.txt b/tests/avif/CMakeLists.txt new file mode 100644 index 0000000..e2df47b --- /dev/null +++ b/tests/avif/CMakeLists.txt @@ -0,0 +1,17 @@ +IF(AVIF_FOUND) +LIST(APPEND TESTS_FILES + avif_ptr_double_free + avif_im2im + avif_null + bad_input +) + +IF(PNG_FOUND) +LIST(APPEND TESTS_FILES + compare_avif_to_png +) +ENDIF(PNG_FOUND) + +ENDIF(AVIF_FOUND) + +ADD_GD_TESTS() diff --git a/tests/avif/Makemodule.am b/tests/avif/Makemodule.am new file mode 100644 index 0000000..b446a93 --- /dev/null +++ b/tests/avif/Makemodule.am @@ -0,0 +1,16 @@ +if HAVE_LIBAVIF +libgd_test_programs += \ + avif/avif_ptr_double_free + avif/avif_im2im + avif/avif_null + avif/bad_input + +if HAVE_LIBPNG +libgd_test_programs += \ + avif/compare_avif_to_png +endif + +endif + +EXTRA_DIST += \ + avif/CMakeLists.txt diff --git a/tests/avif/avif_im2im.c b/tests/avif/avif_im2im.c new file mode 100644 index 0000000..3a07ebd --- /dev/null +++ b/tests/avif/avif_im2im.c @@ -0,0 +1,67 @@ +/** + * File: avif_im2im + * + * Sanity check for AVIF encoding and decoding. + * We create a simple gd image, we encode it to AVIF, and we decode it back to gd. + * Then we make sure the image we started with and the image we finish with are the same. + * + */ + +#include "gd.h" +#include "gdtest.h" +#include + +int main() +{ + gdImagePtr srcGdIm, destGdIm; + void *avifImageDataPtr; + FILE *fp; + int r, g, b; + int size = 0; + CuTestImageResult result = {0, 0}; + + // Create new gd image and add some shapes to it. + srcGdIm = gdImageCreateTrueColor(100, 100); + gdTestAssertMsg(srcGdIm != NULL, "could not create source image\n"); + + r = gdImageColorAllocate(srcGdIm, 0xFF, 0, 0); + g = gdImageColorAllocate(srcGdIm, 0, 0xFF, 0); + b = gdImageColorAllocate(srcGdIm, 0, 0, 0xFF); + gdImageFilledRectangle(srcGdIm, 0, 0, 99, 99, r); + gdImageRectangle(srcGdIm, 20, 20, 79, 79, g); + gdImageEllipse(srcGdIm, 70, 25, 30, 20, b); + + // Encode the gd image to a test AVIF file. + fp = gdTestTempFp(); + gdImageAvif(srcGdIm, fp); + fclose(fp); + + // Encode the gd image to an AVIF image in memory. + avifImageDataPtr = gdImageAvifPtrEx(srcGdIm, &size, 100, 10); + gdTestAssertMsg(avifImageDataPtr != NULL, "gdImageAvifPtr() returned null\n"); + gdTestAssertMsg(size > 0, "gdImageAvifPtr() returned a non-positive size\n"); + + // Encode the AVIF image back into a gd image. + destGdIm = gdImageCreateFromAvifPtr(size, avifImageDataPtr); + gdTestAssertMsg(destGdIm != NULL, "gdImageAvifPtr() returned null\n"); + + // Encode that gd image to a test AVIF file. + fp = gdTestTempFp(); + gdImageAvif(destGdIm, fp); + fclose(fp); + + // Make sure the image we started with is the same as the image after two conversions. + gdTestImageDiff(srcGdIm, destGdIm, NULL, &result); + gdTestAssertMsg(result.pixels_changed == 0, "pixels changed: %d\n", result.pixels_changed); + + if (srcGdIm) + gdImageDestroy(srcGdIm); + + if (destGdIm) + gdImageDestroy(destGdIm); + + if (avifImageDataPtr) + gdFree(avifImageDataPtr); + + return gdNumFailures(); +} diff --git a/tests/avif/avif_null.c b/tests/avif/avif_null.c new file mode 100644 index 0000000..bbcc9c6 --- /dev/null +++ b/tests/avif/avif_null.c @@ -0,0 +1,23 @@ +/** + * File: avif_null.c + * + * Simple test case, confirming that if you try to create an AVIF image from a + * null file pointer, the creation will fail, and it will return NULL. + */ + +#include "gd.h" +#include "gdtest.h" + + +int main() +{ + gdImagePtr im; + + im = gdImageCreateFromAvif(NULL); + if (!gdTestAssert(im == NULL)) + gdImageDestroy(im); + + gdImageAvif(im, NULL); /* noop safely */ + + return gdNumFailures(); +} diff --git a/tests/avif/avif_ptr_double_free.c b/tests/avif/avif_ptr_double_free.c new file mode 100644 index 0000000..8160950 --- /dev/null +++ b/tests/avif/avif_ptr_double_free.c @@ -0,0 +1,34 @@ +/** + * Test that failure to convert to AVIF returns NULL + * + * We are creating an image, set its width to zero, and pass this image to + * gdImageAvifPtr(). + * This is supposed to fail, and as such should return NULL. + * + * See also + */ + +#include "gd.h" +#include "gdtest.h" + +int main() +{ + gdImagePtr src, dst; + int size; + + src = gdImageCreateTrueColor(1, 10); + gdTestAssert(src != NULL); + + src->sx = 0; // making the width 0 should cause gdImageAvifPtr() to fail + + dst = gdImageAvifPtr(src, &size); + gdTestAssert(dst == NULL); + + if (src) + gdImageDestroy(src); + + if (dst) + gdImageDestroy(dst); + + return gdNumFailures(); +} diff --git a/tests/avif/baboon.avif b/tests/avif/baboon.avif new file mode 100644 index 0000000000000000000000000000000000000000..f5821db1e09159d0683870c7762cae427fd82fae GIT binary patch literal 16521 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 a*~0AZ|Jl+jOLkuTW+ilgeM@OpmM{Q~EBN04 literal 0 HcmV?d00001 diff --git a/tests/avif/baboon.png b/tests/avif/baboon.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc5dcb3fdba348166d80bd348e0c13a7db0b6ee GIT binary patch literal 49030 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 literal 0 HcmV?d00001 diff --git a/tests/avif/bad_input.c b/tests/avif/bad_input.c new file mode 100644 index 0000000..a9f976b --- /dev/null +++ b/tests/avif/bad_input.c @@ -0,0 +1,72 @@ +/** + * File: bad_input.c + * + * Make sure that the AVIF encoding and decoding functions handle bad input gracefully. + */ + +#include +#include +#include "gd.h" +#include "gdtest.h" + +#define PATH "avif/" +#define MAX_FILEPATH_LENGTH 50 + +#define NON_AVIF_FILE_NAME "sunset.png" +#define AVIF_FILE_NAME "sunset.avif" + +int main() { + FILE *fp; + int retval; + char nonAvifFilePath[MAX_FILEPATH_LENGTH], avifFilePath[MAX_FILEPATH_LENGTH]; + gdImagePtr realIm, badIm; + void *rv; + int size; + +// Create paths for our files. + strcpy(avifFilePath, PATH); + strcat(avifFilePath, AVIF_FILE_NAME); + + strcpy(nonAvifFilePath, PATH); + strcat(nonAvifFilePath, NON_AVIF_FILE_NAME); + +// Read in an AVIF image for testing. + + fp = gdTestFileOpen(avifFilePath); + realIm = gdImageCreateFromAvif(fp); + fclose(fp); + if (!gdTestAssertMsg(realIm != NULL, "gdImageCreateFromAvif() failed\n")) + return 1; + +// Try to decode a non-AVIF file. + + fp = gdTestFileOpen(nonAvifFilePath); + badIm = gdImageCreateFromAvif(fp); + fclose(fp); + gdTestAssertMsg(badIm == NULL, "gdImageCreateFromAvif() failed to return NULL when passed a non-AVIF file\n"); + + if (badIm) + gdImageDestroy(badIm); + + // Try to encode a valid image with bad quality parameters. This should still work. + + rv = gdImageAvifPtrEx(realIm, &size, 400, 10); + gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected an overly high quality param instead of clamping it to a valid value"); + gdFree(rv); + + rv = gdImageAvifPtrEx(realIm, &size, -4, 10); + gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected a negative quality param instead of clamping it to a valid value"); + gdFree(rv); + + rv = gdImageAvifPtrEx(realIm, &size, 30, 30); + gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected an overly high speed param instead of clamping it to a valid value"); + gdFree(rv); + + rv = gdImageAvifPtrEx(realIm, &size, 30, -4); + gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected a negative speed param instead of clamping it to a valid value"); + gdFree(rv); + + gdImageDestroy(realIm); + + return gdNumFailures(); +} diff --git a/tests/avif/compare_avif_to_png.c b/tests/avif/compare_avif_to_png.c new file mode 100644 index 0000000..716eae9 --- /dev/null +++ b/tests/avif/compare_avif_to_png.c @@ -0,0 +1,100 @@ +/** + * File: compare_avif_to_png + * + * Thorough check for AVIF encoding and decoding. + * This test reqiures a set of PNG images that have been losslessly encoded to AVIFs. + * For each such image, we encode the PNG into an AVIF, with the GD format as an intermediary, + * then compare the resulting AVIF with the original PNG. + * + * We then do this process in reverse, encoding the AVIF into a PNG, + * and compare the resulting PNG with the original AVIF. + * + * We report any discrepancies in the images, or any other errors that may occur. + */ + +#include +#include +#include "gd.h" +#include "gdtest.h" + +#define PATH "avif/" +#define MAX_FILEPATH_LENGTH 200 + +int main() { + FILE *fp; + gdImagePtr imFromPng = NULL, imFromAvif = NULL; + void *avifImDataPtr = NULL, *pngImDataPtr = NULL; + int size; + char filePath[MAX_FILEPATH_LENGTH], pngFilePath[MAX_FILEPATH_LENGTH], avifFilePath[MAX_FILEPATH_LENGTH]; + char errMsg[MAX_FILEPATH_LENGTH + 100]; + + const int filesCount = 4; + const char *filenames[filesCount] = {"baboon", "dice_with_alpha", "plum_blossom_12bit", "sunset"}; + + for (int i = 0; i < filesCount; i++) { + + // First, encode each PNG into an AVIF (with the GD format as an intermediary), + // then compare the result with the original PNG. + + strcpy(filePath, PATH); + strcat(filePath, filenames[i]); + strcat(strcpy(pngFilePath, filePath), ".png"); + strcat(strcpy(avifFilePath, filePath), ".avif"); + + fp = gdTestFileOpen(pngFilePath); + imFromPng = gdImageCreateFromPng(fp); + fclose(fp); + + strcat(strcpy(errMsg, filenames[i]), ".png: gdImageCreateFromPng failed\n"); + if (!gdTestAssertMsg(imFromPng != NULL, errMsg)) + goto avif2png; + + strcat(strcpy(errMsg, filenames[i]), ": gdImageAvifPtrEx failed\n"); + avifImDataPtr = gdImageAvifPtrEx(imFromPng, &size, 100, 0); + if (!gdTestAssertMsg(avifImDataPtr != NULL, errMsg)) + goto avif2png; + + strcat(strcpy(errMsg, filenames[i]), ": gdImageCreateFromAvifPtr failed\n"); + imFromAvif = gdImageCreateFromAvifPtr(size, avifImDataPtr); + if (!gdTestAssertMsg(imFromAvif != NULL, errMsg)) + goto avif2png; + + strcat(strcpy(errMsg, filenames[i]), ".png: Encoded AVIF image did not match original PNG\n"); + gdTestAssertMsg(gdAssertImageEquals(imFromPng, imFromAvif), errMsg); + + // Then, decode each AVIF into a GD format, and compare that with the orginal PNG. + +avif2png: + continue; + +/* Skip this reverse test for now, until we can find images that encode to PNGs + losslessly. + + fp = gdTestFileOpen(avifFilePath); + imFromAvif = gdImageCreateFromAvif(fp); + fclose(fp); + + strcat(strcpy(errMsg, filenames[i]), ".avif: gdImageCreateFromAvif failed\n"); + if (!gdTestAssertMsg(imFromAvif != NULL, errMsg)) + continue; + + strcat(strcpy(errMsg, filenames[i]), ".avif: Encoded PNG image did not match original AVIF\n"); + gdTestAssertMsg(gdAssertImageEqualsToFile(pngFilePath, imFromAvif), errMsg); +*/ + +} + + if (imFromPng) + gdImageDestroy(imFromPng); + + if (imFromAvif) + gdImageDestroy(imFromAvif); + + if (avifImDataPtr) + gdFree(avifImDataPtr); + + if (pngImDataPtr) + gdFree(pngImDataPtr); + + return gdNumFailures(); +} diff --git a/tests/avif/dice_with_alpha.avif b/tests/avif/dice_with_alpha.avif new file mode 100644 index 0000000000000000000000000000000000000000..dce625b38b845851f0d8d0e8d44e8ae309bd063e GIT binary patch literal 6248 zcmZu!RZv{fvK^e@3{G$luECw)?ht|m9bjN^x8Uv;AXsph1a~Jm1PL~{yZa-#b?d#4 z*Hyh+R`1o_=V#Xe000yg&K?jGSC9qZRsLEq$bth5GOE&u>9dtT#z z5zG((fVlMPOMpOj|0el|5WfcIe@p(}FmYw)khHh8|2M$@BCqgYMBEl)W%9R@802XF z9|iyb!^Fki_FvDxUFSd$N64$K0YOadUo9@k31a?g|H}QVw!SJB1mq6-n}9<`Mt(JD zCaxTk0RXhWDI8OKTSq%nTld##&;c<1uc`l!;&u7|P{8~j0+PQ3e6Qn3{&id&?F7IO zbIX5+gn%i?6e8f{;pA)%b`p540oj5~96ba~{<{(x2m=1M+w0ZW4+swf8wd}8g-1XP zeeHl>1U55q1_DqJ2}z&r9yB?}(XpYZLb4+MLv6uh)g*jldI`tI(X`%su!aZ_Y`%mS zG|7jR4lS9fcY5`B@u07@{&`8xGu~_17Rg*_@nWKtA&LmHW6$e6hCz>#6HFo8YIPNs zXY-HCC|*R@mGv0kPHQKK^oW6*FsdwYc!Ibuk{#Z6_cXgrDne=DuHo4@>sGTW_6QV3 zb7AB{Q6$L7>TiE95`7o8N03LK^H!m{Kn_gvLTH9-%U@y#Qhmdoktj4HT=yiJO3`@t zLKB7u#MzX!>WkWQM1jC=nVT(?OJ}>9eHf^Jxq_D|MG!BPUlO={fL|uhGx4YOVAwI{ zJ9o~K_dnvb@$W6R5~eiq%AjH-LbC%+D` zzUZ&PlS1<*7*MHpo>Zk1jz9{$+#Tj5X2jk#CLfMdJ3Et_vNyD8t*&F>eUAA+V9h^D zsPRzWwj1P274GS>U)ovBz;U? z8$JGo0jUM2w;^HNWY9F<*;d~Uk8IY7o{!aAIBZGK=f+)mz@p_n z&@-S)1EJm(imQtVOZ-;7JGxitJ;9^+XJ-#M;3Z`nRTg};R!l8nfIUwN7GJKan_)#= zBa+shd%F{fmJvl=r^;lsT@$Pt7c%4TMY zLHVkInmP~7^O*@CG*}OlVQ_1f{pGXbwvw^hZX*G&<#~hGVLyX$geM+LeI4-7A%(GC z!*}9)Wa-`(df9?!)1LK)mmDCfDlT5|NaP|%aqw-`)D9`PfY=FTP2JvHSR$>He!qTR z1hjTKliGzw9QxhoBE5&%&Xo-TV-@YD#?E?&JjiQ*TA1T145IqLU2vIjG@yiKpJ)ZN zF&dYi;RxAEerZv!xXiZslW=n_qs(JFKqffgQn+n%vYOQZmwj=dPS^w zK1c*_%+=HrJo@LVi;ke|`T=Hhr0k-IsS09zkzd_SS6e8tJ)kLLcd=P!+#0AfLX$_& zVAL5;czY|w$^!MNT=H_#Igo?Pu>4Y;QIE3Dvu2tA3H)wsRGF|8eYx|76-I-GnmA?* z2BF%~#!if9!3^K?*)poWRV(<&Jhw)}233hq5HY8pH6_shiLvQPG9ZqFxaOwBR>~A9hN>pikMMAc_WpwNfFrawoip2&=jS!@ zSdT!C2A0X4*z&F#_7%eKebQ{a!A_eEFmB3`$vu?qBB6%9*+A*L!h$1?5m|mmlrvR* zvF&Qp-KDx)RTBGe4?hoRW6%*iql}rC)d|a^6NWHmY5ZoTa-NTpy(12MQd<~CEJ|rH zb+eqYx`Qp;$$UDW>#~WPs2pm^4}FhM@Np)4rDPKMQLcGJIWD=ZMB1*EoYH|`00n6~lQfjJl!6E1%+ax13NTVwM0!M* z-_1#NZLESV1$xhyyA1tw+Vg1jPLl}UevvoNDG?HHt80u%n)?D1Rsb_+nT+~;ZW|J3 zgu#f15@7JnPi#7%m&VsA$YisZNPL=HQ>Nvaa6_}uVJw}XhSe^0Cb^DH1P)q0PV)M; zq5ON>C@6E-{W)vNv7vA=gt?SGu3{5Z^b%0_Lfe3A_K5lRU9-DWSRGvvptQ?5uPf_& zDOeglnUD-fnS*+Q zXj)$L`|`~UB(~Gv*~c@I+T>IANW*_FeQEjBEF8Cbmwxc9%r$`#{G<2K*@f`l`yWy2 z3xvgWOgzwrW{t7F@E~6ZEZZVECDIKEmlFjxBKFfJOLI9f4u+ZrR?!$O$&KY7nRM4U zvM(w|Fb^E9E=_fxyv6svKC4$j4CmbstVd9M?~31AkP6=!^c(f;VIWp4%ujT$bbW0| zfc*txIk)-~AI*4S66K`i&nX=T+?(?*|1Od7dpr?weTx$+c{IB|4Hwl>N4z*wgVB zc5+wEX3=1FW}MPti!Xg!I+^Oki9s|Y)`c!t9u;YnTuy_!8q2>&jy_fhzEI(1Q?TLd zXR|V;dA?!P>~ZsSDok&zZf_0RPY;nR+$=dIS?u8<-59jARARMWc6Q;BxQ$5TJ=$e% z#9mB=&x2CJq(Ln)8asW%(i+cVjhhJBT=25&hg{Tq8DKp` zp=AQ?;NwxFRfqR^@Ua_pto+O)F>7}smq43&)2A_~nrOpw%vAGA4j=0+VB*46-R1i8 zlD~YVQ|w4oggM%Xe>fLq7}9v&v#)5%@QoI1ORdJ(;HG(3HuL$LDETydW5fo>jB-DY z3o;YU?S-m^`Qo7W0<>&O`cT^sI5!JpQD~knAy)puol-Ip(<=7OgiMHI%b$KIC@RNRny3L&Zm7+ znV%K3#cDFHN*N&1d)NtJ~uIQxc@oXd*4Lu(}EQUP8wTs|1|BTqr&ee$2t1olOn51o@!qm}$dU&jPj zsG--&+flie-$b{A*^E6fKcLi;MZFZv6McKK#^-_2%WRt2{zHq~gc4{c1$a&i9R5z{ zV~m$9C{3yy!E2hc!d#%Etw6T))!+ay&h!H1wf?$a3T^vzTYpO3*wKN$)lf7Xk0FF& z;x_S-dfg0K-|i!8w4KiAqcetto_1(tFNn7m!+Q;@YnnWr(}>Z{>H|?NQ(U5vDRq%_ zM&Pjxv6z){$(^%n0Earm=MYzl5Kg8p4+qI-g?p{UktdXc3*$7okL7~?5CAk$V>b7RjR}O z$0?xjX0=u{Av}^sLFFdqzL!xYcdD0gy*jKrEtflDeGUcqt7MpP(th3e2x840cFp{y zXvzzOZ7qUqHW|jJOBZHm?<(ns>X_;oBAQ+$ggNBm=XNh8#EN7bAA;zA1c|G zgx(^p2ihrS8R6qH+Bn#lATR3uv+sPd3rA*Q{e%eL6e~PFB6nW;-IPrBL8ax3LI8w$ zyzf4jrF-&Jt(lpBLqwA<8uuO9Hr4RJv1s*_P2f)?t6(k-b%TT+D%XY0Bz0{Zn3JDE zbK=1Bm9y`5agv1qyW3*c)ple z@}-p1*dX(UA#o?~>nkd-h~^(uHM!rv^#J1-;(4v4AxE3w66+xf+owkVtdP)cvu5p#=KKW>r-ks+^rHjlh z%6HaomrmxJmdFuUA-)@^wd^-eO|p#USLs%?ISJd{lb(@DEOe6~4B4y2?yO4}g)`f% z*u)4Upl*`U$?=W`Sx-sGDibpYTNbpp`TA3JFy3sN(VlaWwCezsINt}b*MM_LrX_&88N_Eh1&Du!YQ>3Y z3y)USCiOG#WpHbBa9jPXZw;0~V2{qK7W$>`W{nM^>I8hfl-@%IPyuCOO!P^ z{rc`$zjKq`YtK2R7J*XGB7!gdQxnFx-0E@~IVM|-qs@w`Htc=%o(l<5dn^XSaf6ef z7ewT?8Jd=YV;+2M^8Br{w$=y$Op9E z59F*|Ki*5E$*$DD|5W2|W1QjPf_R>+WNajwB>@hjaBS*#qgB#sOVqX4J^IQA{?KFV zIK@&&q8uGjQx8nVAN3=mOk9;R`Jky?UtUmAKSGr=#s!bJ)rT3QK^PbM_4quRzhDMC zDHtjRGcgZCagROJBI`6KXp9lmH^`YBN>l8!t7Y&YNAY|mH%e+UOPU=QO zaH!h25Pi>0;?Ja9aZ}3!oMZ02r(Ke`a6FPTA#2$37bV>fyTiOkCnLan+8hD8!#QM8 zuVk0W6{|fVZGIvm5%$A`-yVoxKNjC1;Vl>)^ao}3voEgwlCl7@o0O%PptC^Xa<|BMxHf#qobTI5q+Qm}(j&t}04s$GqIo}I;I881wZiILh zbUzcGc8p6k+%H|;oNRDXHKd%Kvh4TG08zy2E<~&~i%STG`k&||5}C#}*F9UrQ%=!- z{)t|)*50Ykqvf&$Sh3qdVoR$GM0XJ+W5-A=I(v1yGV{cqf+rAl#1^KW37=N&Y(|b? zNT5&+J?cMNvRWxD`rni#9#mq}j3}y{2;w5KP|}Q>*fMQ64XLRO%dGAFvgD3_;>H)1 z`R*&Eyn=fBJQC1G^eOofQN%|*JF!;Hx#=0}xfrl7TeR8;FqlpN9h{nqpn zbA5cBb%!iPbkqOtft3;|ZZ4zjPm6%f_WEzi+l{QFIn0j}C4xkOOp5?8s$bKKN`1u$ z&@|>nDH)ZS;v+da;SIcX!?mRRI9iqAcy<03R&>UF=ckjx9m5oLsR!q*Cm%W$&PbEw z+3y#I)7`y`aGyAQZcOnr)tci3<>69wG!!IrPkt-$D;YTIMCtV88AIvLF<)lPqOfa- n%Osz?12UgVGsGlKS~D5l9`rcm_D|%}{XPNXD^^b=F0tZG00{su<-wp(f4FvvQJP?o+FwXz-O28EVg8=~o3bh0R`yY(fKl-0d z;$Qiv{XY~m5BUFD%mevf^m`uY|MH#xQ49Z~UHeC%9V9fJfq-C9{!@T~GO{rLS<|#s z(Ew=3%5WLm+tL}D*c+MBx!XGYM+=C@o$DWKYYH$Vbhov!bLMjACH^l2*FXM0VtQi2 z|AGLld5JY-6$pjxolFT?=~(C(i1}a$2?=?eOw72HM8y6_{a=lj*a84>;G(B@b919} zW2UorGN)(c|Fr7#Kiw`^uODGw-aD#_J2LuIsZ>s{{p1{&l!3~ItKdxwf#?(=RZ;|c_&NLf1dwi zpO2B}zmWeQ+5h{tJ~4hKK%tFB>0>O#g39ARqxCNfAL6ci_t| z%P7+mj~$O^=j-mJZkMNR8@5bTOT`3HYYI(4F=V6B@MIJ6G!7w#24YY#a)K;xXc-~~ zh71I3(qBfa0tTRh_ks<$pmK!T4aDRrrs2o)`|HwAN?S|17h5;HA51+bn^bh@O)?_u zOD4J3+AbG#<{mR2zRN!koe@s<9qb@4V!PW=n>hYnBo6jq*U`OQNUi^Wp)M~-x~F>X zcUPjX`aj6ndr1qoa-)pmqBlS#=Zj+_6ZmK3>pHga$1At(zqEhj0TX_i31nYBhyP}x zonZPpD`kF=)*r9hd9R-IJ}aKwXI0kw*@MK$zYBc%8tC!5+43T}U5@JQ&?$rk+9`7Z zZenFFOqxACB88^TNlof2Pc#ij3kk8qjA(96Lq9oQG|JB_tI3RZbxV9+PFaVX6>PF{ z&p3{vk;d|QU#R$b-yrof|6rsITJe3@e)vLCKog@+B(S0SdG)pDd4W6${qjr&`HBYO zcO-6v47_+k@b1mxbgAI5*L0}*3FkPDa%YqlX z@Tau!(xpR7eqphfMLBilqdlj2ZAPy?ttoTr?^pT^3q-B|XY|OAA^WNBXU^ml0l{E; zUd|Q%?StX#1pl_FfG@m(QOwU+?xS_aawbmfLE9XK9UiyYdW0m>>OSM&o z((>P`FeWxy>PBnUCXMnU(T(Xz2ARM<0j$3pnrKxpZVMP%}=qDx$FcB{AVS~?I zR!h1}Q|?5vSLqZ~OSq+4PPm1a9F}9vXgIs)e!AeB5C~f=XuPt?U=APIa%|VGjf%LX zt4EG0C6WmxtH7Ga=_TjORuMZkW9x|9@*u_~0_qwiHTfz1zj3c7p5*{2wpq$-7ef}`+IHUoG&V8 zi)9O!Q8@~^0&xwpK>QvlJ-63icXYt*1z`}r$LWTRJ1?njZUezmWLkf2`wqX`+74~% zG3m`URd9Z>x>#3Uh8ogRCj%h!v`f;{GSERUQJIn5A3&M;Ty)`WYuW<+&&7~xO*lsz z!LlacgflmamDE_GCL<0QR8)O&i0&F{v@ukg-UAL6>As)s3gZhRlE&Yd z?^&3mf{t-u=xiKX`FV@LljRc*Qt zC_vT!UT#ra2Iej~u|D~T>BQqdEnosXwxb}6sG&nka z9Gs5?sssPfv7SW}uzb7yTv$DilB8>vKccs^w8Si1%_&a6$mQ_Y^4;dVte(W+HD)?H zmjKU(7lmrI;F!OjrQ3#P)ZkQvj|+I1cjvwrDuz5yck0o*eta=VAkz|=r>ujk4%o9x zk?l~TgZ_0hI>mfTF~yDvWHhLFcPM*b1-46ACF&j7iQN%q>8WpIrmC$L9bQ~?c^Hkq zTxXssv&eNrT4feh&QYltUrB1yAN{lU2w?J&ie56t6st5ur2{&|wkos0X*RYJ;Xy2J z(?Y(%;YRhq23J&w9njc{Xvwhf&0f*zUcp%(s4h?(WTUQ)899jFx%@tES9WXWtN!De z0PcbDetW}^*8`C>LNIeK+2A($@L9;rJa?u=>%Hoj(0DR~aYEqU+Z>BaX&D`2MJic^ zEF%F>E#SToX#SzUeFT#aSGD|S$sf>zik{P~t9 z(OF?sLqY*38{krO^6ARG1}jX~WZPkq7Y74=^*Sk|A*tN+xE~qLiCJa+vhy>)l&Yr$ zeca^=@77cI1+0GiR|(L)H~ALdbL*DS^Uy29^nm|)yU@x@ZJENBK!e2aJEO+5y`(h7 zurkFC3ka+3Krp@lE{QO5aWqZV%v#OJ^r*ZDQhvFi#$cxcjxG`-mRA?|F>jF;+&tUILuC0h#4r~B13Z1KH{2en|A9+=C-VS!ILI&3ugv(7R56R7a=LgV@s3u^^G=t9L zh6-3)TYI!ml2W`|uCDPo8n+2?(DJ&MWHr0*Wd6OE%CLZutY)jAeckc(CO#m3)5vte zNdGjgRlzzkFszZVC&K6HkKyTW%weWUDb54)%MeAzO?OFkNkz6W54CEccmd9`@mxc0 zS+!$MtNl2pARfis5j46dFGxx|_Hl}4QmsL$c~vGe^+)z&N9QYfxfbpkJ+2$=g(6e4&OBg5+On?OXl|g*!rIeg|L%I(IJpfsZx~REq1|-@lK+C-CcNME4AVW zC%N+N7Z;ZERvyeDd&nxn`lV#WN|f3u#p^MJiLC0v1GBs`&dIyDelpR73Watn*rWCn zQizC*iXM!+O>jhraG~Rv$kCMbJooow*LFNMERR73xkejc8IPxoG{9Xt*F`gYnRPRl z*c`bc(K`{`-Wt!2(v+*#&jnm6sk|%Nb;HYy()E9^1J7*wC>CwE*bZ1?hR0Sf#C_~Z zHdnh+^e!f?ACAbp%2~D3(42KAoo&c*ZCSVj1T(3p*Qk%stV>u5k+Y<=3sau5esp?r zpP7XjkM}9`;QDvd3^B!<1hk`I=KgB3Y5RTc*RuE?u@S4jvfsP{Ho3u0sn+YXZvbMY zjW*t$8&5G9kz;|yO7{kBSxxSCdrOqu+?3dCP__EMCqZL6wibIln4fEPkWjc)&!6%* zaAVRWY*{5y1I!JLFw4w`h6e*tN)HXx2kBQ>vITUGrLk!vl2%`ufCW1y9a##sSZT@8 z`vqigpOTH{21O-2=vSU8{San9HS_(VYpK9xBk`-$0{u_mc?Mc#$K}>IXkI^|rw>#s zP0oso&D^RxnDC=8SoO8lbdF3I>G0iL-1zDONL7Rg97gOeL+p+rS_(I|V9$bSfiNK@ z#t^wJKMc)Nv|FSstr2D6BliS90+9xs{kz*_9Ur zD_b~*ZLmug{+zNes?av>-1o@-*gBGDw!OP8^<;J~^!>pA{St_z9_N3ByejVN<<2bG zR-894ooC^(-8g4@v&Vr?-zOMJn-grwL{t#2hag(#d01INbNi#`NR?ctNL4I{>m`Qy zeAg8!m|yVV4kgsMdM_-RDib{ZN6^~ zaWVyYtmRo5@XVgad@8bwBHxFj-kF#B_}QRdzcor$P;s$PYza~s5@DK$G|OxsWlt(+ zrfmj7#Hk$NwV^5+PP>5yq$N_d}3Zkf^sgf3; zwd7cdzS|N7?i%(>jNs^HTg6{Rw%)cVgOhXZ(UPEj6%8~W%$kn&_BWdbySW6vx|jzHZ}9_+Ma?EKYzJRRzjKu81AW90A*5^1faXn6|jL1mD5Kn<+x; zg}nv#2?-`twJX|D>e5mT3=THBIi8|#MmWHGjX!zBE4C_Lt~a!I{|xMdB+v}Q;FDsw znhRM=t35@_^ve*OWa`M?bmdok8+w(KY(Vnh>`KA7w^A2A^g z_79zQ?jg9R$8QY;?2?C#-;m89SUJiL5mTg2B740d;9Y5hK>sOaMrD7L&5 zo&1rAjdEn6dha$zmRy3Le<%%&C2Q<)G`TT-I%0wRIPpDH-Bu-Ng=KBe_)7Ghw{E>Y z2JO;whsnzgs{DigsxKa+Qn=51OQD;a-@=(AJ z>CZdjPaFL=I}O|9Rn%)u2#|y_$CY3YLB3BgOr@0u?D}|wp0>{7+%x6eGwG1Zh^&BQ zB0yR>ur40#ioDZRj>ecDS38g%p&C|n$F7p-?JX>fkMP6*Ge@FS71`^`b8E-zaW48< zS)La7d1W(6n73m#b+P}hKr^YVP4JvLpaC1F-Y|=G zT8$v*kNdOxMQe1dt)LU5!C-mXSq4t)T60_W<}W+QK$BhI`#1^j`RI21Bk+R))kWyx z^wKBgqnoxJ*b~=dA?>E>Bt|wDmc>nQ%b}4N!QCDKY}?PU1o;!I^2pvcLy1# zGH<9k&_SUdX`RzZYUJNJO>%QlE!9 z!sGDcO+}y4%SlNXe#%K=!jzL!meE?Y)u=EPfgZMC-37zp`@nyZa$OAD$-ri0z#v=n zy=@q~7;C2BP>A>gz!r!F^!WaC?j}u~(!sKGPbcjujMgDHFW5Yb!*`t8Y>tn4D-w80 zROawntKh(g_fwA_n;q-7B0ksXP7J%p6K8P*sEKK00kUk&EhX2y&&%zfJ#>}qLR~U} zKtimY@qdN4CK#>EptIG{R2;xSJ979$FRUU4Job#9Bt+L|lb9RZ({DB{yWZF6p^^ z_moeSa6gQTjZ{_OYHhqa3-jjcujgCK&>N-H7!g5`|Bl=-G4!a6$PbW+?H8LJipi-# z_q5&(?dDSc*vQ5>YCwMa9(P`Y0e|tozsmfqN$ba3|JDMX0 z8)({j7CHi__bLg{X;a8Gi1KW^{<{=xX1=OB=(P1 zDnV>;{n>QVqQ!+`d3|;@LW}Irfz8`0IXtdEWF$eInFhf+d;3nnYA^e|9b2s@%&jU!Wu3b_A zUm)A4aOx758Ygfq~uye(G{{f2(M{gpLPXJJvw%q4MF1z%EwjAI8d9uU6ENr z!0bgriZsKA3%K$Yhu3md4#ytHNDQZIeOTkD`Gn~m)6?T}bieD{nOx!M3y zK%^Ts{KN7=tp1L_L}CYgDBR`RIlFqcq8p%y{Txp=^bE;V>@e+_(#(@5D&$P>Zzu=)ik3PFh5VSC5E0WD@B;80JF-s{SuR*Qh$hOgEuz0}~Cc~Aw7%tV;d(l4%%lj{l` zE{M?(3C=^PK#M5+-~iLAy|V3G0*`FQj&H)--Cg|{f5Q-^?x&}Cnh3Ieu$1X3^-sA^ z#@{vJEjtJ7D>pu?@uZ1FvV|rKo0|@a zc}*xwgda;`pEiayq0`8L-%8=EOCV-KwDV(`TJ1`7gi1a1Oa@SfxWlh|SefbuNvfD> zV1!t3f z3`yhSjybzp2{mK`m=N8`3j_K!oPsg0AX=frEZ{U%zFN3Wf2~IAQSo__{M4&9ue+R< zRGatA>xa1ql5*MvZ!R-_5S4s04Rx#v03w3-{auNv78Ye&5nfBE_PA?p>N6fP_3AMU zu-hQ*3%`^w;|fWJui@3f*_jn7FrN|lBaGl6xz&)ocQ&DZv-Kqec;&1Im)CpdWWAfn z`c)jLuA)eyTgP``c8uGO0U~b@Jx{3L(8thU>7m+e8zY#)p-2TC>m@5GUJs?X@kYeV zC{3{_o%~Og;FcQ1VD)*UIVJh*`6?~i{2OfxJ6qA^hZ(PIPu_AG8q9^dwejKvXp$Ic zP%`{D=Nb46c?Nxl4`{Fu4K!g+E`b?Ax_vT@rI+-aq{pEohGfQ5>>2JP!mot? z4(e6eQf#x@l0@3i`8#eMt10p6+w4H1|Wt%fp_Y1Ht?Ycp`$&ublg$z2f($ z({-avE2x1fSR(+$#=-%Wl9H<5sBVcgHT&(L{@ADjVZ(N60F|!$rE6$B9L3ecGXvxV zWblblwMO^Bd)~PCZnch3zHsc0pK$RH4|fJqUr`1Nf(qFKqpN|sqh z7$;KT{up9AyFAf7`9#TL;9|BSNtS9y?py7og{=+4htu|ZtBL%R2<% z)bYK2OLkK{{dD^tc2nZ_`Oym=<7~@YIfXo2xje2_UY6;QEZB$%RU+tmZ`wajl2cnZkSajS)7@5C_?ZHpdtoQ?#O*++cT4&d;O;(F1R?eWNR zRm0G`(t3b!bbk4Cgz~2Y8e3GeKCww@i|zOP&`;xk2`33&yYkA3kk2CFSwTbb3y-Y< zQrpW$vF&39J+;`PNid*N6L9_R)csiD-{vVkR5!$8<81@lb&#dHjN;lzPDZiYw^g8=v#B@Da`T?kMDbw zsS^uT`{RDakKecXEx>;Ht-^oGKdwOV`^Oe08f}LMl>wn~uPo68Br-uy(kI@m5u-^I z4(UkLaj|jip4c8 zP)Dgn?$eFA`tin&C-Wh4u_XX+v{96!0e%BOv{;ul&i|X2U6s2yF_iEtQf_IZ-O~}k zXwnWv35jKm3=@Up=Yy7*)82pmyuZCqKC;Dw8K^$9N9XBO=J$soPXA5H-qifJCqIw} z{oM5jR7^5iE7?^h!^T|AB9*l1{Wr_%N(mJhXnzz z)?bOneA6!*b8{K-bivno>90Ly`8OX4=HbV`(dcx75#_tTP?dl=Mbh29G93`nNt0GE zCxCO>AH%$^a1V1}5jkcyvpLd0jS#OdNxviMW5kq|!2wBI_n<`n{ z2ruRo?hOQv&L&#uY6s{hWrQHB{+8PA!PX5ftu;Z^uS$F$^AxsLk(LT)0axT4f-ier zsxe(@PfeWA6{vPjM`o3dq@>*st6ktB{&_LOfWX9h|HMN!j41{+@(fyybKISuYnk{9 z(2`UQ7HmQJmxfy#rA`CSekf`slo~BGS1?^lKaWzQNPW;1HqA0vy;>Uyg zOF5U%Hj$2~Hm1dZE4Dpyh8i1PmWnW*z{3Kr0hZ16(wIE9TtnH&PxO};>P|QBBfZ{b zEWK_-=UiA(q%Cp)ZAh__C}r}v5n3F<%lwoqeO_l0vg-5XVA>@=|1yq@YfN^a4%mz} z4n|P4!(ITwT`}b80?3?qcwOnmMR!m0@j|W~wPEmVuaJ_zC10XwnB=#97}w+_gpe8d zC_(vB#LC(WEhl7+Hr==F&LC$pEmI*%;oa#V1twl`+@ZVOaX$!objo`=#&bfq7j?(d z^?+KfmFY*6qpRI;nkA5dxP>U9nMCv%HlI&*Rtm}Fi$brw&94zyBVXjW&7{Rcgq^{e zRM|iGS^52K(*R;Cwm7=7x?2{V@PM;)u0dSf#@6{vx##&mhjqa(v8t1Z(d3Amk0SrHw*`FQX9>tZ- zZy_)H&chEzBv-s2wn7e3ycf@5L=<#qEtc|4v%QoPGwzuol9b#wd$>VSt1x}MxQpkn zRDFC`8RsOuE-Re0{>6OAxvLE%*42^QVTS)QX}_3mK%KD_1z# z9&b*Zc_k^Uh5TN#c+?d{dcup$Qx?LvwlwV2dHk-hy!&Ch5ELgynXl)5AE;O+*RL;vmVt>bRBJ>LUsus z+C1<`pcDraGnMFyfPd-gCB~tV;tThl(kNzT*yDZ`QKFe@F7RQQ(zKwgrh4q4>H{35hHzaGR8l|e!8Bl3*Dv411~mW~EmTj35e z8rY*mNtUI+t_)jW>$pu@rev-=IctJnuHUUII{P^EziWM5;8lSP^AfQFEiuViX;3@s zoMb7fr{uPN2LVcvL`f2E#B(lU+f#bRUl8DD!NnTB-hv&g6X2xcxijR5&n}gU(gwi} z-}4p}AsGmYNKyS@F%P8&tsZO(mX7cx2E^>p@e2`tk4N5YVnr@*d%atBaq-i8%XDef zZpbxhr6g<6NYKkQT3R+`Fq5vwT+d0`lD*FAHFRB(Xn?uiC;q%$Wp5t%r24x#v2DLt zK8%?wj;6g?xOC%KKW0gP_@L}$Dp6_gabO3K;uy)!u0d3rpzw~@MyJz+kPRa1B!@ke zBO~hc7wP2W?jY&=eAJ3m-t45hICp6}Tcd3)T>u;?5BNKn-=k0qPH8L2hC>G~w4^hM zmsATvW6hFP2umAsWUILTbxAX_`=g}SCB32?@lQPNWQfj0jj?nxB#-FSpGlf^@E!Cv z?w;$)TPoxZC7J|?6@4e_nNJ&)s?C7@;N&YgqOcQ=Y?Jk7=snWKXmzD1J5nJ#EJ;pL zl654>awnFFwBcs zJY?hPV=KkEBgIXSzg$HVV$@As?32pSM6h?X+`CjM={SsCq1X)YF%-RYTp~;eCI=Jp zoYsLI77YQ$D;O;G&Z+Rs^Jfd1gBo*b6j)nSC{R;hx9No#eAZ7rtr$?zPZW>Z(8tEp;nN(Sj(dGPKZF5ZMH?uogBx@OYPxt(_x+8`=s z2sy$OmtSR$O*txCuG3Zr@8MQljC=Zd$H2XN?Ed;3RYqq+3J|?2+cF^OZp(bLJSMYK z9MY_iX);_-x-uGs9t>b)6k$ zORgB21iQfoST8^qg44MigFUK`a1J`g@^7+|xf#v&L}mN{bq$AG;0keOBB0a5S8p=`9BSAPYB;Ya_buxl_way-ewvF&y|uf zZEYCW$)n+rrBtO=C{rl2dNFayb`^+vPC2dIPEXw9c+R{UGwqt{4=nW1M*O%Xg^YYo znb`Mxzol|5vT1UYL@@!+>2|F+*WfSx$3u@s`s>1m<2{ZHFFy&xo%iyeo-8za!c|*Q z>(#58Q5SF%!+wWU3@MKDh&4Oc!LKUccM-^oY! z4YKF5J5O$8U22517;q>N2w`2q8_}GI9vy#0%P-&}ooHpM<-=>c$5dJ?y`O}E0l*Py z*VSs(9Qa-?X*1DnYYB?g6m({Q?KaW#rnw-tru88!RqBMBW>R~(nC#_otR$88SnzP3 z(b&p)Z={L}LxY&a_WnxYox*I^zpd~06Dsv^C}WwCmmgEtKsduAH{91?TE|40;r` z>S(!IJmyu*GyNYEuW!sDltoVYilFk1rRmh)0g>Lyu(&jTi&7VPb7g-km zw6|x}Nnz1nYrc$f?mG$(yl&0xpNwRLDL1}>R9dGR%+3ak_&D7bxoz^xQ3_RqJ;>GK zJY@jt*HqZJRmR^EeodOnl&~OSKOE(Cnz|2zX!+dOEu4pfoPs#5eeWVbjDLE|5Kc1T zL`Q@ki)9MS6*&U=5z1Fs(?lUQP9l9Rqt2bG6cq!^qsQu{#h2sqRDZb>se{g~2K4w;zwuQAN4{&%t=&D5>XOQ6U zuOla;S=4@;oC`g|CD*S?ecrcc*L=ZWR`eF8Vx=HNCH^NS@;D2wOBLt03lCNd0cxBV z@-@IGB0(7UOxJo5^tMV4$cm=uE=h8)cjF`4v2;A^Jj_1BIh503Rm+eA{=^1k5xIPr zd>l_tyB95Wn51aW=dJgg*asbF0o@8*rnyuk?Ji0lV@Id=2I^~1l~Ssy&oi$F&{1zmPfMSQWGcEmn#!fh#hVQ z$clYj<5IMF$bahuE*7L!g#?h#^ib}3Vh4vIM8U-dccBl2MHVXtNy1EYyE8i7x2HwP4%M?xnhCC65s-OQZ)Z=>2hy!VqN5W$3hmnC2=x?t8-x$4J95m`wi`k_Jo zaB>o5>@Fb}%6T*TlBI6bS<$G2!bd}OzRfNQPZcVQSCdqepw}^(-u+v18=Wm1V0c`` zsIBH5?8F4+YNW>q1r?D6c$nK4KiS#vya53L!LP2Ev!mkT|a@|z4 zWD+E?K!Jge4vdScIjMLE^tgCD1zb`7P(r^DarcQ;76i%_6<9*jZq_-dnq;1V7i^nudt+KZg>gTYWOay$n855gr437G+;vS~ zwYH$6GqcNXDT%D&+q&Tu7|2<*B3<{S*R9?Vs`{m2iuUFvFqn50POn)6c3~GUz zP#;4mtMz#$HA3|o(9^@|Y#9~~vT}{oW}!=gVwu=K^+DY7Y)vB9;DzleTZ*2Nv@36U zD)jK!Vxkmx@HjUN#iPgHcihg+x8bE>F}`QFa5a8Z0sgeqQu)$iS8e*aG(~g{ngVFc z>LOSQQR)I{=P3wn*;V@@C7S*#3*%lgEnR^=;a<5^LDXfxtt!@3jY2GOR#p;1y%xe-Uu zLm22!{{Ubw}v#c7sRnTh$8=0+*!e1a2}*FAo` zpUzIt@K~6HaOp@>#PkG$dTG$4#2V)pF)Ab9Ie#{hL5NRD@dzrYqm4B^VfA$7uiAn< zFqNc9ZuH~QfG)Y5=d`j442$8~olLz=AESO`OhS&mFGn6&E1Pdco(J(gp2A;!D#d?j zw|DYExNOr=*M;-5oueh|q!h!GOwcmE3g9){l0uA;E(nq8kn5DSV`3|f>P|kNH&qg$ z18R;^4fMfp)j-0Oq~w&9tZA|sWNP%D7<|)P6aQl%s_)^mV`U0WV5c`>$tmKXDRadb}MMr_hDVTa_}^@=2HoLR4C{C z&3g9`YJT8Pz7oIvEvdmUgl0m(>S_8Rm&H2cd3U_F+0hCE(A9(gP+|WucA$RSK7HE@ zahlL>KqrH#5#kTNld=IeQPw37E^O;Wj)NWrUj^j&^KeInpLRecX|OO0GAo(sJ@37T zmd3EgCZ}Xb4+}X9uFG129VJQC7pTIX0xGTMF&q4(Yl$5g@<@BR)=Xr;UKdlen~bJ3 zXlR$G#ZOYd7k?ITSSp|-9A+`+6~^F1EH3>~dl_6voeEQ+rK?iZ@VXP(vveHQv+nKI zUYT!Z)+tRSD=latwf$euJF*_~UzQNiX2)0;mV{68=Qntw=T;$Dk44tudB~O$z%iCr zgk$$n{0mxpDBl3+GPAfW7UZ_MKy?1xi&14FY`|n6g?Np^ZRK*2{-}_gW6R6^Fuh2> z!2dW(wP>Ws4VGZ!MS{osdi;$1djY;=QhLUSIw&+6wz6`lXUJ7>`HL(oH^RR@9dBll z+yT#95W~?Be_KA?A2~Q2Nv(oTqL*+nLQbRrb;en7K#WiK>JqgUOIces^$r;YTM#9? zSQf@JlCR?$H!|>Eh39@Z)6xSd+md`l-ooY;u*poUqm=^5yH*-pe05>n25cMw%HR@M zN9AYPciC}^8QRU#^ZXE8wQ?Q9opG{65qSAN1J8A~Es?gs6jg5Q8#p(DUTZOIBbnEc zeUV;%Vt+f5nj%UTDTF9nq-eVoEf1sEKM#3sLkV(z#0*Atk?FOHsdURK+tvboX_0W4 zPU2@{0W`3{HipCLmb^(ksGW#ibw`78q~D#h#^A3|u((5{5LZQpnCAwz%{iAxDNvD)O~-td`7v5U<4yGNt@#U z<}dh)X_aNlNHMqTLB5jOKbL80#1V1|((2F84Svb$JSkcUVVnl?mIo$rc7-cIWCgPp z;RdN1WWi#yq^32xk(HA;*g}{dXB0<8-tub3@omg^1HWg;`G-t=c~5`mDvm)=VEgP= zIIK=IVFRr91p%R|=;$yauaPD&HdRrZGbL2=%*V$d)*c=TpW815cp$!jY_hsI6V+#1 zq~ugHEDm(8eiP6vVl$Iu2dssiX(+!~&Rja8o2}x)bEJP~}OR3+65dM8Zn|_q=)O78O zT`Z*SwvwQu8Oj6wcS%#*W`JU6GWU{~N!tv87z)~@yJ$@u$bnFXaIjIJLaJzD@WsDY z)3SdK{S%xop}*?AopL-7^Cq4asB_vOFvJO!!toB#p#@oaoCoMOj%?_%GxHm0_uO^S zEuxASFiSe6jNu3Z;1bjp@|V|tOZ|>xD~FGitH!t>pApTQ^0d9dbPU6}%Hw^&$=;!G z9_=$+`A<(>=Fr=Di%rkQ6s6AIsJkId2;@UHgJvEgY<@}$-i|7foaBSljONkQqOzWs zJyeL+f=X)FMTFEyjXvxZqj=pj+Co!n_(tj9bZ&)m1s8^;JLS+ev)>`fOgjSpQ zQA7`_-`{!De+(;JlmWUuyvyTO=MRAmu}p;MmRQ;>l3I&s;{!gLGlbA^0mm>=ia~@b z(RzAMu{tguok5fIBZ0mT=~Ye9Blw(>KVM)vzBAnA4_-2x%2c)V|#?Ndu9Y&NX6e7pR$1cRIa9bw8TXOG1_ zPt5G6f_h$$Bp7+mPkR3av}uFm@5|Q&GiywElnEif97jDYne3>z3L$k3OT6j?=sbVH zVGb=eUHkFsDpp}RJ^y<4{nlAaQV-a4ka_A89Q|p!59$N7htb_Ik|BBrh^V3Ug1M*m z=a`npcGm5T4$k(q)vIecnu;&Z&*!bMT$`DHcWsv#aygXWd+}#n{aril3`b_y*83j0 zYbQ(wQb7pCqJsQawXv+MCe~F7$vWA>G;|OBFF#?wl*XnZ(X(PZ6AXH)w6pqYt71Tu zBuqj?p#>NU7LJyS*k!DpKSy`P*nT9;2m3kLi2@T9nv(;wNpn5)C)g@v|LIhSHgbO} zRx2=-UouNxEA0Gp`dM`N*r0iYTz9y2|M$PKU;=N#8E^;v`GW@rJ&P3)T##9N0jfpiaT$(;_WPTZ-zG&lcMRq8x_7pZ}|_ zG5#vo`g{Ckc;|xlB~|)KNY|n%BhFuAQqkNr&C_~Qs~u^xEW;Q@EtEKtwOj7AY5_52#KVS_05P94Jf?ydv@u1Tyq(N#9P2NO=d+ z=Ep%=neQNcZ783Alx_JuOFd9f7NmpwGKt9Dw<~_Mf64u%M&Klp{

_FmbXH8_!(=iHcel%UDH`qdqaXjo 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 literal 0 HcmV?d00001 diff --git a/tests/avif/plum_blossom_12bit.avif b/tests/avif/plum_blossom_12bit.avif new file mode 100644 index 0000000000000000000000000000000000000000..7959d15b92630db4cc8f2132e4be9db5385dcb87 GIT binary patch literal 5202 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 literal 0 HcmV?d00001 diff --git a/tests/avif/plum_blossom_12bit.png b/tests/avif/plum_blossom_12bit.png new file mode 100644 index 0000000000000000000000000000000000000000..e6901e211213a1aafec8eef62b6053c847eed8a8 GIT binary patch literal 10185 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 literal 0 HcmV?d00001 diff --git a/tests/avif/sunset.avif b/tests/avif/sunset.avif new file mode 100644 index 0000000000000000000000000000000000000000..496455833080ef41c1712fdb52b377cbb9113e67 GIT binary patch literal 1174 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 literal 0 HcmV?d00001 diff --git a/travis/main.sh b/travis/main.sh index 2d29b5d..9965c40 100755 --- a/travis/main.sh +++ b/travis/main.sh @@ -78,6 +78,9 @@ build_autotools() { m distclean } +# TODO: When we switch to Ubuntu 21+ (Hirsute), we can reenable libavif coverage, +# as Ubuntu 21+ supports libavif 0.8.2+. +# "-DENABLE_AVIF=1" cmake_args=( "-DBUILD_SHARED_LIBS=1" "-DBUILD_STATIC_LIBS=1" @@ -94,7 +97,7 @@ cmake_args=( ) # libxpm-dev is unavaible in brew repo -# Once it gets avaible, please modify this code block. +# Once it gets available, please modify this code block. if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then cmake_args+=("-DENABLE_XPM=1") fi diff --git a/windows/Makefile.vc b/windows/Makefile.vc index d97b22f..3fefe80 100644 --- a/windows/Makefile.vc +++ b/windows/Makefile.vc @@ -95,10 +95,11 @@ LIB_OBJS= \ $(LIBGD_OBJ_DIR)\gd_crop.obj \ $(LIBGD_OBJ_DIR)\gd_color_map.obj \ $(LIBGD_OBJ_DIR)\gd_heif.obj \ + $(LIBGD_OBJ_DIR)\gd_avif.obj \ $(LIBGD_OBJ_DIR)\gd_webp.obj LIBS=kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_32.lib Dnsapi.lib Gdi32.Lib -LIBS_GD=libjpeg_a.lib freetype_a.lib libpng_a.lib libiconv_a.lib zlib_a.lib libheif_a.lib libwebp_a.lib libxpm_a.lib libtiff.lib +LIBS_GD=libjpeg_a.lib freetype_a.lib libpng_a.lib libiconv_a.lib zlib_a.lib libheif_a.lib libwebp_a.lib libxpm_a.lib libavif_a.lib libtiff.lib PROG_EXES= \ $(LIBGD_OBJ_DIR)\gdcmpgif.exe \ @@ -135,11 +136,13 @@ CFLAGS= $(CFLAGS) \ /DHAVE_FT2BUILD_H=1\ /DHAVE_GD_H=1\ /DHAVE_ICONV_H=1\ + /DHAVE_LIBAVIF=1\ /DHAVE_LIBFREETYPE=1\ /DHAVE_LIBJPEG=1\ /DHAVE_LIBPNG=1\ /DHAVE_LIBWEBP=1\ /DHAVE_LIBHEIF=1\ + /DHAVE_LIBAVIF=1\ /DHAVE_LIBZ=1\ /DHAVE_LIBXPM=1\ /DHAVE_LIBTIFF=1\ @@ -186,6 +189,9 @@ make_dirs: @echo #ifndef HAVE_ICONV_H>> $(GD_CONFIG_H) @echo #define HAVE_ICONV_H>> $(GD_CONFIG_H) @echo #endif>> $(GD_CONFIG_H) + @echo #ifndef HAVE_LIBAVIF>> $(GD_CONFIG_H) + @echo #define HAVE_LIBAVIF>> $(GD_CONFIG_H) + @echo #endif>> $(GD_CONFIG_H) @echo #ifndef HAVE_LIBFREETYPE>> $(GD_CONFIG_H) @echo #define HAVE_LIBFREETYPE>> $(GD_CONFIG_H) @echo #endif>> $(GD_CONFIG_H) @@ -201,6 +207,9 @@ make_dirs: @echo #ifndef HAVE_LIBHEIF>> $(GD_CONFIG_H) @echo #define HAVE_LIBHEIF>> $(GD_CONFIG_H) @echo #endif>> $(GD_CONFIG_H) + @echo #ifndef HAVE_LIBAVIF>> $(GD_CONFIG_H) + @echo #define HAVE_LIBAVIF>> $(GD_CONFIG_H) + @echo #endif>> $(GD_CONFIG_H) @echo #ifndef HAVE_LIBZ>> $(GD_CONFIG_H) @echo #define HAVE_LIBZ>> $(GD_CONFIG_H) @echo #endif>> $(GD_CONFIG_H) diff --git a/windows/Makefiletest.vc b/windows/Makefiletest.vc index 827a4e7..6e5d598 100644 --- a/windows/Makefiletest.vc +++ b/windows/Makefiletest.vc @@ -1,5 +1,10 @@ TESTS=bmp\bmp_im2im \ bmp\bmp_null \ +avif\avif_ptr_double_free \ +avif\avif_im2im \ +avif\avif_null \ +avif\compare_avif_to_png \ +avif\bad_input \ freetype\bug00132 \ gd\gd_im2im \ gd\gd_null \ diff --git a/windows/msys/Makefile b/windows/msys/Makefile index 8c5d380..d183ac2 100644 --- a/windows/msys/Makefile +++ b/windows/msys/Makefile @@ -98,7 +98,8 @@ gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c \ gdfonts.c gdfontt.c gdft.c gdhelpers.c gdkanji.c gdtables.c gdxpm.c \ wbmp.c gd_filter.c gd_nnquant.c gd_rotate.c gd_matrix.c \ gd_interpolation.c gd_crop.c gd_webp.c gd_heif.c gd_tiff.c gd_tga.c \ -gd_bmp.c gd_xbm.c gd_color_match.c gd_version.c gd_filename.c +gd_bmp.c gd_xbm.c gd_color_match.c gd_version.c gd_filename.c \ +gd_avif.c OBJ=$(SRC:.c=.o)