prepare for the release of rrdtool-1.2.5
[rrdtool.git] / src / rrd_graph.c
index cbf947d..da0b9d0 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * RRDtool 1.2.1  Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2.5  Copyright by Tobi Oetiker, 1997-2005
  ****************************************************************************
  * rrd__graph.c  produce graphs from data in rrdfiles
  ****************************************************************************/
@@ -886,26 +886,29 @@ data_calc( image_desc_t *im){
                 *   and the resulting number is the step size for the
                 *   resulting data source.
                 */
-               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;
-                       if (im->gdes[ptr].ds_cnt == 0) {
+               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;
+                       if (im->gdes[ptr].ds_cnt == 0) { /* this is a VDEF data source */
 #if 0
-                       printf("DEBUG: inside CDEF '%s' processing VDEF '%s'\n",
-       im->gdes[gdi].vname,
-       im->gdes[ptr].vname);
-                       printf("DEBUG: value from vdef is %f\n",im->gdes[ptr].vf.val);
+                           printf("DEBUG: inside CDEF '%s' processing VDEF '%s'\n",
+                              im->gdes[gdi].vname,
+                              im->gdes[ptr].vname);
+                           printf("DEBUG: value from vdef is %f\n",im->gdes[ptr].vf.val);
 #endif
                            im->gdes[gdi].rpnp[rpi].val = im->gdes[ptr].vf.val;
                            im->gdes[gdi].rpnp[rpi].op  = OP_NUMBER;
-                       } else {
-                       if ((steparray =
+                       } else { /* normal variables and PREF(variables) */
+
+                           /* add one entry to the array that keeps track of the step sizes of the
+                            * data sources going into the CDEF. */
+                           if ((steparray =
                                 rrd_realloc(steparray,
                                                         (++stepcnt+1)*sizeof(*steparray)))==NULL){
-                               rrd_set_error("realloc steparray");
-                               rpnstack_free(&rpnstack);
-                               return -1;
+                                rrd_set_error("realloc steparray");
+                                rpnstack_free(&rpnstack);
+                                return -1;
                            };
 
                            steparray[stepcnt-1] = im->gdes[ptr].step;
@@ -915,6 +918,7 @@ data_calc( image_desc_t *im){
                             * to the earliest endpoint of any of the
                             * rras involved (ptr)
                             */
+
                            if(im->gdes[gdi].start < im->gdes[ptr].start)
                                im->gdes[gdi].start = im->gdes[ptr].start;
 
@@ -927,8 +931,8 @@ data_calc( image_desc_t *im){
                             * further save step size and data source
                             * count of this rra
                             */ 
-                            im->gdes[gdi].rpnp[rpi].data  im->gdes[ptr].data + im->gdes[ptr].ds;
-                           im->gdes[gdi].rpnp[rpi].step = im->gdes[ptr].step;
+                            im->gdes[gdi].rpnp[rpi].data   = im->gdes[ptr].data + im->gdes[ptr].ds;
+                           im->gdes[gdi].rpnp[rpi].step   = im->gdes[ptr].step;
                            im->gdes[gdi].rpnp[rpi].ds_cnt = im->gdes[ptr].ds_cnt;
 
                            /* backoff the *.data ptr; this is done so
@@ -941,9 +945,9 @@ data_calc( image_desc_t *im){
 
                 /* move the data pointers to the correct period */
                 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;
+                   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;
 
                         if(diff > 0)
@@ -1578,14 +1582,14 @@ calc_horizontal_grid(image_desc_t   *im)
        else {
            for(i=0;ylab[i].grid > 0;i++){
                pixel = im->ysize / (scaledrange / ylab[i].grid);
-               if (pixel > 5) {
+               if (pixel > 7) {
                    gridind = i;
                    break;
                }
            }
            
            for(i=0; i<4;i++) {
-              if (pixel * ylab[gridind].lfac[i] >=  2 * im->text_prop[TEXT_PROP_AXIS].size) {
+              if (pixel * ylab[gridind].lfac[i] >=  2.5 * im->text_prop[TEXT_PROP_AXIS].size) {
                  im->ygrid_scale.labfact =  ylab[gridind].lfac[i];
                  break;
               }                          
@@ -1610,14 +1614,16 @@ int draw_horizontal_grid(image_desc_t *im)
    
     int sgrid = (int)( im->minval / im->ygrid_scale.gridstep - 1);
     int egrid = (int)( im->maxval / im->ygrid_scale.gridstep + 1);
+    double MaxY;
     scaledstep = im->ygrid_scale.gridstep/im->magfact;
+    MaxY = scaledstep*(double)im->viewfactor*(double)egrid;
     for (i = sgrid; i <= egrid; i++){
        double Y0=ytr(im,im->ygrid_scale.gridstep*i);
        if ( Y0 >= im->yorigin-im->ysize
                 && Y0 <= im->yorigin){       
            if(i % im->ygrid_scale.labfact == 0){               
                if (i==0 || im->symbol == ' ') {
-                   if(scaledstep < 1){
+                   if(MaxY < 10) {
                        if(im->extra_flags & ALTYGRID) {
                            sprintf(graph_label,im->ygrid_scale.labfmt,scaledstep*im->viewfactor*i);
                        }
@@ -1628,7 +1634,7 @@ int draw_horizontal_grid(image_desc_t *im)
                        sprintf(graph_label,"%4.0f",scaledstep*im->viewfactor*i);
                    }
                }else {
-                   if(scaledstep < 1){
+                   if(MaxY < 10){
                        sprintf(graph_label,"%4.1f %c",scaledstep*im->viewfactor*i, im->symbol);
                    } else {
                        sprintf(graph_label,"%4.0f %c",scaledstep*im->viewfactor*i, im->symbol);
@@ -1938,7 +1944,7 @@ grid_paint(image_desc_t   *im)
 
     /* yaxis unit description */
     gfx_new_text( im->canvas,
-                  12, (im->yorigin - im->ysize/2),
+                  10, (im->yorigin - im->ysize/2),
                   im->graph_col[GRC_FONT],
                   im->text_prop[TEXT_PROP_UNIT].font,
                   im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth, 
@@ -1957,9 +1963,9 @@ grid_paint(image_desc_t   *im)
     /* rrdtool 'logo' */
     gfx_new_text( im->canvas,
                  im->ximg-7, 7,
-                 0xbfbfbfff,
+                 ( im->graph_col[GRC_FONT] & 0xffffff00 ) | 0x00000044,
                  im->text_prop[TEXT_PROP_AXIS].font,
-                 5, im->tabwidth, 270,
+                 5.5, im->tabwidth, 270,
                  GFX_H_RIGHT, GFX_V_TOP,
                  "RRDTOOL / TOBI OETIKER");
     
@@ -1983,30 +1989,38 @@ grid_paint(image_desc_t   *im)
                     if (          im->gdes[i].gf != GF_PRINT &&
                                   im->gdes[i].gf != GF_GPRINT &&
                                    im->gdes[i].gf != GF_COMMENT) {
-                            int boxH, boxV;
+                            int boxL, boxH, boxV;
                             
-                            boxH = gfx_get_text_width(im->canvas, 0,
+                            boxL = gfx_get_text_width(im->canvas, 0,
                                                       im->text_prop[TEXT_PROP_LEGEND].font,
                                                       im->text_prop[TEXT_PROP_LEGEND].size,
-                                                      im->tabwidth,"M", 0)*1.2;
-                            boxV = boxH;
+                                                      im->tabwidth,"oo", 0);
+                           boxH = boxL / 1.9;
+                            boxV = boxH+1;
                             
                             /* make sure transparent colors show up all the same */
+                            node = gfx_new_area(im->canvas,
+                                                X0-1,Y0-boxV,
+                                                X0-1,Y0+1,
+                                                X0+boxL+0.5,Y0+1,
+                                                im->graph_col[GRC_BACK]);
+                            gfx_add_point ( node, X0+boxL+0.5, Y0-boxV );
                            node = gfx_new_area(im->canvas,
-                                                X0,Y0-boxV,
-                                                X0,Y0,
+                                                X0-1,Y0-boxV,
+                                                X0-1,Y0,
                                                 X0+boxH,Y0,
                                                 im->graph_col[GRC_CANVAS]);
                             gfx_add_point ( node, X0+boxH, Y0-boxV );
 
                             node = gfx_new_area(im->canvas,
-                                                X0,Y0-boxV,
-                                                X0,Y0,
+                                                X0-1,Y0-boxV,
+                                                X0-1,Y0,
                                                 X0+boxH,Y0,
                                                 im->gdes[i].col);
                             gfx_add_point ( node, X0+boxH, Y0-boxV );
                             node = gfx_new_line(im->canvas,
-                                                X0,Y0-boxV, X0,Y0,
+                                                X0-1,Y0-boxV,
+                                                X0-1,Y0,
                                                 1,im->graph_col[GRC_FONT]);
                             gfx_add_point(node,X0+boxH,Y0);
                             gfx_add_point(node,X0+boxH,Y0-boxV);
@@ -2176,7 +2190,7 @@ graph_size_location(image_desc_t *im, int elements
                        im->text_prop[TEXT_PROP_AXIS].font,
                        im->text_prop[TEXT_PROP_AXIS].size,
                        im->tabwidth,
-                       "0", 0) * im->unitslength + Xspacing;
+                       "0", 0) * im->unitslength;
        }
     }