libgimpcolor: add gimp_lcms_profile_is_equal()

and remove all of our own MD5 digest code and API. is_equal() uses
lcms' own MD5 API which I missed before. Thanks Elle for pointing that
out :)
This commit is contained in:
Michael Natterer 2014-03-29 10:40:47 +01:00
parent b4a2fa916c
commit 32e47cf70d
12 changed files with 80 additions and 110 deletions

View File

@ -84,7 +84,7 @@ gimp_image_validate_icc_profile (GimpImage *image,
profile = gimp_lcms_profile_open_from_data (gimp_parasite_data (icc_profile), profile = gimp_lcms_profile_open_from_data (gimp_parasite_data (icc_profile),
gimp_parasite_data_size (icc_profile), gimp_parasite_data_size (icc_profile),
NULL, error); error);
if (! profile) if (! profile)
{ {
@ -135,7 +135,6 @@ gimp_image_set_icc_profile (GimpImage *image,
GimpColorProfile GimpColorProfile
gimp_image_get_profile (GimpImage *image, gimp_image_get_profile (GimpImage *image,
guint8 *md5_digest,
GError **error) GError **error)
{ {
GimpColorConfig *config; GimpColorConfig *config;
@ -153,12 +152,11 @@ gimp_image_get_profile (GimpImage *image,
{ {
return gimp_lcms_profile_open_from_data (gimp_parasite_data (parasite), return gimp_lcms_profile_open_from_data (gimp_parasite_data (parasite),
gimp_parasite_data_size (parasite), gimp_parasite_data_size (parasite),
md5_digest, error); error);
} }
else if (config->rgb_profile) else if (config->rgb_profile)
{ {
profile = gimp_lcms_profile_open_from_file (config->rgb_profile, profile = gimp_lcms_profile_open_from_file (config->rgb_profile, error);
md5_digest, error);
if (profile && ! gimp_lcms_profile_is_rgb (profile)) if (profile && ! gimp_lcms_profile_is_rgb (profile))
{ {

View File

@ -30,7 +30,6 @@ void gimp_image_set_icc_profile (GimpImage *image
const GimpParasite *icc_profile); const GimpParasite *icc_profile);
GimpColorProfile gimp_image_get_profile (GimpImage *image, GimpColorProfile gimp_image_get_profile (GimpImage *image,
guint8 *md5_digest,
GError **error); GError **error);

View File

@ -111,7 +111,7 @@ gimp_image_profile_view_update (GimpImageParasiteView *view)
image = gimp_image_parasite_view_get_image (view); image = gimp_image_parasite_view_get_image (view);
profile = gimp_image_get_profile (image, NULL, &error); profile = gimp_image_get_profile (image, &error);
if (! profile && error) if (! profile && error)
{ {
@ -120,7 +120,7 @@ gimp_image_profile_view_update (GimpImageParasiteView *view)
} }
if (! profile) if (! profile)
profile = gimp_lcms_create_srgb_profile (NULL); profile = gimp_lcms_create_srgb_profile ();
gimp_color_profile_view_set_profile (profile_view->profile_view, profile); gimp_color_profile_view_set_profile (profile_view->profile_view, profile);

View File

@ -44,6 +44,7 @@ EXPORTS
gimp_lcms_profile_get_model gimp_lcms_profile_get_model
gimp_lcms_profile_get_summary gimp_lcms_profile_get_summary
gimp_lcms_profile_is_cmyk gimp_lcms_profile_is_cmyk
gimp_lcms_profile_is_equal
gimp_lcms_profile_is_rgb gimp_lcms_profile_is_rgb
gimp_lcms_profile_open_from_data gimp_lcms_profile_open_from_data
gimp_lcms_profile_open_from_file gimp_lcms_profile_open_from_file

View File

@ -22,6 +22,8 @@
#include "config.h" #include "config.h"
#include <string.h>
#include <glib.h> /* lcms.h uses the "inline" keyword */ #include <glib.h> /* lcms.h uses the "inline" keyword */
#include <lcms2.h> #include <lcms2.h>
@ -57,25 +59,8 @@ gimp_lcms_error_quark (void)
return quark; return quark;
} }
static void
gimp_lcms_calculate_checksum (const guint8 *data,
gsize length,
guint8 *md5_digest)
{
GChecksum *md5 = g_checksum_new (G_CHECKSUM_MD5);
g_checksum_update (md5,
(const guchar *) data + sizeof (cmsICCHeader),
length - sizeof (cmsICCHeader));
length = GIMP_LCMS_MD5_DIGEST_LENGTH;
g_checksum_get_digest (md5, md5_digest, &length);
g_checksum_free (md5);
}
GimpColorProfile GimpColorProfile
gimp_lcms_profile_open_from_file (const gchar *filename, gimp_lcms_profile_open_from_file (const gchar *filename,
guint8 *md5_digest,
GError **error) GError **error)
{ {
GimpColorProfile profile; GimpColorProfile profile;
@ -97,15 +82,9 @@ gimp_lcms_profile_open_from_file (const gchar *filename,
profile = cmsOpenProfileFromMem (data, length); profile = cmsOpenProfileFromMem (data, length);
if (! profile) if (! profile)
{ g_set_error (error, gimp_lcms_error_quark (), 0,
g_set_error (error, gimp_lcms_error_quark (), 0, _("'%s' does not appear to be an ICC color profile"),
_("'%s' does not appear to be an ICC color profile"), gimp_filename_to_utf8 (filename));
gimp_filename_to_utf8 (filename));
}
else if (md5_digest)
{
gimp_lcms_calculate_checksum (data, length, md5_digest);
}
g_mapped_file_unref (file); g_mapped_file_unref (file);
@ -115,7 +94,6 @@ gimp_lcms_profile_open_from_file (const gchar *filename,
GimpColorProfile GimpColorProfile
gimp_lcms_profile_open_from_data (const guint8 *data, gimp_lcms_profile_open_from_data (const guint8 *data,
gsize length, gsize length,
guint8 *md5_digest,
GError **error) GError **error)
{ {
GimpColorProfile profile; GimpColorProfile profile;
@ -127,14 +105,8 @@ gimp_lcms_profile_open_from_data (const guint8 *data,
profile = cmsOpenProfileFromMem (data, length); profile = cmsOpenProfileFromMem (data, length);
if (! profile) if (! profile)
{ g_set_error_literal (error, gimp_lcms_error_quark (), 0,
g_set_error_literal (error, gimp_lcms_error_quark (), 0, _("Data does not appear to be an ICC color profile"));
_("Data does not appear to be an ICC color profile"));
}
else if (md5_digest)
{
gimp_lcms_calculate_checksum (data, length, md5_digest);
}
return profile; return profile;
} }
@ -236,6 +208,28 @@ gimp_lcms_profile_get_summary (GimpColorProfile profile)
return g_string_free (string, FALSE); return g_string_free (string, FALSE);
} }
gboolean
gimp_lcms_profile_is_equal (GimpColorProfile profile1,
GimpColorProfile profile2)
{
cmsUInt8Number digest1[GIMP_LCMS_MD5_DIGEST_LENGTH];
cmsUInt8Number digest2[GIMP_LCMS_MD5_DIGEST_LENGTH];
g_return_val_if_fail (profile1 != NULL, FALSE);
g_return_val_if_fail (profile2 != NULL, FALSE);
if (! cmsMD5computeID (profile1) ||
! cmsMD5computeID (profile2))
{
return FALSE;
}
cmsGetHeaderProfileID (profile1, digest1);
cmsGetHeaderProfileID (profile2, digest2);
return (memcmp (digest1, digest2, GIMP_LCMS_MD5_DIGEST_LENGTH) == 0);
}
gboolean gboolean
gimp_lcms_profile_is_rgb (GimpColorProfile profile) gimp_lcms_profile_is_rgb (GimpColorProfile profile)
{ {
@ -297,7 +291,7 @@ gimp_lcms_profile_set_tag (cmsHPROFILE profile,
* Since: GIMP 2.10 * Since: GIMP 2.10
**/ **/
GimpColorProfile GimpColorProfile
gimp_lcms_create_srgb_profile (guint8 *md5_digest) gimp_lcms_create_srgb_profile (void)
{ {
cmsHPROFILE srgb_profile; cmsHPROFILE srgb_profile;
cmsCIExyY d65_srgb_specs = { 0.3127, 0.3290, 1.0 }; cmsCIExyY d65_srgb_specs = { 0.3127, 0.3290, 1.0 };
@ -345,25 +339,5 @@ gimp_lcms_create_srgb_profile (guint8 *md5_digest)
* cmsSetProfileVersion (srgb_profile, 2.1); * cmsSetProfileVersion (srgb_profile, 2.1);
**/ **/
if (md5_digest)
{
md5_digest[0] = 0xcb;
md5_digest[1] = 0x63;
md5_digest[2] = 0x14;
md5_digest[3] = 0x56;
md5_digest[4] = 0xd4;
md5_digest[5] = 0x0a;
md5_digest[6] = 0x01;
md5_digest[7] = 0x62;
md5_digest[8] = 0xa0;
md5_digest[9] = 0xdb;
md5_digest[10] = 0xe6;
md5_digest[11] = 0x32;
md5_digest[12] = 0x8b;
md5_digest[13] = 0xea;
md5_digest[14] = 0x1a;
md5_digest[15] = 0x89;
}
return srgb_profile; return srgb_profile;
} }

View File

@ -36,11 +36,9 @@ G_BEGIN_DECLS
GimpColorProfile gimp_lcms_profile_open_from_file (const gchar *filename, GimpColorProfile gimp_lcms_profile_open_from_file (const gchar *filename,
guint8 *md5_digest,
GError **error); GError **error);
GimpColorProfile gimp_lcms_profile_open_from_data (const guint8 *data, GimpColorProfile gimp_lcms_profile_open_from_data (const guint8 *data,
gsize length, gsize length,
guint8 *md5_digest,
GError **error); GError **error);
gchar * gimp_lcms_profile_get_description (GimpColorProfile profile); gchar * gimp_lcms_profile_get_description (GimpColorProfile profile);
@ -50,10 +48,13 @@ gchar * gimp_lcms_profile_get_copyright (GimpColorProfile profil
gchar * gimp_lcms_profile_get_summary (GimpColorProfile profile); gchar * gimp_lcms_profile_get_summary (GimpColorProfile profile);
gboolean gimp_lcms_profile_is_equal (GimpColorProfile profile1,
GimpColorProfile profile2);
gboolean gimp_lcms_profile_is_rgb (GimpColorProfile profile); gboolean gimp_lcms_profile_is_rgb (GimpColorProfile profile);
gboolean gimp_lcms_profile_is_cmyk (GimpColorProfile profile); gboolean gimp_lcms_profile_is_cmyk (GimpColorProfile profile);
GimpColorProfile gimp_lcms_create_srgb_profile (guint8 *md5_digest); GimpColorProfile gimp_lcms_create_srgb_profile (void);
G_END_DECLS G_END_DECLS

View File

@ -199,7 +199,7 @@ gimp_color_profile_chooser_dialog_update_preview (GimpColorProfileChooserDialog
return; return;
} }
profile = gimp_lcms_profile_open_from_file (filename, NULL, &error); profile = gimp_lcms_profile_open_from_file (filename, &error);
if (! profile) if (! profile)
{ {

View File

@ -357,7 +357,7 @@ color_config_get_rgb_profile (GimpColorConfig *config)
if (config->rgb_profile) if (config->rgb_profile)
profile = cmsOpenProfileFromFile (config->rgb_profile, "r"); profile = cmsOpenProfileFromFile (config->rgb_profile, "r");
return profile ? profile : gimp_lcms_create_srgb_profile (NULL); return profile ? profile : gimp_lcms_create_srgb_profile ();
} }
static cmsHPROFILE static cmsHPROFILE

View File

@ -318,10 +318,10 @@ cdisplay_lcms_changed (GimpColorDisplay *display)
cmsUInt32Number softproof_flags = 0; cmsUInt32Number softproof_flags = 0;
if (! src_profile) if (! src_profile)
src_profile = gimp_lcms_create_srgb_profile (NULL); src_profile = gimp_lcms_create_srgb_profile ();
if (! dest_profile) if (! dest_profile)
dest_profile = gimp_lcms_create_srgb_profile (NULL); dest_profile = gimp_lcms_create_srgb_profile ();
softproof_flags |= cmsFLAGS_SOFTPROOFING; softproof_flags |= cmsFLAGS_SOFTPROOFING;
@ -358,10 +358,10 @@ cdisplay_lcms_changed (GimpColorDisplay *display)
cmsUInt32Number display_flags = 0; cmsUInt32Number display_flags = 0;
if (! src_profile) if (! src_profile)
src_profile = gimp_lcms_create_srgb_profile (NULL); src_profile = gimp_lcms_create_srgb_profile ();
if (! dest_profile) if (! dest_profile)
dest_profile = gimp_lcms_create_srgb_profile (NULL); dest_profile = gimp_lcms_create_srgb_profile ();
if (config->display_use_black_point_compensation) if (config->display_use_black_point_compensation)
{ {

View File

@ -384,7 +384,7 @@ cdisplay_proof_changed (GimpColorDisplay *display)
if (! proof->profile) if (! proof->profile)
return; return;
rgb_profile = gimp_lcms_create_srgb_profile (NULL); rgb_profile = gimp_lcms_create_srgb_profile ();
proof_profile = cmsOpenProfileFromFile (proof->profile, "r"); proof_profile = cmsOpenProfileFromFile (proof->profile, "r");

View File

@ -108,7 +108,6 @@ static GimpPDBStatusType lcms_icc_file_info (const gchar *filename,
static cmsHPROFILE lcms_image_get_profile (GimpColorConfig *config, static cmsHPROFILE lcms_image_get_profile (GimpColorConfig *config,
gint32 image, gint32 image,
guchar *checksum,
GError **error); GError **error);
static gboolean lcms_image_set_profile (gint32 image, static gboolean lcms_image_set_profile (gint32 image,
cmsHPROFILE profile, cmsHPROFILE profile,
@ -529,8 +528,6 @@ lcms_icc_apply (GimpColorConfig *config,
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
cmsHPROFILE src_profile = NULL; cmsHPROFILE src_profile = NULL;
cmsHPROFILE dest_profile = NULL; cmsHPROFILE dest_profile = NULL;
guchar src_md5[GIMP_LCMS_MD5_DIGEST_LENGTH];
guchar dest_md5[GIMP_LCMS_MD5_DIGEST_LENGTH];
GError *error = NULL; GError *error = NULL;
g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR);
@ -543,8 +540,7 @@ lcms_icc_apply (GimpColorConfig *config,
{ {
GError *error = NULL; GError *error = NULL;
dest_profile = gimp_lcms_profile_open_from_file (filename, dest_md5, dest_profile = gimp_lcms_profile_open_from_file (filename, &error);
&error);
if (! dest_profile) if (! dest_profile)
{ {
@ -564,7 +560,7 @@ lcms_icc_apply (GimpColorConfig *config,
} }
} }
src_profile = lcms_image_get_profile (config, image, src_md5, &error); src_profile = lcms_image_get_profile (config, image, &error);
if (error) if (error)
{ {
@ -576,12 +572,12 @@ lcms_icc_apply (GimpColorConfig *config,
return GIMP_PDB_SUCCESS; return GIMP_PDB_SUCCESS;
if (! src_profile) if (! src_profile)
src_profile = gimp_lcms_create_srgb_profile (src_md5); src_profile = gimp_lcms_create_srgb_profile ();
if (! dest_profile) if (! dest_profile)
dest_profile = gimp_lcms_create_srgb_profile (dest_md5); dest_profile = gimp_lcms_create_srgb_profile ();
if (memcmp (src_md5, dest_md5, GIMP_LCMS_MD5_DIGEST_LENGTH) == 0) if (gimp_lcms_profile_is_equal (src_profile, dest_profile))
{ {
gchar *src_desc = gimp_lcms_profile_get_description (src_profile); gchar *src_desc = gimp_lcms_profile_get_description (src_profile);
gchar *dest_desc = gimp_lcms_profile_get_description (dest_profile); gchar *dest_desc = gimp_lcms_profile_get_description (dest_profile);
@ -632,7 +628,7 @@ lcms_icc_info (GimpColorConfig *config,
g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR);
g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR);
profile = lcms_image_get_profile (config, image, NULL, &error); profile = lcms_image_get_profile (config, image, &error);
if (error) if (error)
{ {
@ -641,7 +637,7 @@ lcms_icc_info (GimpColorConfig *config,
} }
if (! profile) if (! profile)
profile = gimp_lcms_create_srgb_profile (NULL); profile = gimp_lcms_create_srgb_profile ();
if (name) *name = gimp_lcms_profile_get_model (profile); if (name) *name = gimp_lcms_profile_get_model (profile);
if (desc) *desc = gimp_lcms_profile_get_description (profile); if (desc) *desc = gimp_lcms_profile_get_description (profile);
@ -661,7 +657,7 @@ lcms_icc_file_info (const gchar *filename,
{ {
cmsHPROFILE profile; cmsHPROFILE profile;
profile = gimp_lcms_profile_open_from_file (filename, NULL, error); profile = gimp_lcms_profile_open_from_file (filename, error);
if (! profile) if (! profile)
return GIMP_PDB_EXECUTION_ERROR; return GIMP_PDB_EXECUTION_ERROR;
@ -678,7 +674,6 @@ lcms_icc_file_info (const gchar *filename,
static cmsHPROFILE static cmsHPROFILE
lcms_image_get_profile (GimpColorConfig *config, lcms_image_get_profile (GimpColorConfig *config,
gint32 image, gint32 image,
guchar *checksum,
GError **error) GError **error)
{ {
GimpParasite *parasite; GimpParasite *parasite;
@ -692,7 +687,7 @@ lcms_image_get_profile (GimpColorConfig *config,
{ {
profile = gimp_lcms_profile_open_from_data (gimp_parasite_data (parasite), profile = gimp_lcms_profile_open_from_data (gimp_parasite_data (parasite),
gimp_parasite_data_size (parasite), gimp_parasite_data_size (parasite),
checksum, error); error);
if (! profile) if (! profile)
g_prefix_error (error, _("Error parsing 'icc-profile': ")); g_prefix_error (error, _("Error parsing 'icc-profile': "));
@ -700,8 +695,7 @@ lcms_image_get_profile (GimpColorConfig *config,
} }
else if (config->rgb_profile) else if (config->rgb_profile)
{ {
profile = gimp_lcms_profile_open_from_file (config->rgb_profile, profile = gimp_lcms_profile_open_from_file (config->rgb_profile, error);
checksum, error);
if (profile && ! gimp_lcms_profile_is_rgb (profile)) if (profile && ! gimp_lcms_profile_is_rgb (profile))
{ {
@ -796,7 +790,9 @@ lcms_image_apply_profile (gint32 image,
GimpColorRenderingIntent intent, GimpColorRenderingIntent intent,
gboolean bpc) gboolean bpc)
{ {
gint32 saved_selection = -1; gchar *src_desc;
gchar *dest_desc;
gint32 saved_selection = -1;
gimp_image_undo_group_start (image); gimp_image_undo_group_start (image);
@ -807,18 +803,21 @@ lcms_image_apply_profile (gint32 image,
return FALSE; return FALSE;
} }
{ src_desc = gimp_lcms_profile_get_description (src_profile);
gchar *src = gimp_lcms_profile_get_description (src_profile); if (! src_desc)
gchar *dest = gimp_lcms_profile_get_description (dest_profile); src_desc = gimp_lcms_profile_get_model (src_profile);
/* ICC color profile conversion */ dest_desc = gimp_lcms_profile_get_description (dest_profile);
gimp_progress_init_printf (_("Converting from '%s' to '%s'"), src, dest); if (! dest_desc)
dest_desc = gimp_lcms_profile_get_model (dest_profile);
g_printerr ("lcms: converting from '%s' to '%s'\n", src, dest); gimp_progress_init_printf (_("Converting from '%s' to '%s'"),
src_desc, dest_desc);
g_free (dest); g_printerr ("lcms: converting from '%s' to '%s'\n", src_desc, dest_desc);
g_free (src);
} g_free (dest_desc);
g_free (src_desc);
if (! gimp_selection_is_empty (image)) if (! gimp_selection_is_empty (image))
{ {
@ -1233,7 +1232,7 @@ lcms_icc_combo_box_set_active (GimpColorProfileComboBox *combo,
{ {
GError *error = NULL; GError *error = NULL;
profile = gimp_lcms_profile_open_from_file (filename, NULL, &error); profile = gimp_lcms_profile_open_from_file (filename, &error);
if (! profile) if (! profile)
{ {
@ -1301,8 +1300,7 @@ lcms_icc_combo_box_new (GimpColorConfig *config,
{ {
GError *error = NULL; GError *error = NULL;
profile = gimp_lcms_profile_open_from_file (config->rgb_profile, NULL, profile = gimp_lcms_profile_open_from_file (config->rgb_profile, &error);
&error);
if (! profile) if (! profile)
{ {
@ -1312,7 +1310,7 @@ lcms_icc_combo_box_new (GimpColorConfig *config,
} }
if (! profile) if (! profile)
profile = gimp_lcms_create_srgb_profile (NULL); profile = gimp_lcms_create_srgb_profile ();
name = gimp_lcms_profile_get_description (profile); name = gimp_lcms_profile_get_description (profile);
if (! name) if (! name)
@ -1354,7 +1352,7 @@ lcms_dialog (GimpColorConfig *config,
gboolean run; gboolean run;
GError *error = NULL; GError *error = NULL;
src_profile = lcms_image_get_profile (config, image, NULL, &error); src_profile = lcms_image_get_profile (config, image, &error);
if (error) if (error)
{ {
@ -1363,7 +1361,7 @@ lcms_dialog (GimpColorConfig *config,
} }
if (! src_profile) if (! src_profile)
src_profile = gimp_lcms_create_srgb_profile (NULL); src_profile = gimp_lcms_create_srgb_profile ();
gimp_ui_init (PLUG_IN_BINARY, FALSE); gimp_ui_init (PLUG_IN_BINARY, FALSE);
@ -1471,8 +1469,7 @@ lcms_dialog (GimpColorConfig *config,
{ {
GError *error = NULL; GError *error = NULL;
dest_profile = gimp_lcms_profile_open_from_file (filename, NULL, dest_profile = gimp_lcms_profile_open_from_file (filename, &error);
&error);
if (! dest_profile) if (! dest_profile)
{ {
@ -1482,7 +1479,7 @@ lcms_dialog (GimpColorConfig *config,
} }
else else
{ {
dest_profile = gimp_lcms_create_srgb_profile (NULL); dest_profile = gimp_lcms_create_srgb_profile ();
} }
if (dest_profile) if (dest_profile)

View File

@ -648,7 +648,7 @@ jpeg_load_cmyk_transform (guint8 *profile_data,
/* make the real sRGB profile as a fallback */ /* make the real sRGB profile as a fallback */
if (! rgb_profile) if (! rgb_profile)
{ {
rgb_profile = gimp_lcms_create_srgb_profile (NULL); rgb_profile = gimp_lcms_create_srgb_profile ();
} }
if (config->display_intent == if (config->display_intent ==