X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.c;h=d22c85350a2750d36455411afa08b74308975f6c;hp=c60717fa0828784601476464480d6d33a7e2f6dd;hb=fcbf2878a231442f4b62ee95fca39e28f04fc8d2;hpb=d1e55cdc27a837fb0f4c54ed019e3946e7a6e08b diff --git a/src/rrd_graph.c b/src/rrd_graph.c index c60717f..d22c853 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -41,7 +41,7 @@ char rrd_win_default_font[80]; text_prop_t text_prop[] = { { 10.0, RRD_DEFAULT_FONT }, /* default */ - { 12.0, RRD_DEFAULT_FONT }, /* title */ + { 10.0, RRD_DEFAULT_FONT }, /* title */ { 8.0, RRD_DEFAULT_FONT }, /* axis */ { 10.0, RRD_DEFAULT_FONT }, /* unit */ { 10.0, RRD_DEFAULT_FONT } /* legend */ @@ -188,6 +188,7 @@ enum gf_en gf_conv(char *string){ conv_if(VDEF,GF_VDEF) conv_if(PART,GF_PART) conv_if(XPORT,GF_XPORT) + conv_if(SHIFT,GF_SHIFT) return (-1); } @@ -601,7 +602,7 @@ printf("row_cnt after: %lu\n",row_cnt); ** into one interval for the destination. */ - for (dst_row=0;row_cnt>=reduce_factor;dst_row++) { + for (dst_row=0;(long int)row_cnt>=reduce_factor;dst_row++) { for (col=0;col<(*ds_cnt);col++) { rrd_value_t newval=DNAN; unsigned long validval=0; @@ -681,11 +682,11 @@ for (col=0;colgdes_c;i++){ + for (i=0;i< (int)im->gdes_c;i++){ /* only GF_DEF elements fetch data */ if (im->gdes[i].gf != GF_DEF) continue; @@ -697,6 +698,7 @@ data_fetch(image_desc_t *im ) continue; if ((strcmp(im->gdes[i].rrd, im->gdes[ii].rrd) == 0) && (im->gdes[i].cf == im->gdes[ii].cf) + && (im->gdes[i].cf_reduce == im->gdes[ii].cf_reduce) && (im->gdes[i].start == im->gdes[ii].start) && (im->gdes[i].end == im->gdes[ii].end) && (im->gdes[i].step == im->gdes[ii].step)) { @@ -729,9 +731,10 @@ data_fetch(image_desc_t *im ) return -1; } im->gdes[i].data_first = 1; + im->gdes[i].step = im->step; if (ft_step < im->gdes[i].step) { - reduce_data(im->gdes[i].cf, + reduce_data(im->gdes[i].cf_reduce, ft_step, &im->gdes[i].start, &im->gdes[i].end, @@ -743,8 +746,8 @@ data_fetch(image_desc_t *im ) } } - /* lets see if the required data source is realy there */ - for(ii=0;iigdes[i].ds_cnt;ii++){ + /* lets see if the required data source is really there */ + for(ii=0;ii<(int)im->gdes[i].ds_cnt;ii++){ if(strcmp(im->gdes[i].ds_namv[ii],im->gdes[i].ds_nam) == 0){ im->gdes[i].ds=ii; } } @@ -822,6 +825,28 @@ data_calc( image_desc_t *im){ switch (im->gdes[gdi].gf) { case GF_XPORT: break; + case GF_SHIFT: { + graph_desc_t *vdp = &im->gdes[im->gdes[gdi].vidx]; + + /* remove current shift */ + vdp->start -= vdp->shift; + vdp->end -= vdp->shift; + + /* vdef */ + if (im->gdes[gdi].shidx >= 0) + vdp->shift = im->gdes[im->gdes[gdi].shidx].vf.val; + /* constant */ + else + vdp->shift = im->gdes[gdi].shval; + + /* normalize shift to multiple of consolidated step */ + vdp->shift = (vdp->shift / (long)vdp->step) * (long)vdp->step; + + /* apply shift */ + vdp->start += vdp->shift; + vdp->end += vdp->shift; + break; + } case GF_VDEF: /* A VDEF has no DS. This also signals other parts * of rrdtool that this is a VDEF value, not a CDEF. @@ -912,12 +937,12 @@ data_calc( image_desc_t *im){ if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE || im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){ long ptr = im->gdes[gdi].rpnp[rpi].ptr; - if(im->gdes[gdi].start > im->gdes[ptr].start) { - im->gdes[gdi].rpnp[rpi].data += im->gdes[gdi].rpnp[rpi].ds_cnt; - } + long diff = im->gdes[gdi].start - im->gdes[ptr].start; + + if(diff > 0) + im->gdes[gdi].rpnp[rpi].data += (diff / im->gdes[ptr].step) * im->gdes[ptr].ds_cnt; } } - if(steparray == NULL){ rrd_set_error("rpn expressions without DEF" @@ -1015,8 +1040,10 @@ data_proc( image_desc_t *im ){ ** the time of the graph. Beware. */ vidx = im->gdes[ii].vidx; - if ( (gr_time >= im->gdes[vidx].start) && - (gr_time <= im->gdes[vidx].end) ) { + if (im->gdes[vidx].gf == GF_VDEF) { + value = im->gdes[vidx].vf.val; + } else if (((long int)gr_time >= (long int)im->gdes[vidx].start) && + ((long int)gr_time <= (long int)im->gdes[vidx].end) ) { value = im->gdes[vidx].data[ (unsigned long) floor( (double)(gr_time - im->gdes[vidx].start) @@ -1072,6 +1099,11 @@ data_proc( image_desc_t *im ){ else im->maxval = maxval; } + /* make sure min is smaller than max */ + if (im->minval > im->maxval) { + im->minval = 0.99 * im->maxval; + } + /* make sure min and max are not equal */ if (im->minval == im->maxval) { im->maxval *= 1.01; @@ -1327,6 +1359,7 @@ print_calc(image_desc_t *im, char ***prdata) case GF_CDEF: case GF_VDEF: case GF_PART: + case GF_SHIFT: case GF_XPORT: break; } @@ -1352,7 +1385,7 @@ leg_place(image_desc_t *im) char prt_fctn; /*special printfunctions */ int *legspace; - if( !(im->extra_flags & NOLEGEND) ) { + if( !(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH) ) { if ((legspace = malloc(im->gdes_c*sizeof(int)))==NULL){ rrd_set_error("malloc for legspace"); return -1; @@ -1895,16 +1928,16 @@ grid_paint(image_desc_t *im) 7, (im->yorigin - im->ysize/2), im->graph_col[GRC_FONT], im->text_prop[TEXT_PROP_AXIS].font, - im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 270.0, + im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, + RRDGRAPH_YLEGEND_ANGLE, GFX_H_LEFT, GFX_V_CENTER, im->ylegend); } else { /* horrible hack until we can actually print vertically */ { int n; - int l=strlen(im->ylegend); char s[2]; - for (n=0;nylegend);n++) { + for (n=0;n< (int)strlen(im->ylegend);n++) { s[0]=im->ylegend[n]; s[1]='\0'; gfx_new_text(im->canvas,7,im->text_prop[TEXT_PROP_AXIS].size*(n+1), @@ -1927,7 +1960,7 @@ grid_paint(image_desc_t *im) im->title); /* graph labels */ - if( !(im->extra_flags & NOLEGEND) ) { + if( !(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH) ) { for(i=0;igdes_c;i++){ if(im->gdes[i].legend[0] =='\0') continue; @@ -2079,11 +2112,20 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) #if 0 Xlegend =0, Ylegend =0, #endif - Xspacing =10, Yspacing =10; + Xspacing =10, Yspacing =10; - if (im->ylegend[0] != '\0') { - Xvertical = im->text_prop[TEXT_PROP_LEGEND].size *2; - Yvertical = im->text_prop[TEXT_PROP_LEGEND].size * (strlen(im->ylegend)+1); + if (im->extra_flags & ONLY_GRAPH) { + if ( im->ysize > 32 ) { + rrd_set_error("height > 32 is not possible with --only-graph option"); + return -1; + } + Xspacing =0; + Yspacing =0; + } else { + if (im->ylegend[0] != '\0') { + Xvertical = im->text_prop[TEXT_PROP_LEGEND].size *2; + Yvertical = im->text_prop[TEXT_PROP_LEGEND].size * (strlen(im->ylegend)+1); + } } if (im->title[0] != '\0') { @@ -2129,10 +2171,21 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) ** forget about it at all; the legend will have to fit in the ** size already allocated. */ - im->ximg = Xylabel + Xmain + Xpie + Xspacing; + im->ximg = Xmain; + + if ( !(im->extra_flags & ONLY_GRAPH) ) { + im->ximg = Xylabel + Xmain + Xpie + Xspacing; + } + if (Xmain) im->ximg += Xspacing; if (Xpie) im->ximg += Xspacing; - im->xorigin = Xspacing + Xylabel; + + if (im->extra_flags & ONLY_GRAPH) { + im->xorigin = 0; + } else { + im->xorigin = Xspacing + Xylabel; + } + if (Xtitle > im->ximg) im->ximg = Xtitle; if (Xvertical) { im->ximg += Xvertical; @@ -2150,9 +2203,21 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) */ /* reserve space for main and/or pie */ - im->yimg = Ymain + Yxlabel; + + if (im->extra_flags & ONLY_GRAPH) { + im->yimg = Ymain; + } else { + im->yimg = Ymain + Yxlabel; + } + if (im->yimg < Ypie) im->yimg = Ypie; - im->yorigin = im->yimg - Yxlabel; + + if (im->extra_flags & ONLY_GRAPH) { + im->yorigin = im->yimg; + } else { + im->yorigin = im->yimg - Yxlabel; + } + /* reserve space for the title *or* some padding above the graph */ if (Ytitle) { im->yimg += Ytitle; @@ -2255,9 +2320,11 @@ graph_paint(image_desc_t *im, char ***calcpr) if (!calc_horizontal_grid(im)) return -1; + if (im->gridfit) apply_gridfit(im); + /************************************************************** *** Calculating sizes and locations became a bit confusing *** *** so I moved this into a separate function. *** @@ -2289,8 +2356,8 @@ graph_paint(image_desc_t *im, char ***calcpr) areazero = im->minval; if (im->maxval < 0.0) areazero = im->maxval; - - axis_paint(im); + if( !(im->extra_flags & ONLY_GRAPH) ) + axis_paint(im); } if (piechart) { @@ -2308,6 +2375,7 @@ graph_paint(image_desc_t *im, char ***calcpr) case GF_HRULE: case GF_VRULE: case GF_XPORT: + case GF_SHIFT: break; case GF_TICK: for (ii = 0; ii < im->xsize; ii++) @@ -2442,7 +2510,8 @@ graph_paint(image_desc_t *im, char ***calcpr) im->draw_y_grid=0; } /* grid_paint also does the text */ - grid_paint(im); + if( !(im->extra_flags & ONLY_GRAPH) ) + grid_paint(im); /* the RULES are the last thing to paint ... */ for(i=0;igdes_c;i++){ @@ -2503,13 +2572,7 @@ graph_paint(image_desc_t *im, char ***calcpr) int gdes_alloc(image_desc_t *im){ - unsigned long def_step = (im->end-im->start)/im->xsize; - - if (im->step > def_step) /* step can be increassed ... no decreassed */ - def_step = im->step; - im->gdes_c++; - if ((im->gdes = (graph_desc_t *) rrd_realloc(im->gdes, (im->gdes_c) * sizeof(graph_desc_t)))==NULL){ rrd_set_error("realloc graph_descs"); @@ -2517,7 +2580,7 @@ gdes_alloc(image_desc_t *im){ } - im->gdes[im->gdes_c-1].step=def_step; + im->gdes[im->gdes_c-1].step=im->step; im->gdes[im->gdes_c-1].stack=0; im->gdes[im->gdes_c-1].debug=0; im->gdes[im->gdes_c-1].start=im->start; @@ -2528,6 +2591,7 @@ gdes_alloc(image_desc_t *im){ im->gdes[im->gdes_c-1].data_first=0; im->gdes[im->gdes_c-1].p_data=NULL; im->gdes[im->gdes_c-1].rpnp=NULL; + im->gdes[im->gdes_c-1].shift=0; im->gdes[im->gdes_c-1].col = 0x0; im->gdes[im->gdes_c-1].legend[0]='\0'; im->gdes[im->gdes_c-1].rrd[0]='\0'; @@ -2590,7 +2654,7 @@ rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize, FILE *s strncpy(im.graphfile,argv[optind],MAXPATH-1); im.graphfile[MAXPATH-1]='\0'; - rrd_graph_script(argc,argv,&im); + rrd_graph_script(argc,argv,&im,1); if (rrd_test_error()) { im_free(&im); return -1; @@ -2735,6 +2799,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) {"lazy", no_argument, 0, 'z'}, {"zoom", required_argument, 0, 'm'}, {"no-legend", no_argument, 0, 'g'}, + {"only-graph", no_argument, 0, 'j'}, {"alt-y-grid", no_argument, 0, 'Y'}, {"no-minor", no_argument, 0, 'I'}, {"alt-autoscale", no_argument, 0, 'A'}, @@ -2748,7 +2813,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgYAMX:S:N", + "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgjYAMX:S:N", long_options, &option_index); if (opt == EOF) @@ -2767,6 +2832,9 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) case 'M': im->extra_flags |= ALTAUTOSCALE_MAX; break; + case 'j': + im->extra_flags |= ONLY_GRAPH; + break; case 'g': im->extra_flags |= NOLEGEND; break; @@ -2808,13 +2876,13 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) &im->xlab_user.precis, &stroff) == 7 && stroff != 0){ strncpy(im->xlab_form, optarg+stroff, sizeof(im->xlab_form) - 1); - if((im->xlab_user.gridtm = tmt_conv(scan_gtm)) == -1){ + if((int)(im->xlab_user.gridtm = tmt_conv(scan_gtm)) == -1){ rrd_set_error("unknown keyword %s",scan_gtm); return; - } else if ((im->xlab_user.mgridtm = tmt_conv(scan_mtm)) == -1){ + } else if ((int)(im->xlab_user.mgridtm = tmt_conv(scan_mtm)) == -1){ rrd_set_error("unknown keyword %s",scan_mtm); return; - } else if ((im->xlab_user.labtm = tmt_conv(scan_ltm)) == -1){ + } else if ((int)(im->xlab_user.labtm = tmt_conv(scan_ltm)) == -1){ rrd_set_error("unknown keyword %s",scan_ltm); return; } @@ -2891,7 +2959,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) im->imginfo = optarg; break; case 'a': - if((im->canvas->imgformat = if_conv(optarg)) == -1) { + if((int)(im->canvas->imgformat = if_conv(optarg)) == -1) { rrd_set_error("unsupported graphics format '%s'",optarg); return; } @@ -3009,6 +3077,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) im->start = start_tmp; im->end = end_tmp; + im->step = max((long)im->step, (im->end-im->start)/im->xsize); } int @@ -3122,12 +3191,12 @@ char *str; n=0; sscanf(str,"%le,%29[A-Z]%n",¶m,func,&n); - if (n==strlen(str)) { /* matched */ + if (n== (int)strlen(str)) { /* matched */ ; } else { n=0; sscanf(str,"%29[A-Z]%n",func,&n); - if (n==strlen(str)) { /* matched */ + if (n== (int)strlen(str)) { /* matched */ param=DNAN; } else { rrd_set_error("Unknown function string '%s' in VDEF '%s'"