cairo_rel_move_to(cr, dx, dy);
cairo_text_path(cr, buffer);
- set_source_rgb(gc, 0, 0, 0);
+ set_source_rgba(gc, 0.95, 0.95, 0.95, 0.95);
cairo_stroke(cr);
move_to(gc, x, y);
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};
+ static const text_render_options_t deep = {14, 0.8, 0.2, 0.2, CENTER, TOP};
+ static const text_render_options_t shallow = {14, 0.8, 0.2, 0.2, CENTER, BOTTOM};
int i;
int last = -1;
int i;
struct plot_data *entry = pi->entry;
- set_source_rgba(gc, 1, 0.2, 1, a);
+ set_source_rgba(gc, 0.7, 0.2, 0.7, a);
move_to(gc, entry->sec, entry->min[index]->depth);
for (i = 1; i < pi->nr; i++) {
entry++;
gc->leftx = 0; gc->rightx = maxtime;
gc->topy = 0; gc->bottomy = 1.0;
set_source_rgba(gc, 1, 1, 1, 0.5);
+ cairo_set_line_width(gc->cr, 1);
+
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};
+ text_render_options_t tro = {10, 0.1, 0.5, 0.1, CENTER, TOP};
for (i = incr; i < maxtime; i += 2 * incr)
plot_text(gc, &tro, i, 1, "%d", i/60);
/* Do the depth profile for the neat fill */
gc->topy = 0; gc->bottomy = maxdepth;
- set_source_rgba(gc, 1, 0.2, 0.2, 0.20);
+
+ cairo_pattern_t *pat;
+ pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, 256.0);
+ cairo_pattern_add_color_stop_rgba (pat, 1, 0.2, 0.2, 0.8, 0.6);
+ cairo_pattern_add_color_stop_rgba (pat, 0, 0.9, 0.9, 0.9, 0.6);
+
+ cairo_set_source(gc->cr, pat);
+ cairo_pattern_destroy(pat);
+ cairo_set_line_width(gc->cr, 2);
entry = pi->entry;
move_to(gc, 0, 0);
{
double deg;
const char *unit;
- static const text_render_options_t tro = {12, 0.6, 0.6, 1.0, LEFT, TOP};
+ static const text_render_options_t tro = {12, 0.2, 0.2, 0.7, LEFT, TOP};
deg = get_temp_units(mkelvin, &unit);
if (!setup_temperature_limits(gc, pi))
return;
- set_source_rgba(gc, 0.2, 0.2, 1.0, 0.8);
+ cairo_set_line_width(gc->cr, 2);
+ set_source_rgba(gc, 0.2, 0.2, 0.9, 0.8);
for (i = 0; i < pi->nr; i++) {
struct plot_data *entry = pi->entry + i;
int mkelvin = entry->temperature;
int sac_index = 0;
int delta = sac - avg_sac + 7000;
- sac_index = delta / 2000;
- if (sac_index < 0)
- sac_index = 0;
- if (sac_index > SAC_COLORS - 1)
- sac_index = SAC_COLORS - 1;
- set_source_rgb_struct(gc, &sac_color[sac_index]);
+ if (!gc->printer) {
+ sac_index = delta / 2000;
+ if (sac_index < 0)
+ sac_index = 0;
+ if (sac_index > SAC_COLORS - 1)
+ sac_index = SAC_COLORS - 1;
+ set_source_rgb_struct(gc, &sac_color[sac_index]);
+ } else {
+ set_source_rgb(gc, 1.0, 1.0, 1.0);
+ }
}
/* calculate the current SAC in ml/min and convert to int */
if (!get_cylinder_pressure_range(gc, pi))
return;
+ cairo_set_line_width(gc->cr, 2);
+
for (i = 0; i < pi->nr; i++) {
int mbar;
struct plot_data *entry = pi->entry + i;
if (!last_entry) {
last = i;
last_entry = entry;
- if (first_plot) {
- /* don't start with a sac of 0, so just calculate the first one */
- sac = GET_LOCAL_SAC(entry, pi->entry + i + 1, dive);
- }
+ sac = GET_LOCAL_SAC(entry, pi->entry + i + 1, dive);
} else {
int j;
sac = 0;
const char *unit;
pressure = get_pressure_units(mbar, &unit);
- text_render_options_t tro = {10, 0.2, 1.0, 0.2, xalign, yalign};
+ text_render_options_t tro = {10, 0.2, 0.6, 0.2, xalign, yalign};
plot_text(gc, &tro, sec, mbar, "%d %s", pressure, unit);
}
free(list);
}
+static void dump_pr_track(pr_track_t **track_pr)
+{
+ int cyl;
+ pr_track_t *list;
+
+ for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
+ list = track_pr[cyl];
+ while (list) {
+ printf("cyl%d: start %d end %d t_start %d t_end %d pt %6.3f\n", cyl,
+ list->start, list->end, list->t_start, list->t_end, list->pressure_time);
+ list = list->next;
+ }
+ }
+}
+
static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
pr_track_t **track_pr)
{
struct plot_data *entry;
int cur_pr[MAX_CYLINDERS];
+ if (0) {
+ /* another great debugging tool */
+ dump_pr_track(track_pr);
+ }
for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
cur_pr[cyl] = track_pr[cyl]->start;
}
double cur_pt = (entry->sec - (entry-1)->sec) *
(1 + (entry->depth + (entry-1)->depth) / 20000.0);
INTERPOLATED_PRESSURE(entry) =
- cur_pr[entry->cylinderindex] + cur_pt * magic;
+ cur_pr[entry->cylinderindex] + cur_pt * magic + 0.5;
cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry);
} else
INTERPOLATED_PRESSURE(entry) = cur_pr[entry->cylinderindex];
while (ev && ev->time.seconds < sample->time.seconds) {
/* insert two fake plot info structures for the end of
* the old tank and the start of the new tank */
- entry->sec = ev->time.seconds;
- (entry+1)->sec = ev->time.seconds + 1;
+ if (ev->time.seconds == sample->time.seconds - 1) {
+ entry->sec = ev->time.seconds - 1;
+ (entry+1)->sec = ev->time.seconds;
+ } else {
+ entry->sec = ev->time.seconds;
+ (entry+1)->sec = ev->time.seconds + 1;
+ }
/* we need a fake depth - let's interpolate */
if (i) {
entry->depth = sample->depth.mm -
pi = create_plot_info(dive, nr, sample);
cairo_translate(gc->cr, drawing_area->x, drawing_area->y);
- cairo_set_line_width(gc->cr, 2);
+ cairo_set_line_width(gc->cr, 1);
cairo_set_line_cap(gc->cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join(gc->cr, CAIRO_LINE_JOIN_ROUND);
gc->maxx = (drawing_area->width - 2*drawing_area->x);
gc->maxy = (drawing_area->height - 2*drawing_area->y);
+ cairo_set_source_rgba(gc->cr, 0.95, 0.95, 0.90, 0.95);
+ cairo_paint(gc->cr);
+
/* Temperature profile */
plot_temperature_profile(gc, pi);
gc->topy = 0; gc->bottomy = 1.0;
set_source_rgb(gc, 1, 1, 1);
+ cairo_set_line_width(gc->cr, 1);
move_to(gc, 0, 0);
line_to(gc, 0, 1);
line_to(gc, 1, 1);