From 311c9f949df32012740c2c6940272d4c920fcb03 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 30 Nov 2017 12:10:43 -0800 Subject: [PATCH] Fix cross-fading of *-pattern and line-dasharray --- src/style/evaluation_parameters.js | 8 ++ src/style/properties.js | 3 +- src/ui/map.js | 12 ++- .../mapbox-gl-js#5740/expected.png | Bin 0 -> 11496 bytes .../regressions/mapbox-gl-js#5740/style.json | 72 ++++++++++++++++++ test/suite_implementation.js | 2 +- 6 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#5740/expected.png create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#5740/style.json diff --git a/src/style/evaluation_parameters.js b/src/style/evaluation_parameters.js index 26cc2d375c9..78c83e7f6ce 100644 --- a/src/style/evaluation_parameters.js +++ b/src/style/evaluation_parameters.js @@ -24,6 +24,14 @@ class EvaluationParameters { this.transition = {}; } } + + crossFadingFactor() { + if (this.fadeDuration === 0) { + return 1; + } else { + return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); + } + } } module.exports = EvaluationParameters; diff --git a/src/style/properties.js b/src/style/properties.js index 0ba5774239e..44efd4e1ed2 100644 --- a/src/style/properties.js +++ b/src/style/properties.js @@ -607,8 +607,7 @@ class CrossFadedProperty implements Property> { _calculate(min: T, mid: T, max: T, parameters: EvaluationParameters): ?CrossFaded { const z = parameters.zoom; const fraction = z - Math.floor(z); - const d = parameters.fadeDuration; - const t = d !== 0 ? Math.min((parameters.now - parameters.zoomHistory.lastIntegerZoomTime) / d, 1) : 1; + const t = parameters.crossFadingFactor(); return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid, fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t } : { from: max, to: mid, fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction }; diff --git a/src/ui/map.js b/src/ui/map.js index 10472067dc3..db970383bc5 100755 --- a/src/ui/map.js +++ b/src/ui/map.js @@ -243,6 +243,7 @@ class Map extends Camera { _hash: Hash; _delegatedListeners: any; _fadeDuration: number; + _crossFadingFactor: number; scrollZoom: ScrollZoomHandler; boxZoom: BoxZoomHandler; @@ -270,6 +271,7 @@ class Map extends Camera { this._bearingSnap = options.bearingSnap; this._refreshExpiredTiles = options.refreshExpiredTiles; this._fadeDuration = options.fadeDuration; + this._crossFadingFactor = 1; const transformRequestFn = options.transformRequest; this._transformRequest = transformRequestFn ? (url, type) => transformRequestFn(url, type) || ({ url }) : (url) => ({ url }); @@ -1459,6 +1461,8 @@ class Map extends Camera { this._updateEase(); } + let crossFading = false; + // If the style has changed, the map is being zoomed, or a transition or fade is in progress: // - Apply style changes (in a batch) // - Recalculate paint properties. @@ -1476,6 +1480,12 @@ class Map extends Camera { transition: util.extend({ duration: 300, delay: 0 }, this.style.stylesheet.transition) }); + const factor = parameters.crossFadingFactor(); + if (factor !== 1 || factor !== this._crossFadingFactor) { + crossFading = true; + this._crossFadingFactor = factor; + } + this.style.update(parameters); } @@ -1505,7 +1515,7 @@ class Map extends Camera { this.fire('load'); } - if (this.style && this.style.hasTransitions()) { + if (this.style && (this.style.hasTransitions() || crossFading)) { this._styleDirty = true; } diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#5740/expected.png b/test/integration/render-tests/regressions/mapbox-gl-js#5740/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c86291d37b329589cd6519931e9c194adb02fbdb GIT binary patch literal 11496 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