diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2012-10-29 10:56:20 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-10-29 10:56:20 -0700 |
commit | 029db4aae23feec665acb2c1aee7c07fafed3f0f (patch) | |
tree | 7d57672442cc9159d23501ef6cd1906e6fa39ad7 /profile.c | |
parent | 913cc48eb9852760debb2d982639a24b284ea2b8 (diff) | |
download | subsurface-029db4aae23feec665acb2c1aee7c07fafed3f0f.tar.gz |
Add depth scale to the dive profile
This is intended to be unobtrusive, but add more information for people
who aren't satisfied with the numeric value we put inside the plot to mark
local peaks and troughs.
See ticket #9
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'profile.c')
-rw-r--r-- | profile.c | 37 |
1 files changed, 33 insertions, 4 deletions
@@ -254,9 +254,8 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t * cairo_set_font_size(cr, tro->size * plot_scale); cairo_font_extents(cr, &fe); cairo_text_extents(cr, buffer, &extents); - dx = tro->hpos * extents.width + extents.x_bearing; - dy = tro->vpos * extents.height + fe.descent; - + dx = tro->hpos * (extents.width + extents.x_bearing); + dy = tro->vpos * (extents.height + fe.descent); move_to(gc, x, y); cairo_rel_move_to(cr, dx, dy); @@ -463,6 +462,26 @@ static void plot_minmax_profile(struct graphics_context *gc, struct plot_info *p plot_minmax_profile_minute(gc, pi, 0); } +static void plot_depth_scale(struct graphics_context *gc, struct plot_info *pi) +{ + int i, maxdepth, marker; + static const text_render_options_t tro = {10, SAMPLE_DEEP, RIGHT, MIDDLE}; + + /* Depth markers: every 30 ft or 10 m*/ + maxdepth = get_maxdepth(pi); + gc->topy = 0; gc->bottomy = maxdepth; + + switch (output_units.length) { + case METERS: marker = 10000; break; + case FEET: marker = 9144; break; /* 30 ft */ + } + set_source_rgba(gc, DEPTH_GRID); + for (i = marker; i < maxdepth; i += marker) { + double d = get_depth_units(i, NULL, NULL); + plot_text(gc, &tro, -0.002, i, "%.0f", d); + } +} + static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi) { int i, incr; @@ -1423,13 +1442,14 @@ void plot(struct graphics_context *gc, cairo_rectangle_t *drawing_area, struct d pi = create_plot_info(dive, nr, sample); + /* shift the drawing area so we have a nice margin around it */ cairo_translate(gc->cr, drawing_area->x, drawing_area->y); cairo_set_line_width_scaled(gc->cr, 1); cairo_set_line_cap(gc->cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join(gc->cr, CAIRO_LINE_JOIN_ROUND); /* - * We can use "cairo_translate()" because that doesn't + * We don't use "cairo_translate()" because that doesn't * scale line width etc. But the actual scaling we need * do set up ourselves.. * @@ -1466,5 +1486,14 @@ void plot(struct graphics_context *gc, cairo_rectangle_t *drawing_area, struct d cairo_close_path(gc->cr); cairo_stroke(gc->cr); + /* now shift the translation back by half the margin; + * this way we can draw the vertical scales on both sides */ + cairo_translate(gc->cr, -drawing_area->x / 2.0, 0); + gc->maxx += drawing_area->x; + gc->leftx = -(drawing_area->x / drawing_area->width) / 2.0; + gc->rightx = 1.0 - gc->leftx; + + plot_depth_scale(gc, pi); + free(pi); } |