make transparent backgrounds work propperly
[rrdtool.git] / src / rrd_graph.c
index 95f438b..a399491 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * RRDtool 1.2.3  Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2.6  Copyright by Tobi Oetiker, 1997-2005
  ****************************************************************************
  * rrd__graph.c  produce graphs from data in rrdfiles
  ****************************************************************************/
@@ -9,7 +9,7 @@
 
 #include "rrd_tool.h"
 
-#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
+#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
 #include <io.h>
 #include <fcntl.h>
 #endif
@@ -151,9 +151,9 @@ ytr(image_desc_t *im, double value){
     if (! im->rigid) {
       /* keep yval as-is */
     } else if (yval > im->yorigin) {
-      yval = im->yorigin;
+      yval = im->yorigin +0.00001;
     } else if (yval < im->yorigin - im->ysize){
-      yval = im->yorigin - im->ysize;
+      yval = im->yorigin - im->ysize - 0.00001;
     } 
     return yval;
 }
@@ -1582,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;
               }                          
@@ -1614,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);
                        }
@@ -1632,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);
@@ -1942,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, 
@@ -1961,7 +1963,7 @@ grid_paint(image_desc_t   *im)
     /* rrdtool 'logo' */
     gfx_new_text( im->canvas,
                  im->ximg-7, 7,
-                 ( im->graph_col[GRC_FONT] & 0xffffff00 ) | 0x00000066,
+                 ( im->graph_col[GRC_FONT] & 0xffffff00 ) | 0x00000044,
                  im->text_prop[TEXT_PROP_AXIS].font,
                  5.5, im->tabwidth, 270,
                  GFX_H_RIGHT, GFX_V_TOP,
@@ -1987,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);
@@ -2180,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;
        }
     }
 
@@ -2377,11 +2387,11 @@ graph_paint(image_desc_t *im, char ***calcpr)
   
   node=gfx_new_area ( im->canvas,
                       0, 0,
-                      im->ximg, 0,
-                      im->ximg, im->yimg,
+                      0, im->yimg,
+                     im->ximg, im->yimg,                      
                       im->graph_col[GRC_BACK]);
 
-  gfx_add_point(node,0, im->yimg);
+  gfx_add_point(node,im->ximg, 0);
 
 #ifdef WITH_PIECHART
   if (piechart != 2) {
@@ -2496,11 +2506,11 @@ graph_paint(image_desc_t *im, char ***calcpr)
 
           }
         } else {
-         float ybase0 = DNAN,ytop0=DNAN;
+         double ybase0 = DNAN,ytop0=DNAN;
           for(ii=0;ii<im->xsize;ii++){
            /* keep things simple for now, just draw these bars
               do not try to build a big and complex area */
-           float ybase,ytop;
+           double ybase,ytop;
            if ( im->slopemode == 0 && ii==0){
                continue;
            }
@@ -2521,7 +2531,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
            /* every area has to be wound clock-wise,
               so we have to make sur base remains base  */             
            if (ybase > ytop){
-               float extra = ytop;
+               double extra = ytop;
                ytop = ybase;
                ybase = extra;
            }
@@ -2531,13 +2541,13 @@ graph_paint(image_desc_t *im, char ***calcpr)
            }
            if ( !isnan(ybase0) ){
                    node = gfx_new_area(im->canvas,
-                                ii-1+im->xorigin,ybase0,
-                                ii-1+im->xorigin,ytop0,
-                                ii+im->xorigin,ytop,                           
+                                (double)ii-1.2+(double)im->xorigin,ybase0-0.2,
+                                (double)ii-1.2+(double)im->xorigin,ytop0+0.2,
+                                (double)ii+0.2+(double)im->xorigin,ytop+0.2,
                                 im->gdes[i].col
                                );
                    gfx_add_point(node,
-                               ii+im->xorigin,ybase
+                               (double)ii+0.02+im->xorigin,ybase-0.2
                               );
             }
            ybase0=ybase;
@@ -2624,7 +2634,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
   
   if (strcmp(im->graphfile,"-")==0) {
     fo = im->graphhandle ? im->graphhandle : stdout;
-#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
+#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
     /* Change translation mode for stdout to BINARY */
     _setmode( _fileno( fo ), O_BINARY );
 #endif
@@ -2635,7 +2645,7 @@ graph_paint(image_desc_t *im, char ***calcpr)
       return (-1);
     }
   }
-  gfx_render (im->canvas,im->ximg,im->yimg,0x0,fo);
+  gfx_render (im->canvas,im->ximg,im->yimg,0x00000000,fo);
   if (strcmp(im->graphfile,"-") != 0)
     fclose(fo);
   return 0;
@@ -2829,7 +2839,7 @@ rrd_graph_init(image_desc_t *im)
     for(i=0;i<DIM(graph_col);i++)
         im->graph_col[i]=graph_col[i];
 
-#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
+#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
     {
             char *windir; 
            char rrd_win_default_font[1000];
@@ -3102,6 +3112,22 @@ rrd_graph_options(int argc, char *argv[],image_desc_t *im)
                 int ci;
                int col_len = col_end - col_start;
                switch (col_len){
+                       case 3:
+                               color = (
+                                       ((color & 0xF00) * 0x110000) |
+                                       ((color & 0x0F0) * 0x011000) |
+                                       ((color & 0x00F) * 0x001100) |
+                                       0x000000FF
+                                       );
+                               break;
+                       case 4:
+                               color = (
+                                       ((color & 0xF000) * 0x11000) |
+                                       ((color & 0x0F00) * 0x01100) |
+                                       ((color & 0x00F0) * 0x00110) |
+                                       ((color & 0x000F) * 0x00011)
+                                       );
+                               break;
                        case 6:
                                color = (color << 8) + 0xff /* shift left by 8 */;
                                break;