From aa4b49144558b7683f39bc7e803d69427ff3993e Mon Sep 17 00:00:00 2001 From: oetiker Date: Sun, 10 Apr 2005 11:29:16 +0000 Subject: [PATCH] revamped drawing routines to be less complex and more stable. be kind to libart git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@378 a5681a0c-68f1-0310-ab6d-d61299d08faa --- src/rrd_gfx.c | 14 ++----- src/rrd_graph.c | 104 ++++++++++++++++++++++--------------------------- src/rrd_graph_helper.c | 6 ++- 3 files changed, 55 insertions(+), 69 deletions(-) diff --git a/src/rrd_gfx.c b/src/rrd_gfx.c index 8686d3d..9d5943c 100644 --- a/src/rrd_gfx.c +++ b/src/rrd_gfx.c @@ -321,14 +321,6 @@ static void gfx_libart_close_path(gfx_node_t *node, ArtVpath **vec) art_vpath_add_point (vec, &points, &points_max, ART_END, 0, 0); } -static void gfx_round_scaled_coordinates(ArtVpath *vec) -{ - while (vec->code != ART_END) { - vec->x = floor(vec->x - LINEOFFSET + 0.5) + LINEOFFSET; - vec->y = floor(vec->y - LINEOFFSET + 0.5) + LINEOFFSET; - vec++; - } -} /* find bbox of a string */ static void compute_string_bbox(gfx_string string) { @@ -565,8 +557,10 @@ int gfx_render_png (gfx_canvas_t *canvas, (char *)node->filename, 0, &face ); - if ( error ) break; - + if ( error ) { + rrd_set_error("faild to load %s",node->filename); + break; + } error = FT_Set_Char_Size(face, /* handle to face object */ (long)(node->size*64), (long)(node->size*64), diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 4b9cb6c..67fce90 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -2418,81 +2418,69 @@ graph_paint(image_desc_t *im, char ***calcpr) } } /* for */ - - if (im->gdes[i].col != 0x0){ + + /* ******************************************************* + ___ + | | ___ + ____| | | | + | |___| + -------|--------------------------------------- + + if we know the value of y at time t was a then + we draw a square from t-1 to t with the value a. + + ********************************************************* */ + if (im->gdes[i].col != 0x0){ /* GF_LINE and friend */ if(stack_gf == GF_LINE ){ node = NULL; for(ii=1;iixsize;ii++){ - if ( ! isnan(im->gdes[i].p_data[ii-1]) - && ! isnan(im->gdes[i].p_data[ii])){ - if (node == NULL){ - node = gfx_new_line(im->canvas, - ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii-1]), + if (isnan(im->gdes[i].p_data[ii])){ + node = NULL; + continue; + } + if ( node == NULL ) { + node = gfx_new_line(im->canvas, + ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii]), ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii]), im->gdes[i].linewidth, im->gdes[i].col); - } else { - gfx_add_point(node,ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii])); - } - } else { - node = NULL; - } + } else { + gfx_add_point(node,ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii])); + gfx_add_point(node,ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii])); + }; + } } else { - int area_start=-1; - node = NULL; for(ii=1;iixsize;ii++){ - /* open an area */ - if ( ! isnan(im->gdes[i].p_data[ii-1]) - && ! isnan(im->gdes[i].p_data[ii])){ - if (node == NULL){ - float ybase = 0.0; -/* - if (im->gdes[i].gf == GF_STACK) { -*/ - if ( (im->gdes[i].gf == GF_STACK) - || (im->gdes[i].stack) ) { - - ybase = ytr(im,lastgdes->p_data[ii-1]); - } else { - ybase = ytr(im,areazero); - } - area_start = ii-1; - node = gfx_new_area(im->canvas, - ii-1+im->xorigin,ybase, - ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii-1]), - ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii]), - im->gdes[i].col - ); - } else { - gfx_add_point(node,ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii])); - } + /* keep things simple for now, just draw these bars + do not try to build a big and complex area */ + float ybase; + if ( isnan(im->gdes[i].p_data[ii]) ) { + continue; + } + if ( im->gdes[i].stack ) { + ybase = ytr(im,lastgdes->p_data[ii]); + } else { + ybase = ytr(im,areazero); } - - if ( node != NULL && (ii+1==im->xsize || isnan(im->gdes[i].p_data[ii]) )){ - /* GF_AREA STACK type*/ -/* - if (im->gdes[i].gf == GF_STACK ) { -*/ - if ( (im->gdes[i].gf == GF_STACK) - || (im->gdes[i].stack) ) { - int iii; - for (iii=ii-1;iii>area_start;iii--){ - gfx_add_point(node,iii+im->xorigin,ytr(im,lastgdes->p_data[iii])); - } - } else { - gfx_add_point(node,ii+im->xorigin,ytr(im,areazero)); - }; - node=NULL; - }; + if ( ybase == im->gdes[i].p_data[ii] ){ + continue; + } + node = gfx_new_area(im->canvas, + ii-1+im->xorigin,ybase, + ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii]), + ii+im->xorigin,ytr(im,im->gdes[i].p_data[ii]), + im->gdes[i].col + ); + gfx_add_point(node,ii+im->xorigin,ybase); } } /* else GF_LINE */ } /* if color != 0x0 */ /* make sure we do not run into trouble when stacking on NaN */ for(ii=0;iixsize;ii++){ if (isnan(im->gdes[i].p_data[ii])) { - if (lastgdes && (im->gdes[i].gf == GF_STACK)) { + 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); diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c index bb6415d..3ab6a5b 100644 --- a/src/rrd_graph_helper.c +++ b/src/rrd_graph_helper.c @@ -370,6 +370,10 @@ rrd_parse_PVHLAST(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc return 1; } } + /* have simpler code in the drawing section */ + if ( gdp->gf == GF_STACK ){ + gdp->stack=1; + } return 0; } @@ -589,6 +593,7 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *im, int optno) { case GF_COMMENT: /* text */ if (rrd_parse_legend(argv[i],&eaten,gdp)) return; break; + case GF_STACK: /* vname-or-value[#color[:legend]] */ #ifdef WITH_PIECHART case GF_PART: /* value[#color[:legend]] */ #endif @@ -596,7 +601,6 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *im, int optno) { case GF_HRULE: /* value#color[:legend] */ case GF_LINE: /* vname-or-value[#color[:legend]][:STACK] */ case GF_AREA: /* vname-or-value[#color[:legend]][:STACK] */ - case GF_STACK: /* vname-or-value[#color[:legend]] */ case GF_TICK: /* vname#color[:num[:legend]] */ if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im)) return; break; -- 2.11.0