From 436d8eb5e09948b3baa86570fe16e3964fddaae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 23 May 2016 13:27:43 +0200 Subject: [core] introduce TileDataObserver avoids passing around bound callback functions --- src/mbgl/style/source.cpp | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) (limited to 'src/mbgl/style/source.cpp') diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp index 51e6334440..a31c804b01 100644 --- a/src/mbgl/style/source.cpp +++ b/src/mbgl/style/source.cpp @@ -197,9 +197,6 @@ std::unique_ptr Source::createTile(const OverscaledTileID& overscaledT return data; } - auto callback = std::bind(&Source::tileLoadingCallback, this, overscaledTileID, - std::placeholders::_1, true); - // If we don't find working tile data, we're just going to load it. if (type == SourceType::Raster) { assert(!tileset->tiles.empty()); @@ -207,7 +204,8 @@ std::unique_ptr Source::createTile(const OverscaledTileID& overscaledT tileset->tiles.at(0), parameters.pixelRatio, overscaledTileID.canonical.x, overscaledTileID.canonical.y, overscaledTileID.canonical.z); auto data = std::make_unique(overscaledTileID, parameters.texturePool, - parameters.worker, callback); + parameters.worker); + data->setObserver(this); data->setTileSource( std::make_unique(*data, resource, parameters.fileSource)); @@ -216,7 +214,8 @@ std::unique_ptr Source::createTile(const OverscaledTileID& overscaledT return std::move(data); } else { auto data = std::make_unique(overscaledTileID, id, parameters.style, - parameters.mode, callback); + parameters.mode); + data->setObserver(this); if (type == SourceType::Vector) { assert(!tileset->tiles.empty()); const auto resource = Resource::tile( @@ -327,6 +326,9 @@ bool Source::update(const UpdateParameters& parameters) { } } + const PlacementConfig newConfig{ parameters.transformState.getAngle(), + parameters.transformState.getPitch(), + parameters.debugOptions & MapDebugOptions::Collision }; for (auto& pair : tileDataMap) { auto tileData = pair.second.get(); if (parameters.shouldReparsePartialTiles && tileData->isIncomplete()) { @@ -334,10 +336,7 @@ bool Source::update(const UpdateParameters& parameters) { allTilesUpdated = false; } } else { - tileData->redoPlacement({ parameters.transformState.getAngle(), - parameters.transformState.getPitch(), - parameters.debugOptions & MapDebugOptions::Collision }, - [this]() { observer->onPlacementRedone(); }); + tileData->redoPlacement(newConfig); } } @@ -406,28 +405,17 @@ void Source::setObserver(SourceObserver* observer_) { observer = observer_; } -void Source::tileLoadingCallback(const OverscaledTileID& tileID, - std::exception_ptr error, - bool isNewTile) { - auto it = tileDataMap.find(tileID); - if (it == tileDataMap.end()) { - return; - } - - auto& tileData = it->second; - if (!tileData) { - return; - } +void Source::onTileLoaded(TileData& tileData, bool isNewTile) { + tileData.redoPlacement(); + observer->onTileLoaded(*this, tileData.id, isNewTile); +} - if (error) { - observer->onTileError(*this, tileID, error); - return; - } +void Source::onTileError(TileData& tileData, std::exception_ptr error) { + observer->onTileError(*this, tileData.id, error); +} - tileData->redoPlacement([this]() { - observer->onPlacementRedone(); - }); - observer->onTileLoaded(*this, tileID, isNewTile); +void Source::onPlacementRedone(TileData&) { + observer->onPlacementRedone(); } void Source::dumpDebugLogs() const { -- cgit v1.2.1