index 323fec6dcfc1ba3d0d79c455961915e8f16e9ba0..5dd332861bfe5074f394f22481ea10ee0c6765b0 100644 (file)
--- a/program/src/rrd_graph.c
+++ b/program/src/rrd_graph.c
/****************************************************************************
- * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010
****************************************************************************
* rrd__graph.c produce graphs from data in rrdfiles
****************************************************************************/
#include <fcntl.h>
#endif
-#ifdef HAVE_TIME_H
#include <time.h>
-#endif
-#ifdef HAVE_LOCALE_H
#include <locale.h>
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
#endif
#include "rrd_graph.h"
, /* unit */
{8.0, RRD_DEFAULT_FONT,NULL} /* legend */
,
- {5.5, RRD_DEFAULT_FONT,NULL} /* watermark */
+ {5.5, RRD_DEFAULT_FONT,NULL} /* watermark */
};
xlab_t xlab[] = {
conv_if(VRULE, GF_VRULE);
conv_if(LINE, GF_LINE);
conv_if(AREA, GF_AREA);
+ conv_if(GRAD, GF_GRAD);
conv_if(STACK, GF_STACK);
conv_if(TICK, GF_TICK);
conv_if(TEXTALIGN, GF_TEXTALIGN);
if (status)
fprintf(stderr, "OOPS: Cairo has issues it can't even die: %s\n",
cairo_status_to_string(status));
-
+
return 0;
}
ytr(im, DNAN); /* reset precalc */
log10_range = log10(im->maxval) - log10(im->minval);
}
- /* make sure first y=10^x gridline is located on
- integer pixel position by moving scale slightly
+ /* make sure first y=10^x gridline is located on
+ integer pixel position by moving scale slightly
downwards (sub-pixel movement) */
ypix = ytr(im, ya) + im->ysize; /* add im->ysize so it always is positive */
ypixfrac = ypix - floor(ypix);
}
-/* get the data required for the graphs from the
+/* get the data required for the graphs from the
relevant rrds ... */
int data_fetch(
/* evaluate the expressions in the CDEF functions */
/*************************************************************
- * CDEF stuff
+ * CDEF stuff
*************************************************************/
long find_var_wrapper(
{
long i, ii;
double pixstep = (double) (im->end - im->start)
- / (double) im->xsize; /* how much time
+ / (double) im->xsize; /* how much time
passes in one pixel */
double paintval;
double minval = DNAN, maxval = DNAN;
/* memory for the processed data */
for (i = 0; i < im->gdes_c; i++) {
- if ((im->gdes[i].gf == GF_LINE) ||
- (im->gdes[i].gf == GF_AREA) || (im->gdes[i].gf == GF_TICK)) {
+ if ((im->gdes[i].gf == GF_LINE)
+ || (im->gdes[i].gf == GF_AREA)
+ || (im->gdes[i].gf == GF_TICK)
+ || (im->gdes[i].gf == GF_GRAD)
+ ) {
if ((im->gdes[i].p_data = (rrd_value_t*)malloc((im->xsize + 1)
* sizeof(rrd_value_t))) == NULL) {
rrd_set_error("malloc data_proc");
switch (im->gdes[ii].gf) {
case GF_LINE:
case GF_AREA:
+ case GF_GRAD:
case GF_TICK:
if (!im->gdes[ii].stack)
paintval = 0.0;
} else
if (((long int) gr_time >=
(long int) im->gdes[vidx].start)
- && ((long int) gr_time <=
+ && ((long int) gr_time <
(long int) im->gdes[vidx].end)) {
value = im->gdes[vidx].data[(unsigned long)
floor((double)
minval = 0.0; /* catching this right away below */
maxval = 5.1;
}
- /* in logarithm mode, where minval is smaller or equal
+ /* 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;
return 0;
}
-
+static int find_first_weekday(void){
+ static int first_weekday = -1;
+ if (first_weekday == -1){
+#ifdef HAVE__NL_TIME_WEEK_1STDAY
+ /* according to http://sourceware.org/ml/libc-locales/2009-q1/msg00011.html */
+ long week_1stday_l = (long) nl_langinfo (_NL_TIME_WEEK_1STDAY);
+ if (week_1stday_l == 19971130) first_weekday = 0; /* Sun */
+ else if (week_1stday_l == 19971201) first_weekday = 1; /* Mon */
+ else first_weekday = 1; /* we go for a monday default */
+#else
+ first_weekday = 1;
+#endif
+ }
+ return first_weekday;
+}
/* identify the point where the first gridline, label ... gets placed */
tm. tm_sec = 0;
tm. tm_min = 0;
tm. tm_hour = 0;
- tm. tm_mday -= tm.tm_wday - 1; /* -1 because we want the monday */
+ tm. tm_mday -= tm.tm_wday - find_first_weekday();
- if (tm.tm_wday == 0)
- tm. tm_mday -= 7; /* we want the *previous* monday */
+ if (tm.tm_wday == 0 && find_first_weekday() > 0)
+ tm. tm_mday -= 7; /* we want the *previous* week */
break;
case TMT_MONTH:
break;
case GF_LINE:
case GF_AREA:
+ case GF_GRAD:
case GF_TICK:
graphelement = 1;
break;
}
- if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) {
+ if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) {
if ((legspace = (int*)malloc(im->gdes_c * sizeof(int))) == NULL) {
rrd_set_error("malloc for legspace");
return -1;
prt_fctn != 'r' &&
prt_fctn != 'j' &&
prt_fctn != 'c' &&
+ prt_fctn != 'u' &&
prt_fctn != 's' && prt_fctn != '\0' && prt_fctn != 'g') {
free(legspace);
rrd_set_error
if (prt_fctn == 'c')
leg_x = (double)(legendwidth - fill) / 2.0;
if (prt_fctn == 'r')
- leg_x = legendwidth - fill - border;
+ leg_x = legendwidth - fill + border;
for (ii = mark; ii <= i; ii++) {
if (im->gdes[ii].legend[0] == '\0')
continue; /* skip empty legends */
leg_y += im->text_prop[TEXT_PROP_LEGEND].size * 1.8;
if (prt_fctn == 's')
leg_y -= im->text_prop[TEXT_PROP_LEGEND].size;
+ if (prt_fctn == 'u')
+ leg_y -= im->text_prop[TEXT_PROP_LEGEND].size *1.8;
if(calc_width && (fill > legendwidth)){
legendwidth = fill;
double MaxY;
double second_axis_magfact = 0;
char *second_axis_symb = "";
-
+
scaledstep =
im->ygrid_scale.gridstep /
(double) im->magfact * (double) im->viewfactor;
auto_scale(im,&dummy,&second_axis_symb,&second_axis_magfact);
}
sval /= second_axis_magfact;
-
- if(MaxY < 10) {
+
+ if(MaxY < 10) {
sprintf(graph_label_right,"%5.1f %s",sval,second_axis_symb);
} else {
sprintf(graph_label_right,"%5.0f %s",sval,second_axis_symb);
}
else {
sprintf(graph_label_right,im->second_axis_format,sval);
- }
+ }
gfx_text ( im,
X1+7, Y0,
im->graph_col[GRC_FONT],
im->tabwidth,0.0, GFX_H_LEFT, GFX_V_CENTER,
graph_label_right );
}
-
+
gfx_text(im,
X0 -
im->
else
symbol = '?';
sprintf(graph_label, "%3.0f %c", pvalue, symbol);
- } else {
+ } else {
sprintf(graph_label, "%3.0e", value);
}
if (im->second_axis_scale != 0){
auto_scale(im,&sval,&symb,&mfac);
sprintf(graph_label_right,"%4.0f %s", sval,symb);
}
- else {
+ else {
sprintf(graph_label_right,"%3.0e", sval);
}
}
else {
sprintf(graph_label_right,im->second_axis_format,sval);
- }
-
+ }
+
gfx_text ( im,
X1+7, Y0,
im->graph_col[GRC_FONT],
im->tabwidth,0.0, GFX_H_LEFT, GFX_V_CENTER,
graph_label_right );
}
-
+
gfx_text(im,
X0 -
im->
gfx_line ( im, im->xorigin+im->xsize,im->yorigin+4,
im->xorigin+im->xsize,im->yorigin-im->ysize-4,
MGRIDWIDTH, im->graph_col[GRC_AXIS]);
- gfx_new_area ( im,
+ gfx_new_area ( im,
im->xorigin+im->xsize-2, im->yorigin-im->ysize-2,
im->xorigin+im->xsize+3, im->yorigin-im->ysize-2,
im->xorigin+im->xsize, im->yorigin-im->ysize-7, /* LINEOFFSET */
double X0, Y0; /* points for filled graph and more */
struct gfx_color_t water_color;
- /* draw 3d border */
- gfx_new_area(im, 0, im->yimg,
- 2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]);
- gfx_add_point(im, im->ximg - 2, 2);
- gfx_add_point(im, im->ximg, 0);
- gfx_add_point(im, 0, 0);
- gfx_close_path(im);
- gfx_new_area(im, 2, im->yimg - 2,
- im->ximg - 2,
- im->yimg - 2, im->ximg - 2, 2, im->graph_col[GRC_SHADEB]);
- gfx_add_point(im, im->ximg, 0);
- gfx_add_point(im, im->ximg, im->yimg);
- gfx_add_point(im, 0, im->yimg);
- gfx_close_path(im);
+ if (im->draw_3d_border > 0) {
+ /* draw 3d border */
+ i = im->draw_3d_border;
+ gfx_new_area(im, 0, im->yimg,
+ i, im->yimg - i, i, i, im->graph_col[GRC_SHADEA]);
+ gfx_add_point(im, im->ximg - i, i);
+ gfx_add_point(im, im->ximg, 0);
+ gfx_add_point(im, 0, 0);
+ gfx_close_path(im);
+ gfx_new_area(im, i, im->yimg - i,
+ im->ximg - i,
+ im->yimg - i, im->ximg - i, i, im->graph_col[GRC_SHADEB]);
+ gfx_add_point(im, im->ximg, 0);
+ gfx_add_point(im, im->ximg, im->yimg);
+ gfx_add_point(im, 0, im->yimg);
+ gfx_close_path(im);
+ }
if (im->draw_x_grid == 1)
vertical_grid(im);
if (im->draw_y_grid == 1) {
}
if (im->second_axis_legend[0] != '\0'){
gfx_text( im,
- im->xOriginLegendY2+10,
+ im->xOriginLegendY2+10,
im->yOriginLegendY2,
im->graph_col[GRC_FONT],
im->text_prop[TEXT_PROP_UNIT].font_desc,
- im->tabwidth,
+ im->tabwidth,
RRDGRAPH_YLEGEND_ANGLE,
GFX_H_CENTER, GFX_V_CENTER,
im->second_axis_legend);
- }
-
+ }
+
/* graph title */
gfx_text(im,
im->xOriginTitle, im->yOriginTitle+6,
text_prop[TEXT_PROP_WATERMARK].
font_desc, im->tabwidth,
-90, GFX_H_LEFT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER");
- }
+ }
/* graph watermark */
if (im->watermark[0] != '\0') {
water_color = im->graph_col[GRC_FONT];
}
/* graph labels */
- if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) {
+ if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) {
for (i = 0; i < im->gdes_c; i++) {
if (im->gdes[i].legend[0] == '\0')
continue;
boxV = boxH;
/* shift the box up a bit */
Y0 -= boxV * 0.4;
- /* make sure transparent colors show up the same way as in the graph */
- gfx_new_area(im,
- X0, Y0 - boxV,
- X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]);
- gfx_add_point(im, X0 + boxH, Y0 - boxV);
- gfx_close_path(im);
- gfx_new_area(im, X0, Y0 - boxV, X0,
- Y0, X0 + boxH, Y0, im->gdes[i].col);
- gfx_add_point(im, X0 + boxH, Y0 - boxV);
- gfx_close_path(im);
- cairo_save(im->cr);
- cairo_new_path(im->cr);
- cairo_set_line_width(im->cr, 1.0);
- X1 = X0 + boxH;
- Y1 = Y0 - boxV;
- gfx_line_fit(im, &X0, &Y0);
- gfx_line_fit(im, &X1, &Y1);
- cairo_move_to(im->cr, X0, Y0);
- cairo_line_to(im->cr, X1, Y0);
- cairo_line_to(im->cr, X1, Y1);
- cairo_line_to(im->cr, X0, Y1);
- cairo_close_path(im->cr);
- cairo_set_source_rgba(im->cr,
- im->
- graph_col
- [GRC_FRAME].
- red,
- im->
- graph_col
- [GRC_FRAME].
- green,
- im->
- graph_col
- [GRC_FRAME].
- blue, im->graph_col[GRC_FRAME].alpha);
+
+ if (im->dynamic_labels && im->gdes[i].gf == GF_HRULE) { /* [-] */
+ cairo_save(im->cr);
+ cairo_new_path(im->cr);
+ cairo_set_line_width(im->cr, 1.0);
+ gfx_line(im,
+ X0, Y0 - boxV / 2,
+ X0 + boxH, Y0 - boxV / 2,
+ 1.0, im->gdes[i].col);
+ gfx_close_path(im);
+ } else if (im->dynamic_labels && im->gdes[i].gf == GF_VRULE) { /* [|] */
+ cairo_save(im->cr);
+ cairo_new_path(im->cr);
+ cairo_set_line_width(im->cr, 1.0);
+ gfx_line(im,
+ X0 + boxH / 2, Y0,
+ X0 + boxH / 2, Y0 - boxV,
+ 1.0, im->gdes[i].col);
+ gfx_close_path(im);
+ } else if (im->dynamic_labels && im->gdes[i].gf == GF_LINE) { /* [/] */
+ cairo_save(im->cr);
+ cairo_new_path(im->cr);
+ cairo_set_line_width(im->cr, im->gdes[i].linewidth);
+ gfx_line(im,
+ X0, Y0,
+ X0 + boxH, Y0 - boxV,
+ im->gdes[i].linewidth, im->gdes[i].col);
+ gfx_close_path(im);
+ } else {
+ /* make sure transparent colors show up the same way as in the graph */
+ gfx_new_area(im,
+ X0, Y0 - boxV,
+ X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]);
+ gfx_add_point(im, X0 + boxH, Y0 - boxV);
+ gfx_close_path(im);
+ gfx_new_area(im, X0, Y0 - boxV, X0,
+ Y0, X0 + boxH, Y0, im->gdes[i].col);
+ gfx_add_point(im, X0 + boxH, Y0 - boxV);
+ gfx_close_path(im);
+ cairo_save(im->cr);
+ cairo_new_path(im->cr);
+ cairo_set_line_width(im->cr, 1.0);
+ X1 = X0 + boxH;
+ Y1 = Y0 - boxV;
+ gfx_line_fit(im, &X0, &Y0);
+ gfx_line_fit(im, &X1, &Y1);
+ cairo_move_to(im->cr, X0, Y0);
+ cairo_line_to(im->cr, X1, Y0);
+ cairo_line_to(im->cr, X1, Y1);
+ cairo_line_to(im->cr, X0, Y1);
+ cairo_close_path(im->cr);
+ cairo_set_source_rgba(im->cr,
+ im->graph_col[GRC_FRAME].red,
+ im->graph_col[GRC_FRAME].green,
+ im->graph_col[GRC_FRAME].blue,
+ im->graph_col[GRC_FRAME].alpha);
+ }
if (im->gdes[i].dash) {
/* make box borders in legend dashed if the graph is dashed */
double dashes[] = {
/* The actual size of the image to draw is determined from
** several sources. The size given on the command line is
** the graph area but we need more as we have to draw labels
- ** and other things outside the graph area. If the option
- ** --full-size-mode is selected the size defines the total
- ** image size and the size available for the graph is
+ ** and other things outside the graph area. If the option
+ ** --full-size-mode is selected the size defines the total
+ ** image size and the size available for the graph is
** calculated.
*/
** | +---+-------------------------------+
** | a | y | |
** | x | | |
- ** | i | a | |
+ ** | i | a | |
** | s | x | main graph area |
** | | i | |
** | t | s | |
Xylabel += Xspacing;
/* If the legend is printed besides the graph the width has to be
- ** calculated first. Placing the legend north or south of the
- ** graph requires the width calculation first, so the legend is
+ ** calculated first. Placing the legend north or south of the
+ ** graph requires the width calculation first, so the legend is
** skipped for the moment.
*/
im->legendheight = 0;
else{
Ymain -= Yxlabel;
}
-
+
/* reserve space for the title *or* some padding above the graph */
Ymain -= Ytitle;
}
}
}
-
+
im->yimg = Ymain + Yxlabel;
if( (im->legendposition == NORTH || im->legendposition == SOUTH) && !(im->extra_flags & NOLEGEND) ){
im->yimg += im->legendheight;
}
-
+
/* reserve space for the title *or* some padding above the graph */
if (Ytitle) {
im->yimg += Ytitle;
}
- /* In case of putting the legend in west or east position the first
- ** legend calculation might lead to wrong positions if some items
- ** are not aligned on the left hand side (e.g. centered) as the
+ /* In case of putting the legend in west or east position the first
+ ** legend calculation might lead to wrong positions if some items
+ ** are not aligned on the left hand side (e.g. centered) as the
** legendwidth wight have been increased after the item was placed.
** In this case the positions have to be recalculated.
*/
}
/* After calculating all dimensions
- ** it is now possible to calculate
+ ** it is now possible to calculate
** all offsets.
*/
switch(im->legendposition){
return -1;
/* calculate and PRINT and GPRINT definitions. We have to do it at
* this point because it will affect the length of the legends
- * if there are no graph elements (i==0) we stop here ...
- * if we are lazy, try to quit ...
+ * if there are no graph elements (i==0) we stop here ...
+ * if we are lazy, try to quit ...
*/
i = print_calc(im);
if (i < 0)
break;
case GF_LINE:
case GF_AREA:
+ case GF_GRAD:
/* fix data points at oo and -oo */
for (ii = 0; ii < im->xsize; ii++) {
if (isinf(im->gdes[i].p_data[ii])) {
} /* for */
/* *******************************************************
- a ___. (a,t)
+ a ___. (a,t)
| | ___
____| | | |
| |___|
- -------|--t-1--t--------------------------------
+ -------|--t-1--t--------------------------------
- if we know the value at time t was a then
+ if we know the value at time t was a then
we draw a square from t-1 to t with the value a.
********************************************************* */
cairo_stroke(im->cr);
cairo_restore(im->cr);
} else {
+ double lastx=0;
+ double lasty=0;
int idxI = -1;
double *foreY =
(double *) malloc(sizeof(double) * im->xsize * 2);
[cntI + 1], 4)) {
cntI++;
}
- gfx_new_area(im,
- backX[0], backY[0],
- foreX[0], foreY[0],
- foreX[cntI],
- foreY[cntI], im->gdes[i].col);
- while (cntI < idxI) {
+ if (im->gdes[i].gf != GF_GRAD) {
+ gfx_new_area(im,
+ backX[0], backY[0],
+ foreX[0], foreY[0],
+ foreX[cntI],
+ foreY[cntI], im->gdes[i].col);
+ } else {
+ lastx = foreX[cntI];
+ lasty = foreY[cntI];
+ }
+ while (cntI < idxI) {
lastI = cntI;
cntI++;
while (cntI < idxI
+ 1], 4)) {
cntI++;
}
- gfx_add_point(im, foreX[cntI], foreY[cntI]);
+ if (im->gdes[i].gf != GF_GRAD) {
+ gfx_add_point(im, foreX[cntI], foreY[cntI]);
+ } else {
+ gfx_add_rect_fadey(im,
+ lastx, foreY[0],
+ foreX[cntI], foreY[cntI], lasty,
+ im->gdes[i].col,
+ im->gdes[i].col2,
+ im->gdes[i].gradheight
+ );
+ lastx = foreX[cntI];
+ lasty = foreY[cntI];
+ }
}
- gfx_add_point(im, backX[idxI], backY[idxI]);
+ if (im->gdes[i].gf != GF_GRAD) {
+ gfx_add_point(im, backX[idxI], backY[idxI]);
+ } else {
+ gfx_add_rect_fadey(im,
+ lastx, foreY[0],
+ backX[idxI], backY[idxI], lasty,
+ im->gdes[i].col,
+ im->gdes[i].col2,
+ im->gdes[i].gradheight);
+ lastx = backX[idxI];
+ lasty = backY[idxI];
+ }
while (idxI > 1) {
lastI = idxI;
idxI--;
- 1], 4)) {
idxI--;
}
- gfx_add_point(im, backX[idxI], backY[idxI]);
+ if (im->gdes[i].gf != GF_GRAD) {
+ gfx_add_point(im, backX[idxI], backY[idxI]);
+ } else {
+ gfx_add_rect_fadey(im,
+ lastx, foreY[0],
+ backX[idxI], backY[idxI], lasty,
+ im->gdes[i].col,
+ im->gdes[i].col2,
+ im->gdes[i].gradheight);
+ lastx = backX[idxI];
+ lasty = backY[idxI];
+ }
}
idxI = -1;
drawem = 0;
- gfx_close_path(im);
+ if (im->gdes[i].gf != GF_GRAD)
+ gfx_close_path(im);
}
if (drawem != 0) {
drawem = 0;
/*****************************************************
- * graph stuff
+ * graph stuff
*****************************************************/
int gdes_alloc(
im->gdes[im->gdes_c - 1].col.green = 0.0;
im->gdes[im->gdes_c - 1].col.blue = 0.0;
im->gdes[im->gdes_c - 1].col.alpha = 0.0;
+ im->gdes[im->gdes_c - 1].col2.red = 0.0;
+ im->gdes[im->gdes_c - 1].col2.green = 0.0;
+ im->gdes[im->gdes_c - 1].col2.blue = 0.0;
+ im->gdes[im->gdes_c - 1].col2.alpha = 0.0;
+ im->gdes[im->gdes_c - 1].gradheight = 50.0;
im->gdes[im->gdes_c - 1].legend[0] = '\0';
im->gdes[im->gdes_c - 1].format[0] = '\0';
im->gdes[im->gdes_c - 1].strftm = 0;
{
image_desc_t im;
rrd_info_t *grinfo;
+ char *old_locale;
rrd_graph_init(&im);
/* a dummy surface so that we can measure text sizes for placements */
-
+ old_locale = setlocale(LC_NUMERIC, "C");
rrd_graph_options(argc, argv, &im);
if (rrd_test_error()) {
rrd_info_free(im.grinfo);
}
rrd_graph_script(argc, argv, &im, 1);
+ setlocale(LC_NUMERIC, old_locale); /* reenable locale for rendering the graph */
+
if (rrd_test_error()) {
rrd_info_free(im.grinfo);
im_free(&im);
return grinfo;
}
-static void
+static void
rrd_set_font_desc (
image_desc_t *im,int prop,char *font, double size ){
if (font){
- strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1);
- im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0';
- im->text_prop[prop].font_desc = pango_font_description_from_string( font );
+ strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1);
+ im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0';
+ im->text_prop[prop].font_desc = pango_font_description_from_string( font );
};
- if (size > 0){
+ if (size > 0){
im->text_prop[prop].size = size;
};
if (im->text_prop[prop].font_desc && im->text_prop[prop].size ){
#ifdef HAVE_TZSET
tzset();
#endif
-#ifdef HAVE_SETLOCALE
- setlocale(LC_TIME, "");
-#ifdef HAVE_MBSTOWCS
- setlocale(LC_CTYPE, "");
-#endif
-#endif
+
im->base = 1000;
im->daemon_addr = NULL;
im->draw_x_grid = 1;
im->draw_y_grid = 1;
+ im->draw_3d_border = 2;
+ im->dynamic_labels = 0;
im->extra_flags = 0;
im->font_options = cairo_font_options_create();
im->forceleftspace = 0;
im->second_axis_scale = 0; /* 0 disables it */
im->second_axis_shift = 0; /* no shift by default */
im->second_axis_legend[0] = '\0';
- im->second_axis_format[0] = '\0';
+ im->second_axis_format[0] = '\0';
im->yorigin = 0;
im->yOriginLegend = 0;
im->yOriginLegendY = 0;
im->ysize = 100;
im->zoom = 1;
- im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10);
+ im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10);
im->cr = cairo_create(im->surface);
for (i = 0; i < DIM(text_prop); i++) {
long long_tmp;
rrd_time_value_t start_tv, end_tv;
long unsigned int color;
- char *old_locale = "";
/* defines for long options without a short equivalent. should be bytes,
and may not collide with (the ASCII value of) short options */
/* *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'},
+ { "alt-autoscale", no_argument, 0, 'A'},
+ { "imgformat", required_argument, 0, 'a'},
+ { "font-smoothing-threshold", required_argument, 0, 'B'},
{ "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'},
+ { "full-size-mode", no_argument, 0, 'D'},
+ { "daemon", required_argument, 0, 'd'},
+ { "slope-mode", no_argument, 0, 'E'},
+ { "end", required_argument, 0, 'e'},
+ { "force-rules-legend", no_argument, 0, 'F'},
{ "imginfo", required_argument, 0, 'f'},
- { "imgformat", required_argument, 0, 'a'},
- { "lazy", no_argument, 0, 'z'},
- { "zoom", required_argument, 0, 'm'},
+ { "graph-render-mode", required_argument, 0, 'G'},
{ "no-legend", no_argument, 0, 'g'},
- { "legend-position", required_argument, 0, 1005},
- { "legend-direction", required_argument, 0, 1006},
- { "force-rules-legend", no_argument, 0, 'F'},
- { "only-graph", no_argument, 0, 'j'},
- { "alt-y-grid", no_argument, 0, 'Y'},
- {"disable-rrdtool-tag", no_argument, 0, 1001},
- {"right-axis", required_argument, 0, 1002},
- {"right-axis-label", required_argument, 0, 1003},
- {"right-axis-format", required_argument, 0, 1004},
- { "no-minor", no_argument, 0, 'I'},
- { "slope-mode", no_argument, 0, 'E'},
- { "alt-autoscale", no_argument, 0, 'A'},
+ { "height", required_argument, 0, 'h'},
+ { "no-minor", no_argument, 0, 'I'},
+ { "interlaced", no_argument, 0, 'i'},
{ "alt-autoscale-min", no_argument, 0, 'J'},
+ { "only-graph", no_argument, 0, 'j'},
+ { "units-length", required_argument, 0, 'L'},
+ { "lower-limit", required_argument, 0, 'l'},
{ "alt-autoscale-max", no_argument, 0, 'M'},
+ { "zoom", required_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},
+ { "font", required_argument, 0, 'n'},
+ { "logarithmic", no_argument, 0, 'o'},
+ { "pango-markup", no_argument, 0, 'P'},
+ { "font-render-mode", required_argument, 0, 'R'},
+ { "rigid", no_argument, 0, 'r'},
{ "step", required_argument, 0, 'S'},
+ { "start", 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'},
+ { "title", required_argument, 0, 't'},
+ { "upper-limit", required_argument, 0, 'u'},
+ { "vertical-label", required_argument, 0, 'v'},
{ "watermark", required_argument, 0, 'W'},
+ { "width", required_argument, 0, 'w'},
+ { "units-exponent", required_argument, 0, 'X'},
+ { "x-grid", required_argument, 0, 'x'},
+ { "alt-y-grid", no_argument, 0, 'Y'},
+ { "y-grid", required_argument, 0, 'y'},
+ { "lazy", no_argument, 0, 'z'},
+ { "units", required_argument, 0, LONGOPT_UNITS_SI},
{ "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'},
- { "daemon", required_argument, 0, 'd'},
+ { "disable-rrdtool-tag",no_argument, 0, 1001},
+ { "right-axis", required_argument, 0, 1002},
+ { "right-axis-label", required_argument, 0, 1003},
+ { "right-axis-format", required_argument, 0, 1004},
+ { "legend-position", required_argument, 0, 1005},
+ { "legend-direction", required_argument, 0, 1006},
+ { "border", required_argument, 0, 1007},
+ { "grid-dash", required_argument, 0, 1008},
+ { "dynamic-labels", no_argument, 0, 1009},
{ 0, 0, 0, 0}
};
/* *INDENT-ON* */
int col_start, col_end;
opt = getopt_long(argc, argv,
- "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kPd:",
+ "Aa:B:b:c:Dd:Ee:Ff:G:gh:IiJjL:l:Mm:Nn:oPR:rS:s:T:t:u:v:W:w:X:x:Yy:z",
long_options, &option_index);
if (opt == EOF)
break;
break;
case 1001:
im->extra_flags |= NO_RRDTOOL_TAG;
- break;
+ break;
case LONGOPT_UNITS_SI:
if (im->extra_flags & FORCE_UNITS) {
rrd_set_error("--units can only be used once!");
- setlocale(LC_NUMERIC, old_locale);
return;
}
if (strcmp(optarg, "si") == 0)
im->forceleftspace = 1;
break;
case 'T':
- old_locale = setlocale(LC_NUMERIC, "C");
im->tabwidth = atof(optarg);
- setlocale(LC_NUMERIC, old_locale);
break;
case 'S':
- old_locale = setlocale(LC_NUMERIC, "C");
im->step = atoi(optarg);
- setlocale(LC_NUMERIC, old_locale);
break;
case 'N':
im->gridfit = 0;
im->draw_y_grid = 0;
break;
};
- old_locale = setlocale(LC_NUMERIC, "C");
if (sscanf(optarg, "%lf:%d", &im->ygridstep, &im->ylabfact) == 2) {
- setlocale(LC_NUMERIC, old_locale);
if (im->ygridstep <= 0) {
rrd_set_error("grid step must be > 0");
return;
return;
}
} else {
- setlocale(LC_NUMERIC, old_locale);
rrd_set_error("invalid y-grid format");
return;
}
break;
+ case 1007:
+ im->draw_3d_border = atoi(optarg);
+ break;
+ case 1008: /* grid-dash */
+ if(sscanf(optarg,
+ "%lf:%lf",
+ &im->grid_dash_on,
+ &im->grid_dash_off) != 2) {
+ rrd_set_error("expected grid-dash format float:float");
+ return;
+ }
+ break;
+ case 1009: /* enable dynamic labels */
+ im->dynamic_labels = 1;
+ break;
case 1002: /* right y axis */
if(sscanf(optarg,
im->ylegend[150] = '\0';
break;
case 'u':
- old_locale = setlocale(LC_NUMERIC, "C");
im->maxval = atof(optarg);
- setlocale(LC_NUMERIC, old_locale);
break;
case 'l':
- old_locale = setlocale(LC_NUMERIC, "C");
im->minval = atof(optarg);
- setlocale(LC_NUMERIC, old_locale);
break;
case 'b':
im->base = atol(optarg);
double size = 1;
int end;
- old_locale = setlocale(LC_NUMERIC, "C");
if (sscanf(optarg, "%10[A-Z]:%lf%n", prop, &size, &end) >= 2) {
int sindex, propidx;
- setlocale(LC_NUMERIC, old_locale);
if ((sindex = text_prop_conv(prop)) != -1) {
for (propidx = sindex;
propidx < TEXT_PROP_LAST; propidx++) {
if (size > 0) {
- rrd_set_font_desc(im,propidx,NULL,size);
+ rrd_set_font_desc(im,propidx,NULL,size);
}
if ((int) strlen(optarg) > end+2) {
if (optarg[end] == ':') {
- rrd_set_font_desc(im,propidx,optarg + end + 1,0);
+ rrd_set_font_desc(im,propidx,optarg + end + 1,0);
} else {
rrd_set_error
("expected : after font size in '%s'",
return;
}
} else {
- setlocale(LC_NUMERIC, old_locale);
rrd_set_error("invalid text property format");
return;
}
break;
}
case 'm':
- old_locale = setlocale(LC_NUMERIC, "C");
im->zoom = atof(optarg);
- setlocale(LC_NUMERIC, old_locale);
if (im->zoom <= 0.0) {
rrd_set_error("zoom factor must be > 0");
return;
int status = rrdc_connect(im->daemon_addr);
if (status != 0) return;
}
-
+
pango_cairo_context_set_font_options(pango_layout_get_context(im->layout), im->font_options);
pango_layout_context_changed(im->layout);
double param;
char func[30];
int n;
- char *old_locale;
n = 0;
- old_locale = setlocale(LC_NUMERIC, "C");
sscanf(str, "%le,%29[A-Z]%n", ¶m, func, &n);
- setlocale(LC_NUMERIC, old_locale);
if (n == (int) strlen(str)) { /* matched */
;
} else {