[gimp] plug-ins: port file-cel to GimpPlugIn and libgimp objects
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: port file-cel to GimpPlugIn and libgimp objects
- Date: Sat, 24 Aug 2019 15:05:11 +0000 (UTC)
commit 2fd17029f4f55a163c272a90e3669dcb23bba004
Author: Michael Natterer <mitch gimp org>
Date: Sat Aug 24 17:04:38 2019 +0200
plug-ins: port file-cel to GimpPlugIn and libgimp objects
plug-ins/common/Makefile.am | 2 -
plug-ins/common/file-cel.c | 492 ++++++++++++++++++++++-------------------
plug-ins/common/plugin-defs.pl | 2 +-
3 files changed, 264 insertions(+), 232 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index aca8e3e9a5..f47ec09d09 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -567,8 +567,6 @@ file_aa_LDADD = \
$(INTLLIBS) \
$(file_aa_RC)
-file_cel_CPPFLAGS = $(AM_CPPFLAGS) -DGIMP_DEPRECATED_REPLACE_NEW_API
-
file_cel_SOURCES = \
file-cel.c
diff --git a/plug-ins/common/file-cel.c b/plug-ins/common/file-cel.c
index 3a49f128b2..7a819064d5 100644
--- a/plug-ins/common/file-cel.c
+++ b/plug-ins/common/file-cel.c
@@ -37,253 +37,287 @@
#define PLUG_IN_ROLE "gimp-file-cel"
-static void query (void);
-static void run (const gchar *name,
- gint nparams,
- const GimpParam *param,
- gint *nreturn_vals,
- GimpParam **return_vals);
-
-static gint load_palette (const gchar *file,
- FILE *fp,
- guchar palette[],
- GError **error);
-static gint32 load_image (const gchar *file,
- GError **error);
-static gboolean save_image (GFile *file,
- gint32 image,
- gint32 layer,
- GError **error);
-static void palette_dialog (const gchar *title);
-static gboolean need_palette (const gchar *file,
- GError **error);
-
-
-/* Globals... */
-
-const GimpPlugInInfo PLUG_IN_INFO =
+typedef struct _Cel Cel;
+typedef struct _CelClass CelClass;
+
+struct _Cel
+{
+ GimpPlugIn parent_instance;
+};
+
+struct _CelClass
{
- NULL, /* init_proc */
- NULL, /* quit_proc */
- query, /* query_proc */
- run, /* run_proc */
+ GimpPlugInClass parent_class;
};
+
+#define CEL_TYPE (cel_get_type ())
+#define CEL (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CEL_TYPE, Cel))
+
+GType cel_get_type (void) G_GNUC_CONST;
+
+static GList * cel_query_procedures (GimpPlugIn *plug_in);
+static GimpProcedure * cel_create_procedure (GimpPlugIn *plug_in,
+ const gchar *name);
+
+static GimpValueArray * cel_load (GimpProcedure *procedure,
+ GimpRunMode run_mode,
+ GFile *file,
+ const GimpValueArray *args,
+ gpointer run_data);
+static GimpValueArray * cel_save (GimpProcedure *procedure,
+ GimpRunMode run_mode,
+ GimpImage *image,
+ GimpDrawable *drawable,
+ GFile *file,
+ const GimpValueArray *args,
+ gpointer run_data);
+
+static gint load_palette (const gchar *file,
+ FILE *fp,
+ guchar palette[],
+ GError **error);
+static GimpImage * load_image (const gchar *file,
+ GError **error);
+static gboolean save_image (GFile *file,
+ GimpImage *image,
+ GimpDrawable *drawable,
+ GError **error);
+static void palette_dialog (const gchar *title);
+static gboolean need_palette (const gchar *file,
+ GError **error);
+
+
+G_DEFINE_TYPE (Cel, cel, GIMP_TYPE_PLUG_IN)
+
+GIMP_MAIN (CEL_TYPE)
+
+
static gchar *palette_file = NULL;
static gsize data_length = 0;
-/* Let GIMP library handle initialisation (and inquisitive users) */
-MAIN ()
+static void
+cel_class_init (CelClass *klass)
+{
+ GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS (klass);
-/* GIMP queries plug-in for parameters etc. */
+ plug_in_class->query_procedures = cel_query_procedures;
+ plug_in_class->create_procedure = cel_create_procedure;
+}
static void
-query (void)
+cel_init (Cel *cel)
{
- static const GimpParamDef load_args[] =
- {
- { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
- { GIMP_PDB_STRING, "filename", "Filename to load image from" },
- { GIMP_PDB_STRING, "raw-filename", "Name entered" },
- { GIMP_PDB_STRING, "palette-filename", "Filename to load palette from" }
- };
- static const GimpParamDef load_return_vals[] =
- {
- { GIMP_PDB_IMAGE, "image", "Output image" }
- };
-
- static const GimpParamDef save_args[] =
- {
- { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }"
},
- { GIMP_PDB_IMAGE, "image", "Input image" },
- { GIMP_PDB_DRAWABLE, "drawable", "Drawable to export" },
- { GIMP_PDB_STRING, "filename", "Filename to export image to" },
- { GIMP_PDB_STRING, "raw-filename", "Name entered" },
- { GIMP_PDB_STRING, "palette-filename", "Filename to save palette to" },
- };
-
- gimp_install_procedure (LOAD_PROC,
- "Loads files in KISS CEL file format",
- "This plug-in loads individual KISS cell files.",
- "Nick Lamb",
- "Nick Lamb <njl195 zepler org uk>",
- "May 1998",
- N_("KISS CEL"),
- NULL,
- GIMP_PLUGIN,
- G_N_ELEMENTS (load_args),
- G_N_ELEMENTS (load_return_vals),
- load_args, load_return_vals);
-
- gimp_register_magic_load_handler (LOAD_PROC,
- "cel",
- "",
- "0,string,KiSS\\040");
-
- gimp_install_procedure (SAVE_PROC,
- "Exports files in KISS CEL file format",
- "This plug-in exports individual KISS cell files.",
- "Nick Lamb",
- "Nick Lamb <njl195 zepler org uk>",
- "May 1998",
- N_("KISS CEL"),
- "RGB*, INDEXED*",
- GIMP_PLUGIN,
- G_N_ELEMENTS (save_args), 0,
- save_args, NULL);
-
- gimp_register_file_handler_remote (SAVE_PROC);
- gimp_register_save_handler (SAVE_PROC, "cel", "");
}
-static void
-run (const gchar *name,
- gint nparams,
- const GimpParam *param,
- gint *nreturn_vals,
- GimpParam **return_vals)
+static GList *
+cel_query_procedures (GimpPlugIn *plug_in)
{
- static GimpParam values[2]; /* Return values */
- GimpRunMode run_mode;
- gint32 image_ID;
- gint32 drawable_ID;
- GimpPDBStatusType status = GIMP_PDB_SUCCESS;
- gint32 image;
- GimpExportReturn export = GIMP_EXPORT_CANCEL;
- GError *error = NULL;
- gint needs_palette = 0;
+ GList *list = NULL;
- INIT_I18N ();
- gegl_init (NULL, NULL);
+ list = g_list_append (list, g_strdup (LOAD_PROC));
+ list = g_list_append (list, g_strdup (SAVE_PROC));
- run_mode = param[0].data.d_int32;
+ return list;
+}
- /* Set up default return values */
+static GimpProcedure *
+cel_create_procedure (GimpPlugIn *plug_in,
+ const gchar *name)
+{
+ GimpProcedure *procedure = NULL;
- *nreturn_vals = 1;
- *return_vals = values;
- values[0].type = GIMP_PDB_STATUS;
- values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+ if (! strcmp (name, LOAD_PROC))
+ {
+ procedure = gimp_load_procedure_new (plug_in, name, GIMP_PLUGIN,
+ cel_load, NULL, NULL);
+
+ gimp_procedure_set_menu_label (procedure, N_("KISS CEL"));
+
+ gimp_procedure_set_documentation (procedure,
+ "Loads files in KISS CEL file format",
+ "This plug-in loads individual KISS "
+ "cell files.",
+ name);
+ gimp_procedure_set_attribution (procedure,
+ "Nick Lamb",
+ "Nick Lamb <njl195 zepler org uk>",
+ "May 1998");
+
+ gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
+ "cel");
+ gimp_file_procedure_set_magics (GIMP_FILE_PROCEDURE (procedure),
+ "0,string,KiSS\\040");
+
+ GIMP_PROC_ARG_STRING (procedure, "palette-filename",
+ "Palette filename",
+ "Filename to load palette from",
+ NULL,
+ G_PARAM_READWRITE |
+ GIMP_PARAM_NO_VALIDATE);
+ }
+ else if (! strcmp (name, SAVE_PROC))
+ {
+ procedure = gimp_save_procedure_new (plug_in, name, GIMP_PLUGIN,
+ cel_save, NULL, NULL);
+
+ gimp_procedure_set_image_types (procedure, "RGB*, INDEXED*");
+
+ gimp_procedure_set_menu_label (procedure, N_("KISS CEL"));
+
+ gimp_procedure_set_documentation (procedure,
+ "Exports files in KISS CEL file format",
+ "This plug-in exports individual KISS "
+ "cell files.",
+ name);
+ gimp_procedure_set_attribution (procedure,
+ "Nick Lamb",
+ "Nick Lamb <njl195 zepler org uk>",
+ "May 1998");
+
+ gimp_file_procedure_set_handles_remote (GIMP_FILE_PROCEDURE (procedure),
+ TRUE);
+ gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
+ "cel");
+
+ GIMP_PROC_ARG_STRING (procedure, "palette-filename",
+ "Palette filename",
+ "Filename to save palette to",
+ NULL,
+ G_PARAM_READWRITE |
+ GIMP_PARAM_NO_VALIDATE);
+ }
+
+ return procedure;
+}
+
+static GimpValueArray *
+cel_load (GimpProcedure *procedure,
+ GimpRunMode run_mode,
+ GFile *file,
+ const GimpValueArray *args,
+ gpointer run_data)
+{
+ GimpValueArray *return_vals;
+ GimpImage *image = NULL;
+ gboolean needs_palette = FALSE;
+ GError *error = NULL;
+
+ INIT_I18N ();
+ gegl_init (NULL, NULL);
- if (strcmp (name, LOAD_PROC) == 0)
+ if (run_mode != GIMP_RUN_NONINTERACTIVE)
{
- if (run_mode != GIMP_RUN_NONINTERACTIVE)
+ data_length = gimp_get_data_size (SAVE_PROC);
+ if (data_length > 0)
{
- data_length = gimp_get_data_size (SAVE_PROC);
- if (data_length > 0)
- {
- palette_file = g_malloc (data_length);
- gimp_get_data (SAVE_PROC, palette_file);
- }
- else
- {
- palette_file = g_strdup ("*.kcf");
- data_length = strlen (palette_file) + 1;
- }
+ palette_file = g_malloc (data_length);
+ gimp_get_data (SAVE_PROC, palette_file);
}
-
- if (run_mode == GIMP_RUN_NONINTERACTIVE)
+ else
{
- palette_file = param[3].data.d_string;
- if (palette_file)
- data_length = strlen (palette_file) + 1;
- else
- data_length = 0;
+ palette_file = g_strdup ("*.kcf");
+ data_length = strlen (palette_file) + 1;
}
- else if (run_mode == GIMP_RUN_INTERACTIVE)
- {
- /* Let user choose KCF palette (cancel ignores) */
- needs_palette = need_palette (param[1].data.d_string, &error);
-
- if (! error)
- {
- if (needs_palette)
- palette_dialog (_("Load KISS Palette"));
+ }
- gimp_set_data (SAVE_PROC, palette_file, data_length);
- }
- }
+ if (run_mode == GIMP_RUN_NONINTERACTIVE)
+ {
+ palette_file = (gchar *) GIMP_VALUES_GET_STRING (args, 0);
+ if (palette_file)
+ data_length = strlen (palette_file) + 1;
+ else
+ data_length = 0;
+ }
+ else if (run_mode == GIMP_RUN_INTERACTIVE)
+ {
+ /* Let user choose KCF palette (cancel ignores) */
+ needs_palette = need_palette (g_file_get_path (file), &error);
if (! error)
{
- GFile *file = g_file_new_for_uri (param[1].data.d_string);
+ if (needs_palette)
+ palette_dialog (_("Load KISS Palette"));
- image = load_image (g_file_get_path (file),
- &error);
-
- if (image != -1)
- {
- *nreturn_vals = 2;
- values[1].type = GIMP_PDB_IMAGE;
- values[1].data.d_image = image;
- }
- else
- {
- status = GIMP_PDB_EXECUTION_ERROR;
- }
- }
- else
- {
- status = GIMP_PDB_EXECUTION_ERROR;
+ gimp_set_data (SAVE_PROC, palette_file, data_length);
}
}
- else if (strcmp (name, SAVE_PROC) == 0)
+
+ if (! error)
{
- image_ID = param[1].data.d_int32;
- drawable_ID = param[2].data.d_int32;
+ image = load_image (g_file_get_path (file),
+ &error);
+ }
- /* eventually export the image */
- switch (run_mode)
- {
- case GIMP_RUN_INTERACTIVE:
- case GIMP_RUN_WITH_LAST_VALS:
- gimp_ui_init (PLUG_IN_BINARY, FALSE);
+ if (! image)
+ return gimp_procedure_new_return_values (procedure,
+ GIMP_PDB_EXECUTION_ERROR,
+ error);
- export = gimp_export_image (&image_ID, &drawable_ID, "CEL",
- GIMP_EXPORT_CAN_HANDLE_RGB |
- GIMP_EXPORT_CAN_HANDLE_ALPHA |
- GIMP_EXPORT_CAN_HANDLE_INDEXED);
+ return_vals = gimp_procedure_new_return_values (procedure,
+ GIMP_PDB_SUCCESS,
+ NULL);
- if (export == GIMP_EXPORT_CANCEL)
- {
- values[0].data.d_status = GIMP_PDB_CANCEL;
- return;
- }
- break;
- default:
- break;
- }
+ GIMP_VALUES_SET_IMAGE (return_vals, 1, image);
- if (save_image (g_file_new_for_uri (param[3].data.d_string),
- image_ID, drawable_ID, &error))
- {
- if (data_length)
- {
- gimp_set_data (SAVE_PROC, palette_file, data_length);
- }
- }
- else
+ return return_vals;
+}
+
+static GimpValueArray *
+cel_save (GimpProcedure *procedure,
+ GimpRunMode run_mode,
+ GimpImage *image,
+ GimpDrawable *drawable,
+ GFile *file,
+ const GimpValueArray *args,
+ gpointer run_data)
+{
+ GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+ GimpExportReturn export = GIMP_EXPORT_CANCEL;
+ GError *error = NULL;
+
+ INIT_I18N ();
+ gegl_init (NULL, NULL);
+
+ switch (run_mode)
+ {
+ case GIMP_RUN_INTERACTIVE:
+ case GIMP_RUN_WITH_LAST_VALS:
+ gimp_ui_init (PLUG_IN_BINARY, FALSE);
+
+ export = gimp_export_image (&image, &drawable, "CEL",
+ GIMP_EXPORT_CAN_HANDLE_RGB |
+ GIMP_EXPORT_CAN_HANDLE_ALPHA |
+ GIMP_EXPORT_CAN_HANDLE_INDEXED);
+
+ if (export == GIMP_EXPORT_CANCEL)
+ return gimp_procedure_new_return_values (procedure,
+ GIMP_PDB_CANCEL,
+ NULL);
+ break;
+
+ default:
+ break;
+ }
+
+ if (save_image (file, image, drawable,
+ &error))
+ {
+ if (data_length)
{
- status = GIMP_PDB_EXECUTION_ERROR;
+ gimp_set_data (SAVE_PROC, palette_file, data_length);
}
-
- if (export == GIMP_EXPORT_EXPORT)
- gimp_image_delete (image_ID);
}
else
{
- status = GIMP_PDB_CALLING_ERROR;
+ status = GIMP_PDB_EXECUTION_ERROR;
}
- if (status != GIMP_PDB_SUCCESS && error)
- {
- *nreturn_vals = 2;
- values[1].type = GIMP_PDB_STRING;
- values[1].data.d_string = error->message;
- }
+ if (export == GIMP_EXPORT_EXPORT)
+ gimp_image_delete (image);
- values[0].data.d_status = status;
+ return gimp_procedure_new_return_values (procedure, status, error);
}
/* Peek into the file to determine whether we need a palette */
@@ -320,7 +354,7 @@ need_palette (const gchar *file,
/* Load CEL image into GIMP */
-static gint32
+static GimpImage *
load_image (const gchar *file,
GError **error)
{
@@ -332,8 +366,8 @@ load_image (const gchar *file,
offx, offy, /* Layer offsets */
colors; /* Number of colors */
- gint32 image, /* Image */
- layer; /* Layer */
+ GimpImage *image; /* Image */
+ GimpLayer *layer; /* Layer */
guchar *buf; /* Temporary buffer */
guchar *line; /* Pixel data */
GeglBuffer *buffer; /* Buffer for layer */
@@ -352,7 +386,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
_("Could not open '%s' for reading: %s"),
gimp_filename_to_utf8 (file), g_strerror (errno));
- return -1;
+ return NULL;
}
/* Get the image dimensions and create the image... */
@@ -364,7 +398,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("EOF or error while reading image header"));
fclose (fp);
- return -1;
+ return NULL;
}
if (strncmp ((const gchar *) header, "KiSS", 4))
@@ -385,7 +419,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("EOF or error while reading image header"));
fclose (fp);
- return -1;
+ return NULL;
}
file_mark = header[0];
@@ -394,7 +428,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("is not a CEL image file"));
fclose (fp);
- return -1;
+ return NULL;
}
bpp = header[1];
@@ -409,7 +443,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("illegal bpp value in image: %hhu"), bpp);
fclose (fp);
- return -1;
+ return NULL;
}
width = header[4] + (256 * header[5]);
@@ -426,7 +460,7 @@ load_image (const gchar *file,
"%d, height: %d, vertical offset: %d"),
width, offx, height, offy);
fclose (fp);
- return -1;
+ return NULL;
}
if (bpp == 32)
@@ -434,11 +468,11 @@ load_image (const gchar *file,
else
image = gimp_image_new (width + offx, height + offy, GIMP_INDEXED);
- if (image == -1)
+ if (! image)
{
g_set_error (error, 0, 0, _("Can't create a new image"));
fclose (fp);
- return -1;
+ return NULL;
}
gimp_image_set_filename (image, file);
@@ -454,12 +488,12 @@ load_image (const gchar *file,
GIMP_INDEXEDA_IMAGE,
100,
gimp_image_get_default_new_layer_mode (image));
- gimp_image_insert_layer (image, layer, -1, 0);
+ gimp_image_insert_layer (image, layer, NULL, 0);
gimp_layer_set_offsets (layer, offx, offy);
/* Get the drawable and set the pixel region for our load... */
- buffer = gimp_drawable_get_buffer (layer);
+ buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (layer));
/* Read the image in and give it to GIMP a line at a time */
buf = g_new (guchar, width * 4);
@@ -477,7 +511,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("EOF or error while reading image data"));
fclose (fp);
- return -1;
+ return NULL;
}
for (j = 0, k = 0; j < width * 2; j+= 4, ++k)
@@ -514,7 +548,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("EOF or error while reading image data"));
fclose (fp);
- return -1;
+ return NULL;
}
for (j = 0, k = 0; j < width * 2; j+= 2, ++k)
@@ -540,7 +574,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("EOF or error while reading image data"));
fclose (fp);
- return -1;
+ return NULL;
}
/* The CEL file order is BGR so we need to swap B and R
@@ -558,7 +592,7 @@ load_image (const gchar *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Unsupported bit depth (%d)!"), bpp);
fclose (fp);
- return -1;
+ return NULL;
}
gegl_buffer_set (buffer, GEGL_RECTANGLE (0, i, width, 1), 0,
@@ -593,7 +627,7 @@ load_image (const gchar *file,
_("Could not open '%s' for reading: %s"),
gimp_filename_to_utf8 (palette_file),
g_strerror (errno));
- return -1;
+ return NULL;
}
}
@@ -602,7 +636,7 @@ load_image (const gchar *file,
colors = load_palette (palette_file, fp, palette, error);
fclose (fp);
if (colors < 0 || *error)
- return -1;
+ return NULL;
}
else
{
@@ -747,10 +781,10 @@ load_palette (const gchar *file,
}
static gboolean
-save_image (GFile *file,
- gint32 image,
- gint32 layer,
- GError **error)
+save_image (GFile *file,
+ GimpImage *image,
+ GimpDrawable *drawable,
+ GError **error)
{
GOutputStream *output;
GeglBuffer *buffer;
@@ -768,7 +802,7 @@ save_image (GFile *file,
gint i, j, k; /* Counters */
/* Check that this is an indexed image, fail otherwise */
- type = gimp_drawable_type (layer);
+ type = gimp_drawable_type (drawable);
if (type == GIMP_INDEXEDA_IMAGE)
{
@@ -782,9 +816,9 @@ save_image (GFile *file,
}
/* Find out how offset this layer was */
- gimp_drawable_offsets (layer, &offx, &offy);
+ gimp_drawable_offsets (drawable, &offx, &offy);
- buffer = gimp_drawable_get_buffer (layer);
+ buffer = gimp_drawable_get_buffer (drawable);
width = gegl_buffer_get_width (buffer);
height = gegl_buffer_get_height (buffer);
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index 8ebc596881..5a032f3e1c 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -17,7 +17,7 @@
'despeckle' => { ui => 1, gegl => 1 },
'destripe' => { ui => 1, gegl => 1 },
'file-aa' => { ui => 1, gegl => 1, optional => 1, libs => 'AA_LIBS', old_api => 1 },
- 'file-cel' => { ui => 1, gegl => 1, old_api => 1 },
+ 'file-cel' => { ui => 1, gegl => 1 },
'file-csource' => { ui => 1, gegl => 1 },
'file-compressor' => { gio => 1, libdep => 'Z:BZIP2:LZMA', cflags => 'LZMA_CFLAGS' },
'file-desktop-link' => { gio => 1 },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]