flist: add flist_first_entry()
[fio.git] / graph.c
diff --git a/graph.c b/graph.c
index 81b1524d705704a21cbcea687487c9625c03091d..c45954c7f79939b2e38cebacbc028d932076c234 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -180,7 +180,7 @@ static double maxdouble(double a, double b)
 static double find_double_values(struct graph_label *l, double_comparator cmp)
 {
        struct flist_head *entry;
-       double answer, tmp;
+       double answer = 0.0, tmp;
        int first = 1;
 
        if (flist_empty(&l->value_list))
@@ -267,17 +267,36 @@ static void draw_bars(struct graph *bg, cairo_t *cr, struct graph_label *lb,
        }
 }
 
-static void graph_draw_common(struct graph *g, cairo_t *cr,
-       double *x1, double *y1, double *x2, double *y2)
+static void graph_draw_common(struct graph *g, cairo_t *cr, double *x1,
+                             double *y1, double *x2, double *y2)
 {
-       cairo_set_source_rgb(cr, 0, 0, 0);
-       cairo_set_line_width(cr, 0.8);
+       const double shade_col[3][3] = { { 0.55, 0.54, 0.54 },
+                                        { 0.80, 0.78, 0.78 },
+                                        { 0.93, 0.91, 0.91 } };
+       int i;
 
        *x1 = 0.10 * g->xdim;
        *x2 = 0.95 * g->xdim;
        *y1 = 0.10 * g->ydim;
        *y2 = 0.90 * g->ydim;
 
+       /*
+        * Add shade
+        */
+       cairo_set_line_width(cr, 1.0);
+       for (i = 0; i < 3; i++) {
+               float offset = i + 1.0;
+
+               cairo_set_source_rgb(cr, shade_col[i][0], shade_col[i][1], shade_col[i][2]);
+               cairo_move_to(cr, offset + *x1, *y1 - offset);
+               cairo_line_to(cr, *x2 + offset, *y1 - offset);
+               cairo_line_to(cr, *x2 + offset, *y2 - offset);
+               cairo_stroke(cr);
+       }
+
+       cairo_set_source_rgb(cr, 0, 0, 0);
+       cairo_set_line_width(cr, 1.2);
+
        cairo_move_to(cr, *x1, *y1);
        cairo_line_to(cr, *x1, *y2);
        cairo_line_to(cr, *x2, *y2);
@@ -324,15 +343,15 @@ static void graph_draw_x_ticks(struct graph *g, cairo_t *cr,
                        continue;
 
                /* Draw tick mark */
-               cairo_set_line_width(cr, 0.8);
+               cairo_set_line_width(cr, 1.0);
                cairo_move_to(cr, tx, y2);
                cairo_line_to(cr, tx, y2 + (y2 - y1) * 0.03);
                cairo_stroke(cr);
 
                /* draw grid lines */
                cairo_save(cr);
-               cairo_set_dash(cr, dash, 2, 2.0);
-               cairo_set_line_width(cr, 0.5);
+               cairo_set_dash(cr, dash, 2, 0.66);
+               cairo_set_line_width(cr, 0.33);
                cairo_move_to(cr, tx, y1);
                cairo_line_to(cr, tx, y2);
                cairo_stroke(cr);
@@ -354,7 +373,7 @@ static double graph_draw_y_ticks(struct graph *g, cairo_t *cr,
        struct tickmark *tm;
        double ty;
        int i, power_of_ten;
-       static double dash[] = { 2.0, 2.0 };
+       static double dash[] = { 1.0, 2.0 };
 
        nticks = calc_tickmarks(miny, maxy, nticks, &tm, &power_of_ten,
                g->y_axis_unit_change_callback == NULL, g->base_offset);
@@ -393,8 +412,8 @@ static double graph_draw_y_ticks(struct graph *g, cairo_t *cr,
 
                /* draw grid lines */
                cairo_save(cr);
-               cairo_set_dash(cr, dash, 2, 2.0);
-               cairo_set_line_width(cr, 0.5);
+               cairo_set_dash(cr, dash, 2, 0.66);
+               cairo_set_line_width(cr, 0.33);
                cairo_move_to(cr, x1, ty);
                cairo_line_to(cr, x2, ty);
                cairo_stroke(cr);
@@ -567,6 +586,8 @@ void line_graph_draw(struct graph *g, cairo_t *cr)
                goto skip_data;
 
        cairo_set_line_width(cr, 1.5);
+       cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
+
        flist_for_each(lentry, &g->label_list) {
                i = flist_entry(lentry, struct graph_label, list);
                first = 1;
@@ -581,9 +602,8 @@ void line_graph_draw(struct graph *g, cairo_t *cr)
                        if (first) {
                                cairo_move_to(cr, tx, ty);
                                first = 0;
-                       } else {
+                       } else
                                cairo_line_to(cr, tx, ty);
-                       }
                }
                cairo_stroke(cr);
        }
@@ -667,7 +687,7 @@ static void graph_value_drop(struct graph_label *l, struct graph_value *v)
         */
        while (!(v->flags & GV_F_ON_PRIO)) {
                assert(!flist_empty(&v->alias));
-               v = flist_entry(v->alias.next, struct graph_value, alias);
+               v = flist_first_entry(&v->alias, struct graph_value, alias);
        }
 
        prio_tree_remove(&l->prio_tree, &v->node);
@@ -678,7 +698,7 @@ static void graph_value_drop(struct graph_label *l, struct graph_value *v)
        while (!flist_empty(&v->alias)) {
                struct graph_value *a;
 
-               a = flist_entry(v->alias.next, struct graph_value, alias);
+               a = flist_first_entry(&v->alias, struct graph_value, alias);
                flist_del_init(&a->alias);
 
                __graph_value_drop(l, a);
@@ -753,7 +773,7 @@ static void graph_label_add_value(struct graph_label *i, void *value,
                        to_drop = 2;
 
                while (to_drop-- && !flist_empty(&i->value_list)) {
-                       x = flist_entry(i->value_list.next, struct graph_value, list);
+                       x = flist_first_entry(&i->value_list, struct graph_value, list);
                        graph_value_drop(i, x);
 
                        /*
@@ -816,7 +836,7 @@ static void graph_free_values(struct graph_label *l)
        struct graph_value *i;
 
        while (!flist_empty(&l->value_list)) {
-               i = flist_entry(l->value_list.next, struct graph_value, list);
+               i = flist_first_entry(&l->value_list, struct graph_value, list);
                graph_value_drop(l, i);
        }
 }
@@ -826,13 +846,24 @@ static void graph_free_labels(struct graph *g)
        struct graph_label *i;
 
        while (!flist_empty(&g->label_list)) {
-               i = flist_entry(g->label_list.next, struct graph_label, list);
+               i = flist_first_entry(&g->label_list, struct graph_label, list);
                flist_del(&i->list);
                graph_free_values(i);
                free(i);
        }
 }
 
+void graph_clear_values(struct graph *g)
+{
+       struct flist_head *node;
+       struct graph_label *i;
+
+       flist_for_each(node, &g->label_list) {
+               i = flist_entry(node, struct graph_label, list);
+               graph_free_values(i);
+       }
+}
+
 void graph_set_color(struct graph *gr, graph_label_t label, double red,
                     double green, double blue)
 {
@@ -979,7 +1010,7 @@ const char *graph_find_tooltip(struct graph *g, int ix, int iy)
                                        }
                                }
                                if (!flist_empty(&v->alias))
-                                       v = flist_entry(v->alias.next, struct graph_value, alias);
+                                       v = flist_first_entry(&v->alias, struct graph_value, alias);
                        } while (v != rootv);
                } while ((n = prio_tree_next(&iter)) != NULL);