This enables code that uses the graph functions to change the axis
titles on the fly to display unit information which matches how the
tick labels are shortened.
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
struct graph_label *tail;
int per_label_limit;
const char *font;
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)
};
void graph_set_size(struct graph *g, unsigned int xdim, unsigned int ydim)
+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;
static int count_labels(struct graph_label *labels)
{
int count = 0;
{
struct tickmark *tm;
double tx;
{
struct tickmark *tm;
double tx;
static double dash[] = { 1.0, 2.0 };
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;
for (i = 0; i < nticks; i++) {
tx = (((tm[i].value) - minx) / (maxx - minx)) * (x2 - x1) + x1;
{
struct tickmark *tm;
double ty;
{
struct tickmark *tm;
double ty;
static double dash[] = { 2.0, 2.0 };
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);
for (i = 0; i < nticks; i++) {
ty = y2 - (((tm[i].value) - miny) / (maxy - miny)) * (y2 - y1);
double red, double green, double blue);
void graph_free(struct graph *bg);
double red, double green, double blue);
void graph_free(struct graph *bg);
+typedef void (*graph_axis_unit_change_callback)(struct graph *g, int power_of_ten);
+void graph_x_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f);
+void graph_y_axis_unit_change_notify(struct graph *g, graph_axis_unit_change_callback f);
return 10.0 * pow(10.0, exp);
}
return 10.0 * pow(10.0, exp);
}
-static void shorten(struct tickmark *tm, int nticks)
+static void shorten(struct tickmark *tm, int nticks, int *power_of_ten,
+ int use_KMG_symbols)
- int i, l, minshorten, can_shorten_by;
char *str;
char shorten_char = '?';
char *str;
char shorten_char = '?';
l = strlen(str);
if (l > 9 && strcmp(&str[l - 9], "000000000") == 0) {
l = strlen(str);
if (l > 9 && strcmp(&str[l - 9], "000000000") == 0) {
- can_shorten_by = 9;
- shorten_char = 'G';
+ *power_of_ten = 9;
+ shorten_char = use_KMG_symbols ? 'G' : '\0';
} else if (6 < minshorten && l > 6 &&
strcmp(&str[l - 6], "000000") == 0) {
} else if (6 < minshorten && l > 6 &&
strcmp(&str[l - 6], "000000") == 0) {
- can_shorten_by = 6;
- shorten_char = 'M';
+ *power_of_ten = 6;
+ shorten_char = use_KMG_symbols ? 'M' : '\0';
} else if (l > 3 && strcmp(&str[l - 3], "000") == 0) {
} else if (l > 3 && strcmp(&str[l - 3], "000") == 0) {
- can_shorten_by = 3;
- shorten_char = 'K';
+ *power_of_ten = 3;
+ shorten_char = use_KMG_symbols ? 'K': '\0';
- if (can_shorten_by < minshorten)
- minshorten = can_shorten_by;
+ if (*power_of_ten < minshorten)
+ minshorten = *power_of_ten;
-int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm)
+int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm,
+ int *power_of_ten, int use_KMG_symbols)
{
char str[100];
int nfrac;
{
char str[100];
int nfrac;
sprintf((*tm)[i].string, str, x);
i++;
}
sprintf((*tm)[i].string, str, x);
i++;
}
+ shorten(*tm, i, power_of_ten, use_KMG_symbols);
-int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm);
+int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm,
+ int *power_of_ten, int use_KMG_symbols);