plug-ins: various fixes and nitpicking to file-webp.

- get_preset_from_id() was defined in file-webp-dialog.c but used in
  file-webp.c only. Move it there.
- Make the preset list available in file-webp-save.h header (since it
  is specifically an encoder attribute) as static, because it is used
  both in the dialog ("preset" choice list) and the main file (for match
  of the "preset" parameter as internal ID to a WebPPreset when run as
  non-interactive).
- Generate the "preset" parameter description from the preset list.
  This way, even if this list were to change (in some hypothetical
  future), the description (and in particular the list of possible
  values and their int match) won't end up wrong.
- "enum WebPPreset" is typedef-ed to "WebPPreset".
- Use G_N_ELEMENTS to compute length of arrays on the stack (equivalent
  to the current code but shorter and simpler to read).
- Many formatting fixes.
This commit is contained in:
Jehan 2016-11-14 21:27:27 +01:00
parent 9ac455f4ad
commit 58e6f6ca35
4 changed files with 83 additions and 49 deletions

View File

@ -29,50 +29,30 @@
#include "libgimp/stdplugins-intl.h"
static GtkWidget* new_combo_from_presets (enum WebPPreset *preset);
static void preset_update (GimpIntComboBox* combo_box,
static void preset_update (GimpIntComboBox *combo_box,
gpointer data);
static GtkWidget * new_combo_from_presets (WebPPreset *preset);
static void save_dialog_toggle_scale (GtkWidget *widget,
gpointer data);
static const struct
{
const enum WebPPreset preset;
const gchar *label;
} presets[] =
{
{ WEBP_PRESET_DEFAULT, "Default" },
{ WEBP_PRESET_PICTURE, "Picture" },
{ WEBP_PRESET_PHOTO, "Photo" },
{ WEBP_PRESET_DRAWING, "Drawing" },
{ WEBP_PRESET_ICON, "Icon" },
{ WEBP_PRESET_TEXT, "Text" },
};
WebPPreset
get_preset_from_id (gint id)
{
if (id >= 0 && id < sizeof (presets) / sizeof (presets[0]))
return presets[id].preset;
return presets[0].preset;
}
static void
preset_update (GimpIntComboBox* combo_box, gpointer data) {
preset_update (GimpIntComboBox *combo_box,
gpointer data)
{
if (! gimp_int_combo_box_get_active (combo_box, (gint*) data))
* (enum WebPPreset*) data = WEBP_PRESET_DEFAULT;
* (WebPPreset*) data = WEBP_PRESET_DEFAULT;
}
static GtkWidget*
new_combo_from_presets (enum WebPPreset *preset)
static GtkWidget *
new_combo_from_presets (WebPPreset *preset)
{
gint i;
GtkWidget* combo = g_object_new (GIMP_TYPE_INT_COMBO_BOX, NULL);
for (i = 0; i < sizeof (presets) / sizeof( presets[0] ); ++i)
gimp_int_combo_box_append (GIMP_INT_COMBO_BOX(combo),
GIMP_INT_STORE_VALUE, (gint) presets[i].preset,
GIMP_INT_STORE_LABEL, presets[i].label,
for (i = 0; i < G_N_ELEMENTS (webp_presets); ++i)
gimp_int_combo_box_append (GIMP_INT_COMBO_BOX (combo),
GIMP_INT_STORE_VALUE, (gint) webp_presets[i].preset,
GIMP_INT_STORE_LABEL, webp_presets[i].label,
-1);
gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), *preset,
G_CALLBACK (preset_update), preset);

View File

@ -298,7 +298,7 @@ save_layer (const gchar *filename,
&icc_data_size);
chunk.bytes = icc_data;
chunk.size = icc_data_size;
WebPMuxSetChunk(mux, "ICCP", &chunk, 1);
WebPMuxSetChunk (mux, "ICCP", &chunk, 1);
g_object_unref (profile);
}
@ -350,7 +350,7 @@ parse_ms_tag (const gchar *str)
offset++;
if (offset >= length)
return(-1);
return -1;
if (! g_ascii_isdigit (str[++offset]))
goto find_another_bra;
@ -364,7 +364,7 @@ parse_ms_tag (const gchar *str)
while ((offset < length) && (g_ascii_isdigit (str[offset])));
if (length - offset <= 2)
return(-3);
return -3;
if ((g_ascii_toupper (str[offset]) != 'M') ||
(g_ascii_toupper (str[offset + 1]) != 'S'))
@ -635,7 +635,7 @@ save_image (const gchar *filename,
if (nLayers == 0)
return FALSE;
g_printerr("Saving WebP file %s\n", filename);
g_printerr ("Saving WebP file %s\n", filename);
if (nLayers == 1)
{

View File

@ -26,7 +26,7 @@
typedef struct
{
enum WebPPreset preset;
WebPPreset preset;
gboolean lossless;
gboolean animation;
gboolean loop;
@ -39,7 +39,23 @@ typedef struct
gboolean force_delay;
} WebPSaveParams;
WebPPreset get_preset_from_id (gint id);
static const struct
{
const WebPPreset preset;
const gchar *label;
} webp_presets[] =
{
/* The preset order is used as ID parameter in the PDB save procedure.
* So it is important to keep it stable in order not to break any
* script. Any new preset should be added to the end.
*/
{ WEBP_PRESET_DEFAULT, "Default" },
{ WEBP_PRESET_PICTURE, "Picture" },
{ WEBP_PRESET_PHOTO, "Photo" },
{ WEBP_PRESET_DRAWING, "Drawing" },
{ WEBP_PRESET_ICON, "Icon" },
{ WEBP_PRESET_TEXT, "Text" },
};
gboolean save_image (const gchar *filename,
gint32 nLayers,

View File

@ -43,6 +43,7 @@ static void run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals);
static WebPPreset get_preset_from_id (gint id);
const GimpPlugInInfo PLUG_IN_INFO =
{
@ -74,6 +75,9 @@ set_default_params (WebPSaveParams* params)
static void
query (void)
{
gchar *preset_param_desc;
gint i;
static const GimpParamDef load_arguments[] =
{
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
@ -86,14 +90,14 @@ query (void)
{ GIMP_PDB_IMAGE, "image", "Output image" }
};
static const GimpParamDef save_arguments[] =
static GimpParamDef save_arguments[] =
{
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
{ GIMP_PDB_IMAGE, "image", "Input image" },
{ GIMP_PDB_DRAWABLE, "drawable", "Drawable to save" },
{ GIMP_PDB_STRING, "filename", "The name of the file to save the image to" },
{ GIMP_PDB_STRING, "raw-filename", "The name entered" },
{ GIMP_PDB_INT32, "preset", "preset (Default=0, Picture=1, Photo=2, Drawing=3, Icon=4, Text=5)" },
{ GIMP_PDB_INT32, "preset", NULL },
{ GIMP_PDB_INT32, "lossless", "Use lossless encoding (0/1)" },
{ GIMP_PDB_FLOAT, "quality", "Quality of the image (0 <= quality <= 100)" },
{ GIMP_PDB_FLOAT, "alpha-quality", "Quality of the image's alpha channel (0 <= alpha-quality <= 100)" },
@ -127,6 +131,31 @@ query (void)
"",
"8,string,WEBP");
/*
* "preset" values in the PDB save proc are internal IDs, not
* necessarily corresponding to the constants from libwebp (though at
* time of writing, they are the same).
* Generate the "preset" parameter description from webp_presets, so
* that we don't have to edit multiple places if new presets are added
* in the future.
*/
preset_param_desc = g_strdup_printf ("WebP encoder preset (%s=0",
webp_presets[0].label);
for (i = 1; i < G_N_ELEMENTS (webp_presets); ++i)
{
gchar *preset_param;
gchar *tmp;
preset_param = g_strdup_printf (", %s=%d%s", webp_presets[i].label, i,
i == G_N_ELEMENTS (webp_presets) - 1 ? ")" : "");
tmp = preset_param_desc;
preset_param_desc = g_strconcat (preset_param_desc, preset_param,
NULL);
g_free (preset_param);
g_free (tmp);
}
save_arguments[5].description = preset_param_desc;
gimp_install_procedure (SAVE_PROC,
"Saves files in the WebP image format",
"Saves files in the WebP image format",
@ -143,6 +172,7 @@ query (void)
gimp_register_file_handler_mime (SAVE_PROC, "image/webp");
gimp_register_save_handler (SAVE_PROC, "webp", "");
g_free (preset_param_desc);
}
static void
@ -298,3 +328,11 @@ run (const gchar *name,
values[0].data.d_status = status;
}
static WebPPreset
get_preset_from_id (gint id)
{
if (id >= 0 && id < G_N_ELEMENTS (webp_presets))
return webp_presets[id].preset;
return webp_presets[0].preset;
}