X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=0325cdef76c3354f15856c0b7e38b35e5ecd2986;hb=93b5bc52971522f3793ad896c0d8fd888f490de3;hp=77a5051386fbf735fc7f251085fcfe329ea5969a;hpb=466f608bff40607e293edb471b34a2eb5617a56c;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 77a5051..0325cde 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.9 Copyright by Tobi Oetiker, 1997-2005 + * RRDtool 1.2.10 Copyright by Tobi Oetiker, 1997-2005 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -469,7 +469,7 @@ apply_gridfit(image_desc_t *im) double new_log10_range = factor * log10_range; double new_ymax_log10 = log10(im->minval) + new_log10_range; im->maxval = pow(10, new_ymax_log10); - ytr(im, DNAN); /* reset precalc */ + ytr(im,DNAN); /* reset precalc */ log10_range = log10(im->maxval) - log10(im->minval); } /* make sure first y=10^x gridline is located on @@ -481,7 +481,7 @@ apply_gridfit(image_desc_t *im) double yfrac = ypixfrac / im->ysize; im->minval = pow(10, log10(im->minval) - yfrac * log10_range); im->maxval = pow(10, log10(im->maxval) - yfrac * log10_range); - ytr(im, DNAN); /* reset precalc */ + ytr(im,DNAN); /* reset precalc */ } } else { /* Make sure we have an integer pixel distance between @@ -494,7 +494,7 @@ apply_gridfit(image_desc_t *im) double gridstep = im->ygrid_scale.gridstep; double minor_y, minor_y_px, minor_y_px_frac; im->maxval = im->minval + new_range; - ytr(im, DNAN); /* reset precalc */ + ytr(im,DNAN); /* reset precalc */ /* make sure first minor gridline is on integer pixel y coord */ minor_y = gridstep * floor(im->minval / gridstep); while (minor_y < im->minval) @@ -506,7 +506,7 @@ apply_gridfit(image_desc_t *im) double range = im->maxval - im->minval; im->minval = im->minval - yfrac * range; im->maxval = im->maxval - yfrac * range; - ytr(im, DNAN); /* reset precalc */ + ytr(im,DNAN); /* reset precalc */ } calc_horizontal_grid(im); /* recalc with changed im->maxval */ } @@ -1547,7 +1547,7 @@ calc_horizontal_grid(image_desc_t *im) if(decimals <= 0) /* everything is small. make place for zero */ decimals = 1; - im->ygrid_scale.gridstep = pow((double)10, floor(log10(range))); + im->ygrid_scale.gridstep = pow((double)10, floor(log10(range*im->viewfactor/im->magfact)))/im->viewfactor*im->magfact; if(im->ygrid_scale.gridstep == 0) /* range is one -> 0.1 is reasonable scale */ im->ygrid_scale.gridstep = 0.1; @@ -1573,7 +1573,7 @@ calc_horizontal_grid(image_desc_t *im) } else { int len = decimals + 1; if (im->unitslength < len+2) im->unitslength = len+2; - sprintf(im->ygrid_scale.labfmt, "%%%d.1f%s", len, ( im->symbol != ' ' ? " %c" : "" )); + sprintf(im->ygrid_scale.labfmt, "%%%d.0f%s", len, ( im->symbol != ' ' ? " %c" : "" )); } } else { @@ -1844,11 +1844,11 @@ vertical_grid( # error "your libc has no strftime I guess we'll abort the exercise here." #endif gfx_new_text ( im->canvas, - xtr(im,tilab), Y0+im->text_prop[TEXT_PROP_AXIS].size, + xtr(im,tilab), Y0+im->text_prop[TEXT_PROP_AXIS].size*1.4+5, im->graph_col[GRC_FONT], im->text_prop[TEXT_PROP_AXIS].font, im->text_prop[TEXT_PROP_AXIS].size, - im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_TOP, + im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_BOTTOM, graph_label ); } @@ -2151,6 +2151,7 @@ graph_size_location(image_desc_t *im, int elements im->ximg = im->xsize; im->yimg = im->ysize; im->yorigin = im->ysize; + ytr(im,DNAN); return 0; } @@ -2241,7 +2242,7 @@ graph_size_location(image_desc_t *im, int elements /* reserve space for main and/or pie */ im->yimg = Ymain + Yxlabel; - + #ifdef WITH_PIECHART if (im->yimg < Ypie) im->yimg = Ypie; #endif @@ -2258,8 +2259,7 @@ graph_size_location(image_desc_t *im, int elements } /* reserve space for padding below the graph */ im->yimg += Yspacing; - ytr(im,DNAN); - + /* Determine where to place the legends onto the image. ** Adjust im->yimg to match the space requirements. */ @@ -2288,6 +2288,7 @@ graph_size_location(image_desc_t *im, int elements } #endif + ytr(im,DNAN); return 0; } @@ -2500,16 +2501,53 @@ graph_paint(image_desc_t *im, char ***calcpr) } } else { - double ybase0 = DNAN,ytop0=DNAN; - for(ii=0;iixsize;ii++){ + int idxI=-1; + double *foreY=malloc(sizeof(double)*im->xsize*2); + double *foreX=malloc(sizeof(double)*im->xsize*2); + double *backY=malloc(sizeof(double)*im->xsize*2); + double *backX=malloc(sizeof(double)*im->xsize*2); + int drawem = 0; + for(ii=0;ii<=im->xsize;ii++){ + double ybase,ytop; + if ( idxI > 0 && ( drawem != 0 || ii==im->xsize)){ + int cntI=1; + int lastI=0; + while (cntI < idxI && foreY[lastI] == foreY[cntI] && foreY[lastI] == foreY[cntI+1]){cntI++;} + node = gfx_new_area(im->canvas, + backX[0],backY[0], + foreX[0],foreY[0], + foreX[cntI],foreY[cntI], im->gdes[i].col); + while (cntI < idxI) { + lastI = cntI; + cntI++; + while ( cntI < idxI && foreY[lastI] == foreY[cntI] && foreY[lastI] == foreY[cntI+1]){cntI++;} + gfx_add_point(node,foreX[cntI],foreY[cntI]); + } + gfx_add_point(node,backX[idxI],backY[idxI]); + while (idxI > 1){ + lastI = idxI; + idxI--; + while ( idxI > 1 && backY[lastI] == backY[idxI] && backY[lastI] == backY[idxI-1]){idxI--;} + gfx_add_point(node,backX[idxI],backY[idxI]); + } + idxI=-1; + drawem = 0; + } + if (drawem != 0){ + drawem = 0; + idxI=-1; + } + if (ii == im->xsize) break; + /* keep things simple for now, just draw these bars do not try to build a big and complex area */ - double ybase,ytop; + + if ( im->slopemode == 0 && ii==0){ continue; } if ( isnan(im->gdes[i].p_data[ii]) ) { - ybase0 = DNAN; + drawem = 1; continue; } ytop = ytr(im,im->gdes[i].p_data[ii]); @@ -2519,7 +2557,7 @@ graph_paint(image_desc_t *im, char ***calcpr) ybase = ytr(im,areazero); } if ( ybase == ytop ){ - ybase0 = DNAN; + drawem = 1; continue; } /* every area has to be wound clock-wise, @@ -2529,24 +2567,22 @@ graph_paint(image_desc_t *im, char ***calcpr) ytop = ybase; ybase = extra; } - if ( im->slopemode == 0){ - ybase0 = ybase; - ytop0 = ytop; - } - if ( !isnan(ybase0) ){ - node = gfx_new_area(im->canvas, - (double)ii-1.2+(double)im->xorigin,ybase0-0.2, - (double)ii-1.2+(double)im->xorigin,ytop0+0.2, - (double)ii+0.2+(double)im->xorigin,ytop+0.2, - im->gdes[i].col - ); - gfx_add_point(node, - (double)ii+0.02+im->xorigin,ybase-0.2 - ); + if ( im->slopemode == 0 ){ + backY[++idxI] = ybase-0.2; + backX[idxI] = ii+im->xorigin-1; + foreY[idxI] = ytop+0.2; + foreX[idxI] = ii+im->xorigin-1; } - ybase0=ybase; - ytop0=ytop; - } + backY[++idxI] = ybase-0.2; + backX[idxI] = ii+im->xorigin; + foreY[idxI] = ytop+0.2; + foreX[idxI] = ii+im->xorigin; + } + /* close up any remaining area */ + free(foreY); + free(foreX); + free(backY); + free(backX); } /* else GF_LINE */ } /* if color != 0x0 */ /* make sure we do not run into trouble when stacking on NaN */ @@ -2555,7 +2591,7 @@ graph_paint(image_desc_t *im, char ***calcpr) if (lastgdes && (im->gdes[i].stack)) { im->gdes[i].p_data[ii] = lastgdes->p_data[ii]; } else { - im->gdes[i].p_data[ii] = ytr(im,areazero); + im->gdes[i].p_data[ii] = areazero; } } } @@ -3150,7 +3186,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) if(sscanf(optarg, "%10[A-Z]:%lf:%1000s", - prop,&size,font) == 3){ + prop,&size,font) >= 2){ int sindex,propidx; if((sindex=text_prop_conv(prop)) != -1){ for (propidx=sindex;propidx