[gimp] plug-ins: port file-fli to GimpProcedureConfig



commit efb6ea9ceb2bedec70e755f1e124401eb41169a3
Author: Michael Natterer <mitch gimp org>
Date:   Fri Oct 4 12:24:48 2019 +0200

    plug-ins: port file-fli to GimpProcedureConfig
    
    While testing noticed that the plug-in either loads or saves total
    garbage, but also in 2.10, so it's not a recent regression.

 plug-ins/file-fli/fli-gimp.c | 254 +++++++++++++++++++++----------------------
 1 file changed, 126 insertions(+), 128 deletions(-)
---
diff --git a/plug-ins/file-fli/fli-gimp.c b/plug-ins/file-fli/fli-gimp.c
index de70aae40f..024e10437c 100644
--- a/plug-ins/file-fli/fli-gimp.c
+++ b/plug-ins/file-fli/fli-gimp.c
@@ -111,17 +111,19 @@ static GimpValueArray * fli_info             (GimpProcedure        *procedure,
                                               gpointer              run_data);
 
 static GimpImage      * load_image           (GFile                *file,
-                                              gint32                from_frame,
-                                              gint32                to_frame,
+                                              GObject              *config,
                                               GError              **error);
-static gboolean         load_dialog          (GFile                *file);
+static gboolean         load_dialog          (GFile                *file,
+                                              GimpProcedure        *procedure,
+                                              GObject              *config);
 
 static gboolean         save_image           (GFile                *file,
                                               GimpImage            *image,
-                                              gint32                from_frame,
-                                              gint32                to_frame,
+                                              GObject              *config,
                                               GError              **error);
-static gboolean         save_dialog          (GimpImage            *image);
+static gboolean         save_dialog          (GimpImage            *image,
+                                              GimpProcedure        *procedure,
+                                              GObject              *config);
 
 static gboolean         get_info             (GFile                *file,
                                               gint32               *width,
@@ -135,10 +137,6 @@ G_DEFINE_TYPE (Fli, fli, GIMP_TYPE_PLUG_IN)
 GIMP_MAIN (FLI_TYPE)
 
 
-static gint32 from_frame;
-static gint32 to_frame;
-
-
 static void
 fli_class_init (FliClass *klass)
 {
@@ -259,11 +257,10 @@ fli_create_procedure (GimpPlugIn  *plug_in,
                                       "Jens Ch. Restemeier",
                                       "1997");
 
-      GIMP_PROC_ARG_STRING (procedure, "uri",
-                            "URI",
-                            "The local file:// URI of the file to get info",
-                            NULL,
-                            G_PARAM_READWRITE);
+      GIMP_PROC_ARG_FILE (procedure, "file",
+                          "File",
+                          "The local file to get info about",
+                          G_PARAM_READWRITE);
 
       GIMP_PROC_VAL_INT (procedure, "width",
                          "Width",
@@ -294,35 +291,26 @@ fli_load (GimpProcedure        *procedure,
           const GimpValueArray *args,
           gpointer              run_data)
 {
-  GimpValueArray *return_vals;
-  GimpImage      *image;
-  GError         *error = NULL;
+  GimpProcedureConfig *config;
+  GimpValueArray      *return_vals;
+  GimpImage           *image;
+  GError              *error = NULL;
 
   INIT_I18N ();
   gegl_init (NULL, NULL);
 
-  switch (run_mode)
-    {
-    case GIMP_RUN_NONINTERACTIVE:
-      from_frame = GIMP_VALUES_GET_INT (args, 0);
-      to_frame   = GIMP_VALUES_GET_INT (args, 1);
-      break;
+  config = gimp_procedure_create_config (procedure);
+  gimp_procedure_config_begin_run (config, NULL, run_mode, args);
 
-    case GIMP_RUN_INTERACTIVE:
-      if (! load_dialog (file))
+  if (run_mode == GIMP_RUN_INTERACTIVE)
+    {
+      if (! load_dialog (file, procedure, G_OBJECT (config)))
         return gimp_procedure_new_return_values (procedure,
                                                  GIMP_PDB_CANCEL,
                                                  NULL);
-      break;
-
-    case GIMP_RUN_WITH_LAST_VALS:
-      return gimp_procedure_new_return_values (procedure,
-                                               GIMP_PDB_CALLING_ERROR,
-                                               error);
-      break;
     }
 
-  image = load_image (file, from_frame, to_frame,
+  image = load_image (file, G_OBJECT (config),
                       &error);
 
   if (! image)
@@ -330,6 +318,9 @@ fli_load (GimpProcedure        *procedure,
                                              GIMP_PDB_EXECUTION_ERROR,
                                              error);
 
+  gimp_procedure_config_end_run (config, GIMP_PDB_SUCCESS);
+  g_object_unref (config);
+
   return_vals = gimp_procedure_new_return_values (procedure,
                                                   GIMP_PDB_SUCCESS,
                                                   NULL);
@@ -348,25 +339,19 @@ fli_save (GimpProcedure        *procedure,
           const GimpValueArray *args,
           gpointer              run_data)
 {
-  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
-  GimpExportReturn   export = GIMP_EXPORT_CANCEL;
-  GError            *error = NULL;
+  GimpProcedureConfig *config;
+  GimpPDBStatusType    status = GIMP_PDB_SUCCESS;
+  GimpExportReturn     export = GIMP_EXPORT_CANCEL;
+  GError              *error  = NULL;
 
   INIT_I18N ();
   gegl_init (NULL, NULL);
 
+  config = gimp_procedure_create_config (procedure);
+  gimp_procedure_config_begin_run (config, image, run_mode, args);
+
   switch (run_mode)
     {
-    case GIMP_RUN_NONINTERACTIVE:
-      from_frame = GIMP_VALUES_GET_INT (args, 0);
-      to_frame   = GIMP_VALUES_GET_INT (args, 1);
-
-      if (from_frame > to_frame)
-        return gimp_procedure_new_return_values (procedure,
-                                                 GIMP_PDB_CALLING_ERROR,
-                                                 NULL);
-      break;
-
     case GIMP_RUN_INTERACTIVE:
     case GIMP_RUN_WITH_LAST_VALS:
       gimp_ui_init (PLUG_IN_BINARY);
@@ -381,20 +366,30 @@ fli_save (GimpProcedure        *procedure,
         return gimp_procedure_new_return_values (procedure,
                                                  GIMP_PDB_CANCEL,
                                                  NULL);
+      break;
 
-      if (! save_dialog (image))
+    default:
+      break;
+    }
+
+  if (run_mode == GIMP_RUN_INTERACTIVE)
+    {
+      if (! save_dialog (image, procedure, G_OBJECT (config)))
         status = GIMP_PDB_CANCEL;
     }
 
   if (status == GIMP_PDB_SUCCESS)
     {
-      if (! save_image (file, image, from_frame, to_frame,
+      if (! save_image (file, image, G_OBJECT (config),
                         &error))
         {
           status = GIMP_PDB_EXECUTION_ERROR;
         }
     }
 
+  gimp_procedure_config_end_run (config, status);
+  g_object_unref (config);
+
   if (export == GIMP_EXPORT_EXPORT)
     gimp_image_delete (image);
 
@@ -413,7 +408,7 @@ fli_info (GimpProcedure        *procedure,
   gint32          frames;
   GError         *error = NULL;
 
-  file = g_file_new_for_uri (GIMP_VALUES_GET_STRING (args, 0));
+  file = GIMP_VALUES_GET_FILE (args, 0);
 
   if (! get_info (file, &width, &height, &frames,
                   &error))
@@ -476,10 +471,9 @@ get_info (GFile   *file,
  * load fli animation and store as framestack
  */
 static GimpImage *
-load_image (GFile   *file,
-            gint32   from_frame,
-            gint32   to_frame,
-            GError **error)
+load_image (GFile    *file,
+            GObject  *config,
+            GError  **error)
 {
   gchar        *filename;
   FILE         *fp;
@@ -490,13 +484,20 @@ load_image (GFile   *file,
   guchar        cm[768], ocm[768];
   s_fli_header  fli_header;
   gint          cnt;
+  gint          from_frame;
+  gint          to_frame;
+
+  g_object_get (config,
+                "from-frame", &from_frame,
+                "to-frame",   &to_frame,
+                NULL);
 
   gimp_progress_init_printf (_("Opening '%s'"),
                              gimp_file_get_utf8_name (file));
 
   filename = g_file_get_path (file);
   fp = g_fopen (filename ,"rb");
-  g_free (file);
+  g_free (filename);
 
   if (! fp)
     {
@@ -520,31 +521,37 @@ load_image (GFile   *file,
   /*
    * Fix parameters
    */
-  if ((from_frame==-1) && (to_frame==-1))
+  if ((from_frame == -1) && (to_frame == -1))
     {
       /* to make scripting easier: */
-      from_frame=1; to_frame=fli_header.frames;
+      from_frame = 1;
+      to_frame   = fli_header.frames;
     }
+
   if (to_frame < from_frame)
     {
       to_frame = fli_header.frames;
     }
+
   if (from_frame < 1)
     {
       from_frame = 1;
     }
+
   if (to_frame < 1)
     {
       /* nothing to do ... */
       fclose (fp);
       return NULL;
     }
+
   if (from_frame >= fli_header.frames)
     {
       /* nothing to do ... */
       fclose (fp);
       return NULL;
     }
+
   if (to_frame > fli_header.frames)
     {
       to_frame = fli_header.frames;
@@ -626,15 +633,14 @@ load_image (GFile   *file,
 static gboolean
 save_image (GFile      *file,
             GimpImage  *image,
-            gint32      from_frame,
-            gint32      to_frame,
+            GObject    *config,
             GError    **error)
 {
   gchar        *filename;
   FILE         *fp;
   GList        *framelist;
   GList        *iter;
-  gint          nframes;
+  gint          n_frames;
   gint          colors, i;
   guchar       *cmap;
   guchar        bg;
@@ -648,19 +654,27 @@ save_image (GFile      *file,
   GimpRGB       background;
   s_fli_header  fli_header;
   gint          cnt;
+  gint          from_frame;
+  gint          to_frame;
+
+  g_object_get (config,
+                "from-frame", &from_frame,
+                "to-frame",   &to_frame,
+                NULL);
 
   framelist = gimp_image_list_layers (image);
   framelist = g_list_reverse (framelist);
-  nframes = g_list_length (framelist);
+  n_frames  = g_list_length (framelist);
 
   if ((from_frame == -1) && (to_frame == -1))
     {
       /* to make scripting easier: */
-      from_frame = 0; to_frame = nframes;
+      from_frame = 1;
+      to_frame   = n_frames;
     }
   if (to_frame < from_frame)
     {
-      to_frame = nframes;
+      to_frame = n_frames;
     }
   if (from_frame < 1)
     {
@@ -671,14 +685,14 @@ save_image (GFile      *file,
       /* nothing to do ... */
       return FALSE;
     }
-  if (from_frame > nframes)
+  if (from_frame > n_frames)
     {
       /* nothing to do ... */
       return FALSE;
     }
-  if (to_frame > nframes)
+  if (to_frame > n_frames)
     {
-      to_frame = nframes;
+      to_frame = n_frames;
     }
 
   gimp_context_get_background (&background);
@@ -856,7 +870,7 @@ save_image (GFile      *file,
 
   g_free (fb);
   g_free (ofb);
-  g_free (framelist);
+  g_list_free (framelist);
 
   gimp_progress_update (1.0);
 
@@ -867,35 +881,28 @@ save_image (GFile      *file,
  * Dialogs for interactive usage
  */
 static gboolean
-load_dialog (GFile *file)
+load_dialog (GFile         *file,
+             GimpProcedure *procedure,
+             GObject       *config)
 {
-  GtkWidget     *dialog;
-  GtkWidget     *grid;
-  GtkWidget     *spinbutton;
-  GtkAdjustment *adj;
-  gint32         width, height, nframes;
-  gboolean       run;
+  GtkWidget *dialog;
+  GtkWidget *grid;
+  GtkWidget *spinbutton;
+  gint       width, height, n_frames;
+  gboolean   run;
 
-  get_info (file, &width, &height, &nframes, NULL);
+  get_info (file, &width, &height, &n_frames, NULL);
 
-  from_frame = 1;
-  to_frame   = nframes;
+  g_object_set (config,
+                "from-frame", 1,
+                "to-frame",   n_frames,
+                NULL);
 
   gimp_ui_init (PLUG_IN_BINARY);
 
-  dialog = gimp_dialog_new (_("GFLI 1.3 - Load framestack"), PLUG_IN_ROLE,
-                            NULL, 0,
-                            gimp_standard_help_func, LOAD_PROC,
-
-                            _("_Cancel"), GTK_RESPONSE_CANCEL,
-                            _("_Open"),   GTK_RESPONSE_OK,
-
-                            NULL);
-
-  gimp_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
-                                           GTK_RESPONSE_OK,
-                                           GTK_RESPONSE_CANCEL,
-                                           -1);
+  dialog = gimp_procedure_dialog_new (procedure,
+                                      GIMP_PROCEDURE_CONFIG (config),
+                                      _("Open FLIC Animation"));
 
   grid = gtk_grid_new ();
   gtk_container_set_border_width (GTK_CONTAINER (grid), 12);
@@ -909,29 +916,22 @@ load_dialog (GFile *file)
    * Maybe I add on-the-fly RGB conversion, to keep palettechanges...
    * But for now you can set a start- and a end-frame:
    */
-  adj = gtk_adjustment_new (from_frame, 1, nframes, 1, 10, 0);
-  spinbutton = gimp_spin_button_new (adj, 1, 0);
-  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+
+  spinbutton = gimp_prop_spin_button_new (config, "from-frame",
+                                          1, 10, 0);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 0,
                             C_("frame-range", "_From:"), 0.0, 0.5,
                             spinbutton, 1);
-  g_signal_connect (adj, "value-changed",
-                    G_CALLBACK (gimp_int_adjustment_update),
-                    &from_frame);
 
-  adj = gtk_adjustment_new (to_frame, 1, nframes, 1, 10, 0);
-  spinbutton = gimp_spin_button_new (adj, 1, 0);
-  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+  spinbutton = gimp_prop_spin_button_new (config, "to-frame",
+                                          1, 10, 0);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 1,
                             C_("frame-range", "_To:"), 0.0, 0.5,
                             spinbutton, 1);
-  g_signal_connect (adj, "value-changed",
-                    G_CALLBACK (gimp_int_adjustment_update),
-                    &to_frame);
 
   gtk_widget_show (dialog);
 
-  run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
+  run = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
 
   gtk_widget_destroy (dialog);
 
@@ -939,27 +939,32 @@ load_dialog (GFile *file)
 }
 
 static gboolean
-save_dialog (GimpImage *image)
+save_dialog (GimpImage     *image,
+             GimpProcedure *procedure,
+             GObject       *config)
 {
-  GtkWidget     *dialog;
-  GtkWidget     *grid;
-  GtkWidget     *spinbutton;
-  GtkAdjustment *adj;
-  gint           nframes;
-  gboolean       run;
+  GtkWidget *dialog;
+  GtkWidget *grid;
+  GtkWidget *spinbutton;
+  gint       n_frames;
+  gboolean   run;
 
-  g_free (gimp_image_get_layers (image, &nframes));
+  g_free (gimp_image_get_layers (image, &n_frames));
 
-  from_frame = 1;
-  to_frame   = nframes;
+  g_object_set (config,
+                "from-frame", 1,
+                "to-frame",   n_frames,
+                NULL);
 
-  dialog = gimp_export_dialog_new (_("GFLI 1.3"), PLUG_IN_BINARY, SAVE_PROC);
+  dialog = gimp_procedure_dialog_new (procedure,
+                                      GIMP_PROCEDURE_CONFIG (config),
+                                      _("Export Image as FLI Animation"));
 
   grid = gtk_grid_new ();
   gtk_container_set_border_width (GTK_CONTAINER (grid), 12);
   gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
   gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
-  gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
                       grid, FALSE, FALSE, 0);
   gtk_widget_show (grid);
 
@@ -967,29 +972,22 @@ save_dialog (GimpImage *image)
    * Maybe I add on-the-fly RGB conversion, to keep palettechanges...
    * But for now you can set a start- and a end-frame:
    */
-  adj = gtk_adjustment_new (from_frame, 1, nframes, 1, 10, 0);
-  spinbutton = gimp_spin_button_new (adj, 1, 0);
-  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+
+  spinbutton = gimp_prop_spin_button_new (config, "from-frame",
+                                          1, 10, 0);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 0,
                             C_("frame-range", "_From:"), 0.0, 0.5,
                             spinbutton, 1);
-  g_signal_connect (adj, "value-changed",
-                    G_CALLBACK (gimp_int_adjustment_update),
-                    &from_frame);
 
-  adj = gtk_adjustment_new (to_frame, 1, nframes, 1, 10, 0);
-  spinbutton = gimp_spin_button_new (adj, 1, 0);
-  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+  spinbutton = gimp_prop_spin_button_new (config, "to-frame",
+                                          1, 10, 0);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 1,
                             C_("frame-range", "_To:"), 0.0, 0.5,
                             spinbutton, 1);
-  g_signal_connect (adj, "value-changed",
-                    G_CALLBACK (gimp_int_adjustment_update),
-                    &to_frame);
 
   gtk_widget_show (dialog);
 
-  run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
+  run = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
 
   gtk_widget_destroy (dialog);
 


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