From: Colin Clark Date: Wed, 3 Jul 2019 12:50:48 +0000 (+0100) Subject: Fix #610: Support heic image format X-Git-Tag: v1.6~185 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=115f9840c030daeaaf7a5095b00b874a3c737efb Fix #610: Support heic image format https://github.com/BestImageViewer/geeqie/issues/610 Primary image only displayed --- diff --git a/configure.ac b/configure.ac index 99b3e2d1..4a14918f 100644 --- a/configure.ac +++ b/configure.ac @@ -576,6 +576,31 @@ AM_CONDITIONAL(HAVE_PDF, [test "x$HAVE_PDF" = xyes]) AC_SUBST(PDF_CFLAGS) AC_SUBST(PDF_LIBS) +# Heif support +# ---------------------------------------------------------------------- + +AC_ARG_ENABLE([heif], + AC_HELP_STRING([--disable-heif], [disable heif support]), + [libheif=$enableval], [libheif=auto]) + +if test "x${libheif}" != "xno"; then + PKG_CHECK_MODULES(HEIF, libheif >= 1.3.2, + [ + HAVE_HEIF=yes + AC_DEFINE(HAVE_HEIF, 1, [define to enable heif support]) + ], + [ + HAVE_HEIF=no + AC_MSG_WARN([$HEIF_PKG_ERRORS]) + ]) +else + HAVE_HEIF=disabled +fi + +AM_CONDITIONAL(HAVE_HEIF, [test "x$HAVE_HEIF" = xyes]) +AC_SUBST(HEIF_CFLAGS) +AC_SUBST(HEIF_LIBS) + # Markdown support # ---------------------------------------------------------------------- @@ -681,6 +706,7 @@ Support: Lua: $HAVE_LUA FFmpegthumbnailer: $HAVE_FFMPEGTHUMBNAILER Pdf: $HAVE_PDF + Heif: $HAVE_HEIF Documentation: Doxygen: $DX_DOXYGEN diff --git a/doc/docbook/GuideReferenceSupportedFormats.xml b/doc/docbook/GuideReferenceSupportedFormats.xml index 6500868b..8d93f6c2 100644 --- a/doc/docbook/GuideReferenceSupportedFormats.xml +++ b/doc/docbook/GuideReferenceSupportedFormats.xml @@ -1,7 +1,7 @@
Supported File Formats - 3FR, ANI, APM, ARW, BMP, CR2, CRW, CUR, DDS, DNG, ERF, GIF, ICNS, ICO, JPE/JPEG/JPG, JPS, KDC, MEF, MPO, MOS, MRW, NEF, ORF, PEF, PTX, PBM/PGM/PNM/PPM, PNG, QIF/QTIF (QuickTime Image Format), RAF, RAW, RW2, SR2, SRF, SVG/SVGZ, TGA/TARGA, TIF/TIFF, WMF, XBM, XPM. Animated GIFs are supported. + 3FR, ANI, APM, ARW, BMP, CR2, CRW, CUR, DDS, DNG, ERF, GIF, ICNS, ICO, JPE/JPEG/JPG, JPS, KDC, MEF, MPO, MOS, MRW, NEF, ORF, PEF, PTX, PBM/PGM/PNM/PPM, PNG, QIF/QTIF (QuickTime Image Format), RAF, RAW, RW2, SR2, SRF, SVG/SVGZ, TGA/TARGA, TIF/TIFF, WMF, XBM, XPM, HEIF (primary image only). Animated GIFs are supported. Refer to diff --git a/src/Makefile.am b/src/Makefile.am index f5d88844..38a7e935 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,7 @@ AM_CFLAGS = \ $(CLUTTER_GTK_CFLAGS) \ $(FFMPEGTHUMBNAILER_CFLAGS) \ $(PDF_CFLAGS) \ + $(HEIF_CFLAGS) \ -I$(top_srcdir) \ -I$(top_builddir) @@ -27,6 +28,7 @@ AM_CXXFLAGS = \ $(CLUTTER_GTK_CFLAGS) \ $(FFMPEGTHUMBNAILER_CFLAGS) \ $(PDF_CFLAGS) \ + $(HEIF_CFLAGS) \ -I$(top_srcdir) \ -I$(top_builddir) @@ -187,6 +189,8 @@ geeqie_SOURCES = \ image_load_collection.h\ image_load_pdf.c\ image_load_pdf.h\ + image_load_heif.c\ + image_load_heif.h\ image_load_ffmpegthumbnailer.c\ image_load_ffmpegthumbnailer.h\ image-overlay.c \ @@ -276,7 +280,7 @@ geeqie_SOURCES = \ zonedetect.c \ zonedetect.h -geeqie_LDADD = $(GTK_LIBS) $(GLIB_LIBS) $(INTLLIBS) $(JPEG_LIBS) $(TIFF_LIBS) $(LCMS_LIBS) $(EXIV2_LIBS) $(LIBCHAMPLAIN_LIBS) $(LIBCHAMPLAIN_GTK_LIBS) $(LUA_LIBS) $(CLUTTER_LIBS) $(CLUTTER_GTK_LIBS) $(FFMPEGTHUMBNAILER_LIBS) $(PDF_LIBS) +geeqie_LDADD = $(GTK_LIBS) $(GLIB_LIBS) $(INTLLIBS) $(JPEG_LIBS) $(TIFF_LIBS) $(LCMS_LIBS) $(EXIV2_LIBS) $(LIBCHAMPLAIN_LIBS) $(LIBCHAMPLAIN_GTK_LIBS) $(LUA_LIBS) $(CLUTTER_LIBS) $(CLUTTER_GTK_LIBS) $(FFMPEGTHUMBNAILER_LIBS) $(PDF_LIBS) $(HEIF_LIBS) EXTRA_DIST = \ $(extra_SLIK) @@ -286,6 +290,3 @@ gq-marshal.h: gq-marshal.list gq-marshal.c: gq-marshal.list gq-marshal.h (echo "#include \"gq-marshal.h\"" ; $(GLIB_GENMARSHAL) --prefix=gq_marshal $(srcdir)/gq-marshal.list --body ) >$@ - - - diff --git a/src/filefilter.c b/src/filefilter.c index 5410f778..a7f7ff23 100644 --- a/src/filefilter.c +++ b/src/filefilter.c @@ -292,6 +292,7 @@ void filter_add_defaults(void) /* other supported formats */ filter_add_if_missing("dds", "DirectDraw Surface", ".dds", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE); filter_add_if_missing("pdf", "Portable Document Format", ".pdf", FORMAT_CLASS_PDF, FALSE, FALSE, TRUE); + filter_add_if_missing("HEIF", "HEIF Format", ".heic", FORMAT_CLASS_HEIF, FALSE, FALSE, TRUE); } GList *filter_to_list(const gchar *extensions) @@ -472,6 +473,7 @@ FileFormatClass filter_file_get_class(const gchar *name) if (filter_file_class(name, FORMAT_CLASS_VIDEO)) return FORMAT_CLASS_VIDEO; if (filter_file_class(name, FORMAT_CLASS_COLLECTION)) return FORMAT_CLASS_COLLECTION; if (filter_file_class(name, FORMAT_CLASS_PDF)) return FORMAT_CLASS_PDF; + if (filter_file_class(name, FORMAT_CLASS_HEIF)) return FORMAT_CLASS_HEIF; return FORMAT_CLASS_UNKNOWN; } diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am index 82e4c5cc..d859b60c 100644 --- a/src/icons/Makefile.am +++ b/src/icons/Makefile.am @@ -47,7 +47,8 @@ ICONS_INLINE = \ icon_mirror.png \ icon_flip.png \ icon_original.png \ - icon_trash.png + icon_trash.png \ + icon_heic.png ICONS_INLINE_PAIRS = \ folder_closed $(srcdir)/folder_closed.png \ @@ -93,7 +94,8 @@ ICONS_INLINE_PAIRS = \ icon_mirror $(srcdir)/icon_mirror.png \ icon_flip $(srcdir)/icon_flip.png \ icon_original $(srcdir)/icon_original.png \ - icon_trash $(srcdir)/icon_trash.png + icon_trash $(srcdir)/icon_trash.png \ + icon_heic $(srcdir)/icon_heic.png icons_inline.h: $(ICONS_INLINE) Makefile.in @sh -ec "echo '/* Auto generated file, do not edit */'; echo; \ diff --git a/src/icons/icon_heic.png b/src/icons/icon_heic.png new file mode 100644 index 00000000..c562f7fa Binary files /dev/null and b/src/icons/icon_heic.png differ diff --git a/src/image-load.c b/src/image-load.c index 9fc4bdc5..02688dfa 100644 --- a/src/image-load.c +++ b/src/image-load.c @@ -26,6 +26,7 @@ #include "image_load_tiff.h" #include "image_load_dds.h" #include "image_load_pdf.h" +#include "image_load_heif.h" #include "image_load_ffmpegthumbnailer.h" #include "image_load_collection.h" @@ -627,6 +628,14 @@ static void image_loader_setup_loader(ImageLoader *il) } else #endif +#ifdef HAVE_HEIF + if (il->fd->format_class == FORMAT_CLASS_HEIF) + { + DEBUG_1("Using custom heif loader"); + image_loader_backend_set_heif(&il->backend); + } + else +#endif #ifdef HAVE_JPEG if (il->bytes_total >= 2 && il->mapped_file[0] == 0xff && il->mapped_file[1] == 0xd8) { diff --git a/src/image.c b/src/image.c index 57670abb..aa74327d 100644 --- a/src/image.c +++ b/src/image.c @@ -862,6 +862,9 @@ static void image_load_done_cb(ImageLoader *il, gpointer data) case FORMAT_CLASS_PDF: pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF); break; + case FORMAT_CLASS_HEIF: + pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_HEIF); + break; default: pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); } diff --git a/src/image_load_heif.c b/src/image_load_heif.c new file mode 100644 index 00000000..ae144066 --- /dev/null +++ b/src/image_load_heif.c @@ -0,0 +1,168 @@ +/* + * Copyright (C) 20019 - The Geeqie Team + * + * Author: Colin Clark + * + * 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 2 of the License, 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. + */ + +#include "main.h" + +#include "image-load.h" +#include "image_load_heif.h" + +#ifdef HAVE_HEIF +#include + +typedef struct _ImageLoaderHEIF ImageLoaderHEIF; +struct _ImageLoaderHEIF { + ImageLoaderBackendCbAreaUpdated area_updated_cb; + ImageLoaderBackendCbSize size_cb; + ImageLoaderBackendCbAreaPrepared area_prepared_cb; + gpointer data; + GdkPixbuf *pixbuf; + guint requested_width; + guint requested_height; + gboolean abort; +}; + +static void free_buffer(guchar *pixels, gpointer data) +{ + g_free (pixels); +} + +static gboolean image_loader_heif_load(gpointer loader, const guchar *buf, gsize count, GError **error) +{ + ImageLoaderHEIF *ld = (ImageLoaderHEIF *) loader; + struct heif_context* ctx; + struct heif_image* img; + struct heif_error error_code; + struct heif_image_handle* handle; + guint8* data; + gint width, height; + gint stride; + gboolean alpha; + + ctx = heif_context_alloc(); + + error_code = heif_context_read_from_memory_without_copy(ctx, buf, count, NULL); + if (error_code.code) + { + log_printf("warning: heif reader error: %s\n", error_code.message); + heif_context_free(ctx); + return FALSE; + } + + // get a handle to the primary image + error_code = heif_context_get_primary_image_handle(ctx, &handle); + if (error_code.code) + { + log_printf("warning: heif reader error: %s\n", error_code.message); + heif_context_free(ctx); + return FALSE; + } + + // decode the image and convert colorspace to RGB, saved as 24bit interleaved + error_code = heif_decode_image(handle, &img, heif_colorspace_RGB, heif_chroma_interleaved_24bit, NULL); + if (error_code.code) + { + log_printf("warning: heif reader error: %s\n", error_code.message); + heif_context_free(ctx); + return FALSE; + } + + data = heif_image_get_plane(img, heif_channel_interleaved, &stride); + + height = heif_image_get_height(img,heif_channel_interleaved); + width = heif_image_get_width(img,heif_channel_interleaved); + alpha = heif_image_handle_has_alpha_channel(handle); + + ld->pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, alpha, 8, width, height, stride, free_buffer, NULL); + + ld->area_updated_cb(loader, 0, 0, width, height, ld->data); + + heif_context_free(ctx); + + return TRUE; +} + +static gpointer image_loader_heif_new(ImageLoaderBackendCbAreaUpdated area_updated_cb, ImageLoaderBackendCbSize size_cb, ImageLoaderBackendCbAreaPrepared area_prepared_cb, gpointer data) +{ + ImageLoaderHEIF *loader = g_new0(ImageLoaderHEIF, 1); + loader->area_updated_cb = area_updated_cb; + loader->size_cb = size_cb; + loader->area_prepared_cb = area_prepared_cb; + loader->data = data; + return (gpointer) loader; +} + +static void image_loader_heif_set_size(gpointer loader, int width, int height) +{ + ImageLoaderHEIF *ld = (ImageLoaderHEIF *) loader; + ld->requested_width = width; + ld->requested_height = height; +} + +static GdkPixbuf* image_loader_heif_get_pixbuf(gpointer loader) +{ + ImageLoaderHEIF *ld = (ImageLoaderHEIF *) loader; + return ld->pixbuf; +} + +static gchar* image_loader_heif_get_format_name(gpointer loader) +{ + return g_strdup("heif"); +} + +static gchar** image_loader_heif_get_format_mime_types(gpointer loader) +{ + static gchar *mime[] = {"image/heic", NULL}; + return g_strdupv(mime); +} + +static gboolean image_loader_heif_close(gpointer loader, GError **error) +{ + return TRUE; +} + +static void image_loader_heif_abort(gpointer loader) +{ + ImageLoaderHEIF *ld = (ImageLoaderHEIF *) loader; + ld->abort = TRUE; +} + +static void image_loader_heif_free(gpointer loader) +{ + ImageLoaderHEIF *ld = (ImageLoaderHEIF *) loader; + if (ld->pixbuf) g_object_unref(ld->pixbuf); + g_free(ld); +} + +void image_loader_backend_set_heif(ImageLoaderBackend *funcs) +{ + funcs->loader_new = image_loader_heif_new; + funcs->set_size = image_loader_heif_set_size; + funcs->load = image_loader_heif_load; + funcs->write = NULL; + funcs->get_pixbuf = image_loader_heif_get_pixbuf; + funcs->close = image_loader_heif_close; + funcs->abort = image_loader_heif_abort; + funcs->free = image_loader_heif_free; + funcs->get_format_name = image_loader_heif_get_format_name; + funcs->get_format_mime_types = image_loader_heif_get_format_mime_types; +} + +#endif +/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff --git a/src/image_load_heif.h b/src/image_load_heif.h new file mode 100644 index 00000000..63378173 --- /dev/null +++ b/src/image_load_heif.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 20019 - The Geeqie Team + * + * Author: Colin Clark + * + * 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 2 of the License, 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. + */ + +#ifndef IMAGE_LOAD_HEIF_H +#define IMAGE_LOAD_HEIF_H + +#ifdef HAVE_HEIF +void image_loader_backend_set_heif(ImageLoaderBackend *funcs); +#endif + +#endif +/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff --git a/src/pixbuf_util.c b/src/pixbuf_util.c index f2a44a02..35c9cdf4 100644 --- a/src/pixbuf_util.c +++ b/src/pixbuf_util.c @@ -146,6 +146,7 @@ static PixbufInline inline_pixbuf_data[] = { { PIXBUF_INLINE_ICON_FLIP, icon_flip }, { PIXBUF_INLINE_ICON_ORIGINAL, icon_original }, { PIXBUF_INLINE_ICON_TRASH, icon_trash }, + { PIXBUF_INLINE_ICON_HEIF, icon_heic }, { NULL, NULL } }; @@ -296,6 +297,9 @@ GdkPixbuf *pixbuf_fallback(FileData *fd, gint requested_width, gint requested_he case FORMAT_CLASS_PDF: pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF); break; + case FORMAT_CLASS_HEIF: + pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_HEIF); + break; default: pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); } diff --git a/src/pixbuf_util.h b/src/pixbuf_util.h index eb7df097..901d4065 100644 --- a/src/pixbuf_util.h +++ b/src/pixbuf_util.h @@ -74,6 +74,7 @@ gboolean pixbuf_scale_aspect(gint req_w, gint req_h, gint old_w, gint old_h, gin #define PIXBUF_INLINE_ICON_SELECT_RECTANGLE "icon_select_rectangle" #define PIXBUF_INLINE_ICON_FILE_FILTER "icon_file_filter" #define PIXBUF_INLINE_ICON_TRASH "icon_trash" +#define PIXBUF_INLINE_ICON_HEIF "icon_heic" #define PIXBUF_INLINE_ICON_CW "icon_rotate_clockwise" #define PIXBUF_INLINE_ICON_CCW "icon_rotate_counter_clockwise" diff --git a/src/preferences.c b/src/preferences.c index 5d6db5dc..3b33b578 100644 --- a/src/preferences.c +++ b/src/preferences.c @@ -117,7 +117,8 @@ gchar *format_class_list[] = { N_("Metadata"), N_("Video"), N_("Collection"), - N_("Pdf") + N_("Pdf"), + N_("HEIF") }; /* config memory values */ diff --git a/src/remote.c b/src/remote.c index b5435444..76a7d529 100644 --- a/src/remote.c +++ b/src/remote.c @@ -855,6 +855,9 @@ static void get_filelist(const gchar *text, GIOChannel *channel, gboolean recurs case FORMAT_CLASS_PDF: out_string = g_string_append(out_string, " Class: PDF"); break; + case FORMAT_CLASS_HEIF: + out_string = g_string_append(out_string, " Class: HEIF"); + break; case FORMAT_CLASS_UNKNOWN: out_string = g_string_append(out_string, " Class: Unknown"); break; diff --git a/src/search.c b/src/search.c index 575b5573..3437b6d2 100644 --- a/src/search.c +++ b/src/search.c @@ -2184,6 +2184,11 @@ static gboolean search_file_next(SearchData *sd) { search_class = FORMAT_CLASS_RAWIMAGE; } + else if (g_strcmp0(gtk_combo_box_text_get_active_text( + GTK_COMBO_BOX_TEXT(sd->class_type)), _("HEIF")) == 0) + { + search_class = FORMAT_CLASS_HEIF; + } else if (g_strcmp0(gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT(sd->class_type)), _("Video")) == 0) { @@ -3369,6 +3374,7 @@ void search_new(FileData *dir_fd, FileData *example_file) sd->class_type = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Image")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Raw Image")); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("HEIF")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Video")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Metadata")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Unknown")); diff --git a/src/thumb.c b/src/thumb.c index bf18c60b..c249569d 100644 --- a/src/thumb.c +++ b/src/thumb.c @@ -337,7 +337,7 @@ gboolean thumb_loader_start(ThumbLoader *tl, FileData *fd) if (!tl->fd) tl->fd = file_data_ref(fd); - if (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_PDF && !options->file_filter.disable) + if (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_PDF && tl->fd->format_class != FORMAT_CLASS_HEIF && !options->file_filter.disable) { thumb_loader_set_fallback(tl); return FALSE; diff --git a/src/thumb_standard.c b/src/thumb_standard.c index f21906b6..ff2d02d1 100644 --- a/src/thumb_standard.c +++ b/src/thumb_standard.c @@ -667,7 +667,7 @@ gboolean thumb_loader_std_start(ThumbLoaderStd *tl, FileData *fd) tl->fd = file_data_ref(fd); - if (!stat_utf8(fd->path, &st) || (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_PDF && !options->file_filter.disable)) + if (!stat_utf8(fd->path, &st) || (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_PDF && tl->fd->format_class != FORMAT_CLASS_HEIF && !options->file_filter.disable)) { thumb_loader_std_set_fallback(tl); return FALSE; diff --git a/src/typedefs.h b/src/typedefs.h index b31ca33a..8b94a456 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -145,6 +145,7 @@ typedef enum { FORMAT_CLASS_VIDEO, FORMAT_CLASS_COLLECTION, FORMAT_CLASS_PDF, + FORMAT_CLASS_HEIF, FILE_FORMAT_CLASSES } FileFormatClass; diff --git a/web/geeqie-install-debian.sh b/web/geeqie-install-debian.sh index db4d982a..d72896a6 100755 --- a/web/geeqie-install-debian.sh +++ b/web/geeqie-install-debian.sh @@ -1,5 +1,5 @@ #!/bin/bash -version="2018-10-23" +version="2019-07-03" description=$' Geeqie is an image viewer. This script will download, compile, and install Geeqie on Debian-based systems. @@ -39,9 +39,9 @@ optional_array=( "libffmpegthumbnailer-dev" "libtiff (for tiff support)" "libtiff-dev" -"libjpeg (for jpeg support" +"libjpeg (for jpeg support)" "libjpeg-dev" -"librsvg2 (for viewing .svg images" +"librsvg2 (for viewing .svg images)" "librsvg2-common" "libwmf (for viewing .wmf images)" "libwmf0.2-7-gtk" @@ -61,6 +61,8 @@ optional_array=( "gphoto2" "libimage-exiftool-perl (for jpeg extraction plugin)" "libimage-exiftool-perl" +"libheif (for HEIF support)" +"libheif-dev" ) # Optional for GTK3 only