X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=graph.c;h=d97da59568b268acf7a1b88e45d374d50a5f51f2;hp=3e76fa914b3c78df751f3bc544b1c20f33ec226d;hb=cae0872709f690086f896f7327e136c7db7ba567;hpb=af58ef32b7398d791168af54aa4aab0b23192f90 diff --git a/graph.c b/graph.c index 3e76fa91..d97da595 100644 --- a/graph.c +++ b/graph.c @@ -53,13 +53,14 @@ struct graph { char *title; char *xtitle; char *ytitle; - int xdim, ydim; + unsigned int xdim, ydim; struct graph_label *labels; struct graph_label *tail; int per_label_limit; + const char *font; }; -struct graph *graph_new(int xdim, int ydim) +struct graph *graph_new(unsigned int xdim, unsigned int ydim, const char *font) { struct graph *g; @@ -67,6 +68,9 @@ struct graph *graph_new(int xdim, int ydim) g->xdim = xdim; g->ydim = ydim; g->per_label_limit = -1; + g->font = font; + if (!g->font) + g->font = "Sans"; return g; } @@ -182,14 +186,12 @@ static void draw_bars(struct graph *bg, cairo_t *cr, struct graph_label *lb, } } -static void draw_centered_text(cairo_t *cr, double x, double y, - double fontsize, const char *text) +static void draw_centered_text(struct graph *g, cairo_t *cr, double x, double y, + double fontsize, const char *text) { cairo_text_extents_t extents; - cairo_select_font_face (cr, "Sans", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face (cr, g->font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, fontsize); cairo_text_extents(cr, text, &extents); @@ -200,15 +202,14 @@ static void draw_centered_text(cairo_t *cr, double x, double y, cairo_show_text(cr, text); } -static void draw_vertical_centered_text(cairo_t *cr, double x, double y, - double fontsize, const char *text) +static void draw_vertical_centered_text(struct graph *g, cairo_t *cr, double x, + double y, double fontsize, + const char *text) { double sx, sy; cairo_text_extents_t extents; - cairo_select_font_face (cr, "Sans", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face(cr, g->font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, fontsize); cairo_text_extents(cr, text, &extents); @@ -230,7 +231,7 @@ 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, 1.0); + cairo_set_line_width (cr, 0.8); cairo_move_to(cr, 0, 0); cairo_line_to(cr, 0, g->ydim); @@ -240,9 +241,9 @@ static void graph_draw_common(struct graph *g, cairo_t *cr, /* for now just set margins at 10% of width. This is not very good. */ *x1 = g->xdim / 10.0; - *x2 = 9.0 * *x1; + *x2 = 9.0 * *x1; *y1 = g->ydim / 10.0; - *y2 = 9.0 * *y1; + *y2 = 9.0 * *y1; cairo_move_to(cr, *x1, *y1); cairo_line_to(cr, *x1, *y2); @@ -251,9 +252,9 @@ static void graph_draw_common(struct graph *g, cairo_t *cr, cairo_line_to(cr, *x1, *y1); cairo_stroke(cr); - draw_centered_text(cr, g->xdim / 2, g->ydim / 20, 20.0, g->title); - draw_centered_text(cr, g->xdim / 2, g->ydim * 0.97, 14.0, g->xtitle); - draw_vertical_centered_text(cr, g->xdim * 0.02, g->ydim / 2, 14.0, g->ytitle); + draw_centered_text(g, cr, g->xdim / 2, g->ydim / 20, 20.0, g->title); + draw_centered_text(g, cr, g->xdim / 2, g->ydim * 0.97, 14.0, g->xtitle); + draw_vertical_centered_text(g, cr, g->xdim * 0.02, g->ydim / 2, 14.0, g->ytitle); cairo_stroke(cr); } @@ -274,7 +275,7 @@ static void graph_draw_x_ticks(struct graph *g, cairo_t *cr, continue; /* Draw tick mark */ - cairo_set_line_width(cr, 1.0); + cairo_set_line_width(cr, 0.8); cairo_move_to(cr, tx, y2); cairo_line_to(cr, tx, y2 + (y2 - y1) * 0.03); cairo_stroke(cr); @@ -289,7 +290,7 @@ static void graph_draw_x_ticks(struct graph *g, cairo_t *cr, cairo_restore(cr); /* draw tickmark label */ - draw_centered_text(cr, tx, y2 * 1.04, 12.0, tm[i].string); + draw_centered_text(g, cr, tx, y2 * 1.04, 12.0, tm[i].string); cairo_stroke(cr); } @@ -325,7 +326,7 @@ static void graph_draw_y_ticks(struct graph *g, cairo_t *cr, cairo_restore(cr); /* draw tickmark label */ - draw_centered_text(cr, x1 - (x2 - x1) * 0.04, ty, 12.0, tm[i].string); + draw_centered_text(g, cr, x1 - (x2 - x1) * 0.04, ty, 12.0, tm[i].string); cairo_stroke(cr); } } @@ -348,7 +349,7 @@ void bar_graph_draw(struct graph *bg, cairo_t *cr) maxdata = find_max_data(bg->labels); if (fabs(maxdata - mindata) < 1e-20) { - draw_centered_text(cr, + draw_centered_text(bg, cr, x1 + (x2 - x1) / 2.0, y1 + (y2 - y1) / 2.0, 20.0, "No good data"); return; @@ -364,7 +365,7 @@ void bar_graph_draw(struct graph *bg, cairo_t *cr) label_offset = bg->xdim * 0.1 + space_per_label * (double) i + space_per_label * 0.1; draw_bars(bg, cr, lb, label_offset, bar_width, mindata, maxdata); // draw_centered_text(cr, label_offset + (bar_width / 2.0 + bar_width * 0.1), bg->ydim * 0.93, - draw_centered_text(cr, x1 + space_per_label * (i + 0.5), bg->ydim * 0.93, + draw_centered_text(bg, cr, x1 + space_per_label * (i + 0.5), bg->ydim * 0.93, 12.0, lb->label); i++; } @@ -418,7 +419,7 @@ void line_graph_draw(struct graph *g, cairo_t *cr) maxy = find_xy_value(g, gety, maxdouble); if (fabs(maxx - minx) < 1e-20 || fabs(maxy - miny) < 1e-20) { - draw_centered_text(cr, + draw_centered_text(g, cr, x1 + (x2 - x1) / 2.0, y1 + (y2 - y1) / 2.0, 20.0, "No good Data"); return; @@ -427,9 +428,11 @@ void line_graph_draw(struct graph *g, cairo_t *cr) graph_draw_x_ticks(g, cr, x1, y1, x2, y2, minx, maxx, 10); graph_draw_y_ticks(g, cr, x1, y1, x2, y2, miny, maxy, 10); - cairo_set_line_width(cr, 2.5); + cairo_set_line_width(cr, 1.5); for (i = g->labels; i; i = i->next) { first = 1; + if (i->r < 0) /* invisible data */ + continue; cairo_set_source_rgb(cr, i->r, i->g, i->b); for (j = i->values; j; j = j->next) { tx = ((getx(j) - minx) / (maxx - minx)) * (x2 - x1) + x1; @@ -587,16 +590,22 @@ void graph_set_color(struct graph *gr, const char *label, struct graph_label *i; double r, g, b; - r = fabs(red); - g = fabs(green); - b = fabs(blue); - - if (r > 1.0) - r = 1.0; - if (g > 1.0) - g = 1.0; - if (b > 1.0) - b =1.0; + if (red < 0.0) { /* invisible color */ + r = -1.0; + g = -1.0; + b = -1.0; + } else { + r = fabs(red); + g = fabs(green); + b = fabs(blue); + + if (r > 1.0) + r = 1.0; + if (g > 1.0) + g = 1.0; + if (b > 1.0) + b =1.0; + } for (i = gr->labels; i; i = i->next) if (strcmp(i->label, label) == 0) {