rrd_first code contributed by Burton Strauss <Burton@ntopSupport.com>
[rrdtool.git] / src / rrd_graph.c
index 438b3e1..3ac3623 100644 (file)
@@ -698,6 +698,7 @@ data_fetch(image_desc_t *im )
                continue;
            if ((strcmp(im->gdes[i].rrd, im->gdes[ii].rrd) == 0)
                        && (im->gdes[i].cf    == im->gdes[ii].cf)
+                       && (im->gdes[i].cf_reduce == im->gdes[ii].cf_reduce)
                        && (im->gdes[i].start == im->gdes[ii].start)
                        && (im->gdes[i].end   == im->gdes[ii].end)
                        && (im->gdes[i].step  == im->gdes[ii].step)) {
@@ -730,9 +731,10 @@ data_fetch(image_desc_t *im )
                return -1;
            }
            im->gdes[i].data_first = 1;     
+           im->gdes[i].step = im->step;
        
            if (ft_step < im->gdes[i].step) {
-               reduce_data(im->gdes[i].cf,
+               reduce_data(im->gdes[i].cf_reduce,
                            ft_step,
                            &im->gdes[i].start,
                            &im->gdes[i].end,
@@ -838,7 +840,7 @@ data_calc( image_desc_t *im){
                        vdp->shift = im->gdes[gdi].shval;
 
                /* normalize shift to multiple of consolidated step */
-               vdp->shift = (vdp->shift / vdp->step) * vdp->step;
+               vdp->shift = (vdp->shift / (long)vdp->step) * (long)vdp->step;
 
                /* apply shift */
                vdp->start += vdp->shift;
@@ -934,8 +936,8 @@ data_calc( image_desc_t *im){
                 for(rpi=0;im->gdes[gdi].rpnp[rpi].op != OP_END;rpi++){
                if(im->gdes[gdi].rpnp[rpi].op == OP_VARIABLE ||
                   im->gdes[gdi].rpnp[rpi].op == OP_PREV_OTHER){
-                        long   ptr  = im->gdes[gdi].rpnp[rpi].ptr;
-                       long    diff = im->gdes[gdi].start - im->gdes[ptr].start;
+                        long ptr = im->gdes[gdi].rpnp[rpi].ptr;
+                       long diff = im->gdes[gdi].start - im->gdes[ptr].start;
 
                         if(diff > 0)
                            im->gdes[gdi].rpnp[rpi].data += (diff / im->gdes[ptr].step) * im->gdes[ptr].ds_cnt;
@@ -1394,13 +1396,15 @@ leg_place(image_desc_t *im)
         
         /* hid legends for rules which are not displayed */
         
-       if (im->gdes[i].gf == GF_HRULE &&
-           (im->gdes[i].yrule < im->minval || im->gdes[i].yrule > im->maxval))
-           im->gdes[i].legend[0] = '\0';
-
-       if (im->gdes[i].gf == GF_VRULE &&
-           (im->gdes[i].xrule < im->start || im->gdes[i].xrule > im->end))
-           im->gdes[i].legend[0] = '\0';
+       if(!(im->extra_flags & FORCE_RULES_LEGEND)) {
+               if (im->gdes[i].gf == GF_HRULE &&
+                   (im->gdes[i].yrule < im->minval || im->gdes[i].yrule > im->maxval))
+                   im->gdes[i].legend[0] = '\0';
+
+               if (im->gdes[i].gf == GF_VRULE &&
+                   (im->gdes[i].xrule < im->start || im->gdes[i].xrule > im->end))
+                   im->gdes[i].legend[0] = '\0';
+       }
 
        leg_cc = strlen(im->gdes[i].legend);
        
@@ -2570,13 +2574,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
 int
 gdes_alloc(image_desc_t *im){
 
-    unsigned long def_step = (im->end-im->start)/im->xsize;
-    
-    if (im->step > def_step) /* step can be increassed ... no decreassed */
-      def_step = im->step;
-
     im->gdes_c++;
-    
     if ((im->gdes = (graph_desc_t *) rrd_realloc(im->gdes, (im->gdes_c)
                                           * sizeof(graph_desc_t)))==NULL){
        rrd_set_error("realloc graph_descs");
@@ -2584,7 +2582,7 @@ gdes_alloc(image_desc_t *im){
     }
 
 
-    im->gdes[im->gdes_c-1].step=def_step; 
+    im->gdes[im->gdes_c-1].step=im->step;
     im->gdes[im->gdes_c-1].stack=0;
     im->gdes[im->gdes_c-1].debug=0;
     im->gdes[im->gdes_c-1].start=im->start; 
@@ -2637,7 +2635,7 @@ scan_for_col(char *input, int len, char *output)
 ** - script parsing   now in rrd_graph_script()
 */
 int 
-rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize, FILE *stream)
+rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize, FILE *stream, double *ymin, double *ymax)
 {
     image_desc_t   im;
             
@@ -2678,6 +2676,8 @@ rrd_graph(int argc, char **argv, char ***prdata, int *xsize, int *ysize, FILE *s
 
     *xsize=im.ximg;
     *ysize=im.yimg;
+    *ymin=im.minval;
+    *ymax=im.maxval;
     if (im.imginfo) {
        char *filename;
        if (!(*prdata)) {
@@ -2803,6 +2803,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im)
            {"lazy",       no_argument,       0,  'z'},
             {"zoom",       required_argument, 0,  'm'},
            {"no-legend",  no_argument,       0,  'g'},
+           {"force-rules-legend",no_argument,0,  'F'},
             {"only-graph", no_argument,       0,  'j'},
            {"alt-y-grid", no_argument,       0,  'Y'},
             {"no-minor",   no_argument,       0,  'I'},
@@ -2817,7 +2818,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im)
 
 
        opt = getopt_long(argc, argv, 
-                         "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgjYAMX:S:N",
+                        "s:e:x:y:v:w:h:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMX:S:N",
                          long_options, &option_index);
 
        if (opt == EOF)
@@ -2842,6 +2843,9 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im)
        case 'g':
            im->extra_flags |= NOLEGEND;
            break;
+       case 'F':
+           im->extra_flags |= FORCE_RULES_LEGEND;
+           break;
        case 'X':
            im->unitsexponent = atoi(optarg);
            break;
@@ -3081,6 +3085,7 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im)
     
     im->start = start_tmp;
     im->end = end_tmp;
+    im->step = max((long)im->step, (im->end-im->start)/im->xsize);
 }
 
 int