summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2017-11-07 09:43:14 -0800
committerChris Loer <chris.loer@mapbox.com>2017-11-07 11:01:16 -0800
commitec54aa1e97c36d7b520de42db633633056d20bb5 (patch)
tree0fdf276be94b8e355a31613650231f3dd91d2320
parent36c5e580446212dab5dc629389b0b356c8a2b13d (diff)
downloadqtlocation-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.cpp7
-rw-r--r--src/mbgl/text/placement.cpp19
-rw-r--r--src/mbgl/text/placement.hpp11
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