/****************************************************************************
- * RRDtool 1.2.19 Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007
****************************************************************************
* rrd__graph.c produce graphs from data in rrdfiles
****************************************************************************/
im->minval -= adj;
im->maxval += adj;
}
+ else if(im->extra_flags & ALTAUTOSCALE_MIN) {
+ /* measure the amplitude of the function. Make sure that
+ graph boundaries are slightly lower than min vals
+ so we can see amplitude on the graph */
+ adj = (im->maxval - im->minval) * 0.1;
+ im->minval -= adj;
+ }
else if(im->extra_flags & ALTAUTOSCALE_MAX) {
/* measure the amplitude of the function. Make sure that
graph boundaries are slightly higher than max vals
double new_range = factor * (im->maxval - im->minval);
double gridstep = im->ygrid_scale.gridstep;
double minor_y, minor_y_px, minor_y_px_frac;
- im->maxval = im->minval + new_range;
+ if (im->maxval > 0.0)
+ im->maxval = im->minval + new_range;
+ else
+ im->minval = im->maxval - new_range;
ytr(im,DNAN); /* reset precalc */
/* make sure first minor gridline is on integer pixel y coord */
minor_y = gridstep * floor(im->minval / gridstep);
for (i = sgrid; i <= egrid; i++){
double Y0=ytr(im,im->ygrid_scale.gridstep*i);
double YN=ytr(im,im->ygrid_scale.gridstep*(i+1));
- if ( Y0 >= im->yorigin-im->ysize
- && Y0 <= im->yorigin){
+ if ( round(Y0) >= im->yorigin-im->ysize
+ && round(Y0) <= im->yorigin){
/* Make sure at least 2 grid labels are shown, even if it doesn't agree
with the chosen settings. Add a label if required by settings, or if
there is only one label so far and the next grid line is out of bounds. */
pre_value = value;
Y0 = ytr(im, value);
- if(Y0 <= im->yorigin - im->ysize) break;
+ if(round(Y0) <= im->yorigin - im->ysize) break;
/* major grid line */
gfx_new_dashed_line ( im->canvas,
if(value < im->minval) continue;
Y0 = ytr(im, value);
- if(Y0 <= im->yorigin - im->ysize) break;
+ if(round(Y0) <= im->yorigin - im->ysize) break;
/* draw lines */
gfx_new_dashed_line ( im->canvas,
if(value < im->minval) continue;
Y0 = ytr(im, value);
- if(Y0 <= im->yorigin - im->ysize) break;
+ if(round(Y0) <= im->yorigin - im->ysize) break;
/* draw lines */
gfx_new_dashed_line ( im->canvas,
if(value < im->minval) continue;
Y0 = ytr(im, value);
- if(Y0 <= im->yorigin - im->ysize) break;
+ if(round(Y0) <= im->yorigin - im->ysize) break;
/* draw lines */
gfx_new_dashed_line ( im->canvas,
if(value < im->minval) continue;
Y0 = ytr(im, value);
- if(Y0 <= im->yorigin - im->ysize) break;
+ if(round(Y0) <= im->yorigin - im->ysize) break;
/* draw lines */
gfx_new_dashed_line ( im->canvas,
{"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'},
break;
case 'A':
im->extra_flags |= ALTAUTOSCALE;
+ break;
+ case 'J':
+ im->extra_flags |= ALTAUTOSCALE_MIN;
break;
case 'M':
im->extra_flags |= ALTAUTOSCALE_MAX;