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.

Reply via email to