From e8c99e4e6311d92cefee37beeb57f093689db20b Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 11 Nov 2015 17:01:54 -0700 Subject: [PATCH] Allow style function to return a style --- src/ol/feature.js | 3 +- .../canvas/canvasvectorlayerrenderer.js | 16 +++++++--- .../canvas/canvasvectortilelayerrenderer.js | 30 ++++++++++++++----- src/ol/renderer/dom/domvectorlayerrenderer.js | 16 +++++++--- .../webgl/webglvectorlayerrenderer.js | 16 +++++++--- src/ol/style/style.js | 2 +- 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/ol/feature.js b/src/ol/feature.js index 3742770cd9..0088e93c76 100644 --- a/src/ol/feature.js +++ b/src/ol/feature.js @@ -290,7 +290,8 @@ ol.Feature.prototype.setGeometryName = function(name) { * resolution. The `this` keyword inside the function references the * {@link ol.Feature} to be styled. * - * @typedef {function(this: ol.Feature, number): Array.} + * @typedef {function(this: ol.Feature, number): + * (ol.style.Style|Array.)} * @api stable */ ol.FeatureStyleFunction; diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index d4652c81ba..6ff320cd3e 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -321,7 +321,8 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = * @param {ol.Feature} feature Feature. * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. - * @param {Array.} styles Array of styles + * @param {(ol.style.Style|Array.)} styles The style or array of + * styles. * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group. * @return {boolean} `true` if an image is loading. */ @@ -330,10 +331,17 @@ ol.renderer.canvas.VectorLayer.prototype.renderFeature = if (!styles) { return false; } - var i, ii, loading = false; - for (i = 0, ii = styles.length; i < ii; ++i) { + var loading = false; + if (goog.isArray(styles)) { + for (var i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + this.handleStyleImageChange_, this) || loading; + } + } else { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], + replayGroup, feature, styles, ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), this.handleStyleImageChange_, this) || loading; } diff --git a/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js b/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js index 820ebd4ce7..66d0f494a8 100644 --- a/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js @@ -201,13 +201,20 @@ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup = function(tile, */ function renderFeature(feature) { var styles; - if (feature.getStyleFunction()) { + var styleFunction = feature.getStyleFunction(); + if (styleFunction) { goog.asserts.assertInstanceof(feature, ol.Feature, 'Got an ol.Feature'); - styles = feature.getStyleFunction().call(feature, resolution); - } else if (layer.getStyleFunction()) { - styles = layer.getStyleFunction()(feature, resolution); + styles = styleFunction.call(feature, resolution); + } else { + styleFunction = layer.getStyleFunction(); + if (styleFunction) { + styles = styleFunction(feature, resolution); + } } if (styles) { + if (!goog.isArray(styles)) { + styles = [styles]; + } var dirty = this.renderFeature(feature, squaredTolerance, styles, replayGroup); this.dirty_ = this.dirty_ || dirty; @@ -423,7 +430,8 @@ ol.renderer.canvas.VectorTileLayer.prototype.prepareFrame = /** * @param {ol.Feature|ol.render.Feature} feature Feature. * @param {number} squaredTolerance Squared tolerance. - * @param {Array.} styles Array of styles + * @param {(ol.style.Style|Array.)} styles The style or array of + * styles. * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group. * @return {boolean} `true` if an image is loading. */ @@ -432,10 +440,16 @@ ol.renderer.canvas.VectorTileLayer.prototype.renderFeature = if (!styles) { return false; } - var i, ii, loading = false; - for (i = 0, ii = styles.length; i < ii; ++i) { + var loading = false; + if (goog.isArray(styles)) { + for (var i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], squaredTolerance, + this.handleStyleImageChange_, this) || loading; + } + } else { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], squaredTolerance, + replayGroup, feature, styles, squaredTolerance, this.handleStyleImageChange_, this) || loading; } return loading; diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index e44c5f5ad6..444d2eab62 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -329,7 +329,8 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame = * @param {ol.Feature} feature Feature. * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. - * @param {Array.} styles Array of styles + * @param {(ol.style.Style|Array.)} styles The style or array of + * styles. * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group. * @return {boolean} `true` if an image is loading. */ @@ -338,10 +339,17 @@ ol.renderer.dom.VectorLayer.prototype.renderFeature = if (!styles) { return false; } - var i, ii, loading = false; - for (i = 0, ii = styles.length; i < ii; ++i) { + var loading = false; + if (goog.isArray(styles)) { + for (var i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + this.handleStyleImageChange_, this) || loading; + } + } else { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], + replayGroup, feature, styles, ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), this.handleStyleImageChange_, this) || loading; } diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index ae84186a9e..c9d9f47e4b 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -297,7 +297,8 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame = * @param {ol.Feature} feature Feature. * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. - * @param {Array.} styles Array of styles + * @param {(ol.style.Style|Array.)} styles The style or array of + * styles. * @param {ol.render.webgl.ReplayGroup} replayGroup Replay group. * @return {boolean} `true` if an image is loading. */ @@ -306,10 +307,17 @@ ol.renderer.webgl.VectorLayer.prototype.renderFeature = if (!styles) { return false; } - var i, ii, loading = false; - for (i = 0, ii = styles.length; i < ii; ++i) { + var loading = false; + if (goog.isArray(styles)) { + for (var i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + this.handleStyleImageChange_, this) || loading; + } + } else { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], + replayGroup, feature, styles, ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), this.handleStyleImageChange_, this) || loading; } diff --git a/src/ol/style/style.js b/src/ol/style/style.js index 5adb92755e..46420cc44e 100644 --- a/src/ol/style/style.js +++ b/src/ol/style/style.js @@ -199,7 +199,7 @@ ol.style.Style.prototype.setZIndex = function(zIndex) { * {@link ol.style.Style}. This way e.g. a vector layer can be styled. * * @typedef {function((ol.Feature|ol.render.Feature), number): - * Array.} + * (ol.style.Style|Array.)} * @api */ ol.style.StyleFunction;