diff options
author | Chris Loer <chris.loer@gmail.com> | 2017-11-07 09:43:14 -0800 |
---|---|---|
committer | Chris Loer <chris.loer@mapbox.com> | 2017-11-07 11:01:16 -0800 |
commit | ec54aa1e97c36d7b520de42db633633056d20bb5 (patch) | |
tree | 0fdf276be94b8e355a31613650231f3dd91d2320 | |
parent | 36c5e580446212dab5dc629389b0b356c8a2b13d (diff) | |
download | qtlocation-mapboxgl-ec54aa1e97c36d7b520de42db633633056d20bb5.tar.gz |
Fix sanitizer issue caused by adding a duration to TimePoint::max() in MapMode::Still.
Make "recent/stale" Placement state private.
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 7 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/text/placement.hpp | 11 |
3 files changed, 28 insertions, 9 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index bccdb576a7..36d8895085 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -374,7 +374,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } bool placementChanged = false; - if (placement->recentUntil <= parameters.timePoint || updateParameters.mode == MapMode::Still) { + if (!placement->stillRecent(parameters.timePoint)) { auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode); for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is<RenderSymbolLayer>()) { @@ -387,10 +387,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { placement = std::move(newPlacement); } - placement->stale = false; - placement->recentUntil = parameters.timePoint + Duration(std::chrono::milliseconds(300)); + placement->setRecent(parameters.timePoint); } else { - placement->stale = true; + placement->setStale(); } parameters.symbolFadeChange = placement->symbolFadeChange(parameters.timePoint); diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 4abf154d5c..2df946cb67 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -32,9 +32,9 @@ bool JointOpacityState::isHidden() const { Placement::Placement(const TransformState& state_, MapMode mapMode_) : collisionIndex(state_) - , recentUntil(TimePoint::min()) , state(state_) , mapMode(mapMode_) + , recentUntil(TimePoint::min()) {} void Placement::placeLayer(RenderSymbolLayer& symbolLayer, const mat4& projMatrix, bool showCollisionBoxes) { @@ -292,4 +292,21 @@ bool Placement::hasTransitions(TimePoint now) const { return symbolFadeChange(now) < 1.0 || stale; } +bool Placement::stillRecent(TimePoint now) const { + return mapMode == MapMode::Continuous && recentUntil > now; +} +void Placement::setRecent(TimePoint now) { + stale = false; + if (mapMode == MapMode::Continuous) { + // Only set in continuous mode because "now" isn't defined in still mode + recentUntil = now + Duration(std::chrono::milliseconds(300)); + } +} + +void Placement::setStale() { + stale = true; +} + + + } // namespace mbgl diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 0aaf104dff..fd36ad25e9 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -49,10 +49,10 @@ namespace mbgl { // TODO: public for queryRenderedFeatures CollisionIndex collisionIndex; - - TimePoint recentUntil; - bool stale = false; - + + bool stillRecent(TimePoint now) const; + void setRecent(TimePoint now); + void setStale(); private: void placeLayerBucket( @@ -73,6 +73,9 @@ namespace mbgl { std::unordered_map<uint32_t,PlacementPair> placements; std::unordered_map<uint32_t,JointOpacityState> opacities; + + TimePoint recentUntil; + bool stale = false; }; } // namespace mbgl |