* simplify code for STACK function ... there were two code paths (new as well as...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Fri, 3 Mar 2006 23:11:55 +0000 (23:11 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Fri, 3 Mar 2006 23:11:55 +0000 (23:11 +0000)
* make TICK work for negative fractions

git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@769 a5681a0c-68f1-0310-ab6d-d61299d08faa

doc/rrdgraph_graph.pod
src/rrd_graph.c
src/rrd_graph_helper.c

index bf683ed..754e703 100644 (file)
@@ -203,9 +203,9 @@ be filled.
 Plot a tick mark (a vertical line) for each value of I<vname> that is
 non-zero and not *UNKNOWN*. The I<fraction> argument specifies the length of
 the tick mark as a fraction of the y-axis; the default value is 0.1 (10% of
-the axis). Note that the color specification is not optional. The TICK marks
-start at y==0 if it is inside the graph. Else they start at the border that
-is closer to 0.
+the axis). Note that the color specification is not optional. The TICK marks normaly
+start at the lower edge of the graphing area. If the fraction is negative they start
+at the upper border of the graphing area.
 
 =item B<SHIFT>B<:>I<vname>B<:>I<offset>
 
index a762b25..7adf04a 100644 (file)
@@ -179,7 +179,7 @@ enum gf_en gf_conv(char *string){
     conv_if(VRULE,GF_VRULE)
     conv_if(LINE,GF_LINE)
     conv_if(AREA,GF_AREA)
-    conv_if(STACK,GF_STACK)
+    conv_if(STACK,GF_STACK) 
     conv_if(TICK,GF_TICK)
     conv_if(DEF,GF_DEF)
     conv_if(CDEF,GF_CDEF)
@@ -1020,8 +1020,7 @@ data_proc( image_desc_t *im ){
     for(i=0;i<im->gdes_c;i++) {
        if((im->gdes[i].gf==GF_LINE) ||
                (im->gdes[i].gf==GF_AREA) ||
-               (im->gdes[i].gf==GF_TICK) ||
-               (im->gdes[i].gf==GF_STACK)) {
+               (im->gdes[i].gf==GF_TICK)) {
            if((im->gdes[i].p_data = malloc((im->xsize +1)
                                        * sizeof(rrd_value_t)))==NULL){
                rrd_set_error("malloc data_proc");
@@ -1043,7 +1042,6 @@ data_proc( image_desc_t *im ){
                case GF_TICK:
                    if (!im->gdes[ii].stack)
                        paintval = 0.0;
-               case GF_STACK:
                    value = im->gdes[ii].yrule;
                    if (isnan(value) || (im->gdes[ii].gf == GF_TICK)) {
                        /* The time of the data doesn't necessarily match
@@ -1082,6 +1080,10 @@ data_proc( image_desc_t *im ){
                        im->gdes[ii].p_data[i] = DNAN;
                    }
                    break;
+               case GF_STACK:
+                    rrd_set_error("STACK should already be turned into LINE or AREA here");
+                    return -1;
+                    break;
                default:
                    break;
            }
@@ -1361,7 +1363,6 @@ print_calc(image_desc_t *im, char ***prdata)
        case GF_LINE:
        case GF_AREA:
        case GF_TICK:
-       case GF_STACK:
        case GF_HRULE:
        case GF_VRULE:
            graphelement = 1;
@@ -1376,6 +1377,10 @@ print_calc(image_desc_t *im, char ***prdata)
        case GF_SHIFT:
        case GF_XPORT:
            break;
+       case GF_STACK:
+            rrd_set_error("STACK should already be turned into LINE or AREA here");
+            return -1;
+            break;
        }
     }
     return graphelement;
@@ -2342,7 +2347,6 @@ graph_paint(image_desc_t *im, char ***calcpr)
   gfx_node_t *node;
   
   double areazero = 0.0;
-  enum gf_en stack_gf = GF_PRINT;
   graph_desc_t *lastgdes = NULL;    
 
   /* if we are lazy and there is nothing to PRINT ... quit now */
@@ -2466,22 +2470,27 @@ graph_paint(image_desc_t *im, char ***calcpr)
       for (ii = 0; ii < im->xsize; ii++)
         {
           if (!isnan(im->gdes[i].p_data[ii]) && 
-              im->gdes[i].p_data[ii] > 0.0)
-            { 
-              /* generate a tick */
-              gfx_new_line(im->canvas, im -> xorigin + ii, 
-                           im -> yorigin - (im -> gdes[i].yrule * im -> ysize),
-                           im -> xorigin + ii, 
-                           im -> yorigin,
-                           1.0,
-                           im -> gdes[i].col );
-            }
+              im->gdes[i].p_data[ii] != 0.0)
+           { 
+             if (im -> gdes[i].yrule > 0 ) {
+                     gfx_new_line(im->canvas,
+                                   im -> xorigin + ii, im->yorigin,
+                                  im -> xorigin + ii, im->yorigin - im -> gdes[i].yrule * im -> ysize,
+                                  1.0,
+                                  im -> gdes[i].col );
+              } else if ( im -> gdes[i].yrule < 0 ) {
+                     gfx_new_line(im->canvas,
+                                   im -> xorigin + ii, im->yorigin - im -> ysize,
+                                  im -> xorigin + ii, im->yorigin - ( 1 - im -> gdes[i].yrule ) * im -> ysize,
+                                  1.0,
+                                  im -> gdes[i].col );
+             
+              }
+           }
         }
       break;
     case GF_LINE:
     case GF_AREA:
-      stack_gf = im->gdes[i].gf;
-    case GF_STACK:          
       /* fix data points at oo and -oo */
       for(ii=0;ii<im->xsize;ii++){
         if (isinf(im->gdes[i].p_data[ii])){
@@ -2507,7 +2516,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
       ********************************************************* */
       if (im->gdes[i].col != 0x0){   
         /* GF_LINE and friend */
-        if(stack_gf == GF_LINE ){
+        if(im->gdes[i].gf == GF_LINE ){
           double last_y=0.0;
           node = NULL;
           for(ii=1;ii<im->xsize;ii++){
@@ -2651,6 +2660,10 @@ graph_paint(image_desc_t *im, char ***calcpr)
       }
       break;
 #endif
+    case GF_STACK:
+      rrd_set_error("STACK should already be turned into LINE or AREA here");
+      return -1;
+      break;
        
     } /* switch */
   }
@@ -2740,6 +2753,7 @@ gdes_alloc(image_desc_t *im){
     im->gdes[im->gdes_c-1].step=im->step;
     im->gdes[im->gdes_c-1].step_orig=im->step;
     im->gdes[im->gdes_c-1].stack=0;
+    im->gdes[im->gdes_c-1].linewidth=0;
     im->gdes[im->gdes_c-1].debug=0;
     im->gdes[im->gdes_c-1].start=im->start; 
     im->gdes[im->gdes_c-1].end=im->end; 
index aca3eea..8855dcd 100644 (file)
@@ -776,6 +776,9 @@ rrd_parse_cdef(const char *const line, unsigned int *const eaten, graph_desc_t *
 void
 rrd_graph_script(int argc, char *argv[], image_desc_t *const im, int optno) {
     int i;
+    /* save state for STACK backward compat function */
+    enum gf_en     last_gf=GF_PRINT;
+    float          last_linewidth=0.0;
 
     for (i=optind+optno;i<argc;i++) {
        graph_desc_t *gdp;
@@ -788,7 +791,7 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *const im, int optno) {
 #endif
 
        if (rrd_parse_find_gf(argv[i],&eaten,gdp)) return;
-
+        
        switch (gdp->gf) {
            case GF_SHIFT:      /* vname:value */
                if (rrd_parse_shift(argv[i],&eaten,gdp,im)) return;
@@ -804,7 +807,6 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *const 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
@@ -813,7 +815,20 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *const im, int optno) {
            case GF_LINE:       /* vname-or-value[#color[:legend]][:STACK] */
            case GF_AREA:       /* vname-or-value[#color[:legend]][:STACK] */
            case GF_TICK:       /* vname#color[:num[:legend]] */
-               if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im)) return;
+               if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im))return;
+                last_gf = gdp->gf;
+                last_linewidth = gdp->linewidth;
+               break;
+           case GF_STACK:      /* vname-or-value[#color[:legend]] */           
+               if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im))return;
+                if (last_gf == GF_LINE || last_gf == GF_AREA){
+                   gdp->gf = last_gf;
+                   gdp->linewidth = last_linewidth;
+                } else {
+                   rrd_set_error("STACK must follow LINE or AREA! command:\n%s",
+                        &argv[i][eaten],argv[i]);
+                   return;
+                }
                break;
        /* data acquisition */
            case GF_DEF:        /* vname=x:DS:CF:[:step=#][:start=#][:end=#] */