prepare for the release of rrdtool-1.2.11
[rrdtool.git] / src / rrd_graph.c
index a699147..6e0e55c 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * RRDtool 1.2.10  Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2.11  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 */
   }
@@ -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,18 +2501,18 @@ graph_paint(image_desc_t *im, char ***calcpr)
 
           }
         } else {
-         double ybase0 = DNAN,ytop0=DNAN;
          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 >= 1 && ( ybase0 == DNAN || ii==im->xsize)){
+           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++;}
+               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],
@@ -2521,7 +2522,6 @@ graph_paint(image_desc_t *im, char ***calcpr)
                  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){
@@ -2531,8 +2531,12 @@ graph_paint(image_desc_t *im, char ***calcpr)
                  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
@@ -2543,7 +2547,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
                continue;
            }
            if ( isnan(im->gdes[i].p_data[ii]) ) {
-               ybase0 = DNAN;
+               drawem = 1;
                continue;
            }
             ytop = ytr(im,im->gdes[i].p_data[ii]);
@@ -2553,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,
@@ -2563,25 +2567,16 @@ graph_paint(image_desc_t *im, char ***calcpr)
                ytop = ybase;
                ybase = extra;
            }
-           if ( im->slopemode == 0){
-                ybase0 = ybase;
-                ytop0 = ytop;
-           }
-           if (!isnan(ybase0)){ 
-                 if ( im->slopemode == 0 ){
-                    backY[++idxI] = ybase0-0.2;
+            if ( im->slopemode == 0 ){
+                    backY[++idxI] = ybase-0.2;
                     backX[idxI] = ii+im->xorigin-1;
-                    foreY[idxI] = ytop0+0.2;
+                    foreY[idxI] = ytop+0.2;
                     foreX[idxI] = ii+im->xorigin-1;
-                 }
-                 backY[++idxI] = ybase-0.2;
-                 backX[idxI] = ii+im->xorigin;
-                 foreY[idxI] = ytop+0.2;
-                 foreX[idxI] = ii+im->xorigin;
             }
-            
-           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);
@@ -2596,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;
           }
         }
       }