]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Honor depth unit settings when plotting the depth profile
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 7 Sep 2011 16:21:26 +0000 (09:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 7 Sep 2011 16:21:26 +0000 (09:21 -0700)
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>
profile.c

index 705d90cd652e15a59c47fba9c34e07e30d6a46dc..d38046a4b7ee66a812c293352d63f81c69630c82 100644 (file)
--- a/profile.c
+++ b/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;
+
+               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), "%d ft", depth);
+               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));
                }
        }