gfio: add graph axis unit change notification callbacks
[fio.git] / graph.c
diff --git a/graph.c b/graph.c
index e9fce952e04aae94e94d8a28b6fc5cd365c686a0..de65055b99c1ffbb0dc00c88b805629c9bfd5bc9 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -29,6 +29,7 @@
 #include <gtk/gtk.h>
 
 #include "tickmarks.h"
+#include "graph.h"
 
 struct xyvalue {
        double x, y;
@@ -58,6 +59,8 @@ struct graph {
        struct graph_label *tail;
        int per_label_limit;
        const char *font;
+       graph_axis_unit_change_callback x_axis_unit_change_callback;
+       graph_axis_unit_change_callback y_axis_unit_change_callback;
 };
 
 void graph_set_size(struct graph *g, unsigned int xdim, unsigned int ydim)
@@ -79,6 +82,16 @@ struct graph *graph_new(unsigned int xdim, unsigned int ydim, const char *font)
        return g;
 }
 
+void graph_x_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f)
+{
+       g->x_axis_unit_change_callback = f;
+}
+
+void graph_y_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f)
+{
+       g->y_axis_unit_change_callback = f;
+}
+
 static int count_labels(struct graph_label *labels)
 {
        int count = 0;
@@ -278,11 +291,10 @@ 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);
 
-       /* for now just set margins at 10% of width.  This is not very good. */
-       *x1 = g->xdim / 10.0;   
-       *x2 = 9.0 * *x1;
-       *y1 = g->ydim / 10.0;   
-       *y2 = 9.0 * *y1;
+       *x1 = 0.15 * g->xdim;   
+       *x2 = 0.95 * g->xdim;
+       *y1 = 0.10 * g->ydim;   
+       *y2 = 0.90 * g->ydim;
 
        cairo_move_to(cr, *x1, *y1);
        cairo_line_to(cr, *x1, *y2);
@@ -303,10 +315,13 @@ static void graph_draw_x_ticks(struct graph *g, cairo_t *cr,
 {
        struct tickmark *tm;
        double tx;
-       int i;
+       int i, power_of_ten;
        static double dash[] = { 1.0, 2.0 };
 
-       nticks = calc_tickmarks(minx, maxx, nticks, &tm);
+       nticks = calc_tickmarks(minx, maxx, nticks, &tm, &power_of_ten,
+               g->x_axis_unit_change_callback == NULL);
+       if (g->x_axis_unit_change_callback)
+               g->x_axis_unit_change_callback(g, power_of_ten);
 
        for (i = 0; i < nticks; i++) {
                tx = (((tm[i].value) - minx) / (maxx - minx)) * (x2 - x1) + x1;
@@ -341,10 +356,13 @@ static void graph_draw_y_ticks(struct graph *g, cairo_t *cr,
 {
        struct tickmark *tm;
        double ty;
-       int i;
+       int i, power_of_ten;
        static double dash[] = { 2.0, 2.0 };
 
-       nticks = calc_tickmarks(miny, maxy, nticks, &tm);
+       nticks = calc_tickmarks(miny, maxy, nticks, &tm, &power_of_ten,
+               g->y_axis_unit_change_callback == NULL);
+       if (g->y_axis_unit_change_callback)
+               g->y_axis_unit_change_callback(g, power_of_ten);
 
        for (i = 0; i < nticks; i++) {
                ty = y2 - (((tm[i].value) - miny) / (maxy - miny)) * (y2 - y1);