X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=e5939d0a13f220e4b4012f521267c1f6ec3a7cab;hb=41273327c7eb2aaa777194f48516e69784aef7f1;hp=03bc5e338428eba5e7fce743a065de003528e5cf;hpb=6bf4df7f0f1340de899e819b1b5ccc0235d11aca;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index 03bc5e3..e5939d0 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -586,7 +586,8 @@ DygraphCanvasRenderer.prototype._renderAnnotations = function() { var points = this.layout.annotated_points; for (var i = 0; i < points.length; i++) { var p = points[i]; - if (p.canvasx < this.area.x || p.canvasx > this.area.x + this.area.w) { + if (p.canvasx < this.area.x || p.canvasx > this.area.x + this.area.w || + p.canvasy < this.area.y || p.canvasy > this.area.y + this.area.h) { continue; } @@ -633,13 +634,13 @@ DygraphCanvasRenderer.prototype._renderAnnotations = function() { div.style.borderColor = this.colors[p.name]; a.div = div; - Dygraph.addEvent(div, 'click', + this.dygraph_.addEvent(div, 'click', bindEvt('clickHandler', 'annotationClickHandler', p, this)); - Dygraph.addEvent(div, 'mouseover', + this.dygraph_.addEvent(div, 'mouseover', bindEvt('mouseOverHandler', 'annotationMouseOverHandler', p, this)); - Dygraph.addEvent(div, 'mouseout', + this.dygraph_.addEvent(div, 'mouseout', bindEvt('mouseOutHandler', 'annotationMouseOutHandler', p, this)); - Dygraph.addEvent(div, 'dblclick', + this.dygraph_.addEvent(div, 'dblclick', bindEvt('dblClickHandler', 'annotationDblClickHandler', p, this)); this.container.appendChild(div); @@ -691,6 +692,7 @@ DygraphCanvasRenderer.prototype._drawStyledLine = function( if (!Dygraph.isArrayLike(strokePattern)) { strokePattern = null; } + var drawGapPoints = this.dygraph_.attr_('drawGapPoints', setName); var point; var next = DygraphCanvasRenderer.makeNextPointStep_( @@ -714,6 +716,14 @@ DygraphCanvasRenderer.prototype._drawStyledLine = function( // and next points are null. var isIsolated = (!prevX && (j == points.length - 1 || isNullOrNaN(points[j+1].canvasy))); + if (drawGapPoints) { + // Also consider a point to be is "isolated" if it's adjacent to a + // null point, excluding the graph edges. + if ((j > 0 && !prevX) || + (j < points.length - 1 && isNullOrNaN(points[j+1].canvasy))) { + isIsolated = true; + } + } if (prevX === null) { prevX = point.canvasx; prevY = point.canvasy; @@ -889,7 +899,8 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { ctx.restore(); } else if (fillGraph) { ctx.save(); - var baseline = []; // for stacked graphs: baseline for filling + var baseline = {}; // for stacked graphs: baseline for filling + var currBaseline; // process sets in reverse order (needed for stacked graphs) for (i = setCount - 1; i >= 0; i--) { @@ -926,21 +937,50 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { continue; } if (stackedGraph) { - var lastY = baseline[point.canvasx]; - if (lastY === undefined) lastY = axisY; - baseline[point.canvasx] = point.canvasy; + currBaseline = baseline[point.canvasx]; + var lastY; + if (currBaseline === undefined) { + lastY = axisY; + } else { + if(stepPlot) { + lastY = currBaseline[0]; + } else { + lastY = currBaseline; + } + } newYs = [ point.canvasy, lastY ]; + + if(stepPlot) { + // Step plots must keep track of the top and bottom of + // the baseline at each point. + if(prevYs[0] === -1) { + baseline[point.canvasx] = [ point.canvasy, axisY ]; + } else { + baseline[point.canvasx] = [ point.canvasy, prevYs[0] ]; + } + } else { + baseline[point.canvasx] = point.canvasy; + } + } else { newYs = [ point.canvasy, axisY ]; } if (!isNaN(prevX)) { ctx.moveTo(prevX, prevYs[0]); + if (stepPlot) { ctx.lineTo(point.canvasx, prevYs[0]); + if(currBaseline) { + // Draw to the bottom of the baseline + ctx.lineTo(point.canvasx, currBaseline[1]); + } else { + ctx.lineTo(point.canvasx, newYs[1]); + } } else { ctx.lineTo(point.canvasx, newYs[0]); + ctx.lineTo(point.canvasx, newYs[1]); } - ctx.lineTo(point.canvasx, newYs[1]); + ctx.lineTo(prevX, prevYs[1]); ctx.closePath(); }