/****************************************************************************
- * RRDtool 1.2.20 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
****************************************************************************/
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,