app/plug-in/plug-in-icc-profile.[ch] removed run-mode argument from

2006-12-18  Sven Neumann  <sven@gimp.org>

	* app/plug-in/plug-in-icc-profile.[ch]
	* plug-ins/common/lcms.c: removed run-mode argument from
	plug-in-icc-profile-info. Added new procedure to obtain
information
	about a color profile on disk.

	* app/widgets/Makefile.am
	* app/widgets/widgets-types.h
	* app/widgets/gimpprofilechooserdialog.[ch]: added a first draft
	of a file-chooser dialog for selecting a color profile.

	* app/dialogs/preferences-dialog.c: use it.
This commit is contained in:
Sven Neumann
2006-12-18 08:15:56 +00:00
committed by Sven Neumann
parent 988e1a442d
commit fd2b9ce3e9
9 changed files with 616 additions and 64 deletions

View File

@ -1,3 +1,17 @@
2006-12-18 Sven Neumann <sven@gimp.org>
* app/plug-in/plug-in-icc-profile.[ch]
* plug-ins/common/lcms.c: removed run-mode argument from
plug-in-icc-profile-info. Added new procedure to obtain information
about a color profile on disk.
* app/widgets/Makefile.am
* app/widgets/widgets-types.h
* app/widgets/gimpprofilechooserdialog.[ch]: added a first draft
of a file-chooser dialog for selecting a color profile.
* app/dialogs/preferences-dialog.c: use it.
2006-12-18 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppropwidgets.[ch]

View File

@ -46,6 +46,7 @@
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpmessagebox.h"
#include "widgets/gimpmessagedialog.h"
#include "widgets/gimpprofilechooserdialog.h"
#include "widgets/gimppropwidgets.h"
#include "widgets/gimptemplateeditor.h"
#include "widgets/gimpwidgets-utils.h"
@ -2332,11 +2333,14 @@ prefs_dialog_new (Gimp *gimp,
for (i = 0; i < G_N_ELEMENTS (profiles); i++)
{
GtkWidget *chooser;
chooser = gimp_profile_chooser_dialog_new (gimp,
gettext (profiles[i].fs_label));
button =
gimp_prop_file_chooser_button_new (color_config,
profiles[i].property_name,
gettext (profiles[i].fs_label),
GTK_FILE_CHOOSER_ACTION_OPEN);
gimp_prop_file_chooser_button_new_with_dialog (color_config,
profiles[i].property_name,
chooser);
gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
gettext (profiles[i].label), 0.0, 0.5,

View File

@ -41,6 +41,14 @@
#define ICC_PROFILE_APPLY_RGB_PROC "plug-in-icc-profile-apply-rgb"
#define ICC_PROFILE_INFO_PROC "plug-in-icc-profile-info"
#define ICC_PROFILE_FILE_INFO_PROC "plug-in-icc-profile-file-info"
static void
plug_in_icc_profile_info_return (GValueArray *return_vals,
gchar **name,
gchar **desc,
gchar **info);
gboolean
@ -135,9 +143,8 @@ plug_in_icc_profile_info (GimpImage *image,
procedure = gimp_pdb_lookup_procedure (gimp->pdb, ICC_PROFILE_INFO_PROC);
if (procedure &&
procedure->num_args >= 2 &&
GIMP_IS_PARAM_SPEC_INT32 (procedure->args[0]) &&
GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->args[1]))
procedure->num_args >= 1 &&
GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->args[0]))
{
GValueArray *return_vals;
GimpPDBStatusType status;
@ -145,8 +152,6 @@ plug_in_icc_profile_info (GimpImage *image,
return_vals =
gimp_pdb_execute_procedure_by_name (gimp->pdb, context, progress,
ICC_PROFILE_INFO_PROC,
GIMP_TYPE_INT32,
GIMP_RUN_NONINTERACTIVE,
GIMP_TYPE_IMAGE_ID,
gimp_image_get_ID (image),
G_TYPE_NONE);
@ -156,29 +161,7 @@ plug_in_icc_profile_info (GimpImage *image,
switch (status)
{
case GIMP_PDB_SUCCESS:
if (name)
{
GValue *value = g_value_array_get_nth (return_vals, 1);
*name = (G_VALUE_HOLDS_STRING (value) ?
g_value_dup_string (value) : NULL);
}
if (desc)
{
GValue *value = g_value_array_get_nth (return_vals, 2);
*desc = (G_VALUE_HOLDS_STRING (value) ?
g_value_dup_string (value) : NULL);
}
if (info)
{
GValue *value = g_value_array_get_nth (return_vals, 3);
*info = (G_VALUE_HOLDS_STRING (value) ?
g_value_dup_string (value) : NULL);
}
plug_in_icc_profile_info_return (return_vals, name, desc, info);
break;
default:
@ -197,3 +180,86 @@ plug_in_icc_profile_info (GimpImage *image,
return FALSE;
}
gboolean
plug_in_icc_profile_file_info (Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const gchar *filename,
gchar **name,
gchar **desc,
gchar **info,
GError **error)
{
GimpProcedure *procedure;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
g_return_val_if_fail (filename != NULL, FALSE);
procedure = gimp_pdb_lookup_procedure (gimp->pdb, ICC_PROFILE_FILE_INFO_PROC);
if (procedure &&
procedure->num_args >= 1 &&
GIMP_IS_PARAM_SPEC_STRING (procedure->args[0]))
{
GValueArray *return_vals;
GimpPDBStatusType status;
return_vals =
gimp_pdb_execute_procedure_by_name (gimp->pdb, context, progress,
ICC_PROFILE_FILE_INFO_PROC,
G_TYPE_STRING, filename,
G_TYPE_NONE);
status = g_value_get_enum (return_vals->values);
switch (status)
{
case GIMP_PDB_SUCCESS:
plug_in_icc_profile_info_return (return_vals, name, desc, info);
break;
default:
g_set_error (error, 0, 0,
_("Error running '%s'"), ICC_PROFILE_FILE_INFO_PROC);
break;
}
g_value_array_free (return_vals);
return (status == GIMP_PDB_SUCCESS);
}
g_set_error (error, 0, 0,
_("Plug-In missing (%s)"), ICC_PROFILE_FILE_INFO_PROC);
return FALSE;
}
static void
plug_in_icc_profile_info_return (GValueArray *return_vals,
gchar **name,
gchar **desc,
gchar **info)
{
if (name)
{
GValue *value = g_value_array_get_nth (return_vals, 1);
*name = G_VALUE_HOLDS_STRING (value) ? g_value_dup_string (value) : NULL;
}
if (desc)
{
GValue *value = g_value_array_get_nth (return_vals, 2);
*desc = G_VALUE_HOLDS_STRING (value) ? g_value_dup_string (value) : NULL;
}
if (info)
{
GValue *value = g_value_array_get_nth (return_vals, 3);
*info = G_VALUE_HOLDS_STRING (value) ? g_value_dup_string (value) : NULL;
}
}

View File

@ -37,5 +37,14 @@ gboolean plug_in_icc_profile_info (GimpImage *image,
gchar **info,
GError **error);
gboolean plug_in_icc_profile_file_info (Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const gchar *filename,
gchar **name,
gchar **desc,
gchar **info,
GError **error);
#endif /* __PLUG_IN_ICC_PROFILE_H__ */

View File

@ -209,6 +209,8 @@ libappwidgets_a_sources = \
gimppixbuf.h \
gimppluginaction.c \
gimppluginaction.h \
gimpprofilechooserdialog.c \
gimpprofilechooserdialog.h \
gimpprogressbox.c \
gimpprogressbox.h \
gimpprogressdialog.c \

View File

@ -0,0 +1,314 @@
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* GimpProfileChooserDialog
* Copyright (C) 2006 Sven Neumann <sven@gimp.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <gtk/gtk.h>
#include "widgets-types.h"
#include "core/gimp.h"
#include "plug-in/plug-in-icc-profile.h"
#include "gimpprofilechooserdialog.h"
#include "gimp-intl.h"
enum
{
PROP_0,
PROP_GIMP
};
static void gimp_profile_chooser_dialog_class_init (GimpProfileChooserDialogClass *klass);
static void gimp_profile_chooser_dialog_init (GimpProfileChooserDialog *dialog);
static GObject * gimp_profile_chooser_dialog_constructor (GType type,
guint n_params,
GObjectConstructParam *params);
static void gimp_profile_chooser_dialog_dispose (GObject *object);
static void gimp_profile_chooser_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_profile_chooser_dialog_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gimp_profile_chooser_dialog_style_set (GtkWidget *widget,
GtkStyle *prev_style);
static void gimp_profile_chooser_dialog_update_preview (GimpProfileChooserDialog *dialog);
static GtkWidget * gimp_profile_view_new (GimpProfileChooserDialog *dialog);
static gboolean gimp_profile_view_query (GimpProfileChooserDialog *dialog);
G_DEFINE_TYPE (GimpProfileChooserDialog, gimp_profile_chooser_dialog,
GTK_TYPE_FILE_CHOOSER_DIALOG);
#define parent_class gimp_profile_chooser_dialog_parent_class
static void
gimp_profile_chooser_dialog_class_init (GimpProfileChooserDialogClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->constructor = gimp_profile_chooser_dialog_constructor;
object_class->dispose = gimp_profile_chooser_dialog_dispose;
object_class->get_property = gimp_profile_chooser_dialog_get_property;
object_class->set_property = gimp_profile_chooser_dialog_set_property;
widget_class->style_set = gimp_profile_chooser_dialog_style_set;
g_object_class_install_property (object_class, PROP_GIMP,
g_param_spec_object ("gimp",
NULL, NULL,
GIMP_TYPE_GIMP,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
}
static void
gimp_profile_chooser_dialog_init (GimpProfileChooserDialog *dialog)
{
dialog->idle_id = 0;
dialog->info_label = g_object_new (GTK_TYPE_LABEL,
"xalign", 0.0,
"yalign", 0.0,
NULL);
gtk_widget_set_size_request (dialog->info_label, 200, -1);
dialog->preview = gimp_profile_view_new (dialog);
}
static GObject *
gimp_profile_chooser_dialog_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object;
GimpProfileChooserDialog *dialog;
GtkFileFilter *filter;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
dialog = GIMP_PROFILE_CHOOSER_DIALOG (object);
gtk_window_set_role (GTK_WINDOW (dialog), "gimp-profile-chooser-dialog");
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
NULL);
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, _("All files (*.*)"));
gtk_file_filter_add_pattern (filter, "*");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, _("ICC color profile (*.icc)"));
gtk_file_filter_add_pattern (filter, "*.[Ii][Cc][Cc]");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (dialog),
dialog->preview);
g_signal_connect (dialog, "update-preview",
G_CALLBACK (gimp_profile_chooser_dialog_update_preview),
NULL);
return object;
}
static void
gimp_profile_chooser_dialog_dispose (GObject *object)
{
GimpProfileChooserDialog *dialog = GIMP_PROFILE_CHOOSER_DIALOG (object);
if (dialog->idle_id)
{
g_source_remove (dialog->idle_id);
dialog->idle_id = 0;
}
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gimp_profile_chooser_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GimpProfileChooserDialog *dialog = GIMP_PROFILE_CHOOSER_DIALOG (object);
switch (prop_id)
{
case PROP_GIMP:
dialog->gimp = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gimp_profile_chooser_dialog_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GimpProfileChooserDialog *dialog = GIMP_PROFILE_CHOOSER_DIALOG (object);
switch (prop_id)
{
case PROP_GIMP:
g_value_set_object (value, dialog->gimp);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gimp_profile_chooser_dialog_style_set (GtkWidget *widget,
GtkStyle *prev_style)
{
GimpProfileChooserDialog *dialog = GIMP_PROFILE_CHOOSER_DIALOG (widget);
GtkWidget *ebox;
GTK_WIDGET_CLASS (parent_class)->style_set (widget, prev_style);
gtk_widget_modify_bg (dialog->preview, GTK_STATE_NORMAL,
&widget->style->base[GTK_STATE_NORMAL]);
gtk_widget_modify_bg (dialog->preview, GTK_STATE_INSENSITIVE,
&widget->style->base[GTK_STATE_NORMAL]);
ebox = gtk_bin_get_child (GTK_BIN (widget));
gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL,
&widget->style->base[GTK_STATE_NORMAL]);
gtk_widget_modify_bg (ebox, GTK_STATE_INSENSITIVE,
&widget->style->base[GTK_STATE_NORMAL]);
}
GtkWidget *
gimp_profile_chooser_dialog_new (Gimp *gimp,
const gchar *title)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
return g_object_new (GIMP_TYPE_PROFILE_CHOOSER_DIALOG,
"gimp", gimp,
"title", title,
NULL);
}
static void
gimp_profile_chooser_dialog_update_preview (GimpProfileChooserDialog *dialog)
{
gtk_label_set_text (GTK_LABEL (dialog->info_label), "");
if (dialog->idle_id)
g_source_remove (dialog->idle_id);
dialog->idle_id = g_idle_add ((GSourceFunc) gimp_profile_view_query,
dialog);
}
static GtkWidget *
gimp_profile_view_new (GimpProfileChooserDialog *dialog)
{
GtkWidget *frame;
GtkWidget *ebox;
GtkWidget *vbox;
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
ebox = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (frame), ebox);
gtk_widget_show (ebox);
vbox = gtk_vbox_new (FALSE, 12);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (ebox), vbox);
gtk_widget_show (vbox);
gtk_box_pack_start (GTK_BOX (vbox), dialog->info_label, FALSE, FALSE, 0);
gtk_widget_show (dialog->info_label);
return frame;
}
static gboolean
gimp_profile_view_query (GimpProfileChooserDialog *dialog)
{
gchar *uri;
gchar *filename;
uri = gtk_file_chooser_get_preview_uri (GTK_FILE_CHOOSER (dialog));
if (! uri)
return FALSE;
filename = g_filename_from_uri (uri, NULL, NULL);
if (filename)
{
gchar *info = NULL;
if (plug_in_icc_profile_file_info (dialog->gimp,
gimp_get_user_context (dialog->gimp),
NULL,
filename,
NULL, NULL, &info,
NULL))
{
gtk_label_set_text (GTK_LABEL (dialog->info_label), info);
g_free (info);
}
g_free (filename);
}
g_free (uri);
return FALSE;
}

View File

@ -0,0 +1,62 @@
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* GimpProfileChooserDialog
* Copyright (C) 2006 Sven Neumann <sven@gimp.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_PROFILE_CHOOSER_DIALOG_H__
#define __GIMP_PROFILE_CHOOSER_DIALOG_H__
G_BEGIN_DECLS
#define GIMP_TYPE_PROFILE_CHOOSER_DIALOG (gimp_profile_chooser_dialog_get_type ())
#define GIMP_PROFILE_CHOOSER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_PROFILE_CHOOSER_DIALOG, GimpProfileChooserDialog))
#define GIMP_PROFILE_CHOOSER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_PROFILE_CHOOSER_DIALOG, GimpProfileChooserDialogClass))
#define GIMP_IS_PROFILE_CHOOSER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_PROFILE_CHOOSER_DIALOG))
#define GIMP_IS_PROFILE_CHOOSER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_PROFILE_CHOOSER_DIALOG))
#define GIMP_PROFILE_CHOOSER_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_PROFILE_CHOOSER_DIALOG, GimpProfileChooserDialogClass))
typedef struct _GimpProfileChooserDialogClass GimpProfileChooserDialogClass;
struct _GimpProfileChooserDialog
{
GtkFileChooserDialog parent_instance;
Gimp *gimp;
GtkWidget *preview;
GtkWidget *info_label;
guint idle_id;
};
struct _GimpProfileChooserDialogClass
{
GtkFileChooserDialogClass parent_class;
};
GType gimp_profile_chooser_dialog_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_profile_chooser_dialog_new (Gimp *gimp,
const gchar *title);
#endif /* __GIMP_PROFILE_CHOOSER_DIALOG_H__ */

View File

@ -130,6 +130,7 @@ typedef struct _GimpColorDialog GimpColorDialog;
typedef struct _GimpErrorDialog GimpErrorDialog;
typedef struct _GimpFileDialog GimpFileDialog;
typedef struct _GimpMessageDialog GimpMessageDialog;
typedef struct _GimpProfileChooserDialog GimpProfileChooserDialog;
typedef struct _GimpProgressDialog GimpProgressDialog;
typedef struct _GimpTextEditor GimpTextEditor;
typedef struct _GimpToolDialog GimpToolDialog;

View File

@ -43,6 +43,7 @@
#define PLUG_IN_PROC_APPLY_RGB "plug-in-icc-profile-apply-rgb"
#define PLUG_IN_PROC_INFO "plug-in-icc-profile-info"
#define PLUG_IN_PROC_FILE_INFO "plug-in-icc-profile-file-info"
enum
@ -61,6 +62,7 @@ enum
PROC_APPLY,
PROC_APPLY_RGB,
PROC_INFO,
PROC_FILE_INFO,
NONE
};
@ -78,19 +80,23 @@ static void run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals);
static GimpPDBStatusType lcms_icc_set (GimpColorConfig *config,
gint32 image,
const gchar *filename);
static GimpPDBStatusType lcms_icc_apply (GimpColorConfig *config,
GimpRunMode run_mode,
gint32 image,
const gchar *filename,
gboolean *dont_ask);
static GimpPDBStatusType lcms_icc_info (GimpColorConfig *config,
gint32 image,
gchar **name,
gchar **desc,
gchar **info);
static GimpPDBStatusType lcms_icc_set (GimpColorConfig *config,
gint32 image,
const gchar *filename);
static GimpPDBStatusType lcms_icc_apply (GimpColorConfig *config,
GimpRunMode run_mode,
gint32 image,
const gchar *filename,
gboolean *dont_ask);
static GimpPDBStatusType lcms_icc_info (GimpColorConfig *config,
gint32 image,
gchar **name,
gchar **desc,
gchar **info);
static GimpPDBStatusType lcms_icc_file_info (const gchar *filename,
gchar **name,
gchar **desc,
gchar **info);
static cmsHPROFILE lcms_image_get_profile (GimpColorConfig *config,
gint32 image);
@ -127,14 +133,23 @@ static const GimpParamDef args[] =
{ GIMP_PDB_IMAGE, "image", "Input image" },
{ GIMP_PDB_STRING, "profile", "Filename of an ICC color profile" }
};
static const GimpParamDef image_args[] =
{
{ GIMP_PDB_IMAGE, "image", "Input image" },
};
static const GimpParamDef file_args[] =
{
{ GIMP_PDB_STRING, "profile", "Filename of an ICC color profile" }
};
static const Procedure procedures[] =
{
{ PLUG_IN_PROC_SET, G_N_ELEMENTS (args) },
{ PLUG_IN_PROC_SET_RGB, G_N_ELEMENTS (base_args) },
{ PLUG_IN_PROC_APPLY, G_N_ELEMENTS (args) },
{ PLUG_IN_PROC_APPLY_RGB, G_N_ELEMENTS (base_args) },
{ PLUG_IN_PROC_INFO, G_N_ELEMENTS (base_args) }
{ PLUG_IN_PROC_SET, G_N_ELEMENTS (args) },
{ PLUG_IN_PROC_SET_RGB, G_N_ELEMENTS (base_args) },
{ PLUG_IN_PROC_APPLY, G_N_ELEMENTS (args) },
{ PLUG_IN_PROC_APPLY_RGB, G_N_ELEMENTS (base_args) },
{ PLUG_IN_PROC_INFO, G_N_ELEMENTS (image_args) },
{ PLUG_IN_PROC_FILE_INFO, G_N_ELEMENTS (file_args) }
};
const GimpPlugInInfo PLUG_IN_INFO =
@ -232,9 +247,23 @@ query (void)
N_("Color Profile Information"),
"*",
GIMP_PLUGIN,
G_N_ELEMENTS (base_args),
G_N_ELEMENTS (image_args),
G_N_ELEMENTS (info_return_vals),
base_args, info_return_vals);
image_args, info_return_vals);
gimp_install_procedure (PLUG_IN_PROC_FILE_INFO,
"Retrieve information about a color profile",
"This procedure returns information about an ICC "
"color profile on disk.",
"Sven Neumann",
"Sven Neumann",
"2006",
N_("Color Profile Information"),
"*",
GIMP_PLUGIN,
G_N_ELEMENTS (file_args),
G_N_ELEMENTS (info_return_vals),
file_args, info_return_vals);
}
static void
@ -244,12 +273,12 @@ run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals)
{
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint proc;
GimpRunMode run_mode;
gint32 image;
const gchar *filename;
GimpColorConfig *config;
GimpPDBStatusType status = GIMP_PDB_CALLING_ERROR;
gint proc = NONE;
GimpRunMode run_mode = GIMP_RUN_NONINTERACTIVE;
gint32 image = -1;
const gchar *filename = NULL;
GimpColorConfig *config = NULL;
gboolean dont_ask = FALSE;
static GimpParam values[6];
@ -279,11 +308,30 @@ run (const gchar *name,
return;
}
config = gimp_get_color_configuration ();
if (proc != PROC_FILE_INFO)
config = gimp_get_color_configuration ();
run_mode = param[0].data.d_int32;
image = param[1].data.d_image;
filename = (procedures[proc].nparams > 2) ? param[2].data.d_string : NULL;
switch (proc)
{
case PROC_SET_RGB:
case PROC_APPLY_RGB:
filename = param[2].data.d_string;
/* fallthrough */
case PROC_SET:
case PROC_APPLY:
run_mode = param[0].data.d_int32;
image = param[1].data.d_image;
break;
case PROC_INFO:
image = param[0].data.d_image;
break;
case PROC_FILE_INFO:
filename = param[0].data.d_string;
break;
}
switch (proc)
{
@ -306,12 +354,18 @@ run (const gchar *name,
break;
case PROC_INFO:
case PROC_FILE_INFO:
{
gchar *name;
gchar *desc;
gchar *info;
status = lcms_icc_info (config, image, &name, &desc, &info);
cmsErrorAction (LCMS_ERROR_IGNORE);
if (proc == PROC_INFO)
status = lcms_icc_info (config, image, &name, &desc, &info);
else
status = lcms_icc_file_info (filename, &name, &desc, &info);
if (status == GIMP_PDB_SUCCESS)
{
@ -330,7 +384,8 @@ run (const gchar *name,
break;
}
g_object_unref (config);
if (config)
g_object_unref (config);
values[0].data.d_status = status;
}
@ -524,6 +579,31 @@ lcms_icc_info (GimpColorConfig *config,
return GIMP_PDB_SUCCESS;
}
static GimpPDBStatusType
lcms_icc_file_info (const gchar *filename,
gchar **name,
gchar **desc,
gchar **info)
{
cmsHPROFILE profile;
if (! g_file_test (filename, G_FILE_TEST_IS_REGULAR))
return GIMP_PDB_EXECUTION_ERROR;
profile = cmsOpenProfileFromFile (filename, "r");
if (! profile)
return GIMP_PDB_EXECUTION_ERROR;
*name = lcms_icc_profile_get_name (profile);
*desc = lcms_icc_profile_get_desc (profile);
*info = lcms_icc_profile_get_info (profile);
cmsCloseProfile (profile);
return GIMP_PDB_SUCCESS;
}
static cmsHPROFILE
lcms_image_get_profile (GimpColorConfig *config,
gint32 image)