[gimp] Bug 756389 - Color-managing grayscale images
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 756389 - Color-managing grayscale images
- Date: Mon, 14 Dec 2015 22:26:21 +0000 (UTC)
commit 5098338470a61f14e737a4e15afa12bd6e7b664b
Author: Michael Natterer <mitch gimp org>
Date: Mon Dec 14 23:23:25 2015 +0100
Bug 756389 - Color-managing grayscale images
Allow to set profiles on grayscale images. Change profile validation
to check for image type and profile type. Actually the patch simply
makes some pieces of code less restrictive. Change user-visible
strings in the profile dialogs accordingly. Change PDB docs
accordingly.
app/core/gimpimage-color-profile.c | 156 +++++++++++++++++------------
app/core/gimpimage.c | 2 +-
app/dialogs/color-profile-dialog.c | 32 +++++--
app/dialogs/color-profile-import-dialog.c | 17 +++-
app/gegl/gimp-gegl-loops.c | 28 +++--
app/pdb/image-color-profile-cmds.c | 10 +-
libgimp/gimpimagecolorprofile_pdb.c | 14 ++-
tools/pdbgen/pdb/image_color_profile.pdb | 17 ++--
8 files changed, 169 insertions(+), 107 deletions(-)
---
diff --git a/app/core/gimpimage-color-profile.c b/app/core/gimpimage-color-profile.c
index a183ad3..c325e0f 100644
--- a/app/core/gimpimage-color-profile.c
+++ b/app/core/gimpimage-color-profile.c
@@ -55,18 +55,18 @@
/* local function prototypes */
-static void gimp_image_convert_profile_rgb (GimpImage *image,
- GimpColorProfile *src_profile,
- GimpColorProfile *dest_profile,
- GimpColorRenderingIntent intent,
- gboolean bpc,
- GimpProgress *progress);
-static void gimp_image_convert_profile_indexed (GimpImage *image,
- GimpColorProfile *src_profile,
- GimpColorProfile *dest_profile,
- GimpColorRenderingIntent intent,
- gboolean bpc,
- GimpProgress *progress);
+static void gimp_image_convert_profile_layers (GimpImage *image,
+ GimpColorProfile *src_profile,
+ GimpColorProfile *dest_profile,
+ GimpColorRenderingIntent intent,
+ gboolean bpc,
+ GimpProgress *progress);
+static void gimp_image_convert_profile_colormap (GimpImage *image,
+ GimpColorProfile *src_profile,
+ GimpColorProfile *dest_profile,
+ GimpColorRenderingIntent intent,
+ gboolean bpc,
+ GimpProgress *progress);
/* public functions */
@@ -246,18 +246,23 @@ gimp_image_validate_color_profile (GimpImage *image,
if (gimp_image_get_base_type (image) == GIMP_GRAY)
{
- g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
- _("ICC profile validation failed: "
- "Cannot attach a color profile to a GRAY image"));
- return FALSE;
+ if (! gimp_color_profile_is_gray (profile))
+ {
+ g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+ _("ICC profile validation failed: "
+ "Color profile is not for GRAY color space"));
+ return FALSE;
+ }
}
-
- if (! gimp_color_profile_is_rgb (profile))
+ else
{
- g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
- _("ICC profile validation failed: "
- "Color profile is not for RGB color space"));
- return FALSE;
+ if (! gimp_color_profile_is_rgb (profile))
+ {
+ g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+ _("ICC profile validation failed: "
+ "Color profile is not for RGB color space"));
+ return FALSE;
+ }
}
if (is_builtin)
@@ -302,41 +307,65 @@ gimp_image_set_color_profile (GimpImage *image,
GimpColorProfile *
gimp_image_get_builtin_color_profile (GimpImage *image)
{
- static GimpColorProfile *srgb_profile = NULL;
- static GimpColorProfile *linear_rgb_profile = NULL;
+ static GimpColorProfile *srgb_profile = NULL;
+ static GimpColorProfile *linear_rgb_profile = NULL;
+ static GimpColorProfile *gray_profile = NULL;
+ static GimpColorProfile *linear_gray_profile = NULL;
const Babl *format;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
- if (! srgb_profile)
- {
- srgb_profile = gimp_color_profile_new_srgb ();
- linear_rgb_profile = gimp_color_profile_new_linear_rgb ();
- }
-
format = gimp_image_get_layer_format (image, FALSE);
- if (gimp_babl_format_get_linear (format))
+ if (gimp_image_get_base_type (image) == GIMP_GRAY)
{
- if (! srgb_profile)
+ if (gimp_babl_format_get_linear (format))
{
- srgb_profile = gimp_color_profile_new_srgb ();
- g_object_add_weak_pointer (G_OBJECT (srgb_profile),
- (gpointer) &srgb_profile);
+ if (! linear_gray_profile)
+ {
+ linear_gray_profile = gimp_color_profile_new_linear_gray ();
+ g_object_add_weak_pointer (G_OBJECT (linear_gray_profile),
+ (gpointer) &linear_gray_profile);
+ }
+
+ return linear_gray_profile;
}
+ else
+ {
+ if (! gray_profile)
+ {
+ gray_profile = gimp_color_profile_new_srgb_gray ();
+ g_object_add_weak_pointer (G_OBJECT (gray_profile),
+ (gpointer) &gray_profile);
+ }
- return linear_rgb_profile;
+ return gray_profile;
+ }
}
else
{
- if (! linear_rgb_profile)
+ if (gimp_babl_format_get_linear (format))
{
- linear_rgb_profile = gimp_color_profile_new_linear_rgb ();
- g_object_add_weak_pointer (G_OBJECT (linear_rgb_profile),
- (gpointer) &linear_rgb_profile);
+ if (! linear_rgb_profile)
+ {
+ linear_rgb_profile = gimp_color_profile_new_linear_rgb ();
+ g_object_add_weak_pointer (G_OBJECT (linear_rgb_profile),
+ (gpointer) &linear_rgb_profile);
+ }
+
+ return linear_rgb_profile;
}
+ else
+ {
+ if (! srgb_profile)
+ {
+ srgb_profile = gimp_color_profile_new_srgb ();
+ g_object_add_weak_pointer (G_OBJECT (srgb_profile),
+ (gpointer) &srgb_profile);
+ }
- return srgb_profile;
+ return srgb_profile;
+ }
}
}
@@ -375,20 +404,18 @@ gimp_image_convert_color_profile (GimpImage *image,
switch (gimp_image_get_base_type (image))
{
case GIMP_RGB:
- gimp_image_convert_profile_rgb (image,
- src_profile, dest_profile,
- intent, bpc,
- progress);
- break;
-
case GIMP_GRAY:
+ gimp_image_convert_profile_layers (image,
+ src_profile, dest_profile,
+ intent, bpc,
+ progress);
break;
case GIMP_INDEXED:
- gimp_image_convert_profile_indexed (image,
- src_profile, dest_profile,
- intent, bpc,
- progress);
+ gimp_image_convert_profile_colormap (image,
+ src_profile, dest_profile,
+ intent, bpc,
+ progress);
break;
}
@@ -418,9 +445,6 @@ gimp_image_import_color_profile (GimpImage *image,
config = image->gimp->config->color_management;
- if (gimp_image_get_base_type (image) == GIMP_GRAY)
- return;
-
if (config->mode == GIMP_COLOR_MANAGEMENT_OFF)
return;
@@ -480,12 +504,12 @@ gimp_image_import_color_profile (GimpImage *image,
/* private functions */
static void
-gimp_image_convert_profile_rgb (GimpImage *image,
- GimpColorProfile *src_profile,
- GimpColorProfile *dest_profile,
- GimpColorRenderingIntent intent,
- gboolean bpc,
- GimpProgress *progress)
+gimp_image_convert_profile_layers (GimpImage *image,
+ GimpColorProfile *src_profile,
+ GimpColorProfile *dest_profile,
+ GimpColorRenderingIntent intent,
+ gboolean bpc,
+ GimpProgress *progress)
{
GList *layers;
GList *list;
@@ -543,12 +567,12 @@ gimp_image_convert_profile_rgb (GimpImage *image,
}
static void
-gimp_image_convert_profile_indexed (GimpImage *image,
- GimpColorProfile *src_profile,
- GimpColorProfile *dest_profile,
- GimpColorRenderingIntent intent,
- gboolean bpc,
- GimpProgress *progress)
+gimp_image_convert_profile_colormap (GimpImage *image,
+ GimpColorProfile *src_profile,
+ GimpColorProfile *dest_profile,
+ GimpColorRenderingIntent intent,
+ gboolean bpc,
+ GimpProgress *progress)
{
cmsHPROFILE src_lcms;
cmsHPROFILE dest_lcms;
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index ac44c29..0b335f4 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -1387,7 +1387,7 @@ gimp_image_color_managed_get_color_profile (GimpColorManaged *managed)
profile = gimp_image_get_color_profile (image);
- if (! profile && gimp_image_get_base_type (image) != GIMP_GRAY)
+ if (! profile)
profile = gimp_image_get_builtin_color_profile (image);
return profile;
diff --git a/app/dialogs/color-profile-dialog.c b/app/dialogs/color-profile-dialog.c
index 9588fbc..727258d 100644
--- a/app/dialogs/color-profile-dialog.c
+++ b/app/dialogs/color-profile-dialog.c
@@ -309,28 +309,44 @@ color_profile_combo_box_new (ProfileDialog *dialog)
profile = gimp_image_get_builtin_color_profile (dialog->image);
- label = g_strdup_printf (_("Built-in RGB (%s)"),
- gimp_color_profile_get_label (profile));
+ if (gimp_image_get_base_type (dialog->image) == GIMP_GRAY)
+ {
+ label = g_strdup_printf (_("Built-in GRAY (%s)"),
+ gimp_color_profile_get_label (profile));
+
+ profile = gimp_color_config_get_gray_color_profile (dialog->config, &error);
+ }
+ else
+ {
+ label = g_strdup_printf (_("Built-in RGB (%s)"),
+ gimp_color_profile_get_label (profile));
+
+ profile = gimp_color_config_get_rgb_color_profile (dialog->config, &error);
+ }
gimp_color_profile_combo_box_add_file (GIMP_COLOR_PROFILE_COMBO_BOX (combo),
NULL, label);
-
g_free (label);
- profile = gimp_color_config_get_rgb_color_profile (dialog->config, &error);
-
if (profile)
{
GFile *file = g_file_new_for_path (dialog->config->rgb_profile);
- label = g_strdup_printf (_("Preferred RGB (%s)"),
- gimp_color_profile_get_label (profile));
+ if (gimp_image_get_base_type (dialog->image) == GIMP_GRAY)
+ {
+ label = g_strdup_printf (_("Preferred GRAY (%s)"),
+ gimp_color_profile_get_label (profile));
+ }
+ else
+ {
+ label = g_strdup_printf (_("Preferred RGB (%s)"),
+ gimp_color_profile_get_label (profile));
+ }
g_object_unref (profile);
gimp_color_profile_combo_box_add_file (GIMP_COLOR_PROFILE_COMBO_BOX (combo),
file, label);
-
g_object_unref (file);
g_free (label);
}
diff --git a/app/dialogs/color-profile-import-dialog.c b/app/dialogs/color-profile-import-dialog.c
index 30ee676..051e12a 100644
--- a/app/dialogs/color-profile-import-dialog.c
+++ b/app/dialogs/color-profile-import-dialog.c
@@ -62,6 +62,8 @@ color_profile_import_dialog_run (GimpImage *image,
GtkWidget *toggle;
GimpColorProfile *src_profile;
GimpColorProfilePolicy policy;
+ const gchar *title;
+ const gchar *frame_title;
gchar *text;
g_return_val_if_fail (GIMP_IS_IMAGE (image), GIMP_COLOR_PROFILE_POLICY_KEEP);
@@ -73,9 +75,20 @@ color_profile_import_dialog_run (GimpImage *image,
src_profile = gimp_image_get_color_profile (image);
*dest_profile = gimp_image_get_builtin_color_profile (image);
+ if (gimp_image_get_base_type (image) == GIMP_GRAY)
+ {
+ title = _("Convert to Grayscale Working Space?");
+ frame_title = _("Convert the image to the grayscale working space?");
+ }
+ else
+ {
+ title = _("Convert to RGB Working Space?");
+ frame_title = _("Convert the image to the RGB working space?");
+ }
+
dialog =
gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
- _("Convert to RGB Working Space?"),
+ title,
"gimp-image-color-profile-import",
NULL,
_("Import the image from a color profile"),
@@ -112,7 +125,7 @@ color_profile_import_dialog_run (GimpImage *image,
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_show (label);
- frame = gimp_frame_new (_("Convert the image to the RGB working space?"));
+ frame = gimp_frame_new (frame_title);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
diff --git a/app/gegl/gimp-gegl-loops.c b/app/gegl/gimp-gegl-loops.c
index 47af27e..f319bd0 100644
--- a/app/gegl/gimp-gegl-loops.c
+++ b/app/gegl/gimp-gegl-loops.c
@@ -667,23 +667,31 @@ static gboolean
gimp_color_profile_can_gegl_copy (GimpColorProfile *src_profile,
GimpColorProfile *dest_profile)
{
- static GimpColorProfile *srgb_profile = NULL;
- static GimpColorProfile *linear_rgb_profile = NULL;
+ static GimpColorProfile *srgb_profile = NULL;
+ static GimpColorProfile *linear_rgb_profile = NULL;
+ static GimpColorProfile *gray_profile = NULL;
+ static GimpColorProfile *linear_gray_profile = NULL;
if (gimp_color_profile_is_equal (src_profile, dest_profile))
return TRUE;
if (! srgb_profile)
{
- srgb_profile = gimp_color_profile_new_srgb ();
- linear_rgb_profile = gimp_color_profile_new_linear_rgb ();
+ srgb_profile = gimp_color_profile_new_srgb ();
+ linear_rgb_profile = gimp_color_profile_new_linear_rgb ();
+ gray_profile = gimp_color_profile_new_srgb_gray ();
+ linear_gray_profile = gimp_color_profile_new_linear_gray ();
}
- if ((gimp_color_profile_is_equal (src_profile, srgb_profile) ||
- gimp_color_profile_is_equal (src_profile, linear_rgb_profile))
+ if ((gimp_color_profile_is_equal (src_profile, srgb_profile) ||
+ gimp_color_profile_is_equal (src_profile, linear_rgb_profile) ||
+ gimp_color_profile_is_equal (src_profile, gray_profile) ||
+ gimp_color_profile_is_equal (src_profile, linear_gray_profile))
&&
- (gimp_color_profile_is_equal (dest_profile, srgb_profile) ||
- gimp_color_profile_is_equal (dest_profile, linear_rgb_profile)))
+ (gimp_color_profile_is_equal (dest_profile, srgb_profile) ||
+ gimp_color_profile_is_equal (dest_profile, linear_rgb_profile) ||
+ gimp_color_profile_is_equal (dest_profile, gray_profile) ||
+ gimp_color_profile_is_equal (dest_profile, linear_gray_profile)))
return TRUE;
return FALSE;
@@ -712,9 +720,7 @@ gimp_gegl_convert_color_profile (GeglBuffer *src_buffer,
src_format = gegl_buffer_get_format (src_buffer);
dest_format = gegl_buffer_get_format (dest_buffer);
- if ((gimp_babl_format_get_base_type (src_format) != GIMP_RGB) ||
- (gimp_babl_format_get_base_type (dest_format) != GIMP_RGB) ||
- gimp_color_profile_can_gegl_copy (src_profile, dest_profile))
+ if (gimp_color_profile_can_gegl_copy (src_profile, dest_profile))
{
gegl_buffer_copy (src_buffer, src_rect, GEGL_ABYSS_NONE,
dest_buffer, dest_rect);
diff --git a/app/pdb/image-color-profile-cmds.c b/app/pdb/image-color-profile-cmds.c
index 15ecfd2..b958387 100644
--- a/app/pdb/image-color-profile-cmds.c
+++ b/app/pdb/image-color-profile-cmds.c
@@ -112,8 +112,8 @@ image_get_effective_color_profile_invoker (GimpProcedure *procedure,
if (profile)
{
- const guint8 *data;
- gsize length;
+ const guint8 *data;
+ gsize length;
data = gimp_color_profile_get_icc_profile (profile, &length);
@@ -368,7 +368,7 @@ register_image_color_profile_procs (GimpPDB *pdb)
gimp_procedure_set_static_strings (procedure,
"gimp-image-get-effective-color-profile",
"Returns the color profile that is used for the image",
- "This procedure returns the color profile that is actually used for
this image, which is the profile returned by 'gimp-image-get-color-profile' if the image has a profile
assigned, or a generated default RGB profile. If the image is not RGB or INDEXED, NULL is returned.",
+ "This procedure returns the color profile that is actually used for
this image, which is the profile returned by 'gimp-image-get-color-profile' if the image has a profile
assigned, or a generated default RGB or GRAY profile, according to the image's type.",
"Michael Natterer <mitch gimp org>",
"Michael Natterer",
"2015",
@@ -466,7 +466,7 @@ register_image_color_profile_procs (GimpPDB *pdb)
gimp_procedure_set_static_strings (procedure,
"gimp-image-convert-color-profile",
"Convert the image's layers to a color profile",
- "This procedure converts from the image's color profile (or the default
RGB profile if none is set) to the given color profile. Only RGB color profiles are accepted.",
+ "This procedure converts from the image's color profile (or the default
RGB or GRAY profile if none is set) to the given color profile. Only RGB and GRAY color profiles are
accepted, according to the image's type.",
"Michael Natterer <mitch gimp org>",
"Michael Natterer",
"2015",
@@ -513,7 +513,7 @@ register_image_color_profile_procs (GimpPDB *pdb)
gimp_procedure_set_static_strings (procedure,
"gimp-image-convert-color-profile-from-file",
"Convert the image's layers to a color profile",
- "This procedure converts from the image's color profile (or the default
RGB profile if none is set) to an ICC profile precified by 'uri'. Only RGB color profiles are accepted.",
+ "This procedure converts from the image's color profile (or the default
RGB or GRAY profile if none is set) to an ICC profile precified by 'uri'. Only RGB and GRAY color profiles
are accepted, according to the image's type.",
"Michael Natterer <mitch gimp org>",
"Michael Natterer",
"2015",
diff --git a/libgimp/gimpimagecolorprofile_pdb.c b/libgimp/gimpimagecolorprofile_pdb.c
index 9984477..9784e8c 100644
--- a/libgimp/gimpimagecolorprofile_pdb.c
+++ b/libgimp/gimpimagecolorprofile_pdb.c
@@ -90,8 +90,8 @@ _gimp_image_get_color_profile (gint32 image_ID,
* This procedure returns the color profile that is actually used for
* this image, which is the profile returned by
* gimp_image_get_color_profile() if the image has a profile assigned,
- * or a generated default RGB profile. If the image is not RGB or
- * INDEXED, NULL is returned.
+ * or a generated default RGB or GRAY profile, according to the image's
+ * type.
*
* Returns: The image's serialized color profile. The returned value
* must be freed with g_free().
@@ -213,8 +213,9 @@ gimp_image_set_color_profile_from_file (gint32 image_ID,
* Convert the image's layers to a color profile
*
* This procedure converts from the image's color profile (or the
- * default RGB profile if none is set) to the given color profile. Only
- * RGB color profiles are accepted.
+ * default RGB or GRAY profile if none is set) to the given color
+ * profile. Only RGB and GRAY color profiles are accepted, according to
+ * the image's type.
*
* Returns: TRUE on success.
*
@@ -257,8 +258,9 @@ _gimp_image_convert_color_profile (gint32 image_ID,
* Convert the image's layers to a color profile
*
* This procedure converts from the image's color profile (or the
- * default RGB profile if none is set) to an ICC profile precified by
- * 'uri'. Only RGB color profiles are accepted.
+ * default RGB or GRAY profile if none is set) to an ICC profile
+ * precified by 'uri'. Only RGB and GRAY color profiles are accepted,
+ * according to the image's type.
*
* Returns: TRUE on success.
*
diff --git a/tools/pdbgen/pdb/image_color_profile.pdb b/tools/pdbgen/pdb/image_color_profile.pdb
index 09fb21c..b12783b 100644
--- a/tools/pdbgen/pdb/image_color_profile.pdb
+++ b/tools/pdbgen/pdb/image_color_profile.pdb
@@ -67,8 +67,7 @@ sub image_get_effective_color_profile {
This procedure returns the color profile that is actually used for
this image, which is the profile returned by
gimp_image_get_color_profile() if the image has a profile assigned, or
-a generated default RGB profile. If the image is not RGB or INDEXED,
-NULL is returned.
+a generated default RGB or GRAY profile, according to the image's type.
HELP
&mitch_pdb_misc('2015', '2.10');
@@ -94,8 +93,8 @@ HELP
if (profile)
{
- const guint8 *data;
- gsize length;
+ const guint8 *data;
+ gsize length;
data = gimp_color_profile_get_icc_profile (profile, &length);
@@ -206,8 +205,9 @@ sub image_convert_color_profile {
$help = <<'HELP';
This procedure converts from the image's color profile (or the default
-RGB profile if none is set) to the given color profile. Only RGB color
-profiles are accepted.
+RGB or GRAY profile if none is set) to the given color profile. Only
+RGB and GRAY color profiles are accepted, according to the image's
+type.
HELP
&mitch_pdb_misc('2015', '2.10');
@@ -258,8 +258,9 @@ sub image_convert_color_profile_from_file {
$help = <<'HELP';
This procedure converts from the image's color profile (or the default
-RGB profile if none is set) to an ICC profile precified by 'uri'.
-Only RGB color profiles are accepted.
+RGB or GRAY profile if none is set) to an ICC profile precified by
+'uri'. Only RGB and GRAY color profiles are accepted, according to
+the image's type.
HELP
&mitch_pdb_misc('2015', '2.10');
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]