[rrd-developers] Patch to rrd_gfx.c

Travis Spencer travislspencer at gmail.com
Thu Apr 5 23:11:54 CEST 2007


Good Afternoon All,

I was trying to generate some graphs this afternoon w/ the following
command in a batch script:

rrdtool.exe ^
    graph %OUTPUT% ^
    -h 116 ^
    -w 368 ^
    -s -1month ^
    -e now ^
    -c ARROW#000000 ^
    -c MGRID#CCCCCC ^
    -c GRID#FFFFFF ^
    -c FONT#8D8D8D ^
    -c SHADEA#FFFFFF ^
    -c SHADEB#FFFFFF ^
    -c AXIS#000000 ^
    -x HOUR:1:HOUR:1:HOUR:1:0:%%H ^
    -g ^
    -A ^
    -a PNG ^
    DEF:in=%RRD_FILE%.rrd:ds0:AVERAGE ^
    LINE1:in#0000FF

This produced the following error:

...
time 1175760000:  -1.#Je+000
time 1175767500:  -1.#Je+000
time 1175775000:  -1.#Je+000
time 1175782500:  -1.#Je+000
time 1175790000:  -1.#Je+000
time 1175797500:  -1.#Je+000
time 1175805000:  -1.#Je+000
time 1175812500:  -1.#Je+000
digits  0.000  im->magfact  1.000
Min:   0.00 Max:   1.00 MagFactor:   1.00
SCALED Min:  -0.10 Max:   1.10 Factor:   1.00
443x170
ERROR: failed to load C:\WINDOWS\fonts\arial.ttf

I tracked it down to an error in FreeType's ftsystem.c when it called fopen:

    file = fopen( filepathname, "rb" );
    if ( !file )
    {
      FT_ERROR(( "FT_Stream_Open:" ));
      FT_ERROR(( " could not open `%s'\n", filepathname ));

      return FT_Err_Cannot_Open_Resource;
    }

I checked errno at that point, and found that the process had to many
files opened.  I checked the FreeType docs and read that after calling
FT_Open_Face (which gfx_save_png calls indirectly when it invokes
FT_New_Face) FT_Done_Face should be called.  Once I did that, rrdtool
was able to execute my graph function for me.

The patch is included below.  HTH!

-- 

Regards,

Travis Spencer

--- rrd_gfx.c~	Thu Apr 05 13:53:59 2007
+++ rrd_gfx.c	Thu Apr 05 13:50:04 2007

@@ -612,3 +609,4 @@
                                  &face );
 	    if ( error ) {
 	        rrd_set_error("failed to load %s",node->filename);
+           FT_Done_Face(face);

 		break;
 	    }
@@ -620,6 +618,11 @@
                                      (long)(node->size*64),
                                      (long)(100*canvas->zoom),
                                      (long)(100*canvas->zoom));
-            if ( error ) break;
+            if ( error )
+            {
+                FT_Done_Face(face);
+                break;
+            }
+
             pen_x = node->x * canvas->zoom;
             pen_y = node->y * canvas->zoom;

             string = gfx_string_create (canvas, face, node->text,
node->angle, node->tabwidth, node->size);
+            FT_Done_Face(face);
+
             switch(node->halign){
             case GFX_H_RIGHT:  vec.x = -string->bbox.xMax;
                                break;



More information about the rrd-developers mailing list