summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/source_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/source_state.cpp')
-rw-r--r--src/mbgl/renderer/source_state.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/mbgl/renderer/source_state.cpp b/src/mbgl/renderer/source_state.cpp
index 087e28b2bb..c1b95aca68 100644
--- a/src/mbgl/renderer/source_state.cpp
+++ b/src/mbgl/renderer/source_state.cpp
@@ -58,7 +58,37 @@ void SourceFeatureState::coalesceChanges(std::vector<RenderTile>& tiles) {
}
changes[sourceLayer] = std::move(layerStates);
}
+
+ for (const auto& layerStatesEntry : deletedStates) {
+ const auto& sourceLayer = layerStatesEntry.first;
+ FeatureStates layerStates = { {}, {} };
+
+ if (deletedStates[sourceLayer].empty()) {
+ for (const auto& featureStatesEntry : currentStates[sourceLayer]) {
+ const auto& featureID = featureStatesEntry.first;
+ layerStates[featureID] = {};
+ currentStates[sourceLayer][featureID] = {};
+ }
+ } else {
+ for (const auto& feature : deletedStates[sourceLayer]) {
+ const auto& featureID = feature.first;
+ bool deleteWholeFeatureState = deletedStates[sourceLayer][featureID].empty();
+ if (deleteWholeFeatureState) {
+ currentStates[sourceLayer][featureID] = {};
+ } else {
+ for (const auto& stateEntry : deletedStates[sourceLayer][featureID]) {
+ currentStates[sourceLayer][featureID].erase(stateEntry.first);
+ }
+ }
+ layerStates[featureID] = currentStates[sourceLayer][featureID];
+ }
+ }
+ changes[sourceLayer] = std::move(layerStates);
+ }
+
stateChanges.clear();
+ deletedStates.clear();
+
if (changes.empty()) return;
for (auto& tile : tiles) {
@@ -66,4 +96,28 @@ void SourceFeatureState::coalesceChanges(std::vector<RenderTile>& tiles) {
}
}
+void SourceFeatureState::removeState(const optional<std::string>& sourceLayerID, const optional<std::string>& featureID, const optional<std::string>& stateKey) {
+ std::string sourceLayer = sourceLayerID.value_or(std::string());
+
+ bool sourceLayerDeleted = (deletedStates.count(sourceLayer) > 0) && deletedStates[sourceLayer].empty();
+ if (sourceLayerDeleted) return;
+
+ if (stateKey && featureID) {
+ if ((deletedStates.count(sourceLayer) == 0) && (deletedStates[sourceLayer].count(*featureID)) == 0) {
+ deletedStates[sourceLayer][*featureID][*stateKey] = {};
+ }
+ } else if (featureID) {
+ bool updateInQueue = stateChanges.count(sourceLayer) && stateChanges[sourceLayer].count(*featureID);
+ if (updateInQueue) {
+ for (const auto& changeEntry : stateChanges[sourceLayer][*featureID]) {
+ deletedStates[sourceLayer][*featureID][changeEntry.first] = {};
+ }
+ } else {
+ deletedStates[sourceLayer][*featureID] = {};
+ }
+ } else {
+ deletedStates[sourceLayer] = {};
+ }
+}
+
} // namespace mbgl