# HG changeset patch # User nadvornik # Date 1208683786 0 # Node ID eff049b3d3082ed2b75897ac35c2ab5d8588c617 # Parent f707aa712b1f73036561d3195b98623ac45d2cbe added fColorProfile pseudo-tag with detailed information diff -r f707aa712b1f -r eff049b3d308 src/bar_exif.c --- a/src/bar_exif.c Sun Apr 20 09:02:05 2008 +0000 +++ b/src/bar_exif.c Sun Apr 20 09:29:46 2008 +0000 @@ -41,7 +41,7 @@ { 0, 0, EXIF_UI_IFSET, "Exif.Photo.ExposureProgram"}, { 0, 0, EXIF_UI_IFSET, "Exif.Photo.MeteringMode"}, { 0, 0, EXIF_UI_IFSET, "Exif.Photo.LightSource"}, - { 0, 0, EXIF_UI_IFSET, "Exif.Photo.ColorSpace"}, + { 0, 0, EXIF_UI_IFSET, "fColorProfile"}, { 0, 0, EXIF_UI_IFSET, "fSubjectDistance"}, { 0, 0, EXIF_UI_IFSET, "fResolution"}, { 0, 0, EXIF_UI_IFSET, "Exif.Image.Orientation"}, diff -r f707aa712b1f -r eff049b3d308 src/exif-common.c --- a/src/exif-common.c Sun Apr 20 09:02:05 2008 +0000 +++ b/src/exif-common.c Sun Apr 20 09:29:46 2008 +0000 @@ -16,7 +16,17 @@ #include #include #include - + +#ifdef HAVE_LCMS +/*** color support enabled ***/ + +#ifdef HAVE_LCMS_LCMS_H + #include +#else + #include +#endif +#endif + #include #include "intl.h" @@ -43,6 +53,7 @@ { "fSubjectDistance", N_("Subject distance") }, { "fFlash", N_("Flash") }, { "fResolution", N_("Resolution") }, + { "fColorProfile", N_("Color profile") }, { NULL, NULL } }; @@ -372,6 +383,61 @@ g_free(units); return text; } + if (strcmp(key, "fColorProfile") == 0) + { + const gchar *name = ""; + const gchar *source = ""; + ExifItem *prof_item = exif_get_item(exif, "Exif.Image.InterColorProfile"); + if (!prof_item) + { + gint cs; + gchar *interop_index; + + /* ColorSpace == 1 specifies sRGB per EXIF 2.2 */ + if (!exif_get_integer(exif, "Exif.Photo.ColorSpace", &cs)) cs = 0; + interop_index = exif_get_data_as_text(exif, "Exif.Iop.InteroperabilityIndex"); + + if (cs == 1) + { + name = _("sRGB"); + source = "ColorSpace"; + } + else if (cs == 2 || (interop_index && !strcmp(interop_index, "R03"))) + { + name = _("AdobeRGB"); + source = (cs == 2) ? "ColorSpace" : "Iop"; + } + + g_free(interop_index); + } + + if (prof_item && exif_item_get_format_id(prof_item) == EXIF_FORMAT_UNDEFINED) + { + source = _("embedded"); +#ifdef HAVE_LCMS + + { + unsigned char *data; + guint data_len; + cmsHPROFILE profile; + + data = (unsigned char *) exif_item_get_data(prof_item, &data_len); + if (data) + { + profile = cmsOpenProfileFromMem(data, data_len); + if (profile) + { + name = cmsTakeProductName(profile); + cmsCloseProfile(profile); + } + g_free(data); + } + } +#endif + } + if (name[0] == 0 && source[0] == 0) return NULL; + return g_strdup_printf("%s (%s)", name, source); + } if (key_valid) *key_valid = FALSE; return NULL;