[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1033975: marked as done (unblock: webp-pixbuf-loader/0.2.1-1)



Your message dated Sat, 15 Apr 2023 08:27:28 +0000
with message-id <E1pnbFo-000D64-N3@respighi.debian.org>
and subject line unblock webp-pixbuf-loader
has caused the Debian Bug report #1033975,
regarding unblock: webp-pixbuf-loader/0.2.1-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1033975: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033975
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: webp-pixbuf-loader@packages.debian.org
Control: affects -1 + src:webp-pixbuf-loader

Please unblock package webp-pixbuf-loader

[ Reason ]
Version 0.0.5 contains multiple bugs and 0.2.0 [1] I pushed was solution
to these problems. Sadly meanwhile 0.2.1 [2] was release with another fix,
which we pushed, but it didn't got into timeframe for 10 days acceptance.

[1] https://github.com/aruiz/webp-pixbuf-loader/releases/tag/0.2.0
[2] https://github.com/aruiz/webp-pixbuf-loader/releases/tag/0.2.1

[ Impact ]

Buggy user experience on old codebase, multiple critical and not resolved bugs.

[ Tests ]
The package has autopkgtests, which has been extended in 0.2.0 and
0.2.1.

[ Risks ]
Package itself is very small and after codebase rework, the fixes are
incremental and self-explaining covered with tests.

[ Checklist ]
  [ ] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [p] attach debdiff against the package in testing

[ Other info ]
I attach diff against the previously sent 0.2.0, since that was targeted
to get into bookworm. If requested, I can send debdiff against 0.0.5.

```
--- webp-pixbuf-loader-0.2.0/debian/changelog	2023-02-26 11:55:51.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/debian/changelog	2023-03-04 01:30:48.000000000 +0100
@@ -1,3 +1,11 @@
+webp-pixbuf-loader (0.2.1-1) UNRELEASED; urgency=medium
+
+  [ David Heidelberg ]
+  * New upstream version 0.2.1 (Closes: #1032334)
+  * d/tests: extend tests by two new upstream tests
+
+ -- David Heidelberg <david@ixit.cz>  Sat, 04 Mar 2023 01:30:48 +0100
+
 webp-pixbuf-loader (0.2.0-1) unstable; urgency=medium
 
   * New upstream version 0.2.0
diff -Nru webp-pixbuf-loader-0.2.0/debian/tests/determinism-test webp-pixbuf-loader-0.2.1/debian/tests/determinism-test
--- webp-pixbuf-loader-0.2.0/debian/tests/determinism-test	2023-02-26 11:55:51.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/debian/tests/determinism-test	2023-03-04 01:30:48.000000000 +0100
@@ -4,7 +4,7 @@
 
 set -eu
 
-gdk-pixbuf-thumbnailer -s 128 tests/t1.webp test1.png
+gdk-pixbuf-thumbnailer -s 128 tests/data/t1.webp test1.png
 file -i test1.png | grep -qFw image/png
-gdk-pixbuf-thumbnailer -s 128 tests/t1.webp test2.png
+gdk-pixbuf-thumbnailer -s 128 tests/data/t1.webp test2.png
 cmp -s test1.png test2.png
diff -Nru webp-pixbuf-loader-0.2.0/debian/tests/upstream-tests webp-pixbuf-loader-0.2.1/debian/tests/upstream-tests
--- webp-pixbuf-loader-0.2.0/debian/tests/upstream-tests	2023-02-26 11:55:51.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/debian/tests/upstream-tests	2023-03-04 01:30:48.000000000 +0100
@@ -4,8 +4,10 @@
 
 set -ex
 
-TEST_FILE="./tests/t1.webp" ./obj*/tests/t1
-TEST_FILE="./tests/t2.webp" ./obj*/tests/t2
-TEST_FILE="./tests/t3.webp" ./obj*/tests/t3
-TEST_FILE="./tests/t1.webp" ./obj*/tests/t4
-TEST_FILE="./tests/t2.webp" ./obj*/tests/t_save
+TEST_FILE="./tests/data/t1.webp" ./obj*/tests/t1
+TEST_FILE="./tests/data/t2.webp" ./obj*/tests/t2
+TEST_FILE="./tests/data/t3.webp" ./obj*/tests/t3
+TEST_FILE="./tests/data/t1.webp" ./obj*/tests/t4
+TEST_FILE="./tests/data/t2.webp" ./obj*/tests/t_save
+TEST_FILE="./tests/data/t2.webp" ./obj*/tests/t_icc
+TEST_FILE="./tests/data/t2.webp" ./obj*/tests/t_null_error
diff -Nru webp-pixbuf-loader-0.2.0/io-webp.c webp-pixbuf-loader-0.2.1/io-webp.c
--- webp-pixbuf-loader-0.2.0/io-webp.c	2023-02-23 23:30:45.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/io-webp.c	2023-03-04 00:36:54.000000000 +0100
@@ -12,6 +12,7 @@
 
 #include "io-webp.h"
 #include "io-webp-anim.h"
+#include <webp/mux.h>
 
 static gpointer
 begin_load (GdkPixbufModuleSizeFunc     size_func,
@@ -192,7 +193,7 @@
 write_file (const uint8_t *data, size_t data_size, const WebPPicture *const pic)
 {
   FILE *const out = (FILE *) pic->custom_ptr;
-  return data_size ? (fwrite (data, data_size, 1, out) == 1) : 1;
+  return data_size == fwrite (data, sizeof (guchar), data_size, out) ? TRUE : FALSE;
 }
 
 /* Encoder write callback to accumulate output data in a GByteArray */
@@ -207,7 +208,7 @@
 static gboolean
 is_save_option_supported (const gchar *option_key)
 {
-  char *options[3] = { "quality", "preset", NULL };
+  char *options[4] = { "quality", "preset", "icc-profile", NULL };
   for (char **o = options; *o; o++)
     {
       if (g_strcmp0 (*o, option_key) == 0)
@@ -216,6 +217,40 @@
   return FALSE;
 }
 
+/* Creates a new image data buffer with the ICC profile data in it */
+WebPData
+add_icc_data (WebPData *image_data, WebPData *icc_data, GError **error)
+{
+  WebPMux *mux = WebPMuxCreate (image_data, FALSE);
+
+  if (mux == NULL)
+    {
+      g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED,
+                   "Could not create WebPMux instance");
+      return (WebPData){ 0 };
+    }
+
+  if (WebPMuxSetChunk (mux, "ICCP", icc_data, FALSE) != WEBP_MUX_OK)
+    {
+      g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED,
+                   "Could not set ICC profile data WebP using Muxer");
+      WebPMuxDelete (mux);
+      return (WebPData){ 0 };
+    }
+
+  WebPData output = { 0 };
+  if (WebPMuxAssemble (mux, &output) != WEBP_MUX_OK)
+    {
+      g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED,
+                   "Could not assemble WebP data using Muxer");
+      WebPMuxDelete (mux);
+      return (WebPData){ 0 };
+    }
+
+  WebPMuxDelete (mux);
+  return output;
+}
+
 static gboolean
 save_webp (GdkPixbuf        *pixbuf,
            gchar           **keys,
@@ -227,6 +262,10 @@
 {
   WebPPicture picture;
   WebPConfig  config;
+  uint8_t    *icc_data     = NULL;
+  gsize       icc_data_len = 0;
+
+  g_clear_error (error);
 
   if (! WebPPictureInit (&picture) || ! WebPConfigInit (&config))
     {
@@ -242,14 +281,18 @@
 
       while (*kiter)
         {
-          if (strncmp (*kiter, "quality", 7) == 0)
+          if (g_strcmp0 (*kiter, "quality") == 0)
             {
               guint64 quality;
               if (! g_ascii_string_to_unsigned (*viter, 10, 0, 100, &quality, error))
                 return FALSE;
               config.quality = (float) quality;
             }
-          else if (strncmp (*kiter, "preset", 6) == 0)
+          else if (g_strcmp0 (*kiter, "icc-profile") == 0)
+            {
+              icc_data = g_base64_decode (*viter, &icc_data_len);
+            }
+          else if (g_strcmp0 (*kiter, "preset") == 0)
             {
               gchar     *PRESET_KEYS[7] = { "default", "picture", "photo",
                                             "drawing", "icon",    "text",
@@ -314,12 +357,14 @@
       return FALSE;
     }
 
-  if (save_func)
+  gboolean uses_array = save_func || icc_data;
+
+  if (uses_array)
     {
       picture.writer     = write_array;
       picture.custom_ptr = (void *) g_byte_array_new ();
     }
-  else if (f)
+  else if (f && ! icc_data)
     {
       picture.writer     = write_file;
       picture.custom_ptr = (void *) f;
@@ -336,26 +381,45 @@
     {
       g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_BAD_OPTION,
                    "Could not encode WebP data");
-      if (save_func && picture.custom_ptr)
+      if ((save_func || icc_data) && picture.custom_ptr)
         g_byte_array_free ((GByteArray *) picture.custom_ptr, TRUE);
       WebPPictureFree (&picture);
       return FALSE;
     }
 
-  if (save_func)
+  gpointer custom_ptr = picture.custom_ptr;
+  WebPPictureFree (&picture);
+
+  if (uses_array)
     {
-      GByteArray *arr = (GByteArray *) picture.custom_ptr;
-      save_func ((const gchar *) arr->data, arr->len, error, user_data);
-      g_byte_array_free (arr, TRUE);
+      WebPData data; // NOTE We can't do field initialization since we can't get length after free
+      data.size  = ((GByteArray *) custom_ptr)->len;
+      data.bytes = g_byte_array_free ((GByteArray *) custom_ptr, FALSE);
 
-      if (*error)
+      if (icc_data)
         {
-          WebPPictureFree (&picture);
-          return FALSE;
+          WebPData icc_wpdata = { .bytes = icc_data, .size = icc_data_len };
+
+          WebPData output = add_icc_data (&data, &icc_wpdata, error);
+          g_clear_pointer (&icc_data, g_free);
+          g_free ((gpointer) data.bytes);
+
+          if (output.bytes == NULL)
+            return FALSE;
+
+          data = output;
         }
+
+      gboolean ret = FALSE;
+      if (save_func)
+        ret = save_func ((const gchar *) data.bytes, data.size, error, user_data);
+      else if (f)
+        ret = fwrite (data.bytes, sizeof (guchar), data.size, f) == data.size ? TRUE : FALSE;
+
+      WebPDataClear (&data);
+      return ret;
     }
 
-  WebPPictureFree (&picture);
   return TRUE;
 }
 
diff -Nru webp-pixbuf-loader-0.2.0/meson.build webp-pixbuf-loader-0.2.1/meson.build
--- webp-pixbuf-loader-0.2.0/meson.build	2023-02-23 23:30:45.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/meson.build	2023-03-04 00:36:54.000000000 +0100
@@ -8,10 +8,11 @@
 
 webp = dependency('libwebp', version: '>0.4.3')
 webpdemux = dependency('libwebpdemux', version: '>0.4.3')
+webpmux = dependency('libwebpmux', version: '>0.4.3')
 
 pbl_webp = shared_module('pixbufloader-webp',
                          sources: ['io-webp.c', 'io-webp-anim.c', 'io-webp-anim-iter.c'],
-                         dependencies: [gdkpb, webp, webpdemux],
+                         dependencies: [gdkpb, webp, webpdemux, webpmux],
                          # Workaround for https://gitlab.gnome.org/GNOME/glib/issues/1413
                          name_suffix: host_machine.system() == 'darwin' ? 'so' : [],
                          install: true,
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/data/t1.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/data/t1.webp differ
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/data/t2.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/data/t2.webp differ
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/data/t3.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/data/t3.webp differ
diff -Nru webp-pixbuf-loader-0.2.0/tests/gtk3-animation-sample.c webp-pixbuf-loader-0.2.1/tests/gtk3-animation-sample.c
--- webp-pixbuf-loader-0.2.0/tests/gtk3-animation-sample.c	2023-02-23 23:30:45.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/tests/gtk3-animation-sample.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,97 +0,0 @@
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gtk/gtk.h>
-
-/* This test is not an automated test.
- * It is intended to allow one to eye-ball webp animated images
- * in a debug environment, to see if there are problems with
- * image reproduction, timing, etc.
- */
-
-typedef struct _AnimationStructure
-{
-  GtkWindow              *window;
-  GdkPixbufAnimation     *anim;
-  GdkPixbufAnimationIter *anim_iter;
-  GtkWidget              *image;
-  int                     delay;
-} AnimationStructure;
-
-gboolean
-delete_objects (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
-  AnimationStructure *ani = (AnimationStructure *) data;
-  if (ani->anim)
-    g_object_unref (ani->anim);
-
-  g_free (ani);
-  return FALSE;
-}
-
-static void
-activate (GtkApplication *app, gpointer user_data)
-{
-  GtkWidget          *window;
-  GtkWidget          *label;
-  AnimationStructure *ani = (AnimationStructure *) user_data;
-
-  window         = gtk_application_window_new (app);
-  GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-  label          = gtk_label_new ("Test WebP Animation");
-  gtk_container_add (GTK_CONTAINER (box), label);
-
-  GtkWidget *image = NULL;
-
-  /*GdkPixbuf *staticPixbuf = NULL;
-    staticPixbuf = gdk_pixbuf_animation_get_static_image (ani->anim);
-    image = gtk_image_new_from_pixbuf (staticPixbuf);
-  */
-
-  image = gtk_image_new_from_animation (ani->anim);
-  gtk_container_add (GTK_CONTAINER (box), image);
-  gtk_container_add (GTK_CONTAINER (window), box);
-  gtk_window_set_title (GTK_WINDOW (window), "Test");
-  gtk_window_set_default_size (GTK_WINDOW (window), 500, 500);
-  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (delete_objects), ani);
-  gtk_widget_show_all (window);
-} /* end of function activate */
-
-gint
-main (gint argc, gchar **argv)
-{
-  GError *error = NULL;
-  gchar **env   = g_get_environ ();
-  g_warning ("%s", g_environ_getenv (env, "TEST_FILE"));
-  gtk_init (&argc, &argv);
-
-  /* setup animation. */
-  GdkPixbufAnimation     *anim      = NULL;
-  GdkPixbufAnimationIter *anim_iter = NULL;
-  anim = gdk_pixbuf_animation_new_from_file (g_environ_getenv (env, "TEST_"
-                                                                    "FILE"),
-                                             &error);
-  gboolean isStatic = gdk_pixbuf_animation_is_static_image (anim);
-  if (! isStatic)
-    {
-      GtkApplication *app;
-
-      G_GNUC_BEGIN_IGNORE_DEPRECATIONS
-      GTimeVal curTime;
-      g_get_current_time (&curTime);
-      G_GNUC_END_IGNORE_DEPRECATIONS
-
-      AnimationStructure *ani = g_new0 (AnimationStructure, 1);
-      ani->anim               = anim;
-
-      anim_iter      = gdk_pixbuf_animation_get_iter (anim, &curTime);
-      int delay      = gdk_pixbuf_animation_iter_get_delay_time (anim_iter);
-      ani->anim_iter = anim_iter;
-      ani->delay     = delay;
-      app            = gtk_application_new (NULL, G_APPLICATION_FLAGS_NONE);
-      g_signal_connect (app, "activate", G_CALLBACK (activate), ani);
-      (void) g_application_run (G_APPLICATION (app), argc, argv);
-      g_object_unref (app);
-    }
-
-  g_strfreev (env);
-  return 0;
-}
diff -Nru webp-pixbuf-loader-0.2.0/tests/meson.build webp-pixbuf-loader-0.2.1/tests/meson.build
--- webp-pixbuf-loader-0.2.0/tests/meson.build	2023-02-23 23:30:45.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/tests/meson.build	2023-03-04 00:36:54.000000000 +0100
@@ -5,6 +5,8 @@
 t3 = executable('t3', 't3.c', dependencies : [gdkpb, webp, webpdemux])
 t4 = executable('t4', 't4.c', dependencies : [gdkpb, webp, webpdemux])
 t_save = executable('t_save', 't_save.c', dependencies : [gdkpb, webp, webpdemux])
+t_icc  = executable('t_icc',  't_icc.c',  dependencies : [gdkpb, webp, webpdemux, webpmux])
+t_null_error = executable('t_null_error',  't_null_error.c',  dependencies : [gdkpb, webp, webpdemux])
 
 loaders_data = configuration_data()
 loaders_data.set('MODULE_PATH', fs.as_posix(pbl_webp.full_path()))
@@ -13,10 +15,12 @@
                          configuration : loaders_data)
 
 test_env = ['GDK_PIXBUF_MODULE_FILE=' + meson.current_build_dir() / 'loaders.cache']
-test_file_base = 'TEST_FILE=' + meson.current_source_dir()
+test_file_base = 'TEST_FILE=' + meson.current_source_dir() / 'data'
 
 test('load 1x1 image',     t1, env : test_env + [ test_file_base / 't1.webp'])
 test('load 200x200 image', t2, env : test_env + [ test_file_base / 't2.webp'])
 test('load animation',     t3, env : test_env + [ test_file_base / 't3.webp'])
 test('get file info',      t4, env : test_env + [ test_file_base / 't1.webp'])
-test('save data',      t_save, env : test_env + [ test_file_base / 't2.webp'])
\ No newline at end of file
+test('save data',         t_save, env : test_env + [ test_file_base / 't2.webp'])
+test('icc data',           t_icc, env : test_env + [ test_file_base / 't2.webp'])
+test('NULL GError', t_null_error, env : test_env + [ test_file_base / 't2.webp'])
\ No newline at end of file
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/t1.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/t1.webp differ
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/t2.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/t2.webp differ
Binary files /tmp/X5m3CJJqgJ/webp-pixbuf-loader-0.2.0/tests/t3.webp and /tmp/NfIwvAZLnM/webp-pixbuf-loader-0.2.1/tests/t3.webp differ
diff -Nru webp-pixbuf-loader-0.2.0/tests/t_icc.c webp-pixbuf-loader-0.2.1/tests/t_icc.c
--- webp-pixbuf-loader-0.2.0/tests/t_icc.c	1970-01-01 01:00:00.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/tests/t_icc.c	2023-03-04 00:36:54.000000000 +0100
@@ -0,0 +1,79 @@
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <glib/gstdio.h>
+#include <webp/decode.h>
+#include <webp/mux.h>
+
+static gchar *
+create_filename ()
+{
+  GString *pathbuild = g_string_new (g_get_tmp_dir ());
+  gchar   *id        = g_uuid_string_random ();
+  g_string_append_printf (pathbuild, "%s%s.webp", G_DIR_SEPARATOR_S, id);
+  g_free (id);
+  return g_string_free (pathbuild, FALSE);
+}
+
+void
+test_webp_icc_output (guchar *buffer, gsize buf_size, const gchar *base64_string)
+{
+  WebPData data   = { .bytes = buffer, .size = buf_size };
+  WebPData output = { 0 };
+  WebPMux *mux    = WebPMuxCreate (&data, FALSE);
+  WebPMuxGetChunk (mux, "ICCP", &output);
+  WebPMuxDelete (mux);
+
+  g_assert (output.bytes != NULL);
+  gchar *encoded_icc = g_base64_encode (output.bytes, output.size);
+  g_assert (encoded_icc != NULL);
+  g_assert_cmpstr (encoded_icc, ==, base64_string);
+
+  g_free (encoded_icc);
+}
+
+gint
+main (gint argc, gchar **argv)
+{
+  GError *error = NULL;
+  gchar **env   = g_get_environ ();
+
+  GdkPixbuf *pixbuf
+      = gdk_pixbuf_new_from_file (g_environ_getenv (env, "TEST_FILE"), &error);
+  if (error)
+    g_error ("%s", error->message);
+
+  g_assert (! gdk_pixbuf_get_has_alpha (pixbuf));
+
+  g_assert (gdk_pixbuf_get_width (pixbuf) == 200);
+  g_assert (gdk_pixbuf_get_height (pixbuf) == 200);
+
+  g_strfreev (env);
+
+  /* Test on disk contents */
+  gchar *path = create_filename ();
+  gdk_pixbuf_save (pixbuf, path, "webp", &error, "icc-profile", "MQo=", NULL);
+  if (error)
+    g_error ("%s", error->message);
+
+  gchar *buffer;
+  gsize  buf_size;
+  g_file_get_contents (path, &buffer, &buf_size, &error);
+  if (error)
+    g_error ("%s", error->message);
+
+  test_webp_icc_output ((guchar *) buffer, buf_size, "MQo=");
+  g_remove (path);
+  g_clear_pointer (&buffer, g_free);
+  g_clear_pointer (&path, g_free);
+
+  /* Test on memory contents */
+  gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &buf_size, "webp", &error,
+                             "icc-profile", "MQo=", NULL);
+  if (error)
+    g_error ("%s", error->message);
+
+  test_webp_icc_output ((guchar *) buffer, buf_size, "MQo=");
+
+  g_free (buffer);
+  g_object_unref (pixbuf);
+  return 0;
+}
diff -Nru webp-pixbuf-loader-0.2.0/tests/t_null_error.c webp-pixbuf-loader-0.2.1/tests/t_null_error.c
--- webp-pixbuf-loader-0.2.0/tests/t_null_error.c	1970-01-01 01:00:00.000000000 +0100
+++ webp-pixbuf-loader-0.2.1/tests/t_null_error.c	2023-03-04 00:36:54.000000000 +0100
@@ -0,0 +1,50 @@
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <glib/gstdio.h>
+
+static gchar *
+create_filename ()
+{
+  GString *pathbuild = g_string_new (g_get_tmp_dir ());
+  gchar   *id        = g_uuid_string_random ();
+  g_string_append_printf (pathbuild, "%s%s.webp", G_DIR_SEPARATOR_S, id);
+  g_free (id);
+  return g_string_free (pathbuild, FALSE);
+}
+
+gboolean
+save_func (const gchar *buffer, gsize count, GError **error, gpointer data)
+{
+  return TRUE;
+}
+
+void
+test_pixbufv (GdkPixbuf *pixbuf, gchar **keys, gchar **values)
+{
+  GStatBuf tmpstat = { 0 };
+  gchar   *path    = create_filename ();
+  g_assert (gdk_pixbuf_savev (pixbuf, path, "webp", keys, values, NULL));
+  g_stat (path, &tmpstat);
+  g_remove (path);
+  g_free (path);
+
+  g_assert (gdk_pixbuf_save_to_callbackv (pixbuf, save_func, NULL, "webp", keys, values, NULL));
+}
+
+int
+main ()
+{
+  gchar **env = g_get_environ ();
+
+  GdkPixbuf *pixbuf
+      = gdk_pixbuf_new_from_file (g_environ_getenv (env, "TEST_FILE"), NULL);
+  g_assert (pixbuf != NULL);
+  g_clear_pointer (&env, g_strfreev);
+
+  gchar *keys[2]   = { "icc-profile", NULL };
+  gchar *values[2] = { "MQo=", NULL };
+
+  test_pixbufv (pixbuf, NULL, NULL);
+  test_pixbufv (pixbuf, keys, values);
+
+  g_object_unref (pixbuf);
+}
\ No newline at end of file

```

unblock webp-pixbuf-loader/0.2.1-1

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: