X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=fad305447bbdb9c2f0b628394e92816ea8e585dc;hb=088be40ba438baaddbbd7135fd20c33135fcaca3;hp=5286ad598f9902897cd6ee81a2413f67a30a262b;hpb=38e3d209effd6f9a3e49d993719808006d9d2ada;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index 5286ad5..fad3054 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -25,7 +25,7 @@ */ /*jshint globalstrict: true */ -/*global Dygraph:false,RGBColor:false */ +/*global Dygraph:false,RGBColorParser:false */ "use strict"; @@ -241,9 +241,9 @@ DygraphCanvasRenderer.prototype._createIEClipArea = function() { * skip over points with missing yVals. */ DygraphCanvasRenderer._getIteratorPredicate = function(connectSeparatedPoints) { - return connectSeparatedPoints - ? DygraphCanvasRenderer._predicateThatSkipsEmptyPoints - : null; + return connectSeparatedPoints ? + DygraphCanvasRenderer._predicateThatSkipsEmptyPoints : + null; }; DygraphCanvasRenderer._predicateThatSkipsEmptyPoints = @@ -335,8 +335,8 @@ DygraphCanvasRenderer._drawSeries = function(e, if (point.canvasy === null || point.canvasy != point.canvasy) { if (stepPlot && prevCanvasX !== null) { // Draw a horizontal line to the start of the missing data - ctx.moveTo(prevX, prevY); - ctx.lineTo(point.canvasx, prevY); + ctx.moveTo(prevCanvasX, prevCanvasY); + ctx.lineTo(point.canvasx, prevCanvasY); } prevCanvasX = prevCanvasY = null; } else { @@ -364,13 +364,12 @@ DygraphCanvasRenderer._drawSeries = function(e, if (stepPlot) { ctx.moveTo(prevCanvasX, prevCanvasY); ctx.lineTo(point.canvasx, prevCanvasY); - prevCanvasX = point.canvasx; } - // TODO(danvk): this moveTo is rarely necessary - ctx.moveTo(prevCanvasX, prevCanvasY); ctx.lineTo(point.canvasx, point.canvasy); } + } else { + ctx.moveTo(point.canvasx, point.canvasy); } if (drawPoints || isIsolated) { pointsOnLine.push([point.canvasx, point.canvasy]); @@ -401,7 +400,7 @@ DygraphCanvasRenderer._drawPointsOnLine = function( e.dygraph, e.setName, ctx, cb[0], cb[1], color, pointSize); ctx.restore(); } -} +}; /** * Attaches canvas coordinates to the points array. @@ -452,6 +451,7 @@ DygraphCanvasRenderer.prototype._renderLineChart = function(opt_seriesName, opt_ var sets = this.layout.points; var setNames = this.layout.setNames; var setCount = setNames.length; + var setName; this.colors = this.dygraph_.colorsMap_; @@ -464,7 +464,7 @@ DygraphCanvasRenderer.prototype._renderLineChart = function(opt_seriesName, opt_ var setPlotters = {}; // series name -> plotter fn. for (i = 0; i < setNames.length; i++) { - var setName = setNames[i]; + setName = setNames[i]; var setPlotter = this.attr_("plotter", setName); if (setPlotter == plotter_attr) continue; // not specialized. @@ -476,7 +476,7 @@ DygraphCanvasRenderer.prototype._renderLineChart = function(opt_seriesName, opt_ var is_last = (i == plotters.length - 1); for (var j = 0; j < sets.length; j++) { - var setName = setNames[j]; + setName = setNames[j]; if (opt_seriesName && setName != opt_seriesName) continue; var points = sets[j]; @@ -572,7 +572,7 @@ DygraphCanvasRenderer._linePlotter = function(e) { drawPointCallback, pointSize ); -} +}; /** * Draws the shaded error bars/confidence intervals for each series. @@ -582,15 +582,15 @@ DygraphCanvasRenderer._linePlotter = function(e) { */ DygraphCanvasRenderer._errorPlotter = function(e) { var g = e.dygraph; + var setName = e.setName; var errorBars = g.getOption("errorBars") || g.getOption("customBars"); if (!errorBars) return; - var fillGraph = g.getOption("fillGraph"); + var fillGraph = g.getOption("fillGraph", setName); if (fillGraph) { g.warn("Can't use fillGraph option with error bars"); } - var setName = e.setName; var ctx = e.drawingContext; var color = e.color; var fillAlpha = g.getOption('fillAlpha', setName); @@ -610,14 +610,22 @@ DygraphCanvasRenderer._errorPlotter = function(e) { var prevYs = [-1, -1]; var yscale = axis.yscale; // should be same color as the lines but only 15% opaque. - var rgb = new RGBColor(color); + var rgb = new RGBColorParser(color); var err_color = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + fillAlpha + ')'; ctx.fillStyle = err_color; ctx.beginPath(); + + var isNullUndefinedOrNaN = function(x) { + return (x === null || + x === undefined || + isNaN(x)); + }; + while (iter.hasNext) { var point = iter.next(); - if (!Dygraph.isOK(point.y)) { + if ((!stepPlot && isNullUndefinedOrNaN(point.y)) || + (stepPlot && !isNaN(prevY) && isNullUndefinedOrNaN(prevY))) { prevX = NaN; continue; } @@ -632,24 +640,22 @@ DygraphCanvasRenderer._errorPlotter = function(e) { newYs[1] = e.plotArea.h * newYs[1] + e.plotArea.y; if (!isNaN(prevX)) { if (stepPlot) { - ctx.moveTo(prevX, newYs[0]); - } else { ctx.moveTo(prevX, prevYs[0]); - } - ctx.lineTo(point.canvasx, newYs[0]); - ctx.lineTo(point.canvasx, newYs[1]); - if (stepPlot) { - ctx.lineTo(prevX, newYs[1]); + ctx.lineTo(point.canvasx, prevYs[0]); + ctx.lineTo(point.canvasx, prevYs[1]); } else { - ctx.lineTo(prevX, prevYs[1]); + ctx.moveTo(prevX, prevYs[0]); + ctx.lineTo(point.canvasx, newYs[0]); + ctx.lineTo(point.canvasx, newYs[1]); } + ctx.lineTo(prevX, prevYs[1]); ctx.closePath(); } prevYs = newYs; prevX = point.canvasx; } ctx.fill(); -} +}; /** * Draws the shaded regions when "fillGraph" is set. Not to be confused with @@ -662,18 +668,12 @@ DygraphCanvasRenderer._errorPlotter = function(e) { * @private */ DygraphCanvasRenderer._fillPlotter = function(e) { - var g = e.dygraph; - if (!g.getOption("fillGraph")) return; - // We'll handle all the series at once, not one-by-one. if (e.seriesIndex !== 0) return; - var ctx = e.drawingContext; - var area = e.plotArea; - var sets = e.allSeriesPoints; - var setCount = sets.length; - + var g = e.dygraph; var setNames = g.getLabels().slice(1); // remove x-axis + // getLabels() includes names for invisible series, which are not included in // allSeriesPoints. We remove those to make the two match. // TODO(danvk): provide a simpler way to get this information. @@ -681,6 +681,20 @@ DygraphCanvasRenderer._fillPlotter = function(e) { if (!g.visibility()[i]) setNames.splice(i, 1); } + var anySeriesFilled = (function() { + for (var i = 0; i < setNames.length; i++) { + if (g.getOption("fillGraph", setNames[i])) return true; + } + return false; + })(); + + if (!anySeriesFilled) return; + + var ctx = e.drawingContext; + var area = e.plotArea; + var sets = e.allSeriesPoints; + var setCount = sets.length; + var fillAlpha = g.getOption('fillAlpha'); var stepPlot = g.getOption('stepPlot'); var stackedGraph = g.getOption("stackedGraph"); @@ -692,6 +706,8 @@ DygraphCanvasRenderer._fillPlotter = function(e) { // process sets in reverse order (needed for stacked graphs) for (var setIdx = setCount - 1; setIdx >= 0; setIdx--) { var setName = setNames[setIdx]; + if (!g.getOption('fillGraph', setName)) continue; + var color = colors[setIdx]; var axis = g.axisPropertiesForSeries(setName); var axisY = 1.0 + axis.minyval * axis.yscale; @@ -710,7 +726,7 @@ DygraphCanvasRenderer._fillPlotter = function(e) { var newYs; var yscale = axis.yscale; // should be same color as the lines but only 15% opaque. - var rgb = new RGBColor(color); + var rgb = new RGBColorParser(color); var err_color = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + fillAlpha + ')'; ctx.fillStyle = err_color;