From 98ee28f049415750b2bb5d9f3eb386a83696cddc Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Tue, 18 Mar 2014 10:46:32 +0100 Subject: Add support for specifying custom focal length and aperture Similar to using supplied timestamps this is useful for fully manual lenses that don't provide any information to the camera. --- src/generators.c | 8 ++++++++ src/items.c | 8 +++++++- src/items.h | 4 ++++ src/jpeg-utils.cpp | 30 ++++++++++++++++++++++++++++-- src/jpeg-utils.h | 2 ++ src/xml-parser.c | 18 ++++++++++++++++++ src/xml-parser.h | 1 + 7 files changed, 68 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/generators.c b/src/generators.c index 2038424..f94e2a6 100644 --- a/src/generators.c +++ b/src/generators.c @@ -166,6 +166,14 @@ metadata_apply_overrides (ExifData *exif_data, if (exif_data->fake_datetime == (time_t) -1) exif_data->fake_datetime = items->metadata_fake_datetime; + exif_data->fake_aperture = item->metadata_fake_aperture; + if (exif_data->fake_aperture == -1) + exif_data->fake_aperture = items->metadata_fake_aperture; + + exif_data->fake_focal_length = item->metadata_fake_focal_length; + if (exif_data->fake_focal_length == -1) + exif_data->fake_focal_length = items->metadata_fake_focal_length; + g_free (exif_data->external_exif_data); exif_data->external_exif_data = NULL; if (setup->write_supplied_exif && item->metadata_external_exif) diff --git a/src/items.c b/src/items.c index 31ab41f..b3f1fac 100644 --- a/src/items.c +++ b/src/items.c @@ -183,6 +183,9 @@ parse_album_xml (const gchar *filename, TPathInfo *path_info) index->metadata_fake_datetime = parse_datetime_string (s); g_free (s); } + index->metadata_fake_aperture = xml_file_get_node_attribute_double (xml, "/gallery/general/metadata/fake", "aperture", -1); + index->metadata_fake_focal_length = xml_file_get_node_attribute_double (xml, "/gallery/general/metadata/fake", "focal_length", -1); + /* TODO: add support for lens name */ s = xml_file_get_node_attribute (xml, "/gallery/general/thumbnail", "crop"); if (s != NULL) { @@ -329,11 +332,14 @@ parse_album_xml (const gchar *filename, TPathInfo *path_info) item->metadata_fake_datetime = (time_t) -1; s = g_strdup_printf ("/gallery/items/*[%d]/metadata/fake", i + 1); s2 = xml_file_get_node_attribute (xml, s, "date"); - g_free (s); if (s2 != NULL) { item->metadata_fake_datetime = parse_datetime_string (s2); g_free (s2); } + item->metadata_fake_aperture = xml_file_get_node_attribute_double (xml, s, "aperture", -1); + item->metadata_fake_focal_length = xml_file_get_node_attribute_double (xml, s, "focal_length", -1); + /* TODO: add support for lens name */ + g_free (s); s = g_strdup_printf ("/gallery/items/*[%d]/thumbnail", i + 1); s2 = xml_file_get_node_attribute (xml, s, "crop"); diff --git a/src/items.h b/src/items.h index 71b9401..5d27dac 100644 --- a/src/items.h +++ b/src/items.h @@ -75,6 +75,8 @@ typedef struct { TAuthType auth_type; int metadata_tz_shift; /* minutes */ time_t metadata_fake_datetime; + double metadata_fake_aperture; + double metadata_fake_focal_length; TCropHint thumbnail_crop_hint; } TAlbum; @@ -95,6 +97,8 @@ typedef struct { gchar *metadata_external_exif; int metadata_tz_shift; /* minutes */ time_t metadata_fake_datetime; + double metadata_fake_aperture; + double metadata_fake_focal_length; TCropHint thumbnail_crop_hint; } TIndexItem; diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp index 6c652a5..5a32a3a 100644 --- a/src/jpeg-utils.cpp +++ b/src/jpeg-utils.cpp @@ -225,7 +225,16 @@ get_exif_data_fixed (ExifData *exif, const gchar *key) return NULL; if (g_str_equal (key, EXIF_APERTURE)) { - float val = exifData["Exif.Photo.FNumber"].toFloat(); + double val = -1; + if (exif->fake_aperture != -1) + val = exif->fake_aperture; + else { + if (exifData["Exif.Photo.FNumber"].count() > 0) + val = exifData["Exif.Photo.FNumber"].toFloat(); + else + if (exifData["Exif.Photo.ApertureValue"].count() > 0) + val = exifData["Exif.Photo.ApertureValue"].toFloat(); + } if (val >= 0) return g_strdup_printf ("f/%.1f", val); } @@ -297,7 +306,8 @@ get_exif_data_fixed (ExifData *exif, const gchar *key) } if (g_str_equal (key, EXIF_FOCAL_LENGTH)) { - float val = exifData["Exif.Photo.FocalLength"].toFloat(); + double val; + val = exif->fake_focal_length != -1 ? exif->fake_focal_length : exifData["Exif.Photo.FocalLength"].toFloat(); if (val >= 0) return g_strdup_printf ("%.0f mm", val); } @@ -754,6 +764,22 @@ modify_exif (const gchar *filename, ExifData *exif, gboolean strip_thumbnail, gb modified = TRUE; } } + + if (exif->fake_aperture != -1) { + if (! exifData.empty()) { + exifData["Exif.Photo.FNumber"] = Exiv2::floatToRationalCast (exif->fake_aperture); + if (exifData["Exif.Photo.ApertureValue"].count() > 0) + exifData["Exif.Photo.ApertureValue"] = Exiv2::floatToRationalCast (exif->fake_aperture); + modified = TRUE; + } + } + + if (exif->fake_focal_length != -1) { + if (! exifData.empty()) { + exifData["Exif.Photo.FocalLength"] = Exiv2::floatToRationalCast (exif->fake_focal_length); + modified = TRUE; + } + } } diff --git a/src/jpeg-utils.h b/src/jpeg-utils.h index f8c9b6d..86c8dae 100644 --- a/src/jpeg-utils.h +++ b/src/jpeg-utils.h @@ -54,6 +54,8 @@ typedef struct { gchar *override_copyright; int timezone_shift; time_t fake_datetime; + double fake_aperture; + double fake_focal_length; gchar *external_exif_data; ThumbnailSquareType squared_thumbnail_type; TCropHint thumbnail_crop_hint; diff --git a/src/xml-parser.c b/src/xml-parser.c index 84cc204..9f95cf3 100644 --- a/src/xml-parser.c +++ b/src/xml-parser.c @@ -225,6 +225,24 @@ xml_file_get_node_attribute_boolean (TXMLFile *file, const gchar *x_path, const return b; } +double +xml_file_get_node_attribute_double (TXMLFile *file, const gchar *x_path, const gchar *attr, const double _default) +{ + gchar *s; + double d; + char *endptr = NULL; + + s = xml_file_get_node_attribute (file, x_path, attr); + if (s == NULL) + return _default; + + d = strtod (s, &endptr); + if (endptr != NULL && *endptr != '\0') + d = _default; + g_free (s); + return d; +} + /* * xml_file_get_node_present: existency test of the XPath node diff --git a/src/xml-parser.h b/src/xml-parser.h index f6f6c7c..3ea3e90 100644 --- a/src/xml-parser.h +++ b/src/xml-parser.h @@ -61,6 +61,7 @@ gchar * xml_file_get_node_value_with_default (TXMLFile *file, const gchar *x_pat gchar * xml_file_get_node_attribute (TXMLFile *file, const gchar *x_path, const gchar *attr); long int xml_file_get_node_attribute_long (TXMLFile *file, const gchar *x_path, const gchar *attr, const int _default); gboolean xml_file_get_node_attribute_boolean (TXMLFile *file, const gchar *x_path, const gchar *attr, const gboolean _default); +double xml_file_get_node_attribute_double (TXMLFile *file, const gchar *x_path, const gchar *attr, const double _default); /* * xml_file_get_node_present: existency test of the XPath node -- cgit v1.2.3