diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2014-03-18 10:46:32 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2014-03-18 10:46:32 +0100 |
| commit | 98ee28f049415750b2bb5d9f3eb386a83696cddc (patch) | |
| tree | 44bfab0208e7854e3bcd134287498d59634e9e9f /src | |
| parent | ef1d22999ea6de81f0eb0c58a92da5fa750ee393 (diff) | |
| download | cataract-98ee28f049415750b2bb5d9f3eb386a83696cddc.tar.xz | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/generators.c | 8 | ||||
| -rw-r--r-- | src/items.c | 8 | ||||
| -rw-r--r-- | src/items.h | 4 | ||||
| -rw-r--r-- | src/jpeg-utils.cpp | 30 | ||||
| -rw-r--r-- | src/jpeg-utils.h | 2 | ||||
| -rw-r--r-- | src/xml-parser.c | 18 | ||||
| -rw-r--r-- | src/xml-parser.h | 1 |
7 files changed, 68 insertions, 3 deletions
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 |
