Code

make sure we do not try to draw points all that far outside the drawing area
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Tue, 9 Nov 2010 16:15:06 +0000 (16:15 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Tue, 9 Nov 2010 16:15:06 +0000 (16:15 +0000)
since some versions of cairo seem to go unstable when this happens. -- Peter Stamfest

git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4@2142 a5681a0c-68f1-0310-ab6d-d61299d08faa

program/src/rrd_graph.c

index 5573e1630921f23726fbb80e9c5ce4a5e45182ad..def9c9ccea38089d7d38bf8032bf9686f217d278 100644 (file)
@@ -3431,16 +3431,26 @@ int graph_paint(
             }
             break;
         case GF_LINE:
-        case GF_AREA:
-            /* fix data points at oo and -oo */
+        case GF_AREA: {
+            rrd_value_t diffval = im->maxval - im->minval;
+            rrd_value_t maxlimit = im->maxval + 9 * diffval;
+            rrd_value_t minlimit = im->minval - 9 * diffval;        
             for (ii = 0; ii < im->xsize; ii++) {
+               /* fix data points at oo and -oo */
                 if (isinf(im->gdes[i].p_data[ii])) {
                     if (im->gdes[i].p_data[ii] > 0) {
                         im->gdes[i].p_data[ii] = im->maxval;
                     } else {
                         im->gdes[i].p_data[ii] = im->minval;
                     }
-
+                }
+                /* some versions of cairo go unstable when trying
+                   to draw way out of the canvas ... lets not even try */
+                if (im->gdes[i].p_data[ii] > maxlimit) {
+                    im->gdes[i].p_data[ii] = maxlimit;
+                }
+                if (im->gdes[i].p_data[ii] < minlimit) {
+                    im->gdes[i].p_data[ii] = minlimit;
                 }
             }           /* for */
 
@@ -3667,6 +3677,7 @@ int graph_paint(
             }
             lastgdes = &(im->gdes[i]);
             break;
+        } /* GF_AREA, GF_LINE, GF_GRAD */
         case GF_STACK:
             rrd_set_error
                 ("STACK should already be turned into LINE or AREA here");