X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.c;h=0279d49d524cbee22831a1546e6528b5195e8fea;hp=2069660ea58e38b0015b25f3cc4f444406bdd78f;hb=99b9b7fd0cad0edea57c08fdf939d368c4c0ec45;hpb=23d1c29c5b06a786817613f266e04887af4945c4 diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 2069660..0279d49 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.x Copyright Tobias Oetiker, 1997 - 2005 + * RRDtool 1.2rc2 Copyright by Tobi Oetiker, 1997-2005 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -37,11 +37,11 @@ char rrd_win_default_font[80]; #endif text_prop_t text_prop[] = { - { 10.0, RRD_DEFAULT_FONT }, /* default */ - { 10.0, RRD_DEFAULT_FONT }, /* title */ - { 8.0, RRD_DEFAULT_FONT }, /* axis */ - { 10.0, RRD_DEFAULT_FONT }, /* unit */ - { 10.0, RRD_DEFAULT_FONT } /* legend */ + { 9.0, RRD_DEFAULT_FONT }, /* default */ + { 11.0, RRD_DEFAULT_FONT }, /* title */ + { 8.0, RRD_DEFAULT_FONT }, /* axis */ + { 9.0, RRD_DEFAULT_FONT }, /* unit */ + { 9.0, RRD_DEFAULT_FONT } /* legend */ }; xlab_t xlab[] = { @@ -183,7 +183,9 @@ enum gf_en gf_conv(char *string){ conv_if(DEF,GF_DEF) conv_if(CDEF,GF_CDEF) conv_if(VDEF,GF_VDEF) +#ifdef WITH_PIECHART conv_if(PART,GF_PART) +#endif conv_if(XPORT,GF_XPORT) conv_if(SHIFT,GF_SHIFT) @@ -1319,7 +1321,7 @@ print_calc(image_desc_t *im, char ***prdata) (*prdata)[prlines-2] = malloc((FMT_LEG_LEN+2)*sizeof(char)); (*prdata)[prlines-1] = NULL; if (bad_format(im->gdes[i].format)) { - rrd_set_error("bad format for [G]PRINT in '%s'", im->gdes[i].format); + rrd_set_error("bad format for PRINT in '%s'", im->gdes[i].format); return -1; } #ifdef HAVE_SNPRINTF @@ -1331,7 +1333,7 @@ print_calc(image_desc_t *im, char ***prdata) /* GF_GPRINT */ if (bad_format(im->gdes[i].format)) { - rrd_set_error("bad format for [G]PRINT in '%s'", im->gdes[i].format); + rrd_set_error("bad format for GPRINT in '%s'", im->gdes[i].format); return -1; } #ifdef HAVE_SNPRINTF @@ -1355,7 +1357,9 @@ print_calc(image_desc_t *im, char ***prdata) case GF_DEF: case GF_CDEF: case GF_VDEF: +#ifdef WITH_PIECHART case GF_PART: +#endif case GF_SHIFT: case GF_XPORT: break; @@ -1471,7 +1475,7 @@ leg_place(image_desc_t *im) for(ii=mark;ii<=i;ii++){ if(im->gdes[ii].legend[0]=='\0') - continue; + continue; /* skip empty legends */ im->gdes[ii].leg_x = leg_x; im->gdes[ii].leg_y = leg_y; leg_x += @@ -1801,15 +1805,15 @@ vertical_grid( } /* paint the labels below the graph */ - for(ti = find_first_time(im->start, + for(ti = find_first_time(im->start - im->xlab_user.precis/2, im->xlab_user.labtm, im->xlab_user.labst); - ti <= im->end; + ti <= im->end - im->xlab_user.precis/2; ti = find_next_time(ti,im->xlab_user.labtm,im->xlab_user.labst) ){ tilab= ti + im->xlab_user.precis/2; /* correct time for the label */ /* are we inside the graph ? */ - if (ti < im->start || ti > im->end) continue; + if (tilab < im->start || tilab > im->end) continue; #if HAVE_STRFTIME localtime_r(&tilab, &tm); @@ -1911,19 +1915,19 @@ grid_paint(image_desc_t *im) } } - /* yaxis description */ + /* yaxis unit description */ 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, + im->text_prop[TEXT_PROP_UNIT].font, + im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth, RRDGRAPH_YLEGEND_ANGLE, GFX_H_LEFT, GFX_V_CENTER, im->ylegend); /* graph title */ gfx_new_text( im->canvas, - im->ximg/2, im->text_prop[TEXT_PROP_TITLE].size, + im->ximg/2, im->text_prop[TEXT_PROP_TITLE].size*1.2, im->graph_col[GRC_FONT], im->text_prop[TEXT_PROP_TITLE].font, im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0, @@ -1947,16 +1951,25 @@ grid_paint(image_desc_t *im) im->gdes[i].legend ); /* The legend for GRAPH items starts with "M " to have enough space for the box */ - if ( im->gdes[i].gf != GF_GPRINT - && im->gdes[i].gf != GF_COMMENT) { + if ( im->gdes[i].gf != GF_PRINT && + im->gdes[i].gf != GF_GPRINT && + im->gdes[i].gf != GF_COMMENT) { int boxH, boxV; boxH = gfx_get_text_width(im->canvas, 0, im->text_prop[TEXT_PROP_LEGEND].font, im->text_prop[TEXT_PROP_LEGEND].size, - im->tabwidth,"M", 0); + im->tabwidth,"M", 0)*1.2; boxV = boxH; + /* make sure transparent colors show up all the same */ + node = gfx_new_area(im->canvas, + X0,Y0-boxV, + X0,Y0, + X0+boxH,Y0, + im->graph_col[GRC_CANVAS]); + gfx_add_point ( node, X0+boxH, Y0-boxV ); + node = gfx_new_area(im->canvas, X0,Y0-boxV, X0,Y0, @@ -1965,7 +1978,7 @@ grid_paint(image_desc_t *im) gfx_add_point ( node, X0+boxH, Y0-boxV ); node = gfx_new_line(im->canvas, X0,Y0-boxV, X0,Y0, - 1,0x000000FF); + 1,im->graph_col[GRC_FONT]); gfx_add_point(node,X0+boxH,Y0); gfx_add_point(node,X0+boxH,Y0-boxV); gfx_close_path(node); @@ -2005,6 +2018,7 @@ int lazy_check(image_desc_t *im){ return size; } +#ifdef WITH_PIECHART void pie_part(image_desc_t *im, gfx_color_t color, double PieCenterX, double PieCenterY, double Radius, @@ -2051,8 +2065,16 @@ pie_part(image_desc_t *im, gfx_color_t color, } } +#endif + int -graph_size_location(image_desc_t *im, int elements, int piechart ) +graph_size_location(image_desc_t *im, int elements + +#ifdef WITH_PIECHART +, int piechart +#endif + + ) { /* The actual size of the image to draw is determined from ** several sources. The size given on the command line is @@ -2090,8 +2112,11 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) 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); + Xvertical = im->text_prop[TEXT_PROP_UNIT].size *2; + Yvertical = gfx_get_text_width(im->canvas, 0, + im->text_prop[TEXT_PROP_UNIT].font, + im->text_prop[TEXT_PROP_UNIT].size, + im->tabwidth,im->ylegend, 0); } } @@ -2105,7 +2130,7 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, im->title, 0) + 2*Xspacing; - Ytitle = im->text_prop[TEXT_PROP_TITLE].size*2; + Ytitle = im->text_prop[TEXT_PROP_TITLE].size*2.5; } if (elements) { @@ -2113,19 +2138,21 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) Ymain=im->ysize; if (im->draw_x_grid) { Xxlabel=Xmain; - Yxlabel=im->text_prop[TEXT_PROP_LEGEND].size *2; + Yxlabel=im->text_prop[TEXT_PROP_AXIS].size *2.5; } if (im->draw_y_grid) { - Xylabel=im->text_prop[TEXT_PROP_LEGEND].size *6; + Xylabel=im->text_prop[TEXT_PROP_AXIS].size *6; Yylabel=Ymain; } } +#ifdef WITH_PIECHART if (piechart) { im->piesize=im->xsizeysize?im->xsize:im->ysize; Xpie=im->piesize; Ypie=im->piesize; } +#endif /* Now calculate the total size. Insert some spacing where desired. im->xorigin and im->yorigin need to correspond @@ -2213,6 +2240,7 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) } #endif +#ifdef WITH_PIECHART /* The pie is placed in the upper right hand corner, ** just below the title (if any) and with sufficient ** padding. @@ -2224,6 +2252,7 @@ graph_size_location(image_desc_t *im, int elements, int piechart ) im->pie_x = im->ximg/2; im->pie_y = im->yorigin-Ypie/2; } +#endif return 0; } @@ -2234,8 +2263,10 @@ graph_paint(image_desc_t *im, char ***calcpr) { int i,ii; int lazy = lazy_check(im); +#ifdef WITH_PIECHART int piechart = 0; double PieStart=0.0; +#endif FILE *fo; gfx_node_t *node; @@ -2254,7 +2285,8 @@ graph_paint(image_desc_t *im, char ***calcpr) /* evaluate VDEF and CDEF operations ... */ if(data_calc(im)==-1) return -1; - + +#ifdef WITH_PIECHART /* check if we need to draw a piechart */ for(i=0;igdes_c;i++){ if (im->gdes[i].gf == GF_PART) { @@ -2262,6 +2294,7 @@ graph_paint(image_desc_t *im, char ***calcpr) break; } } +#endif /* calculate and PRINT and GPRINT definitions. We have to do it at * this point because it will affect the length of the legends @@ -2270,10 +2303,16 @@ graph_paint(image_desc_t *im, char ***calcpr) */ i=print_calc(im,calcpr); if(i<0) return -1; - if(((i==0)&&(piechart==0)) || lazy) return 0; + if(((i==0) +#ifdef WITH_PIECHART +&&(piechart==0) +#endif +) || lazy) return 0; +#ifdef WITH_PIECHART /* If there's only the pie chart to draw, signal this */ if (i==0) piechart=2; +#endif /* get actual drawing data and find min and max values*/ if(data_proc(im)==-1) @@ -2296,7 +2335,11 @@ graph_paint(image_desc_t *im, char ***calcpr) *** Calculating sizes and locations became a bit confusing *** *** so I moved this into a separate function. *** **************************************************************/ - if(graph_size_location(im,i,piechart)==-1) + if(graph_size_location(im,i +#ifdef WITH_PIECHART +,piechart +#endif +)==-1) return -1; /* the actual graph is created by going through the individual @@ -2310,7 +2353,9 @@ graph_paint(image_desc_t *im, char ***calcpr) gfx_add_point(node,0, im->yimg); +#ifdef WITH_PIECHART if (piechart != 2) { +#endif node=gfx_new_area ( im->canvas, im->xorigin, im->yorigin, im->xorigin + im->xsize, im->yorigin, @@ -2323,11 +2368,15 @@ graph_paint(image_desc_t *im, char ***calcpr) areazero = im->minval; if (im->maxval < 0.0) areazero = im->maxval; - } +#ifdef WITH_PIECHART + } +#endif +#ifdef WITH_PIECHART if (piechart) { pie_part(im,im->graph_col[GRC_CANVAS],im->pie_x,im->pie_y,im->piesize*0.5,0,2*M_PI); } +#endif for(i=0;igdes_c;i++){ switch(im->gdes[i].gf){ @@ -2456,6 +2505,7 @@ graph_paint(image_desc_t *im, char ***calcpr) } lastgdes = &(im->gdes[i]); break; +#ifdef WITH_PIECHART case GF_PART: if(isnan(im->gdes[i].yrule)) /* fetch variable */ im->gdes[i].yrule = im->gdes[im->gdes[i].vidx].vf.val; @@ -2468,12 +2518,16 @@ graph_paint(image_desc_t *im, char ***calcpr) PieStart += im->gdes[i].yrule; } break; +#endif + } /* switch */ } +#ifdef WITH_PIECHART if (piechart==2) { im->draw_x_grid=0; im->draw_y_grid=0; } +#endif if( !(im->extra_flags & ONLY_GRAPH) ) axis_paint(im); @@ -2563,6 +2617,7 @@ gdes_alloc(image_desc_t *im){ im->gdes[im->gdes_c-1].shift=0; im->gdes[im->gdes_c-1].col = 0x0; im->gdes[im->gdes_c-1].legend[0]='\0'; + im->gdes[im->gdes_c-1].format[0]='\0'; im->gdes[im->gdes_c-1].rrd[0]='\0'; im->gdes[im->gdes_c-1].ds=-1; im->gdes[im->gdes_c-1].p_data=NULL; @@ -2723,13 +2778,13 @@ rrd_graph_init(image_desc_t *im) strcpy(rrd_win_default_font,windir); strcat(rrd_win_default_font,"\\fonts\\cour.ttf"); for(i=0;itext_prop[i].size = text_prop[i].size; - im->text_prop[i].font = text_prop[i].font; + strcpy(im->text_prop[i].font,text_prop[i].font); } } @@ -2968,35 +3023,26 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) } break; case 'n':{ - /* originally this used char *prop = "" and - ** char *font = "dummy" however this results - ** in a SEG fault, at least on RH7.1 - ** - ** The current implementation isn't proper - ** either, font is never freed and prop uses - ** a fixed width string - */ - char prop[100]; + char prop[15]; double size = 1; - char *font; + char font[1024]; - font=malloc(255); if(sscanf(optarg, - "%10[A-Z]:%lf:%s", + "%10[A-Z]:%lf:%1000s", prop,&size,font) == 3){ int sindex; if((sindex=text_prop_conv(prop)) != -1){ im->text_prop[sindex].size=size; - im->text_prop[sindex].font=font; + strcpy(im->text_prop[sindex].font,font); if (sindex==0) { /* the default */ im->text_prop[TEXT_PROP_TITLE].size=size; - im->text_prop[TEXT_PROP_TITLE].font=font; + strcpy(im->text_prop[TEXT_PROP_TITLE].font,font); im->text_prop[TEXT_PROP_AXIS].size=size; - im->text_prop[TEXT_PROP_AXIS].font=font; + strcpy(im->text_prop[TEXT_PROP_AXIS].font,font); im->text_prop[TEXT_PROP_UNIT].size=size; - im->text_prop[TEXT_PROP_UNIT].font=font; + strcpy(im->text_prop[TEXT_PROP_UNIT].font,font); im->text_prop[TEXT_PROP_LEGEND].size=size; - im->text_prop[TEXT_PROP_LEGEND].font=font; + strcpy(im->text_prop[TEXT_PROP_LEGEND].font,font); } } else { rrd_set_error("invalid fonttag '%s'",prop); @@ -3110,15 +3156,6 @@ rrd_graph_color(image_desc_t *im, char *var, char *err, int optional) return n; } } -int -rrd_graph_legend(graph_desc_t *gdp, char *line) -{ - int i; - - i=scan_for_col(line,FMT_LEG_LEN,gdp->legend); - - return (strlen(&line[i])==0); -} int bad_format(char *fmt) {