X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=3a39ae240c804e12665f2f33b8154aff1bf1a073;hb=598e1be5cb840ba33b6cbbd77d258a0805d5d1a6;hp=597abafc22b020fdb990d1ae268fd0995b824ad8;hpb=72da289aab9147072de240ea67237601d51de0cd;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 597abaf..3a39ae2 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.1 Copyright by Tobi Oetiker, 1997-2005 + * RRDtool 1.2.6 Copyright by Tobi Oetiker, 1997-2005 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -151,9 +151,9 @@ ytr(image_desc_t *im, double value){ if (! im->rigid) { /* keep yval as-is */ } else if (yval > im->yorigin) { - yval = im->yorigin+2; + yval = im->yorigin; } else if (yval < im->yorigin - im->ysize){ - yval = im->yorigin - im->ysize - 2; + yval = im->yorigin - im->ysize; } return yval; } @@ -886,26 +886,29 @@ data_calc( image_desc_t *im){ * and the resulting number is the step size for the * resulting data source. */ - for(rpi=0;im->gdes[gdi].rpnp[rpi].op != OP_END;rpi++){ - if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE || - im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){ - long ptr = im->gdes[gdi].rpnp[rpi].ptr; - if (im->gdes[ptr].ds_cnt == 0) { + for(rpi=0;im->gdes[gdi].rpnp[rpi].op != OP_END;rpi++){ + if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE || + im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){ + long ptr = im->gdes[gdi].rpnp[rpi].ptr; + if (im->gdes[ptr].ds_cnt == 0) { /* this is a VDEF data source */ #if 0 - printf("DEBUG: inside CDEF '%s' processing VDEF '%s'\n", - im->gdes[gdi].vname, - im->gdes[ptr].vname); - printf("DEBUG: value from vdef is %f\n",im->gdes[ptr].vf.val); + printf("DEBUG: inside CDEF '%s' processing VDEF '%s'\n", + im->gdes[gdi].vname, + im->gdes[ptr].vname); + printf("DEBUG: value from vdef is %f\n",im->gdes[ptr].vf.val); #endif im->gdes[gdi].rpnp[rpi].val = im->gdes[ptr].vf.val; im->gdes[gdi].rpnp[rpi].op = OP_NUMBER; - } else { - if ((steparray = + } else { /* normal variables and PREF(variables) */ + + /* add one entry to the array that keeps track of the step sizes of the + * data sources going into the CDEF. */ + if ((steparray = rrd_realloc(steparray, (++stepcnt+1)*sizeof(*steparray)))==NULL){ - rrd_set_error("realloc steparray"); - rpnstack_free(&rpnstack); - return -1; + rrd_set_error("realloc steparray"); + rpnstack_free(&rpnstack); + return -1; }; steparray[stepcnt-1] = im->gdes[ptr].step; @@ -915,6 +918,7 @@ data_calc( image_desc_t *im){ * to the earliest endpoint of any of the * rras involved (ptr) */ + if(im->gdes[gdi].start < im->gdes[ptr].start) im->gdes[gdi].start = im->gdes[ptr].start; @@ -927,8 +931,8 @@ data_calc( image_desc_t *im){ * further save step size and data source * count of this rra */ - 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].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; /* backoff the *.data ptr; this is done so @@ -941,9 +945,9 @@ data_calc( image_desc_t *im){ /* move the data pointers to the correct period */ for(rpi=0;im->gdes[gdi].rpnp[rpi].op != OP_END;rpi++){ - if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE || - im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){ - long ptr = im->gdes[gdi].rpnp[rpi].ptr; + if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE || + im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){ + long ptr = im->gdes[gdi].rpnp[rpi].ptr; long diff = im->gdes[gdi].start - im->gdes[ptr].start; if(diff > 0) @@ -1578,14 +1582,14 @@ calc_horizontal_grid(image_desc_t *im) else { for(i=0;ylab[i].grid > 0;i++){ pixel = im->ysize / (scaledrange / ylab[i].grid); - if (pixel > 5) { + if (pixel > 7) { gridind = i; break; } } for(i=0; i<4;i++) { - if (pixel * ylab[gridind].lfac[i] >= 2 * im->text_prop[TEXT_PROP_AXIS].size) { + if (pixel * ylab[gridind].lfac[i] >= 2.5 * im->text_prop[TEXT_PROP_AXIS].size) { im->ygrid_scale.labfact = ylab[gridind].lfac[i]; break; } @@ -1610,14 +1614,16 @@ int draw_horizontal_grid(image_desc_t *im) int sgrid = (int)( im->minval / im->ygrid_scale.gridstep - 1); int egrid = (int)( im->maxval / im->ygrid_scale.gridstep + 1); + double MaxY; scaledstep = im->ygrid_scale.gridstep/im->magfact; + MaxY = scaledstep*(double)im->viewfactor*(double)egrid; for (i = sgrid; i <= egrid; i++){ double Y0=ytr(im,im->ygrid_scale.gridstep*i); if ( Y0 >= im->yorigin-im->ysize && Y0 <= im->yorigin){ if(i % im->ygrid_scale.labfact == 0){ if (i==0 || im->symbol == ' ') { - if(scaledstep < 1){ + if(MaxY < 10) { if(im->extra_flags & ALTYGRID) { sprintf(graph_label,im->ygrid_scale.labfmt,scaledstep*im->viewfactor*i); } @@ -1628,7 +1634,7 @@ int draw_horizontal_grid(image_desc_t *im) sprintf(graph_label,"%4.0f",scaledstep*im->viewfactor*i); } }else { - if(scaledstep < 1){ + if(MaxY < 10){ sprintf(graph_label,"%4.1f %c",scaledstep*im->viewfactor*i, im->symbol); } else { sprintf(graph_label,"%4.0f %c",scaledstep*im->viewfactor*i, im->symbol); @@ -1923,7 +1929,7 @@ grid_paint(image_desc_t *im) } else { res = draw_horizontal_grid(im); } - + /* dont draw horizontal grid if there is no min and max val */ if (! res ) { char *nodata = "No Data found"; @@ -1938,7 +1944,7 @@ grid_paint(image_desc_t *im) /* yaxis unit description */ gfx_new_text( im->canvas, - 12, (im->yorigin - im->ysize/2), + 10, (im->yorigin - im->ysize/2), im->graph_col[GRC_FONT], im->text_prop[TEXT_PROP_UNIT].font, im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth, @@ -1954,6 +1960,14 @@ grid_paint(image_desc_t *im) im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_CENTER, im->title); + /* rrdtool 'logo' */ + gfx_new_text( im->canvas, + im->ximg-7, 7, + ( im->graph_col[GRC_FONT] & 0xffffff00 ) | 0x00000044, + im->text_prop[TEXT_PROP_AXIS].font, + 5.5, im->tabwidth, 270, + GFX_H_RIGHT, GFX_V_TOP, + "RRDTOOL / TOBI OETIKER"); /* graph labels */ if( !(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH) ) { @@ -1975,30 +1989,38 @@ grid_paint(image_desc_t *im) if ( im->gdes[i].gf != GF_PRINT && im->gdes[i].gf != GF_GPRINT && im->gdes[i].gf != GF_COMMENT) { - int boxH, boxV; + int boxL, boxH, boxV; - boxH = gfx_get_text_width(im->canvas, 0, + boxL = 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)*1.2; - boxV = boxH; + im->tabwidth,"oo", 0); + boxH = boxL / 1.9; + boxV = boxH+1; /* make sure transparent colors show up all the same */ + node = gfx_new_area(im->canvas, + X0-1,Y0-boxV, + X0-1,Y0+1, + X0+boxL+0.5,Y0+1, + im->graph_col[GRC_BACK]); + gfx_add_point ( node, X0+boxL+0.5, Y0-boxV ); node = gfx_new_area(im->canvas, - X0,Y0-boxV, - X0,Y0, + X0-1,Y0-boxV, + X0-1,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, + X0-1,Y0-boxV, + X0-1,Y0, X0+boxH,Y0, im->gdes[i].col); gfx_add_point ( node, X0+boxH, Y0-boxV ); node = gfx_new_line(im->canvas, - X0,Y0-boxV, X0,Y0, + X0-1,Y0-boxV, + X0-1,Y0, 1,im->graph_col[GRC_FONT]); gfx_add_point(node,X0+boxH,Y0); gfx_add_point(node,X0+boxH,Y0-boxV); @@ -2168,7 +2190,7 @@ graph_size_location(image_desc_t *im, int elements im->text_prop[TEXT_PROP_AXIS].font, im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, - "0", 0) * im->unitslength + Xspacing; + "0", 0) * im->unitslength; } } @@ -2484,11 +2506,11 @@ graph_paint(image_desc_t *im, char ***calcpr) } } else { - float ybase0 = DNAN,ytop0; + double ybase0 = DNAN,ytop0=DNAN; for(ii=0;iixsize;ii++){ /* keep things simple for now, just draw these bars do not try to build a big and complex area */ - float ybase,ytop; + double ybase,ytop; if ( im->slopemode == 0 && ii==0){ continue; } @@ -2509,7 +2531,7 @@ graph_paint(image_desc_t *im, char ***calcpr) /* every area has to be wound clock-wise, so we have to make sur base remains base */ if (ybase > ytop){ - float extra = ytop; + double extra = ytop; ytop = ybase; ybase = extra; } @@ -2519,13 +2541,13 @@ graph_paint(image_desc_t *im, char ***calcpr) } if ( !isnan(ybase0) ){ node = gfx_new_area(im->canvas, - ii-1+im->xorigin,ybase0, - ii-1+im->xorigin,ytop0, - ii+im->xorigin,ytop, + (double)ii-1.1+(double)im->xorigin,ybase0-0.1, + (double)ii-1.1+(double)im->xorigin,ytop0+0.1, + (double)ii+0.1+(double)im->xorigin,ytop+0.1, im->gdes[i].col ); gfx_add_point(node, - ii+im->xorigin,ybase + (double)ii+0.01+im->xorigin,ybase-0.1 ); } ybase0=ybase;