summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/generators.c8
-rw-r--r--src/items.c8
-rw-r--r--src/items.h4
-rw-r--r--src/jpeg-utils.cpp30
-rw-r--r--src/jpeg-utils.h2
-rw-r--r--src/xml-parser.c18
-rw-r--r--src/xml-parser.h1
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