summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-09-17 17:34:13 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-09-19 14:44:34 -0700
commit21b1550739b9a3fe4ab27cabd4a8587249048f71 (patch)
tree6a7d00658b720a334df0aa16c6999c6704116734
parent92deb7aa70e79db43b143c965c6386a6b06b4a2b (diff)
downloadsubsurface-21b1550739b9a3fe4ab27cabd4a8587249048f71.tar.gz
Dive media: on import read metadata only once
On import of dive media, the timestamp is read from the metadata to check if the image belongs to the selected dives. The pictures are then listed in a dialog. Currently, the metadata is read twice if images are outside of a dive: once in picture_check_valid() and if it turns out that the picture is not valid again in picture_get_time() to display the proper timestamp. Even though metadata-extraction is reasonably fast, this is a bit of an embarrassment. Instead, read the timestamps only once in the constructor of the dialog and from then on only used these timestamps. Keep the timestamps in a QVector. Rename the picture_check_valid() function to picture_check_valid_time() and pass a timestamp instead of a filename. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/dive.c3
-rw-r--r--core/dive.h2
-rw-r--r--desktop-widgets/simplewidgets.cpp22
-rw-r--r--desktop-widgets/simplewidgets.h1
4 files changed, 16 insertions, 12 deletions
diff --git a/core/dive.c b/core/dive.c
index 67cfc5fa5..0c185efa5 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -3871,12 +3871,11 @@ bool dive_check_picture_time(const struct dive *d, int shift_time, timestamp_t t
return false;
}
-bool picture_check_valid(const char *filename, int shift_time)
+bool picture_check_valid_time(timestamp_t timestamp, int shift_time)
{
int i;
struct dive *dive;
- timestamp_t timestamp = picture_get_timestamp(filename);
for_each_dive (i, dive)
if (dive->selected && dive_check_picture_time(dive, shift_time, timestamp))
return true;
diff --git a/core/dive.h b/core/dive.h
index 277050f5e..3344aaf35 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -382,7 +382,7 @@ extern void dive_create_picture(struct dive *d, const char *filename, int shift_
extern void dive_add_picture(struct dive *d, struct picture *newpic);
extern bool dive_remove_picture(struct dive *d, const char *filename);
extern unsigned int dive_get_picture_count(struct dive *d);
-extern bool picture_check_valid(const char *filename, int shift_time);
+extern bool picture_check_valid_time(timestamp_t timestamp, int shift_time);
extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic);
extern void picture_free(struct picture *picture);
diff --git a/desktop-widgets/simplewidgets.cpp b/desktop-widgets/simplewidgets.cpp
index 79a3cc069..64845712d 100644
--- a/desktop-widgets/simplewidgets.cpp
+++ b/desktop-widgets/simplewidgets.cpp
@@ -354,6 +354,11 @@ ShiftImageTimesDialog::ShiftImageTimesDialog(QWidget *parent, QStringList fileNa
connect(ui.matchAllImages, SIGNAL(toggled(bool)), this, SLOT(matchAllImagesToggled(bool)));
dcImageEpoch = (time_t)0;
+ // Get times of all files. 0 means that the time couldn't be determined.
+ int numFiles = fileNames.size();
+ timestamps.resize(numFiles);
+ for (int i = 0; i < numFiles; ++i)
+ timestamps[i] = picture_get_timestamp(qPrintable(fileNames[i]));
updateInvalid();
}
@@ -375,7 +380,6 @@ void ShiftImageTimesDialog::setOffset(time_t offset)
void ShiftImageTimesDialog::updateInvalid()
{
- timestamp_t timestamp;
bool allValid = true;
ui.warningLabel->hide();
ui.invalidFilesText->hide();
@@ -389,17 +393,17 @@ void ShiftImageTimesDialog::updateInvalid()
}
ui.invalidFilesText->append(tr("\nFiles with inappropriate date/time") + ":");
- Q_FOREACH (const QString &fileName, fileNames) {
- if (picture_check_valid(qPrintable(fileName), m_amount))
+ int numFiles = fileNames.size();
+ for (int i = 0; i < numFiles; ++i) {
+ if (picture_check_valid_time(timestamps[i], m_amount))
continue;
- // We've found invalid image
- timestamp = picture_get_timestamp(qPrintable(fileName));
- time_first.setTime_t(timestamp + m_amount);
- if (timestamp == 0)
- ui.invalidFilesText->append(fileName + " - " + tr("No Exif date/time found"));
+ // We've found an invalid image
+ time_first.setTime_t(timestamps[i] + m_amount);
+ if (timestamps[i] == 0)
+ ui.invalidFilesText->append(fileNames[i] + " - " + tr("No Exif date/time found"));
else
- ui.invalidFilesText->append(fileName + " - " + time_first.toString());
+ ui.invalidFilesText->append(fileNames[i] + " - " + time_first.toString());
allValid = false;
}
diff --git a/desktop-widgets/simplewidgets.h b/desktop-widgets/simplewidgets.h
index 526e2be50..e8c999c40 100644
--- a/desktop-widgets/simplewidgets.h
+++ b/desktop-widgets/simplewidgets.h
@@ -118,6 +118,7 @@ slots:
private:
QStringList fileNames;
+ QVector<timestamp_t> timestamps;
Ui::ShiftImageTimesDialog ui;
time_t m_amount;
time_t dcImageEpoch;