diff options
Diffstat (limited to 'src/mbgl/style/custom_tile_loader.cpp')
-rw-r--r-- | src/mbgl/style/custom_tile_loader.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/mbgl/style/custom_tile_loader.cpp b/src/mbgl/style/custom_tile_loader.cpp new file mode 100644 index 0000000000..91832f82ba --- /dev/null +++ b/src/mbgl/style/custom_tile_loader.cpp @@ -0,0 +1,67 @@ +#include <mbgl/style/custom_tile_loader.hpp> + +namespace mbgl { +namespace style { + +CustomTileLoader::CustomTileLoader(const TileFunction& fetchTileFn, const TileFunction& cancelTileFn) { + fetchTileFunction = fetchTileFn; + cancelTileFunction = cancelTileFn; +} + +void CustomTileLoader::fetchTile(const OverscaledTileID& tileID, ActorRef<SetTileDataFunction> callbackRef) { + auto cachedTileData = dataCache.find(tileID.canonical); + if (cachedTileData == dataCache.end()) { + fetchTileFunction(tileID.canonical); + } else { + callbackRef.invoke(&SetTileDataFunction::operator(), *(cachedTileData->second)); + } + auto tileCallbacks = tileCallbackMap.find(tileID.canonical); + if (tileCallbacks == tileCallbackMap.end()) { + auto tuple = std::make_tuple(tileID.overscaledZ, tileID.wrap, callbackRef); + tileCallbackMap.insert({ tileID.canonical, std::vector<OverscaledIDFunctionTuple>(1, tuple) }); + } + else { + for(auto iter = tileCallbacks->second.begin(); iter != tileCallbacks->second.end(); iter++) { + if(std::get<0>(*iter) == tileID.overscaledZ && std::get<1>(*iter) == tileID.wrap ) { + std::get<2>(*iter) = callbackRef; + return; + } + } + tileCallbacks->second.emplace_back(std::make_tuple(tileID.overscaledZ, tileID.wrap, callbackRef)); + } +} + +void CustomTileLoader::cancelTile(const OverscaledTileID& tileID) { + if(tileCallbackMap.find(tileID.canonical) != tileCallbackMap.end()) { + cancelTileFunction(tileID.canonical); + } +} + +void CustomTileLoader::removeTile(const OverscaledTileID& tileID) { + auto tileCallbacks = tileCallbackMap.find(tileID.canonical); + if (tileCallbacks == tileCallbackMap.end()) return; + for(auto iter = tileCallbacks->second.begin(); iter != tileCallbacks->second.end(); iter++) { + if(std::get<0>(*iter) == tileID.overscaledZ && std::get<1>(*iter) == tileID.wrap ) { + tileCallbacks->second.erase(iter); + break; + } + } + if (tileCallbacks->second.size() == 0) { + tileCallbackMap.erase(tileCallbacks); + dataCache.erase(tileID.canonical); + } + +} + +void CustomTileLoader::setTileData(const CanonicalTileID& tileID, const mapbox::geojson::geojson& data) { + auto iter = tileCallbackMap.find(tileID); + if (iter == tileCallbackMap.end()) return; + dataCache[tileID] = std::make_unique<mapbox::geojson::geojson>(std::move(data)); + for(auto tuple : iter->second) { + auto actor = std::get<2>(tuple); + actor.invoke(&SetTileDataFunction::operator(), data); + } +} + +} // namespace style +} // namespace mbgl |