From 338ae69121424368fbbe7dcff9a990aeb8e6fc52 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Sun, 4 Jun 2023 15:20:03 +0200
Subject: [PATCH] Add support for the Little CMS fast float plugin
On a sample of JPEGs, it improved loading speed from ~0.26s to ~0.15s.
Unfortunately, it isn't normally installed.
---
README.adoc | 5 +++--
fiv.c | 10 ++++++++++
meson.build | 22 +++++++++++++++++++++-
meson_options.txt | 2 ++
4 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/README.adoc b/README.adoc
index 66ce631..e1fc5cc 100644
--- a/README.adoc
+++ b/README.adoc
@@ -42,8 +42,9 @@ Build-only dependencies:
Meson, pkg-config, asciidoctor or asciidoc (recommended but optional) +
Runtime dependencies: gtk+-3.0, glib>=2.64, pixman-1, shared-mime-info,
libturbojpeg, libwebp, librsvg-2.0 (for icons) +
-Optional dependencies: lcms2, LibRaw, librsvg-2.0, xcursor, libheif, libtiff,
- ExifTool, resvg (unstable API, needs to be requested explicitly) +
+Optional dependencies: lcms2, Little CMS fast float plugin,
+ LibRaw, librsvg-2.0, xcursor, libheif, libtiff, ExifTool,
+ resvg (unstable API, needs to be requested explicitly) +
Runtime dependencies for reverse image search:
xdg-utils, cURL, jq
diff --git a/fiv.c b/fiv.c
index ab64bb0..66a8d36 100644
--- a/fiv.c
+++ b/fiv.c
@@ -43,6 +43,11 @@
#include "fiv-thumbnail.h"
#include "fiv-view.h"
+#ifdef HAVE_LCMS2_FAST_FLOAT
+#include
+#include
+#endif // HAVE_LCMS2_FAST_FLOAT
+
// --- Utilities ---------------------------------------------------------------
static void exit_fatal(const char *format, ...) G_GNUC_PRINTF(1, 2);
@@ -2382,6 +2387,11 @@ on_app_handle_local_options(G_GNUC_UNUSED GApplication *app,
return 0;
}
+ // TODO(p): Use Little CMS with contexts instead.
+#ifdef HAVE_LCMS2_FAST_FLOAT
+ cmsPlugin(cmsFastFloatExtensions());
+#endif // HAVE_LCMS2_FAST_FLOAT
+
// Normalize all arguments to URIs, and run thumbnailing modes first.
for (gsize i = 0; o.args && o.args[i]; i++) {
GFile *resolved = g_file_new_for_commandline_arg(o.args[i]);
diff --git a/meson.build b/meson.build
index 44dd6ba..86d4f41 100644
--- a/meson.build
+++ b/meson.build
@@ -25,11 +25,12 @@ libjpegqs = dependency('libjpegqs', required : get_option('libjpegqs'),
lcms2 = dependency('lcms2', required : get_option('lcms2'))
# Note that only libraw_r is thread-safe, but we'll just run it out-of process.
libraw = dependency('libraw', required : get_option('libraw'))
+# This is a direct runtime dependency, but its usage may be disabled for images.
librsvg = dependency('librsvg-2.0', required : get_option('librsvg'))
xcursor = dependency('xcursor', required : get_option('xcursor'))
libheif = dependency('libheif', required : get_option('libheif'))
libtiff = dependency('libtiff-4', required : get_option('libtiff'))
-# This is a direct dependency of GTK+, but its usage may be disabled.
+# This is a direct dependency of GTK+, but its usage may be disabled for images.
gdkpixbuf = dependency('gdk-pixbuf-2.0', required : get_option('gdk-pixbuf'))
dependencies = [
dependency('gtk+-3.0'),
@@ -53,6 +54,24 @@ dependencies = [
cc.find_library('m', required : false),
]
+# As of writing, no pkg-config file is produced, and the plugin is not installed
+# by default. The library can be built statically, but it's a bit of a hassle.
+have_lcms2_fast_float = false
+if not get_option('lcms2fastfloat').disabled()
+ lcms2ff = dependency('lcms2_fast_float', required : false)
+ if not lcms2ff.found()
+ lcms2ff = cc.find_library(
+ 'lcms2_fast_float', required : get_option('lcms2fastfloat'))
+ if lcms2ff.found() and not cc.has_header('lcms2_fast_float.h')
+ error('lcms2_fast_float.h not found')
+ endif
+ endif
+ if lcms2ff.found()
+ dependencies += lcms2ff
+ have_lcms2_fast_float = true
+ endif
+endif
+
# As of writing, the API is unstable, and no pkg-config file is produced.
# Trying to wrap Cargo in Meson is a recipe for pain, so no version pinning.
have_resvg = false
@@ -85,6 +104,7 @@ endif
conf.set('HAVE_JPEG_QS', libjpegqs.found())
conf.set('HAVE_LCMS2', lcms2.found())
+conf.set('HAVE_LCMS2_FAST_FLOAT', have_lcms2_fast_float)
conf.set('HAVE_LIBRAW', libraw.found())
conf.set('HAVE_RESVG', have_resvg)
conf.set('HAVE_LIBRSVG', librsvg.found())
diff --git a/meson_options.txt b/meson_options.txt
index dad40f8..2aa0f9c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -3,6 +3,8 @@ option('tools', type : 'feature', value : 'disabled',
option('lcms2', type : 'feature', value : 'auto',
description : 'Build with Little CMS colour management')
+option('lcms2fastfloat', type : 'feature', value : 'auto',
+ description : 'Build with Little CMS fast float plugin support')
option('libjpegqs', type : 'feature', value : 'auto',
description : 'Build with JPEG Quant Smooth integration')
option('libraw', type : 'feature', value : 'auto',