X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-layout.js;h=c870d3bf797c8f5f83bb6fbb39de407fb3924392;hb=8ae015b50696f7cdbe20d2bec89cf9e9267738e3;hp=99ae50c6800ca396e483d5e6b8bd8cf3812a86ba;hpb=22bce4f209d99203fcb3c3892ddf5ddb6d359b93;p=dygraphs.git diff --git a/dygraph-layout.js b/dygraph-layout.js index 99ae50c..c870d3b 100644 --- a/dygraph-layout.js +++ b/dygraph-layout.js @@ -129,32 +129,70 @@ DygraphLayout.prototype._evaluateLimits = function() { DygraphLayout.prototype._evaluateLineCharts = function() { // add all the rects this.points = new Array(); + // An array to keep track of how many points will be drawn for each set. + // This will allow for the canvas renderer to not have to check every point + // for every data set since the points are added in order of the sets in + // datasets. + this.setPointsLengths = new Array(); + for (var setName in this.datasets) { if (!this.datasets.hasOwnProperty(setName)) continue; var dataset = this.datasets[setName]; var axis = this.dygraph_.axisPropertiesForSeries(setName); + var graphWidth = this.dygraph_.width_; + var graphHeight = this.dygraph_.height_; + var prevXPx = NaN; + var prevYPx = NaN; + var currXPx = NaN; + var currYPx = NaN; + var setPointsLength = 0; + + // Ignore the pixel skipping optimization if there are error bars. + // XXX 2011-07-25 temporarily disabled (see autotests/tests/selection.js) + var skip_opt = (true || + this.attr_("errorBars") || + this.attr_("customBars") || + this.annotations.length > 0); + for (var j = 0; j < dataset.length; j++) { var item = dataset[j]; + var xValue = parseFloat(dataset[j][0]); + var yValue = parseFloat(dataset[j][1]); - var yval; + // Range from 0-1 where 0 represents top and 1 represents bottom + var xNormal = (xValue - this.minxval) * this.xscale; + // Range from 0-1 where 0 represents left and 1 represents right. + var yNormal; if (axis.logscale) { - yval = 1.0 - ((Dygraph.log10(parseFloat(item[1])) - Dygraph.log10(axis.minyval)) * axis.ylogscale); // really should just be yscale. + yNormal = 1.0 - ((Dygraph.log10(yValue) - Dygraph.log10(axis.minyval)) * axis.ylogscale); } else { - yval = 1.0 - ((parseFloat(item[1]) - axis.minyval) * axis.yscale); + yNormal = 1.0 - ((yValue - axis.minyval) * axis.yscale); + } + + // Current pixel coordinates that the data point would fill. + currXPx = Math.round(xNormal * graphWidth); + currYPx = Math.round(yNormal * graphHeight); + + // Skip over pushing points that lie on the same pixel. + // TODO(antrob): optimize this for graphs with error bars. + if (skip_opt || prevXPx != currXPx || prevYPx != currYPx) { + var point = { + // TODO(danvk): here + x: xNormal, + y: yNormal, + xval: xValue, + yval: yValue, + name: setName + }; + this.points.push(point); + setPointsLength += 1; } - var point = { - // TODO(danvk): here - x: ((parseFloat(item[0]) - this.minxval) * this.xscale), - y: yval, - xval: parseFloat(item[0]), - yval: parseFloat(item[1]), - name: setName - }; - - this.points.push(point); + prevXPx = currXPx; + prevYPx = currYPx; } + this.setPointsLengths.push(setPointsLength); } };