X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=inline;f=profile.c;h=2edaf694cd5f429387d5e3cba08f32c7fd3aeda8;hb=ab3c6731bea1043e35d450b227fc2f41e137c397;hp=531839368bf4cd53b89c386ef84a5c15c5b02078;hpb=957aaf619f22465b4aa1898c925831a6270c1230;p=ext%2Fsubsurface.git diff --git a/profile.c b/profile.c index 5318393..2edaf69 100644 --- a/profile.c +++ b/profile.c @@ -156,24 +156,41 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t * cairo_show_text(cr, buffer); } +static void plot_one_event(struct graphics_context *gc, struct plot_info *pi, struct event *event, const text_render_options_t *tro) +{ + int i, depth = 0; + + for (i = 0; i < pi->nr; i++) { + struct plot_data *data = pi->entry + i; + if (event->time.seconds < data->sec) + break; + depth = data->val; + } + plot_text(gc, tro, event->time.seconds, depth, "%s", event->name); +} + +static void plot_events(struct graphics_context *gc, struct plot_info *pi, struct dive *dive) +{ + static const text_render_options_t tro = {14, 1.0, 0.2, 0.2, CENTER, TOP}; + struct event *event = dive->events; + + if (gc->printer) + return; + + while (event) { + plot_one_event(gc, pi, event, &tro); + event = event->next; + } +} + static void render_depth_sample(struct graphics_context *gc, struct plot_data *entry, const text_render_options_t *tro) { - int sec = entry->sec; - depth_t depth = { entry->val }; - const char *fmt; + int sec = entry->sec, decimals; 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(gc, tro, sec, depth.mm, fmt, d); + d = get_depth_units(entry->val, &decimals, NULL); + + plot_text(gc, tro, sec, entry->val, "%.*f", decimals, d); } static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi) @@ -289,10 +306,12 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi cairo_stroke(cr); /* Show mean depth */ - set_source_rgba(gc, 1, 0.2, 0.2, 0.40); - move_to(gc, 0, pi->meandepth); - line_to(gc, 1, pi->meandepth); - cairo_stroke(cr); + if (! gc->printer) { + set_source_rgba(gc, 1, 0.2, 0.2, 0.40); + move_to(gc, 0, pi->meandepth); + line_to(gc, 1, pi->meandepth); + cairo_stroke(cr); + } gc->leftx = 0; gc->rightx = maxtime; @@ -605,7 +624,7 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) } /* Smoothing function: 5-point triangular smooth */ - for (i = 2; i < nr-1; i++) { + for (i = 2; i < nr; i++) { struct plot_data *entry = pi->entry+i; int val; @@ -618,9 +637,9 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) if (entry[0].sec - entry[-1].sec) { entry->velocity = velocity((entry[0].val - entry[-1].val) / (entry[0].sec - entry[-1].sec)); /* if our samples are short and we aren't too FAST*/ - if (entry[0].sec - entry[-1].sec < 30 && entry->velocity < FAST) { + if (entry[0].sec - entry[-1].sec < 15 && entry->velocity < FAST) { int past = -2; - while (pi->entry <= entry-past && entry[0].sec - entry[past].sec < 30) + while (i+past > 0 && entry[0].sec - entry[past].sec < 15) past--; entry->velocity = velocity((entry[0].val - entry[past].val) / (entry[0].sec - entry[past].sec)); @@ -725,6 +744,7 @@ void plot(struct graphics_context *gc, int w, int h, struct dive *dive) /* Depth profile */ plot_depth_profile(gc, pi); + plot_events(gc, pi, dive); /* Text on top of all graphs.. */ plot_temperature_text(gc, pi); @@ -743,4 +763,5 @@ void plot(struct graphics_context *gc, int w, int h, struct dive *dive) cairo_close_path(gc->cr); cairo_stroke(gc->cr); + free(pi); }