mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
Honor depth unit settings when plotting the depth profile
This shows the depth properly in meter or feet depending on unit selection. It also changes the horizontal depth rulers to be at 10m/30ft intervals rather than the previous 15ft. With the textual depth markers, the horizontal lines aren't as important any more. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b5d3fa6023
commit
fdbd80a3a2
1 changed files with 33 additions and 13 deletions
46
profile.c
46
profile.c
|
@ -22,9 +22,11 @@ static int round_seconds_up(int seconds)
|
|||
return MAX(30*60, ROUND_UP(seconds, 60*10));
|
||||
}
|
||||
|
||||
static int round_feet_up(int feet)
|
||||
static int round_depth_up(depth_t depth)
|
||||
{
|
||||
return MAX(90, ROUND_UP(feet+5, 15));
|
||||
unsigned mm = depth.mm;
|
||||
/* Minimum 30m */
|
||||
return MAX(30000, ROUND_UP(mm+3000, 10000));
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
@ -124,7 +126,7 @@ static void plot_depth_text(struct dive *dive, cairo_t *cr,
|
|||
|
||||
/* Get plot scaling limits */
|
||||
maxtime = round_seconds_up(dive->duration.seconds);
|
||||
maxdepth = round_feet_up(to_feet(dive->maxdepth));
|
||||
maxdepth = round_depth_up(dive->maxdepth);
|
||||
|
||||
scalex = maxtime;
|
||||
scaley = maxdepth;
|
||||
|
@ -136,9 +138,22 @@ static void plot_depth_text(struct dive *dive, cairo_t *cr,
|
|||
text_render_options_t tro = {1.0, 0.2, 0.2, CENTER};
|
||||
struct sample *sample = dive->sample+i;
|
||||
int sec = sample->time.seconds;
|
||||
int depth = to_feet(sample->depth);
|
||||
depth_t depth = sample->depth;
|
||||
const char *fmt;
|
||||
double d;
|
||||
|
||||
plot_text(cr, &tro, SCALE(sec, depth), "%d ft", depth);
|
||||
switch (output_units.length) {
|
||||
case METERS:
|
||||
d = depth.mm / 1000.0;
|
||||
fmt = "%.1f";
|
||||
break;
|
||||
case FEET:
|
||||
d = to_feet(depth);
|
||||
fmt = "%.0f";
|
||||
break;
|
||||
}
|
||||
|
||||
plot_text(cr, &tro, SCALE(sec, depth.mm), fmt, d);
|
||||
i = next_minmax(dive, i, 0);
|
||||
if (!i)
|
||||
break;
|
||||
|
@ -152,7 +167,7 @@ static void plot_depth_profile(struct dive *dive, cairo_t *cr,
|
|||
int begins, sec, depth;
|
||||
int i, samples;
|
||||
struct sample *sample;
|
||||
int maxtime, maxdepth;
|
||||
int maxtime, maxdepth, marker;
|
||||
|
||||
samples = dive->samples;
|
||||
if (!samples)
|
||||
|
@ -162,7 +177,7 @@ static void plot_depth_profile(struct dive *dive, cairo_t *cr,
|
|||
|
||||
/* Get plot scaling limits */
|
||||
maxtime = round_seconds_up(dive->duration.seconds);
|
||||
maxdepth = round_feet_up(to_feet(dive->maxdepth));
|
||||
maxdepth = round_depth_up(dive->maxdepth);
|
||||
|
||||
/* Time markers: every 5 min */
|
||||
scalex = maxtime;
|
||||
|
@ -172,11 +187,16 @@ static void plot_depth_profile(struct dive *dive, cairo_t *cr,
|
|||
cairo_line_to(cr, SCALE(i, 1));
|
||||
}
|
||||
|
||||
/* Depth markers: every 15 ft */
|
||||
/* Depth markers: every 30 ft or 10 m*/
|
||||
scalex = 1.0;
|
||||
scaley = maxdepth;
|
||||
switch (output_units.length) {
|
||||
case METERS: marker = 10000; break;
|
||||
case FEET: marker = 9144; break; /* 30 ft */
|
||||
}
|
||||
|
||||
cairo_set_source_rgba(cr, 1, 1, 1, 0.5);
|
||||
for (i = 15; i < maxdepth; i += 15) {
|
||||
for (i = marker; i < maxdepth; i += marker) {
|
||||
cairo_move_to(cr, SCALE(0, i));
|
||||
cairo_line_to(cr, SCALE(1, i));
|
||||
}
|
||||
|
@ -184,8 +204,8 @@ static void plot_depth_profile(struct dive *dive, cairo_t *cr,
|
|||
|
||||
/* Show mean depth */
|
||||
cairo_set_source_rgba(cr, 1, 0.2, 0.2, 0.40);
|
||||
cairo_move_to(cr, SCALE(0, to_feet(dive->meandepth)));
|
||||
cairo_line_to(cr, SCALE(1, to_feet(dive->meandepth)));
|
||||
cairo_move_to(cr, SCALE(0, dive->meandepth.mm));
|
||||
cairo_line_to(cr, SCALE(1, dive->meandepth.mm));
|
||||
cairo_stroke(cr);
|
||||
|
||||
scalex = maxtime;
|
||||
|
@ -193,12 +213,12 @@ static void plot_depth_profile(struct dive *dive, cairo_t *cr,
|
|||
sample = dive->sample;
|
||||
cairo_set_source_rgba(cr, 1, 0.2, 0.2, 0.80);
|
||||
begins = sample->time.seconds;
|
||||
cairo_move_to(cr, SCALE(sample->time.seconds, to_feet(sample->depth)));
|
||||
cairo_move_to(cr, SCALE(sample->time.seconds, sample->depth.mm));
|
||||
for (i = 1; i < dive->samples; i++) {
|
||||
sample++;
|
||||
sec = sample->time.seconds;
|
||||
if (sec <= maxtime) {
|
||||
depth = to_feet(sample->depth);
|
||||
depth = sample->depth.mm;
|
||||
cairo_line_to(cr, SCALE(sec, depth));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue