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.
This commit is contained in:
Pascal Massimino 2016-11-24 17:11:03 +01:00 committed by Jehan
parent 2e63533602
commit 136ef67b64
4 changed files with 80 additions and 8 deletions

View File

@ -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);

View File

@ -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++)
{

View File

@ -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;

View File

@ -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;