This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository legacy-imlib2.
View the commit online.
commit b03d3f042bdfb3ee3f66c08c0e41f10b2aaba172
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Sun Dec 15 13:18:42 2024 +0100
savers: Add common save parameter handler
Also increase default compression levels, affects jpeg, jxl, png, and
webp savers.
---
src/modules/loaders/Makefile.am | 13 ++++++----
src/modules/loaders/ldrs_util.c | 50 +++++++++++++++++++++++++++++++++++++++
src/modules/loaders/ldrs_util.h | 15 ++++++++++++
src/modules/loaders/loader_jpeg.c | 32 +++++--------------------
src/modules/loaders/loader_jxl.c | 49 +++++++++++++++-----------------------
src/modules/loaders/loader_png.c | 36 +++++++---------------------
src/modules/loaders/loader_tiff.c | 12 ++++++----
src/modules/loaders/loader_webp.c | 27 +++++++--------------
test/test_save.cpp | 8 +++----
9 files changed, 127 insertions(+), 115 deletions(-)
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
index 5dd7106..5be82aa 100644
--- a/src/modules/loaders/Makefile.am
+++ b/src/modules/loaders/Makefile.am
@@ -68,6 +68,9 @@ if BUILD_ID3_LOADER
pkg_LTLIBRARIES += id3.la
endif
+ SRCS_EXIF = exif.c exif.h
+ SRCS_SAVE = ldrs_util.c ldrs_util.h
+
ani_la_SOURCES = loader_ani.c
ani_la_LDFLAGS = -module -avoid-version
ani_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
@@ -104,7 +107,7 @@ ico_la_LDFLAGS = -module -avoid-version
ico_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
ico_la_LIBTOOLFLAGS = --tag=disable-static
-jpeg_la_SOURCES = loader_jpeg.c exif.c exif.h
+jpeg_la_SOURCES = loader_jpeg.c $(SRCS_EXIF) $(SRCS_SAVE)
jpeg_la_CPPFLAGS = $(AM_CPPFLAGS) $(JPEG_CFLAGS)
jpeg_la_LDFLAGS = -module -avoid-version
jpeg_la_LIBADD = $(JPEG_LIBS) $(top_builddir)/src/lib/libImlib2.la
@@ -116,7 +119,7 @@ j2k_la_LDFLAGS = -module -avoid-version
j2k_la_LIBADD = $(J2K_LIBS) $(top_builddir)/src/lib/libImlib2.la
j2k_la_LIBTOOLFLAGS = --tag=disable-static
-jxl_la_SOURCES = loader_jxl.c
+jxl_la_SOURCES = loader_jxl.c $(SRCS_SAVE)
jxl_la_CPPFLAGS = $(AM_CPPFLAGS) $(JXL_CFLAGS)
jxl_la_LDFLAGS = -module -avoid-version
jxl_la_LIBADD = $(JXL_LIBS) $(top_builddir)/src/lib/libImlib2.la
@@ -127,7 +130,7 @@ lbm_la_LDFLAGS = -module -avoid-version
lbm_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
lbm_la_LIBTOOLFLAGS = --tag=disable-static
-png_la_SOURCES = loader_png.c
+png_la_SOURCES = loader_png.c $(SRCS_SAVE)
png_la_CPPFLAGS = $(AM_CPPFLAGS) $(PNG_CFLAGS)
png_la_LDFLAGS = -module -avoid-version
png_la_LIBADD = $(PNG_LIBS) $(top_builddir)/src/lib/libImlib2.la
@@ -166,13 +169,13 @@ tga_la_LDFLAGS = -module -avoid-version
tga_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
tga_la_LIBTOOLFLAGS = --tag=disable-static
-tiff_la_SOURCES = loader_tiff.c
+tiff_la_SOURCES = loader_tiff.c $(SRCS_SAVE)
tiff_la_CPPFLAGS = $(AM_CPPFLAGS) $(TIFF_CFLAGS)
tiff_la_LDFLAGS = -module -avoid-version
tiff_la_LIBADD = $(TIFF_LIBS) $(top_builddir)/src/lib/libImlib2.la
tiff_la_LIBTOOLFLAGS = --tag=disable-static
-webp_la_SOURCES = loader_webp.c
+webp_la_SOURCES = loader_webp.c $(SRCS_SAVE)
webp_la_CPPFLAGS = $(AM_CPPFLAGS) $(WEBP_CFLAGS)
webp_la_LDFLAGS = -module -avoid-version
webp_la_LIBADD = $(WEBP_LIBS) $(top_builddir)/src/lib/libImlib2.la
diff --git a/src/modules/loaders/ldrs_util.c b/src/modules/loaders/ldrs_util.c
new file mode 100644
index 0000000..401f6c2
--- /dev/null
+++ b/src/modules/loaders/ldrs_util.c
@@ -0,0 +1,50 @@
+#include "Imlib2_Loader.h"
+#include "ldrs_util.h"
+
+#define CLAMP(X, MIN, MAX) ((X) < (MIN) ? (MIN) : ((X) > (MAX) ? (MAX) : (X)))
+
+/*
+ * Default compression to quality "conversion"
+ * compression quality
+ * 0 100 Lossless
+ * 1 88
+ * 2 77
+ * 3 66
+ * 4 55
+ * 5 44
+ * 6 33
+ * 7 22
+ * 8 11
+ * 9 0
+ */
+
+void
+get_saver_params(const ImlibImage *im, ImlibSaverParam *imsp)
+{
+ ImlibImageTag *tag;
+
+ /* Set defaults */
+ imsp->compr_type = -1;
+ imsp->compression = 6;
+ imsp->quality = 75;
+ imsp->interlacing = 0;
+
+ /* Compression type */
+ if ((tag = __imlib_GetTag(im, "compression_type")))
+ imsp->compr_type = tag->val;
+
+ /* Compression (effort) */
+ if ((tag = __imlib_GetTag(im, "compression")))
+ imsp->compression = CLAMP(tag->val, 0, 9);
+
+ /* "Convert" to quality */
+ imsp->quality = (9 - imsp->compression) * 100 / 9;
+
+ /* Quality (100 is lossless) */
+ if ((tag = __imlib_GetTag(im, "quality")))
+ imsp->quality = CLAMP(tag->val, 1, 100);
+
+ /* Interlacing */
+ if ((tag = __imlib_GetTag(im, "interlacing")))
+ imsp->interlacing = !!tag->val;
+}
diff --git a/src/modules/loaders/ldrs_util.h b/src/modules/loaders/ldrs_util.h
new file mode 100644
index 0000000..ae57c88
--- /dev/null
+++ b/src/modules/loaders/ldrs_util.h
@@ -0,0 +1,15 @@
+#ifndef LDRS_UTIL_H
+#define LDRS_UTIL_H 1
+
+#include "Imlib2_Loader.h"
+
+typedef struct {
+ int compr_type; /* Saver specific */
+ int compression; /* 0 - 9 */
+ int quality; /* 1 - 100 */
+ int interlacing; /* 0 or 1 */
+} ImlibSaverParam;
+
+void get_saver_params(const ImlibImage * im, ImlibSaverParam * imsp);
+
+#endif /* LDRS_UTIL_H */
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index df177ca..75e1ab2 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -4,6 +4,7 @@
#include <jpeglib.h>
#include <setjmp.h>
#include "exif.h"
+#include "ldrs_util.h"
#define DBG_PFX "LDR-jpg"
@@ -258,11 +259,11 @@ _save(ImlibImage *im)
struct jpeg_compress_struct jcs;
ImLib_JPEG_data jdata;
FILE *f = im->fi->fp;
+ ImlibSaverParam imsp;
uint8_t *buf;
const uint32_t *imdata;
JSAMPROW *jbuf;
- int y, quality, compression;
- ImlibImageTag *tag;
+ int y;
int i, j;
/* allocate a small buffer to convert image data */
@@ -289,35 +290,14 @@ _save(ImlibImage *im)
/* settigns etc. - this is the "api" to hint for extra information for */
/* saver modules */
- /* compression */
- compression = 2;
- tag = __imlib_GetTag(im, "compression");
- if (tag)
- {
- compression = tag->val;
- if (compression < 0)
- compression = 0;
- if (compression > 9)
- compression = 9;
- }
- /* convert to quality */
- quality = (9 - compression) * 10;
- quality = quality * 10 / 9;
- /* quality */
- tag = __imlib_GetTag(im, "quality");
- if (tag)
- quality = tag->val;
- if (quality < 1)
- quality = 1;
- if (quality > 100)
- quality = 100;
+ get_saver_params(im, &imsp);
/* set up jepg compression parameters */
jpeg_set_defaults(&jcs);
- jpeg_set_quality(&jcs, quality, TRUE);
+ jpeg_set_quality(&jcs, imsp.quality, TRUE);
/* progressive */
- if ((tag = __imlib_GetTag(im, "interlacing")) && tag->val)
+ if (imsp.interlacing)
jpeg_simple_progression(&jcs);
jpeg_start_compress(&jcs, TRUE);
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index 1bf133c..cbbf366 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -1,5 +1,6 @@
#include "config.h"
#include "Imlib2_Loader.h"
+#include "ldrs_util.h"
#define MAX_RUNNERS 4 /* Maybe set to Ncpu/2? */
@@ -230,7 +231,8 @@ _save(ImlibImage *im)
.data_type = JXL_TYPE_UINT8,
.endianness = JXL_NATIVE_ENDIAN,
};
- ImlibImageTag *tag;
+ ImlibSaverParam imsp;
+ float distance;
const uint32_t *imdata;
uint8_t *buffer = NULL, *buf_ptr;
size_t buf_len, i, npix;
@@ -277,38 +279,25 @@ _save(ImlibImage *im)
if (!opts)
goto quit;
- tag = __imlib_GetTag(im, "quality");
- if (tag)
- {
- int quality;
- float distance;
+ get_saver_params(im, &imsp);
- quality = (tag->val) >= 0 ? tag->val : 0;
- if (quality >= 100)
- {
- D("Quality=%d: Lossless\n", quality);
- JxlEncoderSetFrameDistance(opts, 0.f);
- JxlEncoderSetFrameLossless(opts, JXL_TRUE);
- }
- else
- {
- distance = 15.f * (1.f - .01 * quality); // 0 - 100 -> 15 - 0
- D("Quality=%d: Distance=%.1f\n", quality, distance);
- JxlEncoderSetFrameLossless(opts, JXL_FALSE);
- JxlEncoderSetFrameDistance(opts, distance);
- }
+ if (imsp.quality == 100)
+ {
+ D("Quality=%d: Lossless\n", imsp.quality);
+ JxlEncoderSetFrameDistance(opts, 0.f);
+ JxlEncoderSetFrameLossless(opts, JXL_TRUE);
+ }
+ else
+ {
+ distance = 15.f * (1.f - .01 * imsp.quality); // 0 - 100 -> 15 - 0
+ D("Quality=%d: Distance=%.1f\n", imsp.quality, distance);
+ JxlEncoderSetFrameLossless(opts, JXL_FALSE);
+ JxlEncoderSetFrameDistance(opts, distance);
}
- tag = __imlib_GetTag(im, "compression");
- if (tag)
- {
- int compression;
-
- compression = (tag->val < 1) ? 1 : (tag->val > 9) ? 9 : tag->val;
- D("Compression=%d\n", compression);
- JxlEncoderFrameSettingsSetOption(opts, JXL_ENC_FRAME_SETTING_EFFORT,
- compression);
- }
+ D("Compression=%d\n", imsp.compression);
+ JxlEncoderFrameSettingsSetOption(opts, JXL_ENC_FRAME_SETTING_EFFORT,
+ imsp.compression);
// Create buffer for format conversion and output
pbuf_fmt.num_channels = (im->has_alpha) ? 4 : 3;
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index ccc73d6..a781aa7 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -1,5 +1,6 @@
#include "config.h"
#include "Imlib2_Loader.h"
+#include "ldrs_util.h"
#include <png.h>
#include <stdbool.h>
@@ -606,8 +607,7 @@ _save(ImlibImage *im)
int x, y, j, interlace;
png_bytep row_buf, row_ptr;
png_color_8 sig_bit;
- ImlibImageTag *tag;
- int quality = 75, compression = 3;
+ ImlibSaverParam imsp;
int pass, n_passes = 1;
row_ptr = NULL;
@@ -634,14 +634,16 @@ _save(ImlibImage *im)
if (setjmp(png_jmpbuf(png_ptr)))
QUIT_WITH_RC(LOAD_BADFILE);
+ get_saver_params(im, &imsp);
+
/* check whether we should use interlacing */
interlace = PNG_INTERLACE_NONE;
- if ((tag = __imlib_GetTag(im, "interlacing")) && tag->val)
- {
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
+ if (imsp.interlacing)
+ {
interlace = PNG_INTERLACE_ADAM7;
-#endif
}
+#endif
png_init_io(png_ptr, f);
if (im->has_alpha)
@@ -667,30 +669,10 @@ _save(ImlibImage *im)
sig_bit.alpha = 8;
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
- /* quality */
- tag = __imlib_GetTag(im, "quality");
- if (tag)
- {
- quality = tag->val;
- if (quality < 1)
- quality = 1;
- if (quality > 99)
- quality = 99;
- }
- /* convert to compression */
- quality = quality / 10;
- compression = 9 - quality;
- /* compression */
- tag = __imlib_GetTag(im, "compression");
- if (tag)
- compression = tag->val;
- if (compression < 0)
- compression = 0;
- if (compression > 9)
- compression = 9;
- png_set_compression_level(png_ptr, compression);
+ png_set_compression_level(png_ptr, imsp.compression);
#if USE_IMLIB2_COMMENT_TAG
+ ImlibImageTag *tag;
tag = __imlib_GetTag(im, "comment");
if (tag)
{
diff --git a/src/modules/loaders/loader_tiff.c b/src/modules/loaders/loader_tiff.c
index 0ea7f7c..997e79f 100644
--- a/src/modules/loaders/loader_tiff.c
+++ b/src/modules/loaders/loader_tiff.c
@@ -1,5 +1,6 @@
#include "config.h"
#include "Imlib2_Loader.h"
+#include "ldrs_util.h"
#include <setjmp.h>
#include <tiffio.h>
@@ -481,7 +482,7 @@ _save(ImlibImage *im)
int has_alpha = im->has_alpha;
int compression_type;
int i;
- ImlibImageTag *tag;
+ ImlibSaverParam imsp;
TIFFSetErrorHandler(_tiff_error);
TIFFSetWarningHandler(_tiff_error);
@@ -506,12 +507,13 @@ _save(ImlibImage *im)
/* settings etc. - this is the "api" to hint for extra information for */
/* saver modules */
+ get_saver_params(im, &imsp);
+
/* compression */
compression_type = COMPRESSION_ADOBE_DEFLATE;
- tag = __imlib_GetTag(im, "compression_type");
- if (tag)
+ if (imsp.compr_type >= 0)
{
- switch (tag->val)
+ switch (imsp.compr_type)
{
default:
break;
@@ -538,7 +540,7 @@ _save(ImlibImage *im)
case COMPRESSION_JBIG:
case COMPRESSION_SGILOG:
case COMPRESSION_SGILOG24:
- compression_type = tag->val;
+ compression_type = imsp.compr_type;
break;
}
}
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 5eb19af..cc674cd 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -1,5 +1,6 @@
#include "config.h"
#include "Imlib2_Loader.h"
+#include "ldrs_util.h"
#include <webp/decode.h>
#include <webp/demux.h>
@@ -7,8 +8,6 @@
#define DBG_PFX "LDR-webp"
-#define CLAMP(X, MIN, MAX) ((X) < (MIN) ? (MIN) : ((X) > (MAX) ? (MAX) : (X)))
-
static const char *const _formats[] = { "webp" };
static int
@@ -129,11 +128,9 @@ _save(ImlibImage *im)
{
int rc;
FILE *f = im->fi->fp;
- ImlibImageTag *quality_tag;
- ImlibImageTag *compression_tag;
+ ImlibSaverParam imsp;
WebPConfig conf;
WebPPicture pic;
- int compression;
int lossless;
int free_pic = 0;
@@ -142,25 +139,19 @@ _save(ImlibImage *im)
if (!WebPConfigInit(&conf) || !WebPPictureInit(&pic))
goto quit;
- conf.quality = 75;
- quality_tag = __imlib_GetTag(im, "quality");
- if (quality_tag)
- conf.quality = CLAMP(quality_tag->val, 0, 100);
+ get_saver_params(im, &imsp);
- compression_tag = __imlib_GetTag(im, "compression");
/* other savers seem to treat quality 100 as lossless, do the same here. */
- lossless = conf.quality == 100;
+ lossless = imsp.quality == 100;
if (lossless)
{
- compression = 9 - (conf.quality / 10); /* convert to compression */
- if (compression_tag)
- compression = compression_tag->val;
- WebPConfigLosslessPreset(&conf, CLAMP(compression, 0, 9));
+ /* Compression parameter is effort, gzip-like 0-9 */
+ WebPConfigLosslessPreset(&conf, imsp.compression);
}
- else if (compression_tag) /* for lossly encoding, only change conf.method if compression_tag was set */
+ else
{
- conf.method = CLAMP(compression_tag->val, 0, 9);
- conf.method *= 0.67; /* convert from [0, 9] to [0, 6]. (6/9 == 0.67) */
+ conf.quality = imsp.quality;
+ conf.method = 0.67 * imsp.compression; /* convert from [0, 9] to [0, 6]. (6/9 == 0.67) */
}
if (!WebPValidateConfig(&conf))
diff --git a/test/test_save.cpp b/test/test_save.cpp
index 0cd3848..604d9ad 100644
--- a/test/test_save.cpp
+++ b/test/test_save.cpp
@@ -30,14 +30,14 @@ static const test_rec_t exts[] = {
// { "id3", { 0, 0 } },
// { "j2k", { 0, 0 } },
#ifdef BUILD_JPEG_LOADER
- { "jpeg", { 372259931, 649473747 } },
+ { "jpeg", { 631237512, 1120421740 } },
#endif
#ifdef BUILD_JXL_LOADER
#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 10, 0)
#ifdef __i386__
- { "jxl", { 2550658206, 604351119 } },
+ { "jxl", { 1626654164, 2937200044 } },
#else
- { "jxl", { 3151654577, 2616864169 } },
+ { "jxl", { 2415497566, 2734910059 } },
#endif
#elif JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
#ifdef __i386__
@@ -62,7 +62,7 @@ static const test_rec_t exts[] = {
{ "tga", { 1636116234, 169859126 } },
{ "tiff", { 1636116234, 2443461544 } },
#ifdef BUILD_WEBP_LOADER
- { "webp", { 3702954496, 1070534241 } },
+ { "webp", { 902703844, 3830549848 } },
#endif
{ "xbm", { 2432994606, 2367802683 } },
// { "xpm", { 0, 0 } },
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.