summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/dive.c86
-rw-r--r--core/dive.h8
-rw-r--r--core/picture.c89
-rw-r--r--core/picture.h12
4 files changed, 100 insertions, 95 deletions
diff --git a/core/dive.c b/core/dive.c
index 5ac008e8f..d5ffc162b 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -14,7 +14,6 @@
#include "divesite.h"
#include "errorhelper.h"
#include "qthelper.h"
-#include "metadata.h"
#include "membuffer.h"
#include "picture.h"
#include "tag.h"
@@ -3498,64 +3497,6 @@ void set_git_prefs(const char *prefs)
git_prefs.pp_graphs.po2 = 1;
}
-/* Return distance of timestamp to time of dive. Result is always positive, 0 means during dive. */
-static timestamp_t time_from_dive(const struct dive *d, timestamp_t timestamp)
-{
- timestamp_t end_time = dive_endtime(d);
- if (timestamp < d->when)
- return d->when - timestamp;
- else if (timestamp > end_time)
- return timestamp - end_time;
- else
- return 0;
-}
-
-// only add pictures that have timestamps between 30 minutes before the dive and
-// 30 minutes after the dive ends
-#define D30MIN (30 * 60)
-static bool dive_check_picture_time(const struct dive *d, timestamp_t timestamp)
-{
- return time_from_dive(d, timestamp) < D30MIN;
-}
-
-/* Return dive closest selected dive to given timestamp or NULL if no dives are selected. */
-static struct dive *nearest_selected_dive(timestamp_t timestamp)
-{
- struct dive *d, *res = NULL;
- int i;
- timestamp_t offset, min = 0;
-
- for_each_dive(i, d) {
- if (!d->selected)
- continue;
- offset = time_from_dive(d, timestamp);
- if (!res || offset < min) {
- res = d;
- min = offset;
- }
-
- /* We suppose that dives are sorted chronologically. Thus
- * if the offset starts to increase, we can end. This ignores
- * pathological cases such as overlapping dives. In such a
- * case the user will have to add pictures manually.
- */
- if (offset == 0 || offset > min)
- break;
- }
- return res;
-}
-
-bool picture_check_valid_time(timestamp_t timestamp, int shift_time)
-{
- int i;
- struct dive *dive;
-
- for_each_dive (i, dive)
- if (dive->selected && dive_check_picture_time(dive, timestamp + shift_time))
- return true;
- return false;
-}
-
void dive_set_geodata_from_picture(struct dive *dive, struct picture *picture, struct dive_site_table *table)
{
struct dive_site *ds = dive->dive_site;
@@ -3570,33 +3511,6 @@ void dive_set_geodata_from_picture(struct dive *dive, struct picture *picture, s
}
}
-/* Creates a picture and indicates the dive to which this picture should be added.
- * The caller is responsible for actually adding the picture to the dive.
- * If no appropriate dive was found, no picture is created and NULL is returned.
- */
-struct picture *create_picture(const char *filename, int shift_time, bool match_all, struct dive **dive)
-{
- struct metadata metadata;
- timestamp_t timestamp;
-
- get_metadata(filename, &metadata);
- timestamp = metadata.timestamp + shift_time;
- *dive = nearest_selected_dive(timestamp);
-
- if (!*dive)
- return NULL;
- if (get_picture_idx(&(*dive)->pictures, filename) >= 0)
- return NULL;
- if (!match_all && !dive_check_picture_time(*dive, timestamp))
- return NULL;
-
- struct picture *picture = malloc(sizeof(struct picture));
- picture->filename = strdup(filename);
- picture->offset.seconds = metadata.timestamp - (*dive)->when + shift_time;
- picture->location = metadata.location;
- return picture;
-}
-
/* clones a dive and moves given dive computer to front */
struct dive *make_first_dc(const struct dive *d, int dc_number)
{
diff --git a/core/dive.h b/core/dive.h
index 8e9ee280a..2113c2a9c 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -204,14 +204,6 @@ extern enum divemode_t get_current_divemode(const struct divecomputer *dc, int t
extern struct event *get_next_divemodechange(const struct event **evd, bool update_pointer);
extern enum divemode_t get_divemode_at_time(const struct divecomputer *dc, int dtime, const struct event **ev_dmc);
-/* picture list and methods related to dive picture handling */
-#define FOR_EACH_PICTURE(_dive) \
- if ((_dive) && (_dive)->pictures.nr) \
- for (struct picture *picture = (_dive)->pictures.pictures; \
- picture < (_dive)->pictures.pictures + (_dive)->pictures.nr; \
- picture++)
-extern struct picture *create_picture(const char *filename, int shift_time, bool match_all, struct dive **dive);
-extern bool picture_check_valid_time(timestamp_t timestamp, int shift_time);
extern void dive_set_geodata_from_picture(struct dive *dive, struct picture *picture, struct dive_site_table *table);
extern bool has_gaschange_event(const struct dive *dive, const struct divecomputer *dc, int idx);
diff --git a/core/picture.c b/core/picture.c
index 36953b8b1..9440cef35 100644
--- a/core/picture.c
+++ b/core/picture.c
@@ -1,7 +1,9 @@
// SPDX-License-Identifier: GPL-2.0
#include "picture.h"
-#include "table.h"
+#include "dive.h"
+#include "metadata.h"
#include "subsurface-string.h"
+#include "table.h"
#include <stdlib.h>
#include <string.h>
@@ -66,3 +68,88 @@ int get_picture_idx(const struct picture_table *t, const char *filename)
}
return -1;
}
+
+/* Return distance of timestamp to time of dive. Result is always positive, 0 means during dive. */
+static timestamp_t time_from_dive(const struct dive *d, timestamp_t timestamp)
+{
+ timestamp_t end_time = dive_endtime(d);
+ if (timestamp < d->when)
+ return d->when - timestamp;
+ else if (timestamp > end_time)
+ return timestamp - end_time;
+ else
+ return 0;
+}
+
+/* Return dive closest selected dive to given timestamp or NULL if no dives are selected. */
+static struct dive *nearest_selected_dive(timestamp_t timestamp)
+{
+ struct dive *d, *res = NULL;
+ int i;
+ timestamp_t offset, min = 0;
+
+ for_each_dive(i, d) {
+ if (!d->selected)
+ continue;
+ offset = time_from_dive(d, timestamp);
+ if (!res || offset < min) {
+ res = d;
+ min = offset;
+ }
+
+ /* We suppose that dives are sorted chronologically. Thus
+ * if the offset starts to increase, we can end. This ignores
+ * pathological cases such as overlapping dives. In such a
+ * case the user will have to add pictures manually.
+ */
+ if (offset == 0 || offset > min)
+ break;
+ }
+ return res;
+}
+
+// only add pictures that have timestamps between 30 minutes before the dive and
+// 30 minutes after the dive ends
+#define D30MIN (30 * 60)
+static bool dive_check_picture_time(const struct dive *d, timestamp_t timestamp)
+{
+ return time_from_dive(d, timestamp) < D30MIN;
+}
+
+/* Creates a picture and indicates the dive to which this picture should be added.
+ * The caller is responsible for actually adding the picture to the dive.
+ * If no appropriate dive was found, no picture is created and NULL is returned.
+ */
+struct picture *create_picture(const char *filename, int shift_time, bool match_all, struct dive **dive)
+{
+ struct metadata metadata;
+ timestamp_t timestamp;
+
+ get_metadata(filename, &metadata);
+ timestamp = metadata.timestamp + shift_time;
+ *dive = nearest_selected_dive(timestamp);
+
+ if (!*dive)
+ return NULL;
+ if (get_picture_idx(&(*dive)->pictures, filename) >= 0)
+ return NULL;
+ if (!match_all && !dive_check_picture_time(*dive, timestamp))
+ return NULL;
+
+ struct picture *picture = malloc(sizeof(struct picture));
+ picture->filename = strdup(filename);
+ picture->offset.seconds = metadata.timestamp - (*dive)->when + shift_time;
+ picture->location = metadata.location;
+ return picture;
+}
+
+bool picture_check_valid_time(timestamp_t timestamp, int shift_time)
+{
+ int i;
+ struct dive *dive;
+
+ for_each_dive (i, dive)
+ if (dive->selected && dive_check_picture_time(dive, timestamp + shift_time))
+ return true;
+ return false;
+}
diff --git a/core/picture.h b/core/picture.h
index 61492fffc..b763adfe9 100644
--- a/core/picture.h
+++ b/core/picture.h
@@ -10,6 +10,8 @@
extern "C" {
#endif
+struct dive;
+
struct picture {
char *filename;
offset_t offset;
@@ -17,6 +19,13 @@ struct picture {
};
static const struct picture empty_picture = { NULL, { 0 }, { { 0 }, { 0 } } };
+/* loop through all pictures of a dive */
+#define FOR_EACH_PICTURE(_dive) \
+ if ((_dive) && (_dive)->pictures.nr) \
+ for (struct picture *picture = (_dive)->pictures.pictures; \
+ picture < (_dive)->pictures.pictures + (_dive)->pictures.nr; \
+ picture++)
+
/* Table of pictures. Attention: this stores pictures,
* *not* pointers to pictures. This has two crucial consequences:
* 1) Pointers to pictures are not stable. They may be
@@ -37,6 +46,9 @@ extern void remove_from_picture_table(struct picture_table *, int idx);
extern int get_picture_idx(const struct picture_table *, const char *filename); /* Return -1 if not found */
extern void sort_picture_table(struct picture_table *);
+extern struct picture *create_picture(const char *filename, int shift_time, bool match_all, struct dive **dive);
+extern bool picture_check_valid_time(timestamp_t timestamp, int shift_time);
+
#ifdef __cplusplus
}
#endif