X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=graph.c;h=d8f1ba45ab9df005a3c6266278fe7d09dd2c0e25;hp=5bcefbe4fc871645ab975dd7f0f3662d6067f2f0;hb=0deba507cd01601fcce4fb861b9aa6d4971dfd1a;hpb=d8fbeefb67641e9f63088b329de78a26a69fdbae diff --git a/graph.c b/graph.c index 5bcefbe4..d8f1ba45 100644 --- a/graph.c +++ b/graph.c @@ -307,7 +307,7 @@ static void graph_draw_common(struct graph *g, cairo_t *cr, cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_line_width (cr, 0.8); - *x1 = 0.15 * g->xdim; + *x1 = 0.10 * g->xdim; *x2 = 0.95 * g->xdim; *y1 = 0.10 * g->ydim; *y2 = 0.90 * g->ydim; @@ -442,7 +442,14 @@ void bar_graph_draw(struct graph *bg, cairo_t *cr) nlabels = count_labels(bg->labels); space_per_label = (x2 - x1) / (double) nlabels; + /* + * Start bars at 0 unless we have negative values, otherwise we + * present a skewed picture comparing label X and X+1. + */ mindata = find_min_data(bg->labels); + if (mindata > 0) + mindata = 0; + maxdata = find_max_data(bg->labels); if (fabs(maxdata - mindata) < 1e-20) { @@ -452,8 +459,7 @@ void bar_graph_draw(struct graph *bg, cairo_t *cr) return; } - graph_draw_y_ticks(bg, cr, x1, y1, x2, y2, mindata, maxdata, 10, 1); - + maxdata = graph_draw_y_ticks(bg, cr, x1, y1, x2, y2, mindata, maxdata, 10, 1); i = 0; for (lb = bg->labels; lb; lb = lb->next) { int nvalues; @@ -519,6 +525,15 @@ void line_graph_draw(struct graph *g, cairo_t *cr) minx = find_xy_value(g, getx, mindouble); maxx = find_xy_value(g, getx, maxdouble); miny = find_xy_value(g, gety, mindouble); + + /* + * Start graphs at zero, unless we have a value below. Otherwise + * it's hard to visually compare the read and write graph, since + * the lowest valued one will be the floor of the graph view. + */ + if (miny > 0) + miny = 0; + maxy = find_xy_value(g, gety, maxdouble); if (fabs(maxx - minx) < 1e-20 || fabs(maxy - miny) < 1e-20) { @@ -831,12 +846,18 @@ int graph_contains_xy(struct graph *g, int x, int y) return (x >= first_x && x <= last_x) && (y >= first_y && y <= last_y); } +/* + * Allowable difference to show tooltip + */ +#define TOOLTIP_XDIFF 10 +#define TOOLTIP_YDIFF 10 + static int xy_match(struct xyvalue *xy, int x, int y) { int xdiff = abs(xy->gx - x); int ydiff = abs(xy->gy - y); - return xdiff <= 20 && ydiff <= 10; + return xdiff <= TOOLTIP_XDIFF && ydiff <= TOOLTIP_YDIFF; } const char *graph_find_tooltip(struct graph *g, int x, int y) @@ -847,9 +868,17 @@ const char *graph_find_tooltip(struct graph *g, int x, int y) for (i = g->labels; i; i = i->next) { for (j = i->values; j; j = j->next) { struct xyvalue *xy = j->value; - - if (xy_match(xy, x - g->xoffset, y)) + int graphx = x - g->xoffset; + + /* + * Return match if close enough. Take advantage + * of the X axis being monotonically increasing, + * so we can break out if we exceed it. + */ + if (xy_match(xy, graphx, y)) return j->tooltip; + else if (xy->gx - graphx > TOOLTIP_XDIFF) + break; } }