graph: stop matching tooltips if X diff is too large
[fio.git] / graph.c
diff --git a/graph.c b/graph.c
index 5bcefbe4fc871645ab975dd7f0f3662d6067f2f0..d8f1ba45ab9df005a3c6266278fe7d09dd2c0e25 100644 (file)
--- 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;
                }
        }