Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 1 | #ifndef GRAPH_H |
| 2 | #define GRAPH_H |
| 3 | |
| 4 | struct graph; |
| 5 | |
Stephen M. Cameron | cae0872 | 2012-03-07 14:47:38 +0100 | [diff] [blame] | 6 | |
Jens Axboe | f3e8440 | 2012-03-07 13:14:32 +0100 | [diff] [blame] | 7 | struct graph *graph_new(unsigned int xdim, unsigned int ydim, const char *font); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 8 | /* graph_new() Returns a new graph structure of the given dimensions and font */ |
Stephen M. Cameron | 3ea48b8 | 2012-03-07 19:40:58 +0100 | [diff] [blame] | 9 | void graph_set_size(struct graph *g, unsigned int xdim, unsigned int ydim); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 10 | /* graph_set_size() Changes the size of a graph to the given dimensions. */ |
Stephen M. Cameron | 57f9d28 | 2012-03-11 11:36:51 +0100 | [diff] [blame] | 11 | void graph_set_position(struct graph *g, double xoffset, double yoffset); |
| 12 | /* graph_set_position() sets the x- and y-offset to translate the graph */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 13 | void bar_graph_draw(struct graph *g, cairo_t *cr); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 14 | /* bar_graph_draw() draws the given graph as a bar graph */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 15 | void line_graph_draw(struct graph *g, cairo_t *cr); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 16 | /* line_graph_draw draws the given graph as a line graph */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 17 | void line_graph_set_data_count_limit(struct graph *g, int per_label_limit); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 18 | /* line_graph_set_data_count_limit() limits the amount of data which can |
| 19 | * be added to a line graph. Once the limit is reached, the oldest data |
| 20 | * is discarded as new data is added |
| 21 | */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 22 | void graph_title(struct graph *g, const char *title); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 23 | /* graph_title() sets the main title of the graph to the given string */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 24 | void graph_x_title(struct graph *g, const char *title); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 25 | /* graph_x_title() sets the title of the x axis to the given string */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 26 | void graph_y_title(struct graph *g, const char *title); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 27 | /* graph_y_title() sets the title of the y axis to the given string */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 28 | void graph_add_label(struct graph *g, const char *label); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 29 | /* graph_add_label() adds a new "stream" of data to be graphed. |
| 30 | * For line charts, each label is a separate line on the graph. |
| 31 | * For bar charts, each label is a grouping of columns on the x-axis |
| 32 | * For example: |
| 33 | * |
| 34 | * | * | ** |
| 35 | * | * xxxxxxxx | ** |
| 36 | * | *** x | ** ** |
| 37 | * | *x **** | ** ** ** |
| 38 | * | xxxx* ***** | ** xx ** xx ** |
| 39 | * | x ** | ** xx ** xx ** xx |
| 40 | * | x | ** xx ** xx ** xx |
| 41 | * ----------------------- ------------------------- |
| 42 | * A B C |
| 43 | * |
| 44 | * For a line graph, the 'x's For a bar graph, |
| 45 | * would be on one "label", and 'A', 'B', and 'C' |
| 46 | * the '*'s would be on another are the labels. |
| 47 | * label. |
| 48 | */ |
| 49 | |
Stephen M. Cameron | 09ad20f | 2012-03-11 11:34:38 +0100 | [diff] [blame] | 50 | int graph_add_data(struct graph *g, const char *label, const double value); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 51 | /* graph_add_data() is used to add data to the labels of a bar graph */ |
Stephen M. Cameron | 09ad20f | 2012-03-11 11:34:38 +0100 | [diff] [blame] | 52 | int graph_add_xy_data(struct graph *g, const char *label, |
Jens Axboe | 93e2db2 | 2012-03-13 09:45:22 +0100 | [diff] [blame] | 53 | const double x, const double y, const char *tooltip); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 54 | /* graph_add_xy_data is used to add data to the labels of a line graph */ |
| 55 | |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 56 | void graph_set_color(struct graph *g, const char *label, |
| 57 | double red, double green, double blue); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 58 | #define INVISIBLE_COLOR (-1.0) |
| 59 | /* graph_set_color is used to set the color used to plot the data in |
| 60 | * a line graph. INVISIBLE_COLOR can be used to plot the data invisibly. |
| 61 | * Invisible data will have the same effect on the scaling of the axes |
| 62 | * as visible data. |
| 63 | */ |
| 64 | |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 65 | void graph_free(struct graph *bg); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 66 | /* free a graph allocated by graph_new() */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 67 | |
Stephen M. Cameron | 7175d91 | 2012-03-11 11:35:10 +0100 | [diff] [blame] | 68 | typedef void (*graph_axis_unit_change_callback)(struct graph *g, int power_of_ten); |
| 69 | void graph_x_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f); |
| 70 | void graph_y_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f); |
Stephen M. Cameron | ba35aa8 | 2012-03-11 11:36:14 +0100 | [diff] [blame] | 71 | /* The labels used on the x and y axes may be shortened. You can register for callbacks |
| 72 | * so that you can know how the labels are shorted, typically used to adjust the axis |
| 73 | * titles to display the proper units. The power_of_ten parameter indicates what power |
| 74 | * of ten the labels have been divided by (9, 6, 3, or 0, corresponding to billions, |
| 75 | * millions, thousands and ones. |
| 76 | */ |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 77 | |
Stephen M. Cameron | def0ac2 | 2012-03-12 07:32:57 +0100 | [diff] [blame] | 78 | void graph_add_extra_space(struct graph *g, double left_percent, double right_percent, |
| 79 | double top_percent, double bottom_percent); |
| 80 | /* graph_add_extra_space() adds extra space to edges of the the graph |
| 81 | * so that the data doesn't go to the very edges. |
| 82 | */ |
| 83 | |
Jens Axboe | 93e2db2 | 2012-03-13 09:45:22 +0100 | [diff] [blame] | 84 | extern int graph_has_tooltips(struct graph *g); |
| 85 | extern const char *graph_find_tooltip(struct graph *g, int x, int y); |
| 86 | extern int graph_contains_xy(struct graph *p, int x, int y); |
| 87 | |
Jens Axboe | d8fbeef | 2012-03-14 10:25:44 +0100 | [diff] [blame] | 88 | extern void graph_set_base_offset(struct graph *g, unsigned int base_offset); |
| 89 | |
Stephen M. Cameron | af58ef3 | 2012-03-07 07:56:16 +0100 | [diff] [blame] | 90 | #endif |
| 91 | |