mirror of https://github.com/GNOME/gimp.git
plug-ins: port file-fits to GimpProcedureConfig
This commit is contained in:
parent
d02d97e310
commit
50b8adc715
|
@ -55,15 +55,6 @@
|
|||
#define PLUG_IN_ROLE "gimp-file-fits"
|
||||
|
||||
|
||||
/* Load info */
|
||||
typedef struct
|
||||
{
|
||||
gint replace; /* replacement for blank/NaN-values */
|
||||
gint use_datamin; /* Use DATAMIN/MAX-scaling if possible */
|
||||
gint compose; /* compose images with naxis==3 */
|
||||
} FITSLoadVals;
|
||||
|
||||
|
||||
typedef struct _Fits Fits;
|
||||
typedef struct _FitsClass FitsClass;
|
||||
|
||||
|
@ -101,6 +92,8 @@ static GimpValueArray * fits_save (GimpProcedure *procedure,
|
|||
gpointer run_data);
|
||||
|
||||
static GimpImage * load_image (GFile *file,
|
||||
GObject *config,
|
||||
GimpRunMode run_mode,
|
||||
GError **error);
|
||||
static gint save_image (GFile *file,
|
||||
GimpImage *image,
|
||||
|
@ -127,14 +120,14 @@ static GimpImage * create_new_image (GFile *file,
|
|||
GimpLayer **layer,
|
||||
GeglBuffer **buffer);
|
||||
|
||||
static void check_load_vals (void);
|
||||
|
||||
static GimpImage * load_fits (GFile *file,
|
||||
FitsFile *ifp,
|
||||
GObject *config,
|
||||
guint picnum,
|
||||
guint ncompose);
|
||||
|
||||
static gboolean load_dialog (void);
|
||||
static gboolean load_dialog (GimpProcedure *procedure,
|
||||
GObject *config);
|
||||
static void show_fits_errors (void);
|
||||
|
||||
|
||||
|
@ -143,16 +136,6 @@ G_DEFINE_TYPE (Fits, fits, GIMP_TYPE_PLUG_IN)
|
|||
GIMP_MAIN (FITS_TYPE)
|
||||
|
||||
|
||||
static FITSLoadVals plvals =
|
||||
{
|
||||
0, /* Replace with black */
|
||||
0, /* Do autoscale on pixel-values */
|
||||
0 /* Don't compose images */
|
||||
};
|
||||
|
||||
static GimpRunMode l_run_mode;
|
||||
|
||||
|
||||
static void
|
||||
fits_class_init (FitsClass *klass)
|
||||
{
|
||||
|
@ -209,6 +192,24 @@ fits_create_procedure (GimpPlugIn *plug_in,
|
|||
"fit,fits");
|
||||
gimp_file_procedure_set_magics (GIMP_FILE_PROCEDURE (procedure),
|
||||
"0,string,SIMPLE");
|
||||
|
||||
GIMP_PROC_AUX_ARG_INT (procedure, "replace",
|
||||
"Replace",
|
||||
"Replacement for undefined pixels",
|
||||
0, 255, 0,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
GIMP_PROC_AUX_ARG_BOOLEAN (procedure, "use-data-min-max",
|
||||
"Use data min max",
|
||||
"Use DATAMIN/DATAMAX-scaling if possible",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
GIMP_PROC_AUX_ARG_BOOLEAN (procedure, "compose",
|
||||
"Compose",
|
||||
"Image composing",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE);
|
||||
}
|
||||
else if (! strcmp (name, SAVE_PROC))
|
||||
{
|
||||
|
@ -247,6 +248,7 @@ fits_load (GimpProcedure *procedure,
|
|||
const GimpValueArray *args,
|
||||
gpointer run_data)
|
||||
{
|
||||
GimpProcedureConfig *config;
|
||||
GimpValueArray *return_vals;
|
||||
GimpImage *image;
|
||||
GError *error = NULL;
|
||||
|
@ -254,30 +256,18 @@ fits_load (GimpProcedure *procedure,
|
|||
INIT_I18N ();
|
||||
gegl_init (NULL, NULL);
|
||||
|
||||
l_run_mode = run_mode;
|
||||
config = gimp_procedure_create_config (procedure);
|
||||
gimp_procedure_config_begin_run (config, NULL, run_mode, args);
|
||||
|
||||
switch (run_mode)
|
||||
if (run_mode == GIMP_RUN_INTERACTIVE)
|
||||
{
|
||||
case GIMP_RUN_INTERACTIVE:
|
||||
gimp_get_data (LOAD_PROC, &plvals);
|
||||
|
||||
if (! load_dialog ())
|
||||
if (! load_dialog (procedure, G_OBJECT (config)))
|
||||
return gimp_procedure_new_return_values (procedure,
|
||||
GIMP_PDB_CANCEL,
|
||||
NULL);
|
||||
break;
|
||||
|
||||
case GIMP_RUN_WITH_LAST_VALS:
|
||||
gimp_get_data (LOAD_PROC, &plvals);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
check_load_vals ();
|
||||
|
||||
image = load_image (file, &error);
|
||||
image = load_image (file, G_OBJECT (config), run_mode, &error);
|
||||
|
||||
/* Write out error messages of FITS-Library */
|
||||
show_fits_errors ();
|
||||
|
@ -287,7 +277,8 @@ fits_load (GimpProcedure *procedure,
|
|||
GIMP_PDB_EXECUTION_ERROR,
|
||||
error);
|
||||
|
||||
gimp_set_data (LOAD_PROC, &plvals, sizeof (FITSLoadVals));
|
||||
gimp_procedure_config_end_run (config, GIMP_PDB_SUCCESS);
|
||||
g_object_unref (config);
|
||||
|
||||
return_vals = gimp_procedure_new_return_values (procedure,
|
||||
GIMP_PDB_SUCCESS,
|
||||
|
@ -314,8 +305,6 @@ fits_save (GimpProcedure *procedure,
|
|||
INIT_I18N ();
|
||||
gegl_init (NULL, NULL);
|
||||
|
||||
l_run_mode = run_mode;
|
||||
|
||||
switch (run_mode)
|
||||
{
|
||||
case GIMP_RUN_INTERACTIVE:
|
||||
|
@ -351,6 +340,8 @@ fits_save (GimpProcedure *procedure,
|
|||
|
||||
static GimpImage *
|
||||
load_image (GFile *file,
|
||||
GObject *config,
|
||||
GimpRunMode run_mode,
|
||||
GError **error)
|
||||
{
|
||||
GimpImage *image;
|
||||
|
@ -363,6 +354,11 @@ load_image (GFile *file,
|
|||
FILE *fp;
|
||||
FitsFile *ifp;
|
||||
FitsHduList *hdu;
|
||||
gboolean compose_arg;
|
||||
|
||||
g_object_get (config,
|
||||
"compose", &compose_arg,
|
||||
NULL);
|
||||
|
||||
filename = g_file_get_path (file);
|
||||
fp = g_fopen (filename, "rb");
|
||||
|
@ -409,7 +405,7 @@ load_image (GFile *file,
|
|||
break;
|
||||
|
||||
/* Get number of FITS-images to compose */
|
||||
compose = (plvals.compose && (hdu_picnum == 1) && (hdu->naxis == 3) &&
|
||||
compose = (compose_arg && (hdu_picnum == 1) && (hdu->naxis == 3) &&
|
||||
(hdu->naxisn[2] > 1) && (hdu->naxisn[2] <= 4));
|
||||
|
||||
if (compose)
|
||||
|
@ -417,7 +413,7 @@ load_image (GFile *file,
|
|||
else
|
||||
compose = 1; /* Load as GRAY */
|
||||
|
||||
image = load_fits (file, ifp, picnum, compose);
|
||||
image = load_fits (file, ifp, config, picnum, compose);
|
||||
|
||||
/* Write out error messages of FITS-Library */
|
||||
show_fits_errors ();
|
||||
|
@ -447,7 +443,7 @@ load_image (GFile *file,
|
|||
fits_close (ifp);
|
||||
|
||||
/* Display images in reverse order. The last will be displayed by GIMP itself*/
|
||||
if (l_run_mode != GIMP_RUN_NONINTERACTIVE)
|
||||
if (run_mode != GIMP_RUN_NONINTERACTIVE)
|
||||
{
|
||||
for (k = n_images-1; k >= 1; k--)
|
||||
{
|
||||
|
@ -520,15 +516,6 @@ save_image (GFile *file,
|
|||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/* Check (and correct) the load values plvals */
|
||||
static void
|
||||
check_load_vals (void)
|
||||
{
|
||||
if (plvals.replace > 255) plvals.replace = 255;
|
||||
}
|
||||
|
||||
|
||||
/* Create an image. Sets layer_ID, drawable and rgn. Returns image_ID */
|
||||
static GimpImage *
|
||||
create_new_image (GFile *file,
|
||||
|
@ -578,6 +565,7 @@ create_new_image (GFile *file,
|
|||
static GimpImage *
|
||||
load_fits (GFile *file,
|
||||
FitsFile *ifp,
|
||||
GObject *config,
|
||||
guint picnum,
|
||||
guint ncompose)
|
||||
{
|
||||
|
@ -597,6 +585,13 @@ load_fits (GFile *file,
|
|||
FitsPixTransform trans;
|
||||
double datamax, replacetransform;
|
||||
const Babl *type, *format;
|
||||
gint replace;
|
||||
gboolean use_datamin;
|
||||
|
||||
g_object_get (config,
|
||||
"replace", &replace,
|
||||
"use-data-min-max", &use_datamin,
|
||||
NULL);
|
||||
|
||||
hdulist = fits_seek_image (ifp, (int)picnum);
|
||||
if (hdulist == NULL)
|
||||
|
@ -700,7 +695,7 @@ load_fits (GFile *file,
|
|||
/* If the transformation from pixel value to data value has been
|
||||
* specified, use it
|
||||
*/
|
||||
if (plvals.use_datamin &&
|
||||
if (use_datamin &&
|
||||
hdulist->used.datamin && hdulist->used.datamax &&
|
||||
hdulist->used.bzero && hdulist->used.bscale)
|
||||
{
|
||||
|
@ -720,7 +715,7 @@ load_fits (GFile *file,
|
|||
|
||||
trans.datamin = 0.0;
|
||||
trans.datamax = datamax;
|
||||
trans.replacement = plvals.replace * replacetransform;
|
||||
trans.replacement = replace * replacetransform;
|
||||
trans.dsttyp = 'k';
|
||||
|
||||
/* FITS stores images with bottom row first. Therefore we have to
|
||||
|
@ -1169,32 +1164,20 @@ save_fits (FitsFile *ofp,
|
|||
/* Load interface functions */
|
||||
|
||||
static gboolean
|
||||
load_dialog (void)
|
||||
load_dialog (GimpProcedure *procedure,
|
||||
GObject *config)
|
||||
{
|
||||
GtkWidget *dialog;
|
||||
GtkWidget *vbox;
|
||||
GtkListStore *store;
|
||||
GtkWidget *frame;
|
||||
gboolean run;
|
||||
|
||||
gimp_ui_init (PLUG_IN_BINARY);
|
||||
|
||||
dialog = gimp_dialog_new (_("Load FITS File"), 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);
|
||||
|
||||
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
|
||||
|
||||
gimp_window_set_transient (GTK_WINDOW (dialog));
|
||||
dialog = gimp_procedure_dialog_new (procedure,
|
||||
GIMP_PROCEDURE_CONFIG (config),
|
||||
_("Open FITS File"));
|
||||
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
|
||||
|
@ -1202,44 +1185,29 @@ load_dialog (void)
|
|||
vbox, TRUE, TRUE, 0);
|
||||
gtk_widget_show (vbox);
|
||||
|
||||
frame = gimp_int_radio_group_new (TRUE, _("Replacement for undefined pixels"),
|
||||
G_CALLBACK (gimp_radio_button_update),
|
||||
&plvals.replace, plvals.replace,
|
||||
|
||||
_("_Black"), 0, NULL,
|
||||
_("_White"), 255, NULL,
|
||||
|
||||
store = gimp_int_store_new (_("_Black"), 0,
|
||||
_("_White"), 255,
|
||||
NULL);
|
||||
frame = gimp_prop_int_radio_frame_new (config, "replace",
|
||||
_("Replacement for undefined pixels"),
|
||||
GIMP_INT_STORE (store));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
gtk_widget_show (frame);
|
||||
|
||||
frame =
|
||||
gimp_int_radio_group_new (TRUE, _("Pixel value scaling"),
|
||||
G_CALLBACK (gimp_radio_button_update),
|
||||
&plvals.use_datamin, plvals.use_datamin,
|
||||
|
||||
_("_Automatic"), FALSE, NULL,
|
||||
_("By _DATAMIN/DATAMAX"), TRUE, NULL,
|
||||
|
||||
NULL);
|
||||
frame = gimp_prop_boolean_radio_frame_new (config, "use-data-min-max",
|
||||
_("Pixel value scaling"),
|
||||
_("By _DATAMIN/DATAMAX"),
|
||||
_("_Automatic"));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
gtk_widget_show (frame);
|
||||
|
||||
frame =
|
||||
gimp_int_radio_group_new (TRUE, _("Image Composing"),
|
||||
G_CALLBACK (gimp_radio_button_update),
|
||||
&plvals.compose, plvals.compose,
|
||||
|
||||
C_("composing", "_None"), FALSE, NULL,
|
||||
"NA_XIS=3, NAXIS3=2,...,4", TRUE, NULL,
|
||||
|
||||
NULL);
|
||||
frame = gimp_prop_boolean_radio_frame_new (config, "compose",
|
||||
_("Image Composing"),
|
||||
"NA_XIS=3, NAXIS3=2,...,4",
|
||||
C_("composing", "_None"));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
gtk_widget_show (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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue