From 72da289aab9147072de240ea67237601d51de0cd Mon Sep 17 00:00:00 2001 From: oetiker Date: Fri, 6 May 2005 21:52:55 +0000 Subject: [PATCH] since the drawing code is now much simpler we do not need to perturbe the points or rewind the graph anymore this saves quite some time ... git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@490 a5681a0c-68f1-0310-ab6d-d61299d08faa --- src/rrd_gfx.c | 14 ++++++------ src/rrd_graph.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------------- src/rrd_graph.h | 1 + 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/src/rrd_gfx.c b/src/rrd_gfx.c index 3ad318a..8b3493e 100644 --- a/src/rrd_gfx.c +++ b/src/rrd_gfx.c @@ -536,20 +536,20 @@ int gfx_render_png (gfx_canvas_t *canvas, if (node->closed_path) gfx_libart_close_path(node, &vec); /* gfx_round_scaled_coordinates(vec); */ - pvec = art_vpath_perturb(vec); - art_free(vec); + /* pvec = art_vpath_perturb(vec); + art_free(vec); */ if(node->type == GFX_LINE){ - svp = art_svp_vpath_stroke ( pvec, ART_PATH_STROKE_JOIN_ROUND, + svp = art_svp_vpath_stroke ( vec, ART_PATH_STROKE_JOIN_ROUND, ART_PATH_STROKE_CAP_ROUND, node->size*canvas->zoom,4,0.25); } else { - svp = art_svp_from_vpath ( pvec ); - svpt = art_svp_uncross( svp ); + svp = art_svp_from_vpath ( vec ); +/* svpt = art_svp_uncross( svp ); art_svp_free(svp); svp = art_svp_rewind_uncrossed(svpt,ART_WIND_RULE_NONZERO); - art_svp_free(svpt); + art_svp_free(svpt);*/ } - art_free(pvec); + art_free(vec); /* this is from gnome since libart does not have this yet */ gnome_print_art_rgba_svp_alpha (svp ,0,0, pys_width, pys_height, node->color, buffer, rowstride, NULL); diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 01e174c..597abaf 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -2442,13 +2442,13 @@ graph_paint(image_desc_t *im, char ***calcpr) } /* for */ /* ******************************************************* - ___ - | | ___ + a ___. (a,t) + | | ___ ____| | | | | |___| - -------|--------------------------------------- + -------|--t-1--t-------------------------------- - if we know the value of y at time t was a then + if we know the value at time t was a then we draw a square from t-1 to t with the value a. ********************************************************* */ @@ -2456,29 +2456,44 @@ graph_paint(image_desc_t *im, char ***calcpr) /* GF_LINE and friend */ if(stack_gf == GF_LINE ){ node = NULL; - for(ii=1;iixsize;ii++){ - if (isnan(im->gdes[i].p_data[ii])){ + for(ii=1;iixsize;ii++){ + if (isnan(im->gdes[i].p_data[ii]) || (im->slopemode==1 && isnan(im->gdes[i].p_data[ii-1]))){ node = NULL; continue; } if ( node == NULL ) { - node = gfx_new_line(im->canvas, + if ( im->slopemode == 0 ){ + 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 { + node = gfx_new_line(im->canvas, + 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].linewidth, + im->gdes[i].col); + } } else { - gfx_add_point(node,ii-1+im->xorigin,ytr(im,im->gdes[i].p_data[ii])); + if ( im->slopemode==0 ){ + 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 { - for(ii=1;iixsize;ii++){ + float ybase0 = DNAN,ytop0; + 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; + if ( im->slopemode == 0 && ii==0){ + continue; + } if ( isnan(im->gdes[i].p_data[ii]) ) { + ybase0 = DNAN; continue; } ytop = ytr(im,im->gdes[i].p_data[ii]); @@ -2488,15 +2503,33 @@ graph_paint(image_desc_t *im, char ***calcpr) ybase = ytr(im,areazero); } if ( ybase == ytop ){ - continue; + ybase0 = DNAN; + continue; } - node = gfx_new_area(im->canvas, - ii-1+im->xorigin,ybase, - ii-1+im->xorigin,ytop, + /* every area has to be wound clock-wise, + so we have to make sur base remains base */ + if (ybase > ytop){ + float extra = ytop; + ytop = ybase; + ybase = extra; + } + if ( im->slopemode == 0){ + ybase0 = ybase; + ytop0 = ytop; + } + if ( !isnan(ybase0) ){ + node = gfx_new_area(im->canvas, + ii-1+im->xorigin,ybase0, + ii-1+im->xorigin,ytop0, ii+im->xorigin,ytop, im->gdes[i].col ); - gfx_add_point(node,ii+im->xorigin,ybase); + gfx_add_point(node, + ii+im->xorigin,ybase + ); + } + ybase0=ybase; + ytop0=ytop; } } /* else GF_LINE */ } /* if color != 0x0 */ @@ -2767,6 +2800,7 @@ rrd_graph_init(image_desc_t *im) im->gridfit = 1; im->imginfo = NULL; im->lazy = 0; + im->slopemode = 0; im->logarithmic = 0; im->ygridstep = DNAN; im->draw_x_grid = 1; @@ -2860,6 +2894,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) {"only-graph", no_argument, 0, 'j'}, {"alt-y-grid", no_argument, 0, 'Y'}, {"no-minor", no_argument, 0, 'I'}, + {"slope-mode", no_argument, 0, 'E'}, {"alt-autoscale", no_argument, 0, 'A'}, {"alt-autoscale-max", no_argument, 0, 'M'}, {"no-gridfit", no_argument, 0, 'N'}, @@ -2875,7 +2910,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) int col_start,col_end; opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMX:L:S:T:NR:B:", + "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:", long_options, &option_index); if (opt == EOF) @@ -3039,6 +3074,10 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im) case 'z': im->lazy = 1; break; + case 'E': + im->slopemode = 1; + break; + case 'o': im->logarithmic = 1; if (isnan(im->minval)) diff --git a/src/rrd_graph.h b/src/rrd_graph.h index 58af260..ca3e7c3 100644 --- a/src/rrd_graph.h +++ b/src/rrd_graph.h @@ -170,6 +170,7 @@ typedef struct image_desc_t { int lazy; /* only update the image if there is reasonable probablility that the existing one is out of date */ + int slopemode; /* connect the dots of the curve directly, not using a stair */ int logarithmic; /* scale the yaxis logarithmic */ /* status information */ -- 2.11.0