[gimp] Bug 765176 - ICC profile conversions between grayscale and RGB images
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 765176 - ICC profile conversions between grayscale and RGB images
- Date: Sat, 30 Apr 2016 16:36:34 +0000 (UTC)
commit 12f9aa9bd27f3f78d762897108e3c316bd3c0ebc
Author: Michael Natterer <mitch gimp org>
Date: Sat Apr 30 17:48:07 2016 +0200
Bug 765176 - ICC profile conversions between grayscale and RGB images
Add a dest_profile parameter to gimp_image_convert_type() so a profile
can be chosen when converting between RGB and GRAY. Has no GUI yet.
app/actions/image-commands.c | 2 +-
app/core/gimpimage-convert-type.c | 37 +++++++++++++++++++++++++----------
app/core/gimpimage-convert-type.h | 1 +
app/pdb/image-convert-cmds.c | 8 +++---
libgimp/gimpimageconvert_pdb.c | 7 ++---
tools/pdbgen/pdb/image_convert.pdb | 11 ++++-----
6 files changed, 40 insertions(+), 26 deletions(-)
---
diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c
index 94141ff..21143b1 100644
--- a/app/actions/image-commands.c
+++ b/app/actions/image-commands.c
@@ -195,7 +195,7 @@ image_convert_base_type_cmd_callback (GtkAction *action,
if (dialog)
gtk_widget_destroy (dialog);
- if (! gimp_image_convert_type (image, value, NULL, &error))
+ if (! gimp_image_convert_type (image, value, NULL, NULL, &error))
{
gimp_message_literal (image->gimp,
G_OBJECT (widget), GIMP_MESSAGE_WARNING,
diff --git a/app/core/gimpimage-convert-type.c b/app/core/gimpimage-convert-type.c
index cced88f..68d2fd8 100644
--- a/app/core/gimpimage-convert-type.c
+++ b/app/core/gimpimage-convert-type.c
@@ -42,32 +42,38 @@
gboolean
gimp_image_convert_type (GimpImage *image,
GimpImageBaseType new_type,
+ GimpColorProfile *dest_profile,
GimpProgress *progress,
GError **error)
{
GimpImageBaseType old_type;
+ const Babl *new_layer_format;
GList *all_layers;
GList *list;
const gchar *undo_desc = NULL;
GimpProgress *sub_progress = NULL;
- GimpColorProfile *dest_profile = NULL;
gint nth_layer;
gint n_layers;
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
g_return_val_if_fail (new_type != gimp_image_get_base_type (image), FALSE);
g_return_val_if_fail (new_type != GIMP_INDEXED, FALSE);
+ g_return_val_if_fail (dest_profile == NULL || GIMP_IS_COLOR_PROFILE (dest_profile),
+ FALSE);
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- gimp_set_busy (image->gimp);
-
- all_layers = gimp_image_get_layer_list (image);
-
- n_layers = g_list_length (all_layers);
+ new_layer_format = gimp_babl_format (new_type,
+ gimp_image_get_precision (image),
+ TRUE);
- if (progress)
- sub_progress = gimp_sub_progress_new (progress);
+ if (dest_profile &&
+ ! gimp_image_validate_color_profile_by_format (new_layer_format,
+ dest_profile,
+ NULL, error))
+ {
+ return FALSE;
+ }
switch (new_type)
{
@@ -83,6 +89,15 @@ gimp_image_convert_type (GimpImage *image,
g_return_val_if_reached (FALSE);
}
+ gimp_set_busy (image->gimp);
+
+ all_layers = gimp_image_get_layer_list (image);
+
+ n_layers = g_list_length (all_layers);
+
+ if (progress)
+ sub_progress = gimp_sub_progress_new (progress);
+
g_object_freeze_notify (G_OBJECT (image));
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_IMAGE_CONVERT,
@@ -96,13 +111,13 @@ gimp_image_convert_type (GimpImage *image,
g_object_set (image, "base-type", new_type, NULL);
- /* when converting to/from GRAY, convert to the new type's builtin
- * profile.
+ /* When converting to/from GRAY, convert to the new type's builtin
+ * profile if none was passed.
*/
if (old_type == GIMP_GRAY ||
new_type == GIMP_GRAY)
{
- if (gimp_image_get_color_profile (image))
+ if (! dest_profile && gimp_image_get_color_profile (image))
dest_profile = gimp_image_get_builtin_color_profile (image);
}
diff --git a/app/core/gimpimage-convert-type.h b/app/core/gimpimage-convert-type.h
index 06250fb..dc34001 100644
--- a/app/core/gimpimage-convert-type.h
+++ b/app/core/gimpimage-convert-type.h
@@ -21,6 +21,7 @@
gboolean gimp_image_convert_type (GimpImage *image,
GimpImageBaseType new_type,
+ GimpColorProfile *dest_profile,
GimpProgress *progress,
GError **error);
diff --git a/app/pdb/image-convert-cmds.c b/app/pdb/image-convert-cmds.c
index 197bbd2..adadb9e 100644
--- a/app/pdb/image-convert-cmds.c
+++ b/app/pdb/image-convert-cmds.c
@@ -64,7 +64,7 @@ image_convert_rgb_invoker (GimpProcedure *procedure,
{
if (gimp_pdb_image_is_not_base_type (image, GIMP_RGB, error))
{
- success = gimp_image_convert_type (image, GIMP_RGB, NULL, error);
+ success = gimp_image_convert_type (image, GIMP_RGB, NULL, NULL, error);
}
else
{
@@ -93,7 +93,7 @@ image_convert_grayscale_invoker (GimpProcedure *procedure,
{
if (gimp_pdb_image_is_not_base_type (image, GIMP_GRAY, error))
{
- success = gimp_image_convert_type (image, GIMP_GRAY, NULL, error);
+ success = gimp_image_convert_type (image, GIMP_GRAY, NULL, NULL, error);
}
else
{
@@ -292,8 +292,8 @@ register_image_convert_procs (GimpPDB *pdb)
"gimp-image-convert-grayscale");
gimp_procedure_set_static_strings (procedure,
"gimp-image-convert-grayscale",
- "Convert specified image to grayscale (256 intensity levels)",
- "This procedure converts the specified image to grayscale with 8 bits
per pixel (256 intensity levels). This process requires an image in RGB or Indexed color mode.",
+ "Convert specified image to grayscale",
+ "This procedure converts the specified image to grayscale. This process
requires an image in RGB or Indexed color mode.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
diff --git a/libgimp/gimpimageconvert_pdb.c b/libgimp/gimpimageconvert_pdb.c
index 1ac21a5..dccd3cb 100644
--- a/libgimp/gimpimageconvert_pdb.c
+++ b/libgimp/gimpimageconvert_pdb.c
@@ -70,11 +70,10 @@ gimp_image_convert_rgb (gint32 image_ID)
* gimp_image_convert_grayscale:
* @image_ID: The image.
*
- * Convert specified image to grayscale (256 intensity levels)
+ * Convert specified image to grayscale
*
- * This procedure converts the specified image to grayscale with 8 bits
- * per pixel (256 intensity levels). This process requires an image in
- * RGB or Indexed color mode.
+ * This procedure converts the specified image to grayscale. This
+ * process requires an image in RGB or Indexed color mode.
*
* Returns: TRUE on success.
**/
diff --git a/tools/pdbgen/pdb/image_convert.pdb b/tools/pdbgen/pdb/image_convert.pdb
index 77fcb90..7d37bec 100644
--- a/tools/pdbgen/pdb/image_convert.pdb
+++ b/tools/pdbgen/pdb/image_convert.pdb
@@ -37,7 +37,7 @@ HELP
{
if (gimp_pdb_image_is_not_base_type (image, GIMP_RGB, error))
{
- success = gimp_image_convert_type (image, GIMP_RGB, NULL, error);
+ success = gimp_image_convert_type (image, GIMP_RGB, NULL, NULL, error);
}
else
{
@@ -49,12 +49,11 @@ CODE
}
sub image_convert_grayscale {
- $blurb = 'Convert specified image to grayscale (256 intensity levels)';
+ $blurb = 'Convert specified image to grayscale';
$help = <<'HELP';
-This procedure converts the specified image to grayscale with 8 bits
-per pixel (256 intensity levels). This process requires an image in RGB
-or Indexed color mode.
+This procedure converts the specified image to grayscale. This process
+requires an image in RGB or Indexed color mode.
HELP
&std_pdb_misc;
@@ -69,7 +68,7 @@ HELP
{
if (gimp_pdb_image_is_not_base_type (image, GIMP_GRAY, error))
{
- success = gimp_image_convert_type (image, GIMP_GRAY, NULL, error);
+ success = gimp_image_convert_type (image, GIMP_GRAY, NULL, NULL, error);
}
else
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]