X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=8dc502cb007226f837969ebffdbc0cabaa0b9360;hb=fccae3c0438703452b1a077421c1074982dd4344;hp=c12622f8eb2aca62adff706245174eaf02ddf07d;hpb=2f5e7e1a7f5fd071b08ce92167fcab8863234075;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index c12622f..8dc502c 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -309,17 +309,21 @@ DygraphCanvasRenderer = function(dygraph, element, layout, options) { // Set up a clipping area for the canvas (and the interaction canvas). // This ensures that we don't overdraw. - var ctx = this.element.getContext("2d"); + var ctx = this.dygraph_.canvas_.getContext("2d"); ctx.beginPath(); ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h); ctx.clip(); - var ctx = this.dygraph_.hidden_.getContext("2d"); + ctx = this.dygraph_.hidden_.getContext("2d"); ctx.beginPath(); ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h); ctx.clip(); }; +DygraphCanvasRenderer.prototype.attr_ = function(x) { + return this.dygraph_.attr_(x); +}; + DygraphCanvasRenderer.prototype.clear = function() { if (this.isIE) { // VML takes a while to start up, so we just poll every this.IEDelay @@ -343,15 +347,15 @@ DygraphCanvasRenderer.prototype.clear = function() { for (var i = 0; i < this.xlabels.length; i++) { var el = this.xlabels[i]; - el.parentNode.removeChild(el); + if (el.parentNode) el.parentNode.removeChild(el); } for (var i = 0; i < this.ylabels.length; i++) { var el = this.ylabels[i]; - el.parentNode.removeChild(el); + if (el.parentNode) el.parentNode.removeChild(el); } for (var i = 0; i < this.annotations.length; i++) { var el = this.annotations[i]; - el.parentNode.removeChild(el); + if (el.parentNode) el.parentNode.removeChild(el); } this.xlabels = new Array(); this.ylabels = new Array(); @@ -382,11 +386,16 @@ DygraphCanvasRenderer.isSupported = function(canvasName) { * Draw an X/Y grid on top of the existing plot */ DygraphCanvasRenderer.prototype.render = function() { - // Draw the new X/Y grid + // Draw the new X/Y grid. Lines appear crisper when pixels are rounded to + // half-integers. This prevents them from drawing in two rows/cols. var ctx = this.element.getContext("2d"); + function halfUp(x){return Math.round(x)+0.5}; + function halfDown(y){return Math.round(y)-0.5}; if (this.options.underlayCallback) { - this.options.underlayCallback(ctx, this.area, this.layout, this.dygraph_); + // NOTE: we pass the dygraph object to this callback twice to avoid breaking + // users who expect a deprecated form of this callback. + this.options.underlayCallback(ctx, this.area, this.dygraph_, this.dygraph_); } if (this.options.drawYGrid) { @@ -397,8 +406,8 @@ DygraphCanvasRenderer.prototype.render = function() { for (var i = 0; i < ticks.length; i++) { // TODO(danvk): allow secondary axes to draw a grid, too. if (ticks[i][0] != 0) continue; - var x = this.area.x; - var y = this.area.y + ticks[i][1] * this.area.h; + var x = halfUp(this.area.x); + var y = halfDown(this.area.y + ticks[i][1] * this.area.h); ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x + this.area.w, y); @@ -413,8 +422,8 @@ DygraphCanvasRenderer.prototype.render = function() { ctx.strokeStyle = this.options.gridLineColor; ctx.lineWidth = this.options.axisLineWidth; for (var i=0; i