/****************************************************************************
- * RRDtool 1.3rc2 Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.3rc4 Copyright by Tobi Oetiker, 1997-2008
****************************************************************************
* rrd__graph.c produce graphs from data in rrdfiles
****************************************************************************/
yval = im->yorigin - pixie * (log10(value) - log10(im->minval));
}
}
- /* make sure we don't return anything too unreasonable. GD lib can
- get terribly slow when drawing lines outside its scope. This is
- especially problematic in connection with the rigid option */
- if (!im->rigid) {
- /* keep yval as-is */
- } else if (yval > im->yorigin) {
- yval = im->yorigin + 0.00001;
- } else if (yval < im->yorigin - im->ysize) {
- yval = im->yorigin - im->ysize - 0.00001;
- }
return yval;
}
return 0;
}
+/* from http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm */
+/* yes we are loosing precision by doing tos with floats instead of doubles
+ but it seems more stable this way. */
+
static int AlmostEqual2sComplement(
float A,
float B,
lets set these to dummy values then ... */
if (im->logarithmic) {
- if (isnan(minval))
- minval = 0.2;
- if (isnan(maxval))
+ if (isnan(minval) || isnan(maxval) || maxval <= 0) {
+ minval = 0.0; /* catching this right away below */
maxval = 5.1;
+ }
+ /* in logarithm mode, where minval is smaller or equal
+ to 0 make the beast just way smaller than maxval */
+ if (minval <= 0) {
+ minval = maxval / 10e8;
+ }
} else {
- if (isnan(minval))
+ if (isnan(minval) || isnan(maxval)) {
minval = 0.0;
- if (isnan(maxval))
maxval = 1.0;
+ }
}
- /* adjust min and max values */
+ /* adjust min and max values given by the user */
/* for logscale we add something on top */
if (isnan(im->minval)
|| ((!im->rigid) && im->minval > minval)
) {
if (im->logarithmic)
- im->minval = minval * 0.5;
+ im->minval = minval / 2.0;
else
im->minval = minval;
}
return mnt;
}
-/* from http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm */
-/* yes we are loosing precision by doing tos with floats instead of doubles
- but it seems more stable this way. */
-
/* logaritmic horizontal grid */
int horizontal_log_grid(
case IF_PDF:
im->gridfit = 0;
im->surface = strlen(im->graphfile)
- ?
- cairo_pdf_surface_create_for_stream
- (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom)
- : cairo_pdf_surface_create(im->graphfile, im->ximg * im->zoom,
- im->yimg * im->zoom);
+ ? cairo_pdf_surface_create(im->graphfile, im->ximg * im->zoom,
+ im->yimg * im->zoom)
+ : cairo_pdf_surface_create_for_stream
+ (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom);
break;
case IF_EPS:
im->gridfit = 0;
im->surface = strlen(im->graphfile)
?
- cairo_ps_surface_create_for_stream
- (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom)
- : cairo_ps_surface_create(im->graphfile, im->ximg * im->zoom,
- im->yimg * im->zoom);
+ cairo_ps_surface_create(im->graphfile, im->ximg * im->zoom,
+ im->yimg * im->zoom)
+ : cairo_ps_surface_create_for_stream
+ (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom);
break;
case IF_SVG:
im->gridfit = 0;
im->surface = strlen(im->graphfile)
?
- cairo_svg_surface_create_for_stream
- (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom)
- : cairo_svg_surface_create(im->
- graphfile,
- im->
- ximg * im->zoom, im->yimg * im->zoom);
+ cairo_svg_surface_create(im->
+ graphfile,
+ im->ximg * im->zoom, im->yimg * im->zoom)
+ : cairo_svg_surface_create_for_stream
+ (&cairo_output, im, im->ximg * im->zoom, im->yimg * im->zoom);
cairo_svg_surface_restrict_to_version
(im->surface, CAIRO_SVG_VERSION_1_1);
break;
rrd_set_error("Could not save png to '%s'", im->graphfile);
return 1;
}
- }
break;
+ }
default:
if (strlen(im->graphfile)) {
cairo_show_page(im->cr);
*ymin = walker->value.u_val;
} else if (strcmp(walker->key, "value_max") == 0) {
*ymax = walker->value.u_val;
- } else if (strncmp(walker->key, "print", 6) == 0) { /* keys are prdate[0..] */
+ } else if (strncmp(walker->key, "print", 5) == 0) { /* keys are prdate[0..] */
prlines++;
if (((*prdata) =
rrd_realloc((*prdata),
}
}
- if (im->logarithmic == 1 && im->minval <= 0) {
+ if (im->logarithmic && im->minval <= 0) {
rrd_set_error
("for a logarithmic yaxis you must specify a lower-limit > 0");
return;