X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.c;h=a503ca3c6fefa34e8086c68da824a695b6ac384b;hp=eae4c3db1618923b866f591e97fd81ff758d6c74;hb=87ecb352dda7597a61ee73ada82cf97d751817c3;hpb=51c6bdc41243a5071256479672a4b18de413ecf1 diff --git a/src/rrd_graph.c b/src/rrd_graph.c index eae4c3d..a503ca3 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3rc4 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.3rc7 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -1612,7 +1612,8 @@ int leg_place( int border = im->text_prop[TEXT_PROP_LEGEND].size * 2.0; int fill = 0, fill_last; int leg_c = 0; - int leg_x = border, leg_y = im->yimg; + int leg_x = border; + int leg_y = im->yimg; int leg_y_prev = im->yimg; int leg_cc; int glue = 0; @@ -1656,9 +1657,7 @@ int leg_place( } leg_cc = strlen(im->gdes[i].legend); /* is there a controle code ant the end of the legend string ? */ - if (leg_cc >= 2 - && im->gdes[i].legend[leg_cc - - 2] == '\\' ) { + if (leg_cc >= 2 && im->gdes[i].legend[leg_cc - 2] == '\\') { prt_fctn = im->gdes[i].legend[leg_cc - 1]; leg_cc -= 2; im->gdes[i].legend[leg_cc] = '\0'; @@ -1670,8 +1669,7 @@ int leg_place( prt_fctn != 'r' && prt_fctn != 'j' && prt_fctn != 'c' && - prt_fctn != 's' && - prt_fctn != '\0' && prt_fctn != 'g') { + prt_fctn != 's' && prt_fctn != '\0' && prt_fctn != 'g') { free(legspace); rrd_set_error ("Unknown control code at the end of '%s\\%c'", @@ -1807,10 +1805,9 @@ int leg_place( leg_y - im->text_prop[TEXT_PROP_LEGEND].size * 1.8; } } else { - im->yimg = leg_y_prev; - /* if we did place some legends we have to add vertical space */ - if (leg_y != im->yimg) - im->yimg += im->text_prop[TEXT_PROP_LEGEND].size * 1.8; + im->yimg = + leg_y - im->text_prop[TEXT_PROP_LEGEND].size * 1.8 + + border * 0.6; } free(legspace); } @@ -1823,8 +1820,6 @@ int leg_place( /* the xaxis labels are determined from the number of seconds per pixel in the requested graph */ - - int calc_horizontal_grid( image_desc_t *im) @@ -1862,13 +1857,16 @@ int calc_horizontal_grid( if (im->ygrid_scale.gridstep == 0) /* range is one -> 0.1 is reasonable scale */ im->ygrid_scale.gridstep = 0.1; /* should have at least 5 lines but no more then 15 */ - if (range / im->ygrid_scale.gridstep < 5) + if (range / im->ygrid_scale.gridstep < 5 + && im->ygrid_scale.gridstep >= 30) im->ygrid_scale.gridstep /= 10; if (range / im->ygrid_scale.gridstep > 15) im->ygrid_scale.gridstep *= 10; if (range / im->ygrid_scale.gridstep > 5) { im->ygrid_scale.labfact = 1; - if (range / im->ygrid_scale.gridstep > 8) + if (range / im->ygrid_scale.gridstep > 8 + || im->ygrid_scale.gridstep < + 1.8 * im->text_prop[TEXT_PROP_AXIS].size) im->ygrid_scale.labfact = 2; } else { im->ygrid_scale.gridstep /= 5; @@ -1895,17 +1893,17 @@ int calc_horizontal_grid( sprintf(im->ygrid_scale.labfmt, "%%%d.0f%s", len, (im->symbol != ' ' ? " %c" : "")); } - } else { + } else { /* classic rrd grid */ for (i = 0; ylab[i].grid > 0; i++) { pixel = im->ysize / (scaledrange / ylab[i].grid); gridind = i; - if (pixel > 7) + if (pixel >= 5) break; } for (i = 0; i < 4; i++) { if (pixel * ylab[gridind].lfac[i] >= - 2.5 * im->text_prop[TEXT_PROP_AXIS].size) { + 1.8 * im->text_prop[TEXT_PROP_AXIS].size) { im->ygrid_scale.labfact = ylab[gridind].lfac[i]; break; } @@ -3071,6 +3069,9 @@ int graph_paint( im->yorigin - im->ysize, im->graph_col[GRC_CANVAS]); gfx_add_point(im, im->xorigin, im->yorigin - im->ysize); gfx_close_path(im); + cairo_rectangle(im->cr, im->xorigin, im->yorigin - im->ysize - 1.0, + im->xsize, im->ysize + 2.0); + cairo_clip(im->cr); if (im->minval > 0.0) areazero = im->minval; if (im->maxval < 0.0) @@ -3358,6 +3359,7 @@ int graph_paint( break; } /* switch */ } + cairo_reset_clip(im->cr); /* grid_paint also does the text */ if (!(im->extra_flags & ONLY_GRAPH)) @@ -3726,6 +3728,7 @@ void rrd_graph_init( im->unitslength = 6; im->viewfactor = 1.0; im->watermark[0] = '\0'; + im->with_markup = 0; im->ximg = 0; im->xlab_user.minsec = -1; im->xorigin = 0; @@ -3799,123 +3802,55 @@ void rrd_graph_options( /* defines for long options without a short equivalent. should be bytes, and may not collide with (the ASCII value of) short options */ #define LONGOPT_UNITS_SI 255 + +/* *INDENT-OFF* */ struct option long_options[] = { - { - "start", required_argument, 0, 's'}, { - "end", required_argument, 0, - 'e'}, { - "x-grid", - required_argument, 0, - 'x'}, { - "y-grid", - required_argument, - 0, 'y'}, { - "vertical-label", - required_argument, - 0, - 'v'}, { - "width", - required_argument, - 0, - 'w'}, - { - "height", required_argument, 0, 'h'}, { - "full-size-mode", no_argument, - 0, 'D'}, { - "interlaced", - no_argument, 0, - 'i'}, { - "upper-limit", - required_argument, - 0, - 'u'}, { - "lower-limit", - required_argument, - 0, - 'l'}, { - "rigid", - no_argument, - 0, - 'r'}, - { - "base", required_argument, 0, 'b'}, { - "logarithmic", no_argument, 0, - 'o'}, { - "color", - required_argument, 0, - 'c'}, { - "font", - required_argument, - 0, 'n'}, { - "title", - required_argument, - 0, 't'}, - { - "imginfo", required_argument, 0, 'f'}, { - "imgformat", - required_argument, 0, 'a'}, { - "lazy", - no_argument, - 0, - 'z'}, - { - "zoom", required_argument, 0, 'm'}, { - "no-legend", no_argument, 0, - 'g'}, { - "force-rules-legend", - no_argument, - 0, 'F'}, { - "only-graph", - no_argument, 0, - 'j'}, { - "alt-y-grid", - no_argument, - 0, 'Y'}, - { - "no-minor", no_argument, 0, 'I'}, { - "slope-mode", no_argument, 0, - 'E'}, { - "alt-autoscale", - no_argument, 0, 'A'}, { - "alt-autoscale-min", - no_argument, - 0, - 'J'}, { - "alt-autoscale-max", - no_argument, - 0, - 'M'}, { - "no-gridfit", - no_argument, - 0, - 'N'}, - { - "units-exponent", required_argument, - 0, 'X'}, { - "units-length", required_argument, - 0, 'L'}, { - "units", required_argument, 0, - LONGOPT_UNITS_SI}, { - "step", required_argument, 0, - 'S'}, { - "tabwidth", - required_argument, 0, - 'T'}, { - "font-render-mode", - required_argument, - 0, 'R'}, { - "graph-render-mode", - required_argument, - 0, - 'G'}, - { - "font-smoothing-threshold", - required_argument, 0, 'B'}, { - "watermark", required_argument, 0, 'W'}, { - "alt-y-mrtg", no_argument, 0, 1000}, /* this has no effect it is just here to save old apps from crashing when they use it */ - { - 0, 0, 0, 0} - }; + { "start", required_argument, 0, 's'}, + { "end", required_argument, 0, 'e'}, + { "x-grid", required_argument, 0, 'x'}, + { "y-grid", required_argument, 0, 'y'}, + { "vertical-label", required_argument, 0, 'v'}, + { "width", required_argument, 0, 'w'}, + { "height", required_argument, 0, 'h'}, + { "full-size-mode", no_argument, 0, 'D'}, + { "interlaced", no_argument, 0, 'i'}, + { "upper-limit", required_argument, 0, 'u'}, + { "lower-limit", required_argument, 0, 'l'}, + { "rigid", no_argument, 0, 'r'}, + { "base", required_argument, 0, 'b'}, + { "logarithmic", no_argument, 0, 'o'}, + { "color", required_argument, 0, 'c'}, + { "font", required_argument, 0, 'n'}, + { "title", required_argument, 0, 't'}, + { "imginfo", required_argument, 0, 'f'}, + { "imgformat", required_argument, 0, 'a'}, + { "lazy", no_argument, 0, 'z'}, + { "zoom", required_argument, 0, 'm'}, + { "no-legend", no_argument, 0, 'g'}, + { "force-rules-legend", no_argument, 0, 'F'}, + { "only-graph", no_argument, 0, 'j'}, + { "alt-y-grid", no_argument, 0, 'Y'}, + { "no-minor", no_argument, 0, 'I'}, + { "slope-mode", no_argument, 0, 'E'}, + { "alt-autoscale", no_argument, 0, 'A'}, + { "alt-autoscale-min", no_argument, 0, 'J'}, + { "alt-autoscale-max", no_argument, 0, 'M'}, + { "no-gridfit", no_argument, 0, 'N'}, + { "units-exponent", required_argument, 0, 'X'}, + { "units-length", required_argument, 0, 'L'}, + { "units", required_argument, 0, LONGOPT_UNITS_SI}, + { "step", required_argument, 0, 'S'}, + { "tabwidth", required_argument, 0, 'T'}, + { "font-render-mode", required_argument, 0, 'R'}, + { "graph-render-mode", required_argument, 0, 'G'}, + { "font-smoothing-threshold", required_argument, 0, 'B'}, + { "watermark", required_argument, 0, 'W'}, + { "alt-y-mrtg", no_argument, 0, 1000}, /* this has no effect it is just here to save old apps from crashing when they use it */ + { "pango-markup", no_argument, 0, 'P'}, + { 0, 0, 0, 0} +}; +/* *INDENT-ON* */ + optind = 0; opterr = 0; /* initialize getopt */ parsetime("end-24h", &start_tv); @@ -3988,6 +3923,9 @@ void rrd_graph_options( case 'N': im->gridfit = 0; break; + case 'P': + im->with_markup = 1; + break; case 's': if ((parsetime_error = parsetime(optarg, &start_tv))) { rrd_set_error("start time: %s", parsetime_error); @@ -4188,18 +4126,20 @@ void rrd_graph_options( if (size > 0) { im->text_prop[propidx].size = size; } - if ((int) strlen(prop) > end) { - if (prop[end] == ':') { + if ((int) strlen(optarg) > end) { + if (optarg[end] == ':') { strncpy(im->text_prop[propidx].font, - prop + end + 1, 255); + optarg + end + 1, 255); im->text_prop[propidx].font[255] = '\0'; } else { rrd_set_error - ("expected after font size in '%s'", - prop); + ("expected : after font size in '%s'", + optarg); return; } } + /* only run the for loop for DEFAULT (0) for + all others, we break here. woodo programming */ if (propidx == sindex && sindex != 0) break; } @@ -4511,15 +4451,21 @@ int vdef_calc( graph_desc_t *src, *dst; rrd_value_t *data; long step, steps; + unsigned long end; dst = &im->gdes[gdi]; src = &im->gdes[dst->vidx]; data = src->data + src->ds; - steps = (src->end - src->start) / src->step; + end = + src->end_orig % src->step == + 0 ? src->end_orig : (src->end_orig + src->step - + src->end_orig % src->step); + + steps = (end - src->start) / src->step; #if 0 printf ("DEBUG: start == %lu, end == %lu, %lu steps\n", - src->start, src->end, steps); + src->start, src->end_orig, steps); #endif switch (dst->vf.op) { case VDEF_PERCENT:{