From 76bddcf042466d24b735980151964e26a6bc3b08 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Dec 2013 17:46:01 +0100 Subject: [PATCH 1/3] Pass tolerance to ol.render.canvas.ReplayGroup constructor --- src/ol/render/canvas/canvasreplay.js | 9 ++++++++- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 14763abc57..42eebc6f86 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -1063,9 +1063,10 @@ ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function() { * @constructor * @implements {ol.render.IReplayGroup} * @param {number} pixelRatio Pixel ratio. + * @param {number} tolerance Tolerance. * @struct */ -ol.render.canvas.ReplayGroup = function(pixelRatio) { +ol.render.canvas.ReplayGroup = function(pixelRatio, tolerance) { /** * @private @@ -1073,6 +1074,12 @@ ol.render.canvas.ReplayGroup = function(pixelRatio) { */ this.pixelRatio_ = pixelRatio; + /** + * @private + * @type {number} + */ + this.tolerance_ = tolerance; + /** * @private * @type {Object. Date: Tue, 17 Dec 2013 17:46:28 +0100 Subject: [PATCH 2/3] Pass tolerance to ol.render.canvas.Replay constructors --- src/ol/render/canvas/canvasreplay.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 42eebc6f86..58c62adf41 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -42,10 +42,11 @@ ol.render.canvas.Instruction = { * @constructor * @implements {ol.render.IRender} * @param {number} pixelRatio Pixel ratio. + * @param {number} tolerance Tolerance. * @protected * @struct */ -ol.render.canvas.Replay = function(pixelRatio) { +ol.render.canvas.Replay = function(pixelRatio, tolerance) { /** * @protected @@ -53,6 +54,12 @@ ol.render.canvas.Replay = function(pixelRatio) { */ this.pixelRatio = pixelRatio; + /** + * @protected + * @type {number} + */ + this.tolerance = tolerance; + /** * @private * @type {Array.<*>} @@ -438,12 +445,13 @@ ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod; * @constructor * @extends {ol.render.canvas.Replay} * @param {number} pixelRatio Pixel ratio. + * @param {number} tolerance Tolerance. * @protected * @struct */ -ol.render.canvas.ImageReplay = function(pixelRatio) { +ol.render.canvas.ImageReplay = function(pixelRatio, tolerance) { - goog.base(this, pixelRatio); + goog.base(this, pixelRatio, tolerance); /** * @private @@ -597,12 +605,13 @@ ol.render.canvas.ImageReplay.prototype.setImageStyle = function(imageStyle) { * @constructor * @extends {ol.render.canvas.Replay} * @param {number} pixelRatio Pixel ratio. + * @param {number} tolerance Tolerance. * @protected * @struct */ -ol.render.canvas.LineStringReplay = function(pixelRatio) { +ol.render.canvas.LineStringReplay = function(pixelRatio, tolerance) { - goog.base(this, pixelRatio); + goog.base(this, pixelRatio, tolerance); /** * @private @@ -800,12 +809,13 @@ ol.render.canvas.LineStringReplay.prototype.setFillStrokeStyle = * @constructor * @extends {ol.render.canvas.Replay} * @param {number} pixelRatio Pixel ratio. + * @param {number} tolerance Tolerance. * @protected * @struct */ -ol.render.canvas.PolygonReplay = function(pixelRatio) { +ol.render.canvas.PolygonReplay = function(pixelRatio, tolerance) { - goog.base(this, pixelRatio); + goog.base(this, pixelRatio, tolerance); /** * @private @@ -1272,7 +1282,7 @@ ol.render.canvas.ReplayGroup.prototype.getReplay = if (!goog.isDef(replay)) { var constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType]; goog.asserts.assert(goog.isDef(constructor)); - replay = new constructor(this.pixelRatio_); + replay = new constructor(this.pixelRatio_, this.tolerance_); replayes[replayType] = replay; } return replay; @@ -1291,7 +1301,7 @@ ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { * @const * @private * @type {Object.} + * function(new: ol.render.canvas.Replay, number, number)>} */ ol.render.canvas.BATCH_CONSTRUCTORS_ = { 'Image': ol.render.canvas.ImageReplay, From 9bc92b2166ea87cf3f8e3edca702d61d50a78f70 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Dec 2013 17:46:43 +0100 Subject: [PATCH 3/3] Always quantize all polygons --- src/ol/render/canvas/canvasreplay.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 58c62adf41..6ab1f12fcc 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -14,6 +14,7 @@ goog.require('ol.array'); goog.require('ol.color'); goog.require('ol.extent'); goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); goog.require('ol.render.IRender'); goog.require('ol.render.IReplayGroup'); goog.require('ol.render.canvas'); @@ -984,6 +985,18 @@ ol.render.canvas.PolygonReplay.prototype.finish = function() { goog.asserts.assert(!goog.isNull(this.state_)); this.reverseHitDetectionInstructions_(); this.state_ = null; + // We want to preserve topology when drawing polygons. Polygons are + // simplified using quantization and point elimination. However, we might + // have received a mix of quantized and non-quantized geometries, so ensure + // that all are quantized by quantizing all coordinates in the batch. + var tolerance = this.tolerance; + if (tolerance !== 0) { + var coordinates = this.coordinates; + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + coordinates[i] = ol.geom.simplify.snap(coordinates[i], tolerance); + } + } };