From d092ee9102cfcf1dc4266682c6ee1df01c2eeb9c Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 2 Sep 2017 20:29:29 +0200 Subject: [PATCH] libgimpcolor: add a new gimp_color_profile_get_format() which takes a GimpColorProfile and a Babl format, and returns a new format which uses the profile's RGB primaries and TRC, and the original format's pixel layout; or NULL if babl couldn't create a space from the profile's ICC data. --- libgimpcolor/gimpcolor.def | 1 + libgimpcolor/gimpcolorprofile.c | 49 +++++++++++++++++++++++++++++++-- libgimpcolor/gimpcolorprofile.h | 3 ++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/libgimpcolor/gimpcolor.def b/libgimpcolor/gimpcolor.def index 3d9a074cc1..5bd160b3cb 100644 --- a/libgimpcolor/gimpcolor.def +++ b/libgimpcolor/gimpcolor.def @@ -27,6 +27,7 @@ EXPORTS gimp_color_managed_profile_changed gimp_color_profile_get_copyright gimp_color_profile_get_description + gimp_color_profile_get_format gimp_color_profile_get_icc_profile gimp_color_profile_get_label gimp_color_profile_get_lcms_format diff --git a/libgimpcolor/gimpcolorprofile.c b/libgimpcolor/gimpcolorprofile.c index 5e408d0b8b..e042217431 100644 --- a/libgimpcolor/gimpcolorprofile.c +++ b/libgimpcolor/gimpcolorprofile.c @@ -113,6 +113,8 @@ G_DEFINE_TYPE (GimpColorProfile, gimp_color_profile, #define parent_class gimp_color_profile_parent_class +#define GIMP_COLOR_PROFILE_ERROR gimp_color_profile_error_quark () + static GQuark gimp_color_profile_error_quark (void) { @@ -265,7 +267,7 @@ gimp_color_profile_new_from_file (GFile *file, if (error && *error == NULL) { - g_set_error (error, gimp_color_profile_error_quark (), 0, + g_set_error (error, GIMP_COLOR_PROFILE_ERROR, 0, _("'%s' does not appear to be an ICC color profile"), gimp_file_get_utf8_name (file)); } @@ -311,7 +313,7 @@ gimp_color_profile_new_from_icc_profile (const guint8 *data, } else { - g_set_error_literal (error, gimp_color_profile_error_quark (), 0, + g_set_error_literal (error, GIMP_COLOR_PROFILE_ERROR, 0, _("Data does not appear to be an ICC color profile")); } @@ -368,7 +370,7 @@ gimp_color_profile_new_from_lcms_profile (gpointer lcms_profile, g_free (data); } - g_set_error_literal (error, gimp_color_profile_error_quark (), 0, + g_set_error_literal (error, GIMP_COLOR_PROFILE_ERROR, 0, _("Could not save color profile to memory")); return NULL; @@ -1457,6 +1459,47 @@ gimp_color_profile_new_d50_gray_lab_trc (void) return gimp_color_profile_new_from_icc_profile (data, length, NULL); } +/** + * gimp_color_profile_get_format: + * @profile: a #GimpColorProfile + * @format: a #Babl format + * @error: return location for #GError + * + * This function takes a #GimpColorProfile and a #Babl format and + * returns a new #Babl format with @profile's RGB primaries and TRC, + * and @format's pixel layout. + * + * Return value: the new #Babl format. + * + * Since: 2.10 + **/ +const Babl * +gimp_color_profile_get_format (GimpColorProfile *profile, + const Babl *format, + GError **error) +{ + const Babl *space; + gchar *babl_error = NULL; + + g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (profile), NULL); + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + space = babl_space_from_icc ((const gchar *) profile->priv->data, + profile->priv->length, + &babl_error); + + if (! space) + { + g_set_error (error, GIMP_COLOR_PROFILE_ERROR, 0, + "%s: %s", + gimp_color_profile_get_label (profile), babl_error); + return NULL; + } + + return babl_format_with_space (babl_get_name (format), space); +} + /** * gimp_color_profile_get_lcms_format: * @format: a #Babl format diff --git a/libgimpcolor/gimpcolorprofile.h b/libgimpcolor/gimpcolorprofile.h index 598b2b101b..56173f133e 100644 --- a/libgimpcolor/gimpcolorprofile.h +++ b/libgimpcolor/gimpcolorprofile.h @@ -111,6 +111,9 @@ gboolean gimp_color_profile_is_cmyk (GimpColorProfile * gboolean gimp_color_profile_is_linear (GimpColorProfile *profile); +const Babl * gimp_color_profile_get_format (GimpColorProfile *profile, + const Babl *format, + GError **error); const Babl * gimp_color_profile_get_lcms_format (const Babl *format, guint32 *lcms_format);