X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=profile.c;h=56716f5f767c11646d0edaade51d2b9b4d1b427f;hb=bf7d70fe8b9b8c2a1f6d381ae000cb0d91e36961;hp=78643cd753d1c393760c593e6d7957377ddbabbf;hpb=2b4fa480ae57766889c5a20ff1cb59427469d401;p=ext%2Fsubsurface.git diff --git a/profile.c b/profile.c index 78643cd..56716f5 100644 --- a/profile.c +++ b/profile.c @@ -166,11 +166,62 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t * cairo_show_text(cr, buffer); } +struct ev_select { + char *ev_name; + gboolean plot_ev; +}; +static struct ev_select *ev_namelist; +static int evn_allocated; +static int evn_used; + +void evn_foreach(void (*callback)(const char *, int *, void *), void *data) +{ + int i; + + for (i = 0; i < evn_used; i++) { + callback(ev_namelist[i].ev_name, &ev_namelist[i].plot_ev, data); + } +} + +void remember_event(const char *eventname) +{ + int i=0, len; + + if (!eventname || (len = strlen(eventname)) == 0) + return; + while (i < evn_used) { + if (!strncmp(eventname,ev_namelist[i].ev_name,len)) + return; + i++; + } + if (evn_used == evn_allocated) { + evn_allocated += 10; + ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select)); + if (! ev_namelist) + /* we are screwed, but let's just bail out */ + return; + } + ev_namelist[evn_used].ev_name = strdup(eventname); + ev_namelist[evn_used].plot_ev = TRUE; + evn_used++; +} + 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; int x,y; + /* is plotting this event disabled? */ + if (event->name) { + for (i = 0; i < evn_used; i++) { + if (! strcmp(event->name, ev_namelist[i].ev_name)) { + if (ev_namelist[i].plot_ev) + break; + else + return; + } + } + } for (i = 0; i < pi->nr; i++) { struct plot_data *data = pi->entry + i; if (event->time.seconds < data->sec) @@ -299,23 +350,43 @@ static void plot_minmax_profile(struct graphics_context *gc, struct plot_info *p static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi) { - int i; + int i, incr; cairo_t *cr = gc->cr; int sec, depth; struct plot_data *entry; int maxtime, maxdepth, marker; + int increments[4] = { 5*60, 10*60, 15*60, 30*60 }; /* Get plot scaling limits */ maxtime = get_maxtime(pi); maxdepth = get_maxdepth(pi); - /* Time markers: every 5 min */ + /* Time markers: at most every 5 min, but no more than 12 markers + * and for convenience we do 5, 10, 15 or 30 min intervals. + * This allows for 6h dives - enough (I hope) for even the craziest + * divers - but just in case, for those 8h depth-record-breaking dives, + * we double the interval if this still doesn't get us to 12 or fewer + * time markers */ + i = 0; + while (maxtime / increments[i] > 12 && i < 4) + i++; + incr = increments[i]; + while (maxtime / incr > 12) + incr *= 2; + gc->leftx = 0; gc->rightx = maxtime; gc->topy = 0; gc->bottomy = 1.0; - for (i = 5*60; i < maxtime; i += 5*60) { + set_source_rgba(gc, 1, 1, 1, 0.5); + for (i = incr; i < maxtime; i += incr) { move_to(gc, i, 0); line_to(gc, i, 1); } + cairo_stroke(cr); + + /* now the text on every second time marker */ + text_render_options_t tro = {10, 0.2, 1.0, 0.2, CENTER, TOP}; + for (i = incr; i < maxtime; i += 2 * incr) + plot_text(gc, &tro, i, 1, "%d", i/60); /* Depth markers: every 30 ft or 10 m*/ gc->leftx = 0; gc->rightx = 1.0;