mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
Use the analyzed local minima/maxima for depth text plotting
Instead of relying on our ad-hoc minmax finder, just use the local minima/maxima information directly. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
28cadad144
commit
86e48bfe10
1 changed files with 18 additions and 69 deletions
87
profile.c
87
profile.c
|
@ -129,10 +129,10 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t *
|
|||
cairo_show_text(cr, buffer);
|
||||
}
|
||||
|
||||
static void render_depth_sample(struct graphics_context *gc, struct sample *sample, const text_render_options_t *tro)
|
||||
static void render_depth_sample(struct graphics_context *gc, struct plot_data *entry, const text_render_options_t *tro)
|
||||
{
|
||||
int sec = sample->time.seconds;
|
||||
depth_t depth = sample->depth;
|
||||
int sec = entry->sec;
|
||||
depth_t depth = { entry->val };
|
||||
const char *fmt;
|
||||
double d;
|
||||
|
||||
|
@ -149,76 +149,28 @@ static void render_depth_sample(struct graphics_context *gc, struct sample *samp
|
|||
plot_text(gc, tro, sec, depth.mm, fmt, d);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the next minimum/maximum point.
|
||||
*
|
||||
* We exit early if we hit "enough" of a depth reversal,
|
||||
* which is roughly 10 feet.
|
||||
*/
|
||||
static struct sample *next_minmax(struct sample *sample, struct sample *end, int minmax)
|
||||
{
|
||||
const int enough = 3000;
|
||||
struct sample *result;
|
||||
int depthlimit;
|
||||
|
||||
if (sample >= end)
|
||||
return 0;
|
||||
|
||||
depthlimit = sample->depth.mm;
|
||||
result = NULL;
|
||||
|
||||
for (;;) {
|
||||
int depth;
|
||||
|
||||
sample++;
|
||||
if (sample >= end)
|
||||
return NULL;
|
||||
depth = sample->depth.mm;
|
||||
|
||||
if (minmax) {
|
||||
if (depth <= depthlimit) {
|
||||
if (depthlimit - depth > enough)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (depth >= depthlimit) {
|
||||
if (depth - depthlimit > enough)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
result = sample;
|
||||
depthlimit = depth;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void plot_text_samples(struct graphics_context *gc, struct sample *a, struct sample *b)
|
||||
static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi)
|
||||
{
|
||||
static const text_render_options_t deep = {14, 1.0, 0.2, 0.2, CENTER, TOP};
|
||||
static const text_render_options_t shallow = {14, 1.0, 0.2, 0.2, CENTER, BOTTOM};
|
||||
int i;
|
||||
|
||||
for (;;) {
|
||||
if (b <= a)
|
||||
break;
|
||||
a = next_minmax(a, b, 1);
|
||||
if (!a)
|
||||
break;
|
||||
render_depth_sample(gc, a, &deep);
|
||||
a = next_minmax(a, b, 0);
|
||||
if (!a)
|
||||
break;
|
||||
if (a->depth.mm < 2500)
|
||||
for (i = 0; i < pi->nr; i++) {
|
||||
struct plot_data *entry = pi->entry + i;
|
||||
|
||||
if (entry->val < 2000)
|
||||
continue;
|
||||
render_depth_sample(gc, a, &shallow);
|
||||
|
||||
if (entry == entry->max[2])
|
||||
render_depth_sample(gc, entry, &deep);
|
||||
|
||||
if (entry == entry->min[2])
|
||||
render_depth_sample(gc, entry, &shallow);
|
||||
}
|
||||
}
|
||||
|
||||
static void plot_depth_text(struct dive *dive, struct graphics_context *gc)
|
||||
static void plot_depth_text(struct dive *dive, struct graphics_context *gc, struct plot_info *pi)
|
||||
{
|
||||
struct sample *sample, *end;
|
||||
int maxtime, maxdepth;
|
||||
|
||||
/* Get plot scaling limits */
|
||||
|
@ -228,10 +180,7 @@ static void plot_depth_text(struct dive *dive, struct graphics_context *gc)
|
|||
gc->scalex = maxtime;
|
||||
gc->scaley = maxdepth;
|
||||
|
||||
sample = dive->sample;
|
||||
end = dive->sample + dive->samples;
|
||||
|
||||
plot_text_samples(gc, sample, end);
|
||||
plot_text_samples(gc, pi);
|
||||
}
|
||||
|
||||
static void plot_smoothed_profile(struct graphics_context *gc, struct plot_info *pi)
|
||||
|
@ -625,7 +574,7 @@ static void plot(struct graphics_context *gc, int w, int h, struct dive *dive)
|
|||
plot_depth_profile(dive, gc, pi);
|
||||
|
||||
/* Text on top of all graphs.. */
|
||||
plot_depth_text(dive, gc);
|
||||
plot_depth_text(dive, gc, pi);
|
||||
plot_cylinder_pressure_text(dive, gc);
|
||||
|
||||
/* And info box in the lower right corner.. */
|
||||
|
|
Loading…
Reference in a new issue