mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Picture handling: change data structure to store offset instead timestamp
It makes no sense to store a 64bit time stamp with every picture. Even the 32bit offset (in seconds) from the dive start is WAY overkill. But switching to that makes the code much more simple in a number of spots. And makes what is saved to the XML file easier to read, too. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
3a14076b1d
commit
1604299a5b
5 changed files with 13 additions and 12 deletions
9
dive.c
9
dive.c
|
@ -2283,13 +2283,14 @@ static bool new_picture_for_dive(struct dive *d, char *filename)
|
||||||
|
|
||||||
void dive_create_picture(struct dive *d, char *filename, int shift_time)
|
void dive_create_picture(struct dive *d, char *filename, int shift_time)
|
||||||
{
|
{
|
||||||
|
timestamp_t timestamp;
|
||||||
if (!new_picture_for_dive(d, filename))
|
if (!new_picture_for_dive(d, filename))
|
||||||
return;
|
return;
|
||||||
struct picture *p = alloc_picture();
|
struct picture *p = alloc_picture();
|
||||||
p->filename = filename;
|
p->filename = filename;
|
||||||
picture_load_exif_data(p);
|
picture_load_exif_data(p, ×tamp);
|
||||||
if (p->timestamp)
|
if (timestamp)
|
||||||
p->timestamp += shift_time;
|
p->offset = timestamp - d->when + shift_time;
|
||||||
dive_add_picture(d, p);
|
dive_add_picture(d, p);
|
||||||
dive_set_geodata_from_picture(d, p);
|
dive_set_geodata_from_picture(d, p);
|
||||||
}
|
}
|
||||||
|
@ -2298,7 +2299,7 @@ void dive_add_picture(struct dive *d, struct picture *newpic)
|
||||||
{
|
{
|
||||||
struct picture **pic_ptr = &d->picture_list;
|
struct picture **pic_ptr = &d->picture_list;
|
||||||
/* let's keep the list sorted by time */
|
/* let's keep the list sorted by time */
|
||||||
while( *pic_ptr && (*pic_ptr)->timestamp < newpic->timestamp )
|
while( *pic_ptr && (*pic_ptr)->offset < newpic->offset )
|
||||||
pic_ptr = &(*pic_ptr)->next;
|
pic_ptr = &(*pic_ptr)->next;
|
||||||
newpic->next = *pic_ptr;
|
newpic->next = *pic_ptr;
|
||||||
*pic_ptr = newpic;
|
*pic_ptr = newpic;
|
||||||
|
|
4
dive.h
4
dive.h
|
@ -289,7 +289,7 @@ struct dive {
|
||||||
/* picture list and methods related to dive picture handling */
|
/* picture list and methods related to dive picture handling */
|
||||||
struct picture {
|
struct picture {
|
||||||
char *filename;
|
char *filename;
|
||||||
time_t timestamp;
|
int32_t offset;
|
||||||
degrees_t latitude;
|
degrees_t latitude;
|
||||||
degrees_t longitude;
|
degrees_t longitude;
|
||||||
struct picture *next;
|
struct picture *next;
|
||||||
|
@ -305,7 +305,7 @@ extern void dive_create_picture(struct dive *d, char *filename, int shift_time);
|
||||||
extern void dive_add_picture(struct dive *d, struct picture *newpic);
|
extern void dive_add_picture(struct dive *d, struct picture *newpic);
|
||||||
extern void dive_remove_picture(struct dive *d, struct picture *pic);
|
extern void dive_remove_picture(struct dive *d, struct picture *pic);
|
||||||
extern unsigned int dive_get_picture_count(struct dive *d);
|
extern unsigned int dive_get_picture_count(struct dive *d);
|
||||||
extern void picture_load_exif_data(struct picture *p);
|
extern void picture_load_exif_data(struct picture *p, timestamp_t *timestamp);
|
||||||
extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic);
|
extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1307,13 +1307,13 @@ void ProfileWidget2::plotPictures()
|
||||||
struct picture *pic = (struct picture*) m->index(i,1).data(Qt::UserRole).value<void*>();
|
struct picture *pic = (struct picture*) m->index(i,1).data(Qt::UserRole).value<void*>();
|
||||||
// it's a correct picture, but doesn't have a timestamp: only show on the widget near the
|
// it's a correct picture, but doesn't have a timestamp: only show on the widget near the
|
||||||
// information area.
|
// information area.
|
||||||
if (!pic->timestamp)
|
if (!pic->offset)
|
||||||
continue;
|
continue;
|
||||||
DivePictureItem *item = new DivePictureItem();
|
DivePictureItem *item = new DivePictureItem();
|
||||||
item->setPixmap(m->index(i,0).data(Qt::DecorationRole).value<QPixmap>());
|
item->setPixmap(m->index(i,0).data(Qt::DecorationRole).value<QPixmap>());
|
||||||
// let's put the picture at the correct time, but at a fixed "depth" on the profile
|
// let's put the picture at the correct time, but at a fixed "depth" on the profile
|
||||||
// not sure this is ideal, but it seems to look right.
|
// not sure this is ideal, but it seems to look right.
|
||||||
x = timeAxis->posAtValue(pic->timestamp - current_dive->when);
|
x = timeAxis->posAtValue(pic->offset);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
y = 10;
|
y = 10;
|
||||||
else
|
else
|
||||||
|
|
|
@ -264,7 +264,7 @@ extern "C" xsltStylesheetPtr get_stylesheet(const char *name)
|
||||||
return xslt;
|
return xslt;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void picture_load_exif_data(struct picture *p)
|
extern "C" void picture_load_exif_data(struct picture *p, timestamp_t *timestamp)
|
||||||
{
|
{
|
||||||
EXIFInfo exif;
|
EXIFInfo exif;
|
||||||
memblock mem;
|
memblock mem;
|
||||||
|
@ -273,7 +273,7 @@ extern "C" void picture_load_exif_data(struct picture *p)
|
||||||
goto picture_load_exit;
|
goto picture_load_exit;
|
||||||
if (exif.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size) != PARSE_EXIF_SUCCESS)
|
if (exif.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size) != PARSE_EXIF_SUCCESS)
|
||||||
goto picture_load_exit;
|
goto picture_load_exit;
|
||||||
p->timestamp = exif.epoch();
|
*timestamp = exif.epoch();
|
||||||
p->longitude.udeg= lrint(1000000.0 * exif.GeoLocation.Longitude);
|
p->longitude.udeg= lrint(1000000.0 * exif.GeoLocation.Longitude);
|
||||||
p->latitude.udeg = lrint(1000000.0 * exif.GeoLocation.Latitude);
|
p->latitude.udeg = lrint(1000000.0 * exif.GeoLocation.Latitude);
|
||||||
picture_load_exit:
|
picture_load_exit:
|
||||||
|
|
|
@ -333,8 +333,8 @@ static void save_picture(struct membuffer *b, struct picture *pic)
|
||||||
put_string(b, " <picture filename='");
|
put_string(b, " <picture filename='");
|
||||||
put_string(b, pic->filename);
|
put_string(b, pic->filename);
|
||||||
put_string(b, "'");
|
put_string(b, "'");
|
||||||
if (pic->timestamp)
|
if (pic->offset)
|
||||||
put_format(b, " timestamp='%ld'", pic->timestamp);
|
put_format(b, " offset='%d'", pic->offset);
|
||||||
if (pic->latitude.udeg || pic->longitude.udeg) {
|
if (pic->latitude.udeg || pic->longitude.udeg) {
|
||||||
put_degrees(b, pic->latitude, " gps='", " ");
|
put_degrees(b, pic->latitude, " gps='", " ");
|
||||||
put_degrees(b, pic->longitude, "", "'");
|
put_degrees(b, pic->longitude, "", "'");
|
||||||
|
|
Loading…
Add table
Reference in a new issue