Mercurial > geeqie.yaz
changeset 438:eff049b3d308
added fColorProfile pseudo-tag with detailed information
author | nadvornik |
---|---|
date | Sun, 20 Apr 2008 09:29:46 +0000 |
parents | f707aa712b1f |
children | 1cca0b614cba |
files | src/bar_exif.c src/exif-common.c |
diffstat | 2 files changed, 68 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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"},
--- 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 <sys/stat.h> #include <sys/mman.h> #include <math.h> - + +#ifdef HAVE_LCMS +/*** color support enabled ***/ + +#ifdef HAVE_LCMS_LCMS_H + #include <lcms/lcms.h> +#else + #include <lcms.h> +#endif +#endif + #include <glib.h> #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;