index 451e891490f8fddd3a5f399818113a3db99b4b9b..36c80548dee3308e4c077d895594a06aad45be77 100644 (file)
--- a/program/src/rrd_graph.c
+++ b/program/src/rrd_graph.c
/* some constant definitions */
/* some constant definitions */
-#ifndef RRD_DEFAULT_FONT
#ifdef WIN32
#ifdef WIN32
-#define RRD_DEFAULT_FONT "c:/winnt/fonts/COUR.TTF"
-#else
-#define RRD_DEFAULT_FONT "/usr/share/fonts/truetype/openoffice/ariosor.ttf"
+char rrd_win_default_font[80];
+#endif
+
+#ifndef RRD_DEFAULT_FONT
+#ifndef WIN32
+#define RRD_DEFAULT_FONT "VeraMono.ttf"
+/* #define RRD_DEFAULT_FONT "/usr/share/fonts/truetype/openoffice/ariosor.ttf" */
/* #define RRD_DEFAULT_FONT "/usr/share/fonts/truetype/Arial.ttf" */
#endif
#endif
/* #define RRD_DEFAULT_FONT "/usr/share/fonts/truetype/Arial.ttf" */
#endif
#endif
-
text_prop_t text_prop[] = {
{ 10.0, RRD_DEFAULT_FONT }, /* default */
{ 12.0, RRD_DEFAULT_FONT }, /* title */
text_prop_t text_prop[] = {
{ 10.0, RRD_DEFAULT_FONT }, /* default */
{ 12.0, RRD_DEFAULT_FONT }, /* title */
else
im->maxval = maxval;
}
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;
/* make sure min and max are not equal */
if (im->minval == im->maxval) {
im->maxval *= 1.01;
char prt_fctn; /*special printfunctions */
int *legspace;
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;
if ((legspace = malloc(im->gdes_c*sizeof(int)))==NULL){
rrd_set_error("malloc for legspace");
return -1;
for(i=0;i<im->gdes_c;i++){
fill_last = fill;
for(i=0;i<im->gdes_c;i++){
fill_last = fill;
+
+ /* hid legends for rules which are not displayed */
+
+ if (im->gdes[i].gf == GF_HRULE &&
+ (im->gdes[i].yrule < im->minval || im->gdes[i].yrule > im->maxval))
+ im->gdes[i].legend[0] = '\0';
+
+ if (im->gdes[i].gf == GF_VRULE &&
+ (im->gdes[i].xrule < im->start || im->gdes[i].xrule > im->end))
+ im->gdes[i].legend[0] = '\0';
leg_cc = strlen(im->gdes[i].legend);
leg_cc = strlen(im->gdes[i].legend);
im->text_prop[TEXT_PROP_LEGEND].font,
im->text_prop[TEXT_PROP_LEGEND].size,
im->tabwidth,
im->text_prop[TEXT_PROP_LEGEND].font,
im->text_prop[TEXT_PROP_LEGEND].size,
im->tabwidth,
- im->gdes[i].legend);
+ im->gdes[i].legend, 0);
leg_c++;
} else {
legspace[i]=0;
leg_c++;
} else {
legspace[i]=0;
im->text_prop[TEXT_PROP_LEGEND].font,
im->text_prop[TEXT_PROP_LEGEND].size,
im->tabwidth,
im->text_prop[TEXT_PROP_LEGEND].font,
im->text_prop[TEXT_PROP_LEGEND].size,
im->tabwidth,
- im->gdes[ii].legend)
+ im->gdes[ii].legend, 0)
+ legspace[ii]
+ glue;
if (im->gdes[ii].gf != GF_GPRINT &&
+ legspace[ii]
+ glue;
if (im->gdes[ii].gf != GF_GPRINT &&
}
/* yaxis description */
}
/* yaxis description */
- if (im->canvas->imgformat != IF_PNG) {
+/* if (im->canvas->imgformat != IF_PNG) {*/
+ if (1) {
gfx_new_text( im->canvas,
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,
gfx_new_text( im->canvas,
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,
- GFX_H_CENTER, GFX_V_CENTER,
+ GFX_H_LEFT, GFX_V_CENTER,
im->ylegend);
} else {
/* horrible hack until we can actually print vertically */
im->ylegend);
} else {
/* horrible hack until we can actually print vertically */
for (n=0;n<strlen(im->ylegend);n++) {
s[0]=im->ylegend[n];
s[1]='\0';
for (n=0;n<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*(l-n),
+ gfx_new_text(im->canvas,7,im->text_prop[TEXT_PROP_AXIS].size*(n+1),
im->graph_col[GRC_FONT],
im->text_prop[TEXT_PROP_AXIS].font,
im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 270.0,
im->graph_col[GRC_FONT],
im->text_prop[TEXT_PROP_AXIS].font,
im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 270.0,
im->title);
/* graph labels */
im->title);
/* graph labels */
- if( !(im->extra_flags & NOLEGEND) ) {
+ 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;
for(i=0;i<im->gdes_c;i++){
if(im->gdes[i].legend[0] =='\0')
continue;
boxH = gfx_get_text_width(im->canvas, 0,
im->text_prop[TEXT_PROP_AXIS].font,
im->text_prop[TEXT_PROP_AXIS].size,
boxH = gfx_get_text_width(im->canvas, 0,
im->text_prop[TEXT_PROP_AXIS].font,
im->text_prop[TEXT_PROP_AXIS].size,
- im->tabwidth,"M") * 1.25;
+ im->tabwidth,"M", 0) * 1.25;
boxV = boxH;
node = gfx_new_area(im->canvas,
boxV = boxH;
node = gfx_new_area(im->canvas,
#if 0
Xlegend =0, Ylegend =0,
#endif
#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') {
}
if (im->title[0] != '\0') {
im->text_prop[TEXT_PROP_TITLE].font,
im->text_prop[TEXT_PROP_TITLE].size,
im->tabwidth,
im->text_prop[TEXT_PROP_TITLE].font,
im->text_prop[TEXT_PROP_TITLE].size,
im->tabwidth,
- im->title) + 2*Xspacing;
+ im->title, 0) + 2*Xspacing;
Ytitle = im->text_prop[TEXT_PROP_TITLE].size*2;
}
Ytitle = im->text_prop[TEXT_PROP_TITLE].size*2;
}
** forget about it at all; the legend will have to fit in the
** size already allocated.
*/
** 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;
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;
if (Xtitle > im->ximg) im->ximg = Xtitle;
if (Xvertical) {
im->ximg += Xvertical;
*/
/* reserve space for main and/or pie */
*/
/* 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;
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;
/* reserve space for the title *or* some padding above the graph */
if (Ytitle) {
im->yimg += Ytitle;
if (!calc_horizontal_grid(im))
return -1;
if (!calc_horizontal_grid(im))
return -1;
+
if (im->gridfit)
apply_gridfit(im);
if (im->gridfit)
apply_gridfit(im);
+
/**************************************************************
*** Calculating sizes and locations became a bit confusing ***
*** so I moved this into a separate function. ***
/**************************************************************
*** Calculating sizes and locations became a bit confusing ***
*** so I moved this into a separate function. ***
areazero = im->minval;
if (im->maxval < 0.0)
areazero = im->maxval;
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) {
}
if (piechart) {
im->draw_y_grid=0;
}
/* grid_paint also does the text */
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;i<im->gdes_c;i++){
/* the RULES are the last thing to paint ... */
for(i=0;i<im->gdes_c;i++){
if (strcmp(im->graphfile,"-")==0) {
if (strcmp(im->graphfile,"-")==0) {
+ fo = im->graphhandle ? im->graphhandle : stdout;
#ifdef WIN32
/* Change translation mode for stdout to BINARY */
#ifdef WIN32
/* Change translation mode for stdout to BINARY */
- _setmode( _fileno( stdout ), O_BINARY );
+ _setmode( _fileno( fo ), O_BINARY );
#endif
#endif
- fo = stdout;
} else {
if ((fo = fopen(im->graphfile,"wb")) == NULL) {
rrd_set_error("Opening '%s' for write: %s",im->graphfile,
} else {
if ((fo = fopen(im->graphfile,"wb")) == NULL) {
rrd_set_error("Opening '%s' for write: %s",im->graphfile,
** - script parsing now in rrd_graph_script()
*/
int
** - script parsing now in rrd_graph_script()
*/
int
-rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize)
+rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize, FILE *stream)
{
image_desc_t im;
rrd_graph_init(&im);
{
image_desc_t im;
rrd_graph_init(&im);
-
+ im.graphhandle = stream;
+
rrd_graph_options(argc,argv,&im);
if (rrd_test_error()) {
im_free(&im);
rrd_graph_options(argc,argv,&im);
if (rrd_test_error()) {
im_free(&im);
for(i=0;i<DIM(graph_col);i++)
im->graph_col[i]=graph_col[i];
for(i=0;i<DIM(graph_col);i++)
im->graph_col[i]=graph_col[i];
-
+#ifdef WIN32
+ {
+ char *windir;
+ windir = getenv("windir");
+ /* %windir% is something like D:\windows or C:\winnt */
+ if (windir != NULL) {
+ strcpy(rrd_win_default_font,windir);
+ strcat(rrd_win_default_font,"\\fonts\\cour.ttf");
+ for(i=0;i<DIM(text_prop);i++)
+ text_prop[i].font = rrd_win_default_font;
+ }
+ }
+#endif
for(i=0;i<DIM(text_prop);i++){
im->text_prop[i].size = text_prop[i].size;
im->text_prop[i].font = text_prop[i].font;
for(i=0;i<DIM(text_prop);i++){
im->text_prop[i].size = text_prop[i].size;
im->text_prop[i].font = text_prop[i].font;
char scan_gtm[12],scan_mtm[12],scan_ltm[12],col_nam[12];
time_t start_tmp=0,end_tmp=0;
long long_tmp;
char scan_gtm[12],scan_mtm[12],scan_ltm[12],col_nam[12];
time_t start_tmp=0,end_tmp=0;
long long_tmp;
- struct time_value start_tv, end_tv;
+ struct rrd_time_value start_tv, end_tv;
gfx_color_t color;
parsetime("end-24h", &start_tv);
gfx_color_t color;
parsetime("end-24h", &start_tv);
{"lazy", no_argument, 0, 'z'},
{"zoom", required_argument, 0, 'm'},
{"no-legend", no_argument, 0, 'g'},
{"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'},
{"alt-y-grid", no_argument, 0, 'Y'},
{"no-minor", no_argument, 0, 'I'},
{"alt-autoscale", no_argument, 0, 'A'},
opt = getopt_long(argc, argv,
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)
long_options, &option_index);
if (opt == EOF)
case 'M':
im->extra_flags |= ALTAUTOSCALE_MAX;
break;
case 'M':
im->extra_flags |= ALTAUTOSCALE_MAX;
break;
+ case 'j':
+ im->extra_flags |= ONLY_GRAPH;
+ break;
case 'g':
im->extra_flags |= NOLEGEND;
break;
case 'g':
im->extra_flags |= NOLEGEND;
break;