From 27d30e428655ecb95f73240e21b984bbfc103094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 5 Dec 2014 12:13:20 +0100 Subject: [PATCH 1/5] Replay replays in correct order for hit detection --- src/ol/render/canvas/canvasreplay.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index e2ab0f38e0..e47cee9a74 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -1892,12 +1892,13 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( zs, context, extent, transform, viewRotation, skippedFeaturesHash, geometryCallback) { - var i, ii, replays, replayType, replay, result; + var i, ii, j, replays, replay, result; for (i = 0, ii = zs.length; i < ii; ++i) { replays = this.replaysByZIndex_[zs[i].toString()]; - for (replayType in replays) { - replay = replays[replayType]; - if (ol.extent.intersects(extent, replay.getExtent())) { + for (j = ol.render.REPLAY_ORDER.length - 1; j >= 0; --j) { + replay = replays[ol.render.REPLAY_ORDER[j]]; + if (goog.isDef(replay) && + ol.extent.intersects(extent, replay.getExtent())) { result = replay.replayHitDetection(context, transform, viewRotation, skippedFeaturesHash, geometryCallback); if (result) { From b3ad50018da5cb7b5a584ba819b83da28946e436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 5 Dec 2014 12:13:51 +0100 Subject: [PATCH 2/5] Remove unused local variable --- src/ol/render/canvas/canvasreplay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index e47cee9a74..bb13f67ea4 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -1944,7 +1944,7 @@ ol.render.canvas.ReplayGroup.prototype.replay_ = function( context.closePath(); context.clip(); - var i, ii, j, jj, replays, replayType, replay, result; + var i, ii, j, jj, replays, replay, result; for (i = 0, ii = zs.length; i < ii; ++i) { replays = this.replaysByZIndex_[zs[i].toString()]; for (j = 0, jj = ol.render.REPLAY_ORDER.length; j < jj; ++j) { From 4c2a0d2053c46da87916b3d31d0b99cb801defe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 5 Dec 2014 12:14:15 +0100 Subject: [PATCH 3/5] Remove unused code in the canvas replay code --- src/ol/render/canvas/canvasreplay.js | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index bb13f67ea4..f258184250 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -461,13 +461,11 @@ ol.render.canvas.Replay.prototype.replay_ = function( * @param {goog.vec.Mat4.Number} transform Transform. * @param {number} viewRotation View rotation. * @param {Object} skippedFeaturesHash Ids of features to skip - * @return {T|undefined} Callback result. - * @template T */ ol.render.canvas.Replay.prototype.replay = function( context, pixelRatio, transform, viewRotation, skippedFeaturesHash) { var instructions = this.instructions; - return this.replay_(context, pixelRatio, transform, viewRotation, + this.replay_(context, pixelRatio, transform, viewRotation, skippedFeaturesHash, instructions, undefined); }; @@ -1863,15 +1861,13 @@ ol.render.canvas.ReplayGroup = function(tolerance, maxExtent, resolution) { * @param {goog.vec.Mat4.Number} transform Transform. * @param {number} viewRotation View rotation. * @param {Object} skippedFeaturesHash Ids of features to skip - * @return {T|undefined} Callback result. - * @template T */ ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, pixelRatio, transform, viewRotation, skippedFeaturesHash) { /** @type {Array.} */ var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); goog.array.sort(zs); - return this.replay_(zs, context, extent, pixelRatio, transform, + this.replay_(zs, context, extent, pixelRatio, transform, viewRotation, skippedFeaturesHash); }; @@ -1920,8 +1916,6 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( * @param {goog.vec.Mat4.Number} transform Transform. * @param {number} viewRotation View rotation. * @param {Object} skippedFeaturesHash Ids of features to skip - * @return {T|undefined} Callback result. - * @template T */ ol.render.canvas.ReplayGroup.prototype.replay_ = function( zs, context, extent, pixelRatio, transform, viewRotation, @@ -1951,17 +1945,13 @@ ol.render.canvas.ReplayGroup.prototype.replay_ = function( replay = replays[ol.render.REPLAY_ORDER[j]]; if (goog.isDef(replay) && ol.extent.intersects(extent, replay.getExtent())) { - result = replay.replay(context, pixelRatio, transform, viewRotation, + replay.replay(context, pixelRatio, transform, viewRotation, skippedFeaturesHash); - if (result) { - return result; - } } } } context.restore(); - return undefined; }; From 9421bbd362c350e9ea10904dbe40c0c3a89d2d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 5 Dec 2014 12:29:53 +0100 Subject: [PATCH 4/5] More clean-ups in the canvas replay code --- src/ol/render/canvas/canvasreplay.js | 42 ++++++++-------------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index f258184250..aea0cae552 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -1854,27 +1854,8 @@ ol.render.canvas.ReplayGroup = function(tolerance, maxExtent, resolution) { }; -/** - * @param {CanvasRenderingContext2D} context Context. - * @param {ol.Extent} extent Extent. - * @param {number} pixelRatio Pixel ratio. - * @param {goog.vec.Mat4.Number} transform Transform. - * @param {number} viewRotation View rotation. - * @param {Object} skippedFeaturesHash Ids of features to skip - */ -ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, - pixelRatio, transform, viewRotation, skippedFeaturesHash) { - /** @type {Array.} */ - var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); - goog.array.sort(zs); - this.replay_(zs, context, extent, pixelRatio, transform, - viewRotation, skippedFeaturesHash); -}; - - /** * @private - * @param {Array.} zs Z-indices array. * @param {CanvasRenderingContext2D} context Context. * @param {ol.Extent} extent Extent. * @param {goog.vec.Mat4.Number} transform Transform. @@ -1886,8 +1867,12 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, * @template T */ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( - zs, context, extent, transform, viewRotation, skippedFeaturesHash, + context, extent, transform, viewRotation, skippedFeaturesHash, geometryCallback) { + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs, function(a, b) { return b - a; }); + var i, ii, j, replays, replay, result; for (i = 0, ii = zs.length; i < ii; ++i) { replays = this.replaysByZIndex_[zs[i].toString()]; @@ -1908,8 +1893,6 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( /** - * @private - * @param {Array.} zs Z-indices array. * @param {CanvasRenderingContext2D} context Context. * @param {ol.Extent} extent Extent. * @param {number} pixelRatio Pixel ratio. @@ -1917,9 +1900,12 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( * @param {number} viewRotation View rotation. * @param {Object} skippedFeaturesHash Ids of features to skip */ -ol.render.canvas.ReplayGroup.prototype.replay_ = function( - zs, context, extent, pixelRatio, transform, viewRotation, - skippedFeaturesHash) { +ol.render.canvas.ReplayGroup.prototype.replay = function( + context, extent, pixelRatio, transform, viewRotation, skippedFeaturesHash) { + + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs); var maxExtent = this.maxExtent_; var minX = maxExtent[0]; @@ -1974,14 +1960,10 @@ ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function( 1 / resolution, -1 / resolution, -rotation, -coordinate[0], -coordinate[1]); - /** @type {Array.} */ - var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); - goog.array.sort(zs, function(a, b) { return b - a; }); - var context = this.hitDetectionContext_; context.clearRect(0, 0, 1, 1); - return this.replayHitDetection_(zs, context, extent, transform, + return this.replayHitDetection_(context, extent, transform, rotation, skippedFeaturesHash, /** * @param {ol.geom.Geometry} geometry Geometry. From a820ccea5a29cc4df3ce9153263599e030f3c49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 5 Dec 2014 12:32:54 +0100 Subject: [PATCH 5/5] Use alphabetical order for canvas ReplayGroup methods --- src/ol/render/canvas/canvasreplay.js | 202 +++++++++++++-------------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index aea0cae552..cc1c8ac75b 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -1855,40 +1855,90 @@ ol.render.canvas.ReplayGroup = function(tolerance, maxExtent, resolution) { /** - * @private - * @param {CanvasRenderingContext2D} context Context. + * FIXME empty description for jsdoc + */ +ol.render.canvas.ReplayGroup.prototype.finish = function() { + var zKey; + for (zKey in this.replaysByZIndex_) { + var replays = this.replaysByZIndex_[zKey]; + var replayKey; + for (replayKey in replays) { + replays[replayKey].finish(); + } + } +}; + + +/** * @param {ol.Extent} extent Extent. - * @param {goog.vec.Mat4.Number} transform Transform. - * @param {number} viewRotation View rotation. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {ol.Coordinate} coordinate Coordinate. * @param {Object} skippedFeaturesHash Ids of features to skip - * @param {function(ol.geom.Geometry, Object): T} geometryCallback Geometry - * callback. + * @param {function(ol.geom.Geometry, Object): T} callback Geometry callback. * @return {T|undefined} Callback result. * @template T */ -ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( - context, extent, transform, viewRotation, skippedFeaturesHash, - geometryCallback) { - /** @type {Array.} */ - var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); - goog.array.sort(zs, function(a, b) { return b - a; }); +ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function( + extent, resolution, rotation, coordinate, + skippedFeaturesHash, callback) { - var i, ii, j, replays, replay, result; - for (i = 0, ii = zs.length; i < ii; ++i) { - replays = this.replaysByZIndex_[zs[i].toString()]; - for (j = ol.render.REPLAY_ORDER.length - 1; j >= 0; --j) { - replay = replays[ol.render.REPLAY_ORDER[j]]; - if (goog.isDef(replay) && - ol.extent.intersects(extent, replay.getExtent())) { - result = replay.replayHitDetection(context, transform, viewRotation, - skippedFeaturesHash, geometryCallback); - if (result) { - return result; + var transform = this.hitDetectionTransform_; + ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5, + 1 / resolution, -1 / resolution, -rotation, + -coordinate[0], -coordinate[1]); + + var context = this.hitDetectionContext_; + context.clearRect(0, 0, 1, 1); + + return this.replayHitDetection_(context, extent, transform, + rotation, skippedFeaturesHash, + /** + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Opaque data object. + * @return {?} Callback result. + */ + function(geometry, data) { + var imageData = context.getImageData(0, 0, 1, 1).data; + if (imageData[3] > 0) { + var result = callback(geometry, data); + if (result) { + return result; + } + context.clearRect(0, 0, 1, 1); } - } - } + }); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ReplayGroup.prototype.getReplay = + function(zIndex, replayType) { + var zIndexKey = goog.isDef(zIndex) ? zIndex.toString() : '0'; + var replays = this.replaysByZIndex_[zIndexKey]; + if (!goog.isDef(replays)) { + replays = {}; + this.replaysByZIndex_[zIndexKey] = replays; } - return undefined; + var replay = replays[replayType]; + if (!goog.isDef(replay)) { + var Constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType]; + goog.asserts.assert(goog.isDef(Constructor)); + replay = new Constructor(this.tolerance_, this.maxExtent_, + this.resolution_); + replays[replayType] = replay; + } + return replay; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { + return goog.object.isEmpty(this.replaysByZIndex_); }; @@ -1942,90 +1992,40 @@ ol.render.canvas.ReplayGroup.prototype.replay = function( /** + * @private + * @param {CanvasRenderingContext2D} context Context. * @param {ol.Extent} extent Extent. - * @param {number} resolution Resolution. - * @param {number} rotation Rotation. - * @param {ol.Coordinate} coordinate Coordinate. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. * @param {Object} skippedFeaturesHash Ids of features to skip - * @param {function(ol.geom.Geometry, Object): T} callback Geometry callback. + * @param {function(ol.geom.Geometry, Object): T} geometryCallback Geometry + * callback. * @return {T|undefined} Callback result. * @template T */ -ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function( - extent, resolution, rotation, coordinate, - skippedFeaturesHash, callback) { +ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( + context, extent, transform, viewRotation, skippedFeaturesHash, + geometryCallback) { + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs, function(a, b) { return b - a; }); - var transform = this.hitDetectionTransform_; - ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5, - 1 / resolution, -1 / resolution, -rotation, - -coordinate[0], -coordinate[1]); - - var context = this.hitDetectionContext_; - context.clearRect(0, 0, 1, 1); - - return this.replayHitDetection_(context, extent, transform, - rotation, skippedFeaturesHash, - /** - * @param {ol.geom.Geometry} geometry Geometry. - * @param {Object} data Opaque data object. - * @return {?} Callback result. - */ - function(geometry, data) { - var imageData = context.getImageData(0, 0, 1, 1).data; - if (imageData[3] > 0) { - var result = callback(geometry, data); - if (result) { - return result; - } - context.clearRect(0, 0, 1, 1); + var i, ii, j, replays, replay, result; + for (i = 0, ii = zs.length; i < ii; ++i) { + replays = this.replaysByZIndex_[zs[i].toString()]; + for (j = ol.render.REPLAY_ORDER.length - 1; j >= 0; --j) { + replay = replays[ol.render.REPLAY_ORDER[j]]; + if (goog.isDef(replay) && + ol.extent.intersects(extent, replay.getExtent())) { + result = replay.replayHitDetection(context, transform, viewRotation, + skippedFeaturesHash, geometryCallback); + if (result) { + return result; } - }); -}; - - -/** - * FIXME empty description for jsdoc - */ -ol.render.canvas.ReplayGroup.prototype.finish = function() { - var zKey; - for (zKey in this.replaysByZIndex_) { - var replays = this.replaysByZIndex_[zKey]; - var replayKey; - for (replayKey in replays) { - replays[replayKey].finish(); + } } } -}; - - -/** - * @inheritDoc - */ -ol.render.canvas.ReplayGroup.prototype.getReplay = - function(zIndex, replayType) { - var zIndexKey = goog.isDef(zIndex) ? zIndex.toString() : '0'; - var replays = this.replaysByZIndex_[zIndexKey]; - if (!goog.isDef(replays)) { - replays = {}; - this.replaysByZIndex_[zIndexKey] = replays; - } - var replay = replays[replayType]; - if (!goog.isDef(replay)) { - var Constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType]; - goog.asserts.assert(goog.isDef(Constructor)); - replay = new Constructor(this.tolerance_, this.maxExtent_, - this.resolution_); - replays[replayType] = replay; - } - return replay; -}; - - -/** - * @inheritDoc - */ -ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { - return goog.object.isEmpty(this.replaysByZIndex_); + return undefined; };