From def1af449263de7a2dc4a8f4d45b212458b1d3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 22 Aug 2014 18:08:26 +0200 Subject: [PATCH 1/2] No composeFrame if prepareFrame returns false --- .../renderer/canvas/canvasimagelayerrenderer.js | 1 + src/ol/renderer/canvas/canvasmaprenderer.js | 5 +++-- .../renderer/canvas/canvastilelayerrenderer.js | 1 + .../canvas/canvasvectorlayerrenderer.js | 5 +++-- src/ol/renderer/dom/domimagelayerrenderer.js | 1 + src/ol/renderer/dom/domtilelayerrenderer.js | 3 ++- src/ol/renderer/layerrenderer.js | 1 + .../renderer/webgl/webglimagelayerrenderer.js | 2 ++ src/ol/renderer/webgl/webglmaprenderer.js | 17 +++++++---------- src/ol/renderer/webgl/webgltilelayerrenderer.js | 1 + 10 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 221437b514..d72653f122 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -143,4 +143,5 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = this.updateLogos(frameState, imageSource); } + return true; }; diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index a68643fcb1..cac28502a2 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -188,8 +188,9 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { layerState.sourceState != ol.source.State.READY) { continue; } - layerRenderer.prepareFrame(frameState, layerState); - layerRenderer.composeFrame(frameState, layerState, context); + if (layerRenderer.prepareFrame(frameState, layerState)) { + layerRenderer.composeFrame(frameState, layerState, context); + } } this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index bdab178548..1589e1b662 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -415,4 +415,5 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = (origin[0] - center[0]) / tilePixelResolution, (center[1] - origin[1]) / tilePixelResolution); + return true; }; diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index a3756b7609..4e90b9b973 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -176,7 +176,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || frameState.viewHints[ol.ViewHint.INTERACTING])) { - return; + return true; } var frameStateExtent = frameState.extent; @@ -195,7 +195,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { - return; + return true; } var extent = this.renderedExtent_; @@ -258,6 +258,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = this.renderedRenderOrder_ = vectorLayerRenderOrder; this.replayGroup_ = replayGroup; + return true; }; diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js index 9b67145bab..acd7cfad84 100644 --- a/src/ol/renderer/dom/domimagelayerrenderer.js +++ b/src/ol/renderer/dom/domimagelayerrenderer.js @@ -138,6 +138,7 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame = this.updateLogos(frameState, imageSource); } + return true; }; diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 38385d0c96..6e7a97ce69 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -86,7 +86,7 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame = goog.style.setElementShown(this.target, false); this.renderedVisible_ = false; } - return; + return true; } var pixelRatio = frameState.pixelRatio; @@ -263,6 +263,7 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame = this.scheduleExpireCache(frameState, tileSource); this.updateLogos(frameState, tileSource); + return true; }; diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index e1a902b729..ef9ee9029d 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -98,6 +98,7 @@ ol.renderer.Layer.prototype.handleImageChange = function(event) { /** * @param {olx.FrameState} frameState Frame state. * @param {ol.layer.LayerState} layerState Layer state. + * @return {boolean} whether composeFrame should be called. */ ol.renderer.Layer.prototype.prepareFrame = goog.abstractMethod; diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index b0c90ebde3..a179015151 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -175,6 +175,8 @@ ol.renderer.webgl.ImageLayer.prototype.prepareFrame = this.updateAttributions(frameState.attributions, image.getAttributions()); this.updateLogos(frameState, imageSource); } + + return true; }; diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index ccc697c3f8..fa84cac5b8 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -2,6 +2,7 @@ goog.provide('ol.renderer.webgl.Map'); +goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); @@ -448,23 +449,19 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { var layerStatesToDraw = []; var layerStatesArray = frameState.layerStatesArray; var viewResolution = frameState.viewState.resolution; - var i, ii, layerState; + var i, ii, layerRenderer, layerState; for (i = 0, ii = layerStatesArray.length; i < ii; ++i) { layerState = layerStatesArray[i]; if (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) && layerState.sourceState == ol.source.State.READY) { - layerStatesToDraw.push(layerState); + layerRenderer = this.getLayerRenderer(layerState.layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + if (layerRenderer.prepareFrame(frameState, layerState)) { + layerStatesToDraw.push(layerState); + } } } - var layerRenderer; - for (i = 0, ii = layerStatesToDraw.length; i < ii; ++i) { - layerState = layerStatesToDraw[i]; - layerRenderer = this.getLayerRenderer(layerState.layer); - goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); - layerRenderer.prepareFrame(frameState, layerState); - } - var width = frameState.size[0] * frameState.pixelRatio; var height = frameState.size[1] * frameState.pixelRatio; if (this.canvas_.width != width || this.canvas_.height != height) { diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index fa74f38204..84df851850 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -331,4 +331,5 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame = -0.5, 0); + return true; }; From 73df93969a28efe6e98459a38564ca77295afe62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 22 Aug 2014 18:09:46 +0200 Subject: [PATCH 2/2] No composeFrame if layer and view don't intersect ol.renderer.canvas.TileLayer#prepareFrame immediately returns false if the layer extent and the view extent do not intersect. --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 1589e1b662..c30acb9aab 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -197,6 +197,10 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = if (goog.isDef(layerState.extent)) { extent = ol.extent.getIntersection(extent, layerState.extent); } + if (ol.extent.isEmpty(extent)) { + // Return false to prevent the rendering of the layer. + return false; + } var tileRange = tileGrid.getTileRangeForExtentAndResolution( extent, tileResolution);