X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=c7ba63e62d9493c214a2a06fdb93216ad8a50127;hb=b7ba62419191213693d0b47c441d65d3ef88a685;hp=c283a31bd289a411b0599d90bebc2142dcaa48e9;hpb=c0cb62da4ec2b5c7b3aef09adacb7f0a3189df28;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index c283a31..c7ba63e 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.0.33 Copyright Tobias Oetiker, 1997 - 2000 + * RRDtool 1.1.x Copyright Tobias Oetiker, 1997 - 2002 **************************************************************************** * rrd__graph.c make creates ne rrds ****************************************************************************/ @@ -174,6 +174,7 @@ enum gf_en gf_conv(char *string){ conv_if(DEF,GF_DEF) conv_if(CDEF,GF_CDEF) conv_if(VDEF,GF_VDEF) + conv_if(PART,GF_PART) return (-1); } @@ -803,7 +804,7 @@ printf("DEBUG: value from vdef is %f\n",im->gdes[ptr].vf.val); * further save step size and data source * count of this rra */ - im->gdes[gdi].rpnp[rpi].data = im->gdes[ptr].data; + im->gdes[gdi].rpnp[rpi].data = im->gdes[ptr].data + im->gdes[ptr].ds; im->gdes[gdi].rpnp[rpi].step = im->gdes[ptr].step; im->gdes[gdi].rpnp[rpi].ds_cnt = im->gdes[ptr].ds_cnt; @@ -937,6 +938,7 @@ data_proc( image_desc_t *im ){ case GF_DEF: case GF_CDEF: case GF_VDEF: + case GF_PART: break; } } @@ -1209,6 +1211,7 @@ print_calc(image_desc_t *im, char ***prdata) case GF_LINE: case GF_AREA: case GF_TICK: + case GF_PART: case GF_STACK: case GF_HRULE: case GF_VRULE: @@ -1328,7 +1331,7 @@ leg_place(image_desc_t *im) gfx_get_text_width(leg_x,im->text_prop[TEXT_PROP_LEGEND].font, im->text_prop[TEXT_PROP_LEGEND].size, im->tabwidth, - im->gdes[i].legend) + im->gdes[ii].legend) + legspace[ii] + glue; if (im->gdes[ii].gf != GF_GPRINT && @@ -1848,6 +1851,8 @@ graph_paint(image_desc_t *im, char ***calcpr) { int i,ii; int lazy = lazy_check(im); + int piechart = 0, PieSize, PieCenterX, PieCenterY; + double PieStart=0.0; FILE *fo; gfx_canvas_t *canvas; gfx_node_t *node; @@ -1904,8 +1909,30 @@ graph_paint(image_desc_t *im, char ***calcpr) if(im->title[0] != '\0') im->yorigin += im->text_prop[TEXT_PROP_TITLE].size*3+4; - im->xgif=20+im->xsize + im->xorigin; + im->xgif= 20 +im->xsize + im->xorigin; im->ygif= im->yorigin+2* im->text_prop[TEXT_PROP_LEGEND].size; + + /* check if we need to draw a piechart */ + for(i=0;igdes_c;i++){ + if (im->gdes[i].gf == GF_PART) { + piechart=1; + break; + } + } + + if (piechart) { + /* allocate enough space for the piechart itself (PieSize), 20% + ** more for the background and an additional 50 pixels spacing. + */ + if (im->xsize < im->ysize) + PieSize = im->xsize; + else + PieSize = im->ysize; + im->xgif += PieSize*1.2 + 50; + + PieCenterX = im->xorigin + im->xsize + 50 + PieSize*0.6; + PieCenterY = im->yorigin - PieSize*0.5; + } /* determine where to place the legends onto the graphics. and set im->ygif to match space requirements for text */ @@ -1933,7 +1960,24 @@ graph_paint(image_desc_t *im, char ***calcpr) gfx_add_point(node,im->xorigin, im->yorigin - im->ysize); - + if (piechart) { +#if 1 + node=gfx_arc_sect (canvas, + PieCenterX,PieCenterY, + PieSize*0.6, PieSize*0.6, /* 20% more as background */ + 0,M_PI*2, + im->graph_col[GRC_CANVAS]); +#else + node=gfx_new_area ( canvas, + PieCenterX-0.6*PieSize, PieCenterY-0.6*PieSize, + PieCenterX+0.6*PieSize, PieCenterY-0.6*PieSize, + PieCenterX+0.6*PieSize, PieCenterY+0.6*PieSize, + im->graph_col[GRC_CANVAS]); + gfx_add_point(node, + PieCenterX-0.6*PieSize, PieCenterY+0.6*PieSize); +#endif + } + if (im->minval > 0.0) areazero = im->minval; if (im->maxval < 0.0) @@ -1942,7 +1986,7 @@ graph_paint(image_desc_t *im, char ***calcpr) axis_paint(im,canvas); - for(i=0;igdes_c;i++){ + for(i=0;igdes_c;i++){ switch(im->gdes[i].gf){ case GF_CDEF: case GF_VDEF: @@ -2061,6 +2105,20 @@ graph_paint(image_desc_t *im, char ***calcpr) } lastgdes = &(im->gdes[i]); break; + case GF_PART: + if(isnan(im->gdes[i].yrule)) /* fetch variable */ + im->gdes[i].yrule = im->gdes[im->gdes[i].vidx].vf.val; + + if (finite(im->gdes[i].yrule)) { /* even the fetched var can be NaN */ + node=gfx_arc_sect(canvas, + PieCenterX, PieCenterY, + PieSize/2,PieSize/2, + M_PI*2.0*PieStart/100.0, + M_PI*2.0*(PieStart+im->gdes[i].yrule)/100.0, + im->gdes[i].col); + PieStart += im->gdes[i].yrule; + } + break; } /* switch */ } grid_paint(im,canvas); @@ -2070,7 +2128,6 @@ graph_paint(image_desc_t *im, char ***calcpr) switch(im->gdes[i].gf){ case GF_HRULE: - printf("DEBUG: HRULE at %f\n",im->gdes[i].yrule); if(isnan(im->gdes[i].yrule)) { /* fetch variable */ im->gdes[i].yrule = im->gdes[im->gdes[i].vidx].vf.val; }; @@ -2511,27 +2568,46 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) } break; case 'n':{ - char *prop = ""; - double size = 1; - char *font = "dummy"; - - if(sscanf(optarg, - "%10[A-Z]:%lf:%s", - 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; - - } else { - rrd_set_error("invalid color name '%s'",col_nam); - } - } else { - rrd_set_error("invalid text property format"); - return; - } - break; - } + /* 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]; + double size = 1; + char *font; + + font=malloc(255); + if(sscanf(optarg, + "%10[A-Z]:%lf:%s", + 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; + if (sindex==0) { /* the default */ + im->text_prop[TEXT_PROP_TITLE].size=size; + im->text_prop[TEXT_PROP_TITLE].font=font; + im->text_prop[TEXT_PROP_AXIS].size=size; + im->text_prop[TEXT_PROP_AXIS].font=font; + im->text_prop[TEXT_PROP_UNIT].size=size; + im->text_prop[TEXT_PROP_UNIT].font=font; + im->text_prop[TEXT_PROP_LEGEND].size=size; + im->text_prop[TEXT_PROP_LEGEND].font=font; + } + } else { + rrd_set_error("invalid fonttag '%s'",prop); + return; + } + } else { + rrd_set_error("invalid text property format"); + return; + } + break; + } case 'm': im->zoom= atof(optarg); if (im->zoom <= 0.0) { @@ -2612,7 +2688,7 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *im) /* function:newvname=string[:ds-name:CF] for xDEF ** function:vname[#color[:string]] for LINEx,AREA,STACK ** function:vname#color[:num[:string]] for TICK - ** function:vname-or-num#color[:string] for xRULE + ** function:vname-or-num#color[:string] for xRULE,PART ** function:vname:CF:string for xPRINT ** function:string for COMMENT */ @@ -2641,6 +2717,7 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *im) if (rrd_graph_legend(gdp,&line[argstart])==0) rrd_set_error("Cannot parse comment in line: %s",line); break; + case GF_PART: case GF_VRULE: case GF_HRULE: j=k=l=m=0;