diff options
Diffstat (limited to 'libappstream-builder')
-rw-r--r-- | libappstream-builder/asb-app.c | 5 | ||||
-rw-r--r-- | libappstream-builder/asb-utils.c | 34 | ||||
-rw-r--r-- | libappstream-builder/asb-utils.h | 2 |
3 files changed, 41 insertions, 0 deletions
diff --git a/libappstream-builder/asb-app.c b/libappstream-builder/asb-app.c index fa42160..b44f091 100644 --- a/libappstream-builder/asb-app.c +++ b/libappstream-builder/asb-app.c @@ -33,6 +33,7 @@ #include <appstream-glib.h> #include "asb-app.h" +#include "asb-utils.h" typedef struct { @@ -188,6 +189,10 @@ asb_app_save_resources (AsbApp *app, AsbAppSaveFlags save_flags, GError **error) if (!gdk_pixbuf_save (pixbuf, filename, "png", error, NULL)) return FALSE; + /* optimize the icon */ + if (!asb_utils_optimize_png (filename, error)) + return FALSE; + /* set new AppStream compatible icon name */ asb_package_log (priv->pkg, ASB_PACKAGE_LOG_LEVEL_DEBUG, diff --git a/libappstream-builder/asb-utils.c b/libappstream-builder/asb-utils.c index f1b48e9..503c379 100644 --- a/libappstream-builder/asb-utils.c +++ b/libappstream-builder/asb-utils.c @@ -281,6 +281,40 @@ asb_utils_explode_file (struct archive_entry *entry, const gchar *dir) } /** + * asb_utils_optimize_png: + * @filename: package filename + * @error: A #GError or %NULL + * + * Optimises a PNG if pngquant is installed on the system. + * + * Returns: %TRUE for success, %FALSE otherwise + **/ +gboolean +asb_utils_optimize_png (const gchar *filename, GError **error) +{ + g_autofree gchar *standard_error = NULL; + gint exit_status = 0; + const gchar *argv[] = { "/usr/bin/pngquant", "--skip-if-larger", + "--strip", "--ext", ".png", + "--force", "--speed", "1", filename, NULL }; + if (!g_file_test (argv[0], G_FILE_TEST_IS_EXECUTABLE)) + return TRUE; + if (!g_spawn_sync (NULL, (gchar **) argv, NULL, G_SPAWN_DEFAULT, + NULL, NULL, NULL, &standard_error, &exit_status, error)) + return FALSE; + if (exit_status != 0) { + g_autofree gchar *argv_str = g_strjoinv (" ", (gchar **) argv); + g_set_error (error, + AS_APP_ERROR, + AS_APP_ERROR_FAILED, + "failed to run %s: %s", + argv_str, standard_error); + return FALSE; + } + return TRUE; +} + +/** * asb_utils_explode: * @filename: package filename * @dir: directory to decompress into diff --git a/libappstream-builder/asb-utils.h b/libappstream-builder/asb-utils.h index 266f311..31922b6 100644 --- a/libappstream-builder/asb-utils.h +++ b/libappstream-builder/asb-utils.h @@ -42,6 +42,8 @@ gboolean asb_utils_explode (const gchar *filename, const gchar *dir, GPtrArray *glob, GError **error); +gboolean asb_utils_optimize_png (const gchar *filename, + GError **error); gchar *asb_utils_get_cache_id_for_filename (const gchar *filename); gchar *asb_utils_get_builder_id (void); |