[gimp] Bug 775026 - webp-save: expose more saving options in the UI



commit 136ef67b643dff1844a997ac0349d6c5ec4c10a8
Author: Pascal Massimino <pascal massimino gmail com>
Date:   Thu Nov 24 17:11:03 2016 +0100

    Bug 775026 - webp-save: expose more saving options in the UI
    
    webp-save: Add UI elements for 'minimize size' toggle, and a dependent
    'max key-frame distance' setting.
    * If 'minimize size' is active, max-kf is disabled (which is equivalent to
      setting it to infinity). Key-frame cost file size, that's why.
    * If 'minimize size' is disabled, you get to choose how far key-frames
      (=cue points) will be inserted at max.

 plug-ins/file-webp/file-webp-dialog.c |   60 ++++++++++++++++++++++++++++++++-
 plug-ins/file-webp/file-webp-save.c   |    8 ++++-
 plug-ins/file-webp/file-webp-save.h   |    2 +
 plug-ins/file-webp/file-webp.c        |   18 ++++++---
 4 files changed, 80 insertions(+), 8 deletions(-)
---
diff --git a/plug-ins/file-webp/file-webp-dialog.c b/plug-ins/file-webp/file-webp-dialog.c
index e342655..f8916ea 100644
--- a/plug-ins/file-webp/file-webp-dialog.c
+++ b/plug-ins/file-webp/file-webp-dialog.c
@@ -33,7 +33,10 @@
 
 
 static void           save_dialog_toggle_scale   (GtkWidget  *widget,
-                                                  gpointer   data);
+                                                  gpointer    data);
+
+static void           save_dialog_toggle_minsize (GtkWidget  *widget,
+                                                  gpointer    data);
 
 
 static void
@@ -44,6 +47,14 @@ save_dialog_toggle_scale (GtkWidget *widget,
                                   ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
 }
 
+static void
+save_dialog_toggle_minsize (GtkWidget *widget,
+                            gpointer   data)
+{
+  gtk_widget_set_sensitive (GTK_WIDGET (data),
+                            ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
+}
+
 gboolean
 save_dialog (WebPSaveParams *params,
              gint32          image_ID,
@@ -57,6 +68,7 @@ save_dialog (WebPSaveParams *params,
   GtkWidget *vbox2;
   GtkWidget *label;
   GtkWidget *toggle;
+  GtkWidget *toggle_minsize;
   GtkWidget *combo;
   GtkObject *quality_scale;
   GtkObject *alpha_quality_scale;
@@ -170,6 +182,10 @@ save_dialog (WebPSaveParams *params,
       GtkAdjustment *adj;
       GtkWidget     *delay;
       GtkWidget     *hbox;
+      GtkWidget     *label_kf;
+      GtkAdjustment *adj_kf;
+      GtkWidget     *kf_distance;
+      GtkWidget     *hbox_kf;
 
       vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
       gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
@@ -221,6 +237,48 @@ save_dialog (WebPSaveParams *params,
                         G_CALLBACK (gimp_toggle_button_update),
                         &params->loop);
 
+      /* create a hbox for 'max key-frame distance */
+      hbox_kf = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+      gtk_box_pack_start (GTK_BOX (animation_box), hbox_kf, FALSE, FALSE, 0);
+      gtk_widget_set_sensitive (hbox_kf, TRUE);
+      gtk_widget_show (hbox_kf);
+
+      /* label for 'max key-frame distance' adjustment */
+      label_kf = gtk_label_new (_("Max distance between key-frames:"));
+      gtk_label_set_xalign (GTK_LABEL (label_kf), 0.2);
+      gtk_box_pack_start (GTK_BOX (hbox_kf), label_kf, FALSE, FALSE, 0);
+      gtk_widget_show (label_kf);
+
+      /* key-frame distance entry */
+      adj_kf = (GtkAdjustment *) gtk_adjustment_new (params->kf_distance,
+                                                     1, 10000, 1, 10, 0);
+      kf_distance = gtk_spin_button_new (adj_kf, 1, 0);
+      gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (kf_distance), TRUE);
+      gtk_box_pack_start (GTK_BOX (hbox_kf), kf_distance, FALSE, FALSE, 0);
+      gtk_widget_show (kf_distance);
+
+      g_signal_connect (adj_kf, "value-changed",
+                        G_CALLBACK (gimp_int_adjustment_update),
+                        &params->kf_distance);
+
+      /* minimize-size checkbox */
+      toggle_minsize = gtk_check_button_new_with_label (_("Minimize output size (slower)"));
+
+      gtk_box_pack_start (GTK_BOX (animation_box), toggle_minsize,
+                          FALSE, FALSE, 0);
+      gtk_widget_show (toggle_minsize);
+
+      g_signal_connect (toggle_minsize, "toggled",
+                        G_CALLBACK (gimp_toggle_button_update),
+                        &params->minimize_size);
+
+
+      /* Enable and disable the kf-distance box when the 'minimize size' option is selected */
+      g_signal_connect (toggle_minsize, "toggled",
+                        G_CALLBACK (save_dialog_toggle_minsize),
+                        hbox_kf);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle_minsize), params->minimize_size);
+
       /* create a hbox for delay */
       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
       gtk_box_pack_start (GTK_BOX (animation_box), hbox, FALSE, FALSE, 0);
diff --git a/plug-ins/file-webp/file-webp-save.c b/plug-ins/file-webp/file-webp-save.c
index adc53b2..03b67aa 100644
--- a/plug-ins/file-webp/file-webp-save.c
+++ b/plug-ins/file-webp/file-webp-save.c
@@ -529,7 +529,13 @@ save_animation (const gchar    *filename,
         enc_options.anim_params.loop_count = 1;
 
       enc_options.allow_mixed   = params->lossless ? 0 : 1;
-      enc_options.minimize_size = 1;
+      enc_options.minimize_size = params->minimize_size ? 1 : 0;
+      if (! params->minimize_size)
+        {
+          enc_options.kmax = params->kf_distance;
+          /* explicitly force minimum key-frame distance too, for good measure */
+          enc_options.kmin = params->kf_distance - 1;
+        }
 
       for (loop = 0; loop < nLayers; loop++)
         {
diff --git a/plug-ins/file-webp/file-webp-save.h b/plug-ins/file-webp/file-webp-save.h
index a996c84..9330ab8 100644
--- a/plug-ins/file-webp/file-webp-save.h
+++ b/plug-ins/file-webp/file-webp-save.h
@@ -29,6 +29,8 @@ typedef struct
   gboolean   lossless;
   gboolean   animation;
   gboolean   loop;
+  gboolean   minimize_size;
+  gint       kf_distance;
   gfloat     quality;
   gfloat     alpha_quality;
   gboolean   exif;
diff --git a/plug-ins/file-webp/file-webp.c b/plug-ins/file-webp/file-webp.c
index ef7a969..4660248 100644
--- a/plug-ins/file-webp/file-webp.c
+++ b/plug-ins/file-webp/file-webp.c
@@ -83,6 +83,8 @@ query (void)
     { GIMP_PDB_FLOAT,    "alpha-quality", "Quality of the image's alpha channel (0 <= alpha-quality <= 100)" 
},
     { GIMP_PDB_INT32,    "animation",     "Use layers for animation (0/1)" },
     { GIMP_PDB_INT32,    "anim-loop",     "Loop animation infinitely (0/1)" },
+    { GIMP_PDB_INT32,    "minimize-size", "Minimize animation size (0/1)" },
+    { GIMP_PDB_INT32,    "kf-distance",   "Maximum distance between key-frames (>=0)" },
     { GIMP_PDB_INT32,    "exif",          "Toggle saving exif data (0/1)" },
     { GIMP_PDB_INT32,    "iptc",          "Toggle saving iptc data (0/1)" },
     { GIMP_PDB_INT32,    "xmp",           "Toggle saving xmp data (0/1)" },
@@ -193,6 +195,8 @@ run (const gchar      *name,
           params.lossless      = FALSE;
           params.animation     = FALSE;
           params.loop          = TRUE;
+          params.minimize_size = TRUE;
+          params.kf_distance   = 50;
           params.quality       = 90.0f;
           params.alpha_quality = 100.0f;
           params.exif          = TRUE;
@@ -220,7 +224,7 @@ run (const gchar      *name,
           break;
 
         case GIMP_RUN_NONINTERACTIVE:
-          if (nparams != 16)
+          if (nparams != 18)
             {
               status = GIMP_PDB_CALLING_ERROR;
             }
@@ -237,11 +241,13 @@ run (const gchar      *name,
               params.alpha_quality = param[8].data.d_float;
               params.animation     = param[9].data.d_int32;
               params.loop          = param[10].data.d_int32;
-              params.exif          = param[11].data.d_int32;
-              params.iptc          = param[12].data.d_int32;
-              params.xmp           = param[13].data.d_int32;
-              params.delay         = param[14].data.d_int32;
-              params.force_delay   = param[15].data.d_int32;
+              params.minimize_size = param[11].data.d_int32;
+              params.kf_distance   = param[12].data.d_int32;
+              params.exif          = param[13].data.d_int32;
+              params.iptc          = param[14].data.d_int32;
+              params.xmp           = param[15].data.d_int32;
+              params.delay         = param[16].data.d_int32;
+              params.force_delay   = param[17].data.d_int32;
             }
           break;
 


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