This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch libavif-loader
in repository legacy-imlib2.
View the commit online.
commit 62063417f268d9cbb0bf0e152352d24eb0f2f998
Author: NRK <n...@disroot.org>
AuthorDate: Wed Feb 26 03:43:12 2025 +0000
wip: add libavif based loader
---
configure.ac | 2 ++
src/lib/loaders.c | 6 ++++
src/modules/loaders/Makefile.am | 9 ++++++
src/modules/loaders/loader_avif.c | 60 +++++++++++++++++++++++++++++++++++++++
4 files changed, 77 insertions(+)
diff --git a/configure.ac b/configure.ac
index aab3526..533bd34 100644
--- a/configure.ac
+++ b/configure.ac
@@ -215,6 +215,7 @@ loader_check_gif() {
fi
}
+EC_LOADER_CHECK(AVIF, auto, libavif)
EC_LOADER_CHECK(GIF, auto, , loader_check_gif)
EC_LOADER_CHECK(HEIF, auto, libheif)
EC_LOADER_CHECK(JPEG, auto, libjpeg)
@@ -313,6 +314,7 @@ echo "Configuration Options Summary:"
echo
echo "Image loaders:"
echo " Regular image loaders"
+echo " AVIF....................: $avif_ok"
echo " GIF.....................: $gif_ok"
echo " HEIF....................: $heif_ok"
echo " JPEG....................: $jpeg_ok"
diff --git a/src/lib/loaders.c b/src/lib/loaders.c
index 9a3559d..7399bb7 100644
--- a/src/lib/loaders.c
+++ b/src/lib/loaders.c
@@ -27,6 +27,9 @@ static const char *const ext_ani[] = { "ani", NULL };
static const char *const ext_argb[] = { "argb", NULL };
static const char *const ext_bmp[] = { "bmp", NULL };
static const char *const ext_ff[] = { "ff", NULL };
+#ifdef BUILD_AVIF_LOADER
+static const char *const ext_avif[] = { "avif", NULL };
+#endif
#ifdef BUILD_GIF_LOADER
static const char *const ext_gif[] = { "gif", NULL };
#endif
@@ -92,6 +95,9 @@ static const char *const ext_id3[] = { "mp3", NULL };
static const KnownLoader loaders_known[] = {
{ "ani", ext_ani },
{ "argb", ext_argb },
+#ifdef BUILD_AVIF_LOADER
+ { "avif", ext_avif },
+#endif
{ "bmp", ext_bmp },
{ "ff", ext_ff },
#ifdef BUILD_GIF_LOADER
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
index d5752ce..f186904 100644
--- a/src/modules/loaders/Makefile.am
+++ b/src/modules/loaders/Makefile.am
@@ -17,6 +17,9 @@ tga.la \
xbm.la \
xpm.la
+if BUILD_AVIF_LOADER
+pkg_LTLIBRARIES += avif.la
+endif
if BUILD_GIF_LOADER
pkg_LTLIBRARIES += gif.la
endif
@@ -81,6 +84,12 @@ argb_la_LDFLAGS = -module -avoid-version
argb_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
argb_la_LIBTOOLFLAGS = --tag=disable-static
+avif_la_SOURCES = loader_avif.c
+avif_la_CPPFLAGS = $(AM_CPPFLAGS) $(AVIF_CFLAGS)
+avif_la_LDFLAGS = -module -avoid-version
+avif_la_LIBADD = $(AVIF_LIBS) $(top_builddir)/src/lib/libImlib2.la
+avif_la_LIBTOOLFLAGS = --tag=disable-static
+
bmp_la_SOURCES = loader_bmp.c
bmp_la_LDFLAGS = -module -avoid-version
bmp_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
diff --git a/src/modules/loaders/loader_avif.c b/src/modules/loaders/loader_avif.c
new file mode 100644
index 0000000..59bb83d
--- /dev/null
+++ b/src/modules/loaders/loader_avif.c
@@ -0,0 +1,60 @@
+#include "config.h"
+#include "Imlib2_Loader.h"
+
+#include <avif/avif.h>
+
+static const char *const _formats[] = { "avif" };
+
+static int
+_load(ImlibImage *im, int load_data)
+{
+ avifDecoder *dec;
+ /* avifResult res; */
+ avifRGBImage rgb;
+ int rc;
+
+ dec = avifDecoderCreate();
+ if (!dec)
+ return LOAD_OOM;
+ if (avifDecoderSetIOMemory(dec, im->fi->fdata, im->fi->fsize) != AVIF_RESULT_OK)
+ QUIT_WITH_RC(LOAD_OOM);
+ // TODO: could also be corrupted file (LOAD_BADIMAGE)
+ if (avifDecoderParse(dec) != AVIF_RESULT_OK)
+ QUIT_WITH_RC(LOAD_FAIL);
+
+ if (avifDecoderNextImage(dec) != AVIF_RESULT_OK)
+ QUIT_WITH_RC(LOAD_BADIMAGE);
+
+ im->w = dec->image->width;
+ im->h = dec->image->height;
+ im->has_alpha = dec->alphaPresent;
+ if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
+ QUIT_WITH_RC(LOAD_BADIMAGE);
+ if (!load_data)
+ QUIT_WITH_RC(LOAD_SUCCESS);
+
+ if (!__imlib_AllocateData(im))
+ QUIT_WITH_RC(LOAD_OOM);
+
+ avifRGBImageSetDefaults(&rgb, dec->image);
+ rgb.depth = 8;
+#ifdef WORDS_BIGENDIAN // NOTE(NRK): untested on big endian
+ rgb.format = AVIF_RGB_FORMAT_ARGB;
+#else
+ rgb.format = AVIF_RGB_FORMAT_BGRA;
+#endif
+ rgb.pixels = (uint8_t *)im->data;
+ rgb.rowBytes = im->w * 4;
+ if (avifImageYUVToRGB(dec->image, &rgb) != AVIF_RESULT_OK)
+ QUIT_WITH_RC(LOAD_BADIMAGE); // TODO
+
+ if (im->lc)
+ __imlib_LoadProgressRows(im, 0, im->h);
+ rc = LOAD_SUCCESS;
+
+quit:
+ avifDecoderDestroy(dec);
+ return rc;
+}
+
+IMLIB_LOADER(_formats, _load, NULL);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.