X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=profile.c;h=c2433930fe7c4c49aa1ced4f4f1a37fc65a2f2e4;hb=75f784267521e2a02c0c84ab4fe05c105dfc68f5;hp=6475008c93d44dd2cad224d39f01626aa4b228fb;hpb=cfcc811efe5aa3d93cebbc0ceb91a4900b14ec4e;p=ext%2Fsubsurface.git diff --git a/profile.c b/profile.c index 6475008..c243393 100644 --- a/profile.c +++ b/profile.c @@ -57,8 +57,10 @@ static int round_depth_up(depth_t depth) } typedef struct { + int size; double r,g,b; - enum {CENTER,LEFT} allign; + enum {CENTER,LEFT} halign; + enum {MIDDLE,TOP,BOTTOM} valign; } text_render_options_t; static void plot_text(struct graphics_context *gc, text_render_options_t *tro, @@ -74,11 +76,28 @@ static void plot_text(struct graphics_context *gc, text_render_options_t *tro, vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); + cairo_set_font_size(cr, tro->size); cairo_text_extents(cr, buffer, &extents); dx = 0; - if (tro->allign == CENTER) + switch (tro->halign) { + case CENTER: dx = -(extents.width/2 + extents.x_bearing); - dy = extents.height * 1.2; + break; + case LEFT: + dx = 0; + break; + } + switch (tro->valign) { + case TOP: + dy = extents.height * 1.2; + break; + case BOTTOM: + dy = -extents.height * 0.8; + break; + case MIDDLE: + dy = 0; + break; + } move_to(gc, x, y); cairo_rel_move_to(cr, dx, dy); @@ -95,7 +114,7 @@ static void plot_text(struct graphics_context *gc, text_render_options_t *tro, } /* - * Find the next maximum point in a 10-minute window. + * Find the next minimum/maximum point. * * We exit early if we hit "enough" of a depth reversal, * which is roughly 10 feet. @@ -104,12 +123,11 @@ static struct sample *next_minmax(struct sample *sample, struct sample *end, int { const int enough = 3000; struct sample *result; - int timelimit, depthlimit; + int depthlimit; if (sample >= end) return 0; - timelimit = 24*60*60; depthlimit = sample->depth.mm; result = NULL; @@ -121,8 +139,6 @@ static struct sample *next_minmax(struct sample *sample, struct sample *end, int return NULL; time = sample->time.seconds; depth = sample->depth.mm; - if (time > timelimit) - break; if (minmax) { if (depth <= depthlimit) { @@ -140,15 +156,13 @@ static struct sample *next_minmax(struct sample *sample, struct sample *end, int result = sample; depthlimit = depth; - /* Look up to ten minutes into the future */ - timelimit = time + 600; } return result; } static void render_depth_sample(struct graphics_context *gc, struct sample *sample) { - text_render_options_t tro = {1.0, 0.2, 0.2, CENTER}; + text_render_options_t tro = {14, 1.0, 0.2, 0.2, CENTER, TOP}; int sec = sample->time.seconds; depth_t depth = sample->depth; const char *fmt; @@ -167,25 +181,18 @@ static void render_depth_sample(struct graphics_context *gc, struct sample *samp plot_text(gc, &tro, sec, depth.mm, fmt, d); } - -void plot_text_samples(struct dive *dive, struct graphics_context *gc, - struct sample *a, struct sample *b) +static void plot_text_samples(struct graphics_context *gc, struct sample *a, struct sample *b) { - struct sample *max, *min; - - if (b < a) - return; - if (b->time.seconds - a->time.seconds < 3*60) - return; - - max = next_minmax(a, b, 1); - if (max) { - render_depth_sample(gc, max); - min = next_minmax(max, b, 0); - if (min) { - plot_text_samples(dive, gc, min, b); + for (;;) { + if (b <= a) + break; + a = next_minmax(a, b, 1); + if (!a) return; - } + render_depth_sample(gc, a); + a = next_minmax(a, b, 0); + if (!a) + break; } } @@ -201,17 +208,10 @@ static void plot_depth_text(struct dive *dive, struct graphics_context *gc) gc->scalex = maxtime; gc->scaley = maxdepth; - cairo_set_font_size(gc->cr, 14); - - /* - * We never take the last sample into account. - * It should be a surface event anyway, although - * there are buggy cases where it isn't.. - */ sample = dive->sample; - end = dive->sample + dive->samples - 1; + end = dive->sample + dive->samples; - plot_text_samples(dive, gc, sample, end); + plot_text_samples(gc, sample, end); } static void plot_depth_profile(struct dive *dive, struct graphics_context *gc) @@ -380,7 +380,7 @@ static double calculate_airuse(struct dive *dive) static void plot_info(struct dive *dive, struct graphics_context *gc) { - text_render_options_t tro = {0.2, 1.0, 0.2, LEFT}; + text_render_options_t tro = {10, 0.2, 1.0, 0.2, LEFT, TOP}; const double liters_per_cuft = 28.317; const char *unit; double airuse; @@ -411,8 +411,6 @@ static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_conte { pressure_t startp, endp; - cairo_set_font_size(gc->cr, 10); - if (get_cylinder_pressure_range(dive, gc, &startp, &endp)) { int start, end; const char *unit = "bar"; @@ -435,7 +433,7 @@ static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_conte break; } - text_render_options_t tro = {0.2, 1.0, 0.2, LEFT}; + text_render_options_t tro = {10, 0.2, 1.0, 0.2, LEFT, TOP}; plot_text(gc, &tro, 0, startp.mbar, "%d %s", start, unit); plot_text(gc, &tro, dive->duration.seconds, endp.mbar, "%d %s", end, unit);