summaryrefslogtreecommitdiff
path: root/src/jpeg-utils.cpp
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-17 13:04:10 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-17 13:04:10 +0100
commite90b5572f0006b6c4913e31fd83024d2da3dd3a5 (patch)
treea0f94d5d40cf68823bced10fa85e0dbea98d1749 /src/jpeg-utils.cpp
parentdb74836c3a803004b5e1e66a57790b3d127eeb77 (diff)
downloadcataract-e90b5572f0006b6c4913e31fd83024d2da3dd3a5.tar.xz
Support Iptc.Application2.Digitization{Date,Time} for time shifting and faking
Turned out these two keys are commonly used as well.
Diffstat (limited to 'src/jpeg-utils.cpp')
-rw-r--r--src/jpeg-utils.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp
index 6af7f1f..ece40e4 100644
--- a/src/jpeg-utils.cpp
+++ b/src/jpeg-utils.cpp
@@ -580,7 +580,7 @@ shift_exif_time (Exiv2::ExifData& exifData, const char *key, int amount)
}
static gboolean
-shift_iptc_time (Exiv2::IptcData &iptcData, int amount)
+shift_iptc_time (Exiv2::IptcData &iptcData, const char *date_key, const char *time_key, int amount)
{
struct tm tt = {0};
long int orig_time;
@@ -589,10 +589,9 @@ shift_iptc_time (Exiv2::IptcData &iptcData, int amount)
Exiv2::TimeValue tval;
res = FALSE;
- if (iptc_has_key (iptcData, "Iptc.Application2.DateCreated") ||
- iptc_has_key (iptcData, "Iptc.Application2.TimeCreated")) {
- orig_time = (iptc_has_key (iptcData, "Iptc.Application2.DateCreated") ? iptcData["Iptc.Application2.DateCreated"].toLong() : 0) +
- (iptc_has_key (iptcData, "Iptc.Application2.TimeCreated") ? iptcData["Iptc.Application2.TimeCreated"].toLong() : 0);
+ if (iptc_has_key (iptcData, date_key) || iptc_has_key (iptcData, time_key)) {
+ orig_time = (iptc_has_key (iptcData, date_key) ? iptcData[date_key].toLong() : 0) +
+ (iptc_has_key (iptcData, time_key) ? iptcData[time_key].toLong() : 0);
if (orig_time > 0) {
orig_time += amount * 60;
localtime_r (&orig_time, &tt);
@@ -602,8 +601,8 @@ shift_iptc_time (Exiv2::IptcData &iptcData, int amount)
dval = Exiv2::DateValue(tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday);
tval = Exiv2::TimeValue(tt.tm_hour, tt.tm_min, tt.tm_sec, 0, 0);
- iptcData["Iptc.Application2.DateCreated"].setValue(&dval);
- iptcData["Iptc.Application2.TimeCreated"].setValue(&tval);
+ iptcData[date_key].setValue(&dval);
+ iptcData[time_key].setValue(&tval);
res = TRUE;
}
}
@@ -633,19 +632,25 @@ fake_exif_time (Exiv2::ExifData &exifData, const char *key, time_t datetime)
return res;
}
-static void
-fake_iptc_time (Exiv2::IptcData &iptcData, time_t datetime)
+static gboolean
+fake_iptc_time (Exiv2::IptcData &iptcData, const char *date_key, const char *time_key, time_t datetime)
{
struct tm tt = {0};
Exiv2::DateValue dval;
Exiv2::TimeValue tval;
- localtime_r (&datetime, &tt);
+ if (iptc_has_key (iptcData, date_key) || iptc_has_key (iptcData, time_key)) {
+ localtime_r (&datetime, &tt);
+
+ dval = Exiv2::DateValue(tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday);
+ tval = Exiv2::TimeValue(tt.tm_hour, tt.tm_min, tt.tm_sec, 0, 0);
+ iptcData[date_key].setValue(&dval);
+ iptcData[time_key].setValue(&tval);
+
+ return TRUE;
+ }
- dval = Exiv2::DateValue(tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday);
- tval = Exiv2::TimeValue(tt.tm_hour, tt.tm_min, tt.tm_sec, 0, 0);
- iptcData["Iptc.Application2.DateCreated"].setValue(&dval);
- iptcData["Iptc.Application2.TimeCreated"].setValue(&tval);
+ return FALSE;
}
/*
@@ -704,7 +709,8 @@ modify_exif (const gchar *filename, ExifData *exif, gboolean strip_thumbnail, gb
modified = TRUE;
}
if (! iptcData.empty()) {
- res = shift_iptc_time (iptcData, exif->timezone_shift);
+ res = shift_iptc_time (iptcData, "Iptc.Application2.DateCreated", "Iptc.Application2.TimeCreated", exif->timezone_shift);
+ res = shift_iptc_time (iptcData, "Iptc.Application2.DigitizationDate", "Iptc.Application2.DigitizationTime", exif->timezone_shift) || res;
if (res)
modified = TRUE;
}
@@ -719,8 +725,10 @@ modify_exif (const gchar *filename, ExifData *exif, gboolean strip_thumbnail, gb
modified = TRUE;
}
if (! iptcData.empty()) {
- fake_iptc_time (iptcData, exif->fake_datetime);
- modified = TRUE;
+ res = fake_iptc_time (iptcData, "Iptc.Application2.DateCreated", "Iptc.Application2.TimeCreated", exif->fake_datetime);
+ res = fake_iptc_time (iptcData, "Iptc.Application2.DigitizationDate", "Iptc.Application2.DigitizationTime", exif->fake_datetime) || res;
+ if (res)
+ modified = TRUE;
}
}
}