Code

revamped drawing routines to be less complex and more stable. be kind to libart
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Sun, 10 Apr 2005 11:29:16 +0000 (11:29 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Sun, 10 Apr 2005 11:29:16 +0000 (11:29 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@378 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/rrd_gfx.c
src/rrd_graph.c
src/rrd_graph_helper.c

index 8686d3dba0223dedcccde9e102dcfd49e913b886..9d5943cdd463953e414463614b509a8dfa32d4d9 100644 (file)
@@ -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),
index 4b9cb6c9a27a764bb08b950f273cca1a794dbaf1..67fce90cb304134558c3ffb80c348ad71323d852 100644 (file)
@@ -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;ii<im->xsize;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;ii<im->xsize;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;ii<im->xsize;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);
index bb6415de3f963b5fcbee6d7ad555449318a5a9b1..3ab6a5be1ea0d77dd431a78aed3d183877864041 100644 (file)
@@ -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;