summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/geometry_tile_worker.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-04-26 12:42:17 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-04-26 16:29:44 -0700
commit1c42daa152c1e7302c0997c00e206cf7c4b33d73 (patch)
treeedc0115651ed5e2931c8362016d2e7da5928f3ea /src/mbgl/tile/geometry_tile_worker.cpp
parentea0e45b4019ea18c03718e67a3397202080a644a (diff)
downloadqtlocation-mapboxgl-1c42daa152c1e7302c0997c00e206cf7c4b33d73.tar.gz
[core] Tweak handling of annotation special case SpriteAtlas
* Simplify SymbolLayout; it never needs to care about more than one SpriteAtlas. * Move the reference from SymbolLayer::Impl to SymbolBucket. This is a prerequisite for making layer Impls immutable.
Diffstat (limited to 'src/mbgl/tile/geometry_tile_worker.cpp')
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp35
1 files changed, 13 insertions, 22 deletions
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp
index b745cccc89..550e06bae2 100644
--- a/src/mbgl/tile/geometry_tile_worker.cpp
+++ b/src/mbgl/tile/geometry_tile_worker.cpp
@@ -216,14 +216,9 @@ void GeometryTileWorker::onGlyphsAvailable(GlyphPositionMap newGlyphPositions) {
symbolDependenciesChanged();
}
-void GeometryTileWorker::onIconsAvailable(IconAtlasMap newIcons) {
- for (auto& atlasIcons : newIcons) {
- auto pendingAtlasIcons = pendingIconDependencies.find((SpriteAtlas*)atlasIcons.first);
- if (pendingAtlasIcons != pendingIconDependencies.end()) {
- icons[atlasIcons.first] = std::move(newIcons[atlasIcons.first]);
- pendingIconDependencies.erase((SpriteAtlas*)atlasIcons.first);
- }
- }
+void GeometryTileWorker::onIconsAvailable(IconMap newIcons) {
+ icons = std::move(newIcons);
+ pendingIconDependencies.clear();
symbolDependenciesChanged();
}
@@ -241,12 +236,8 @@ void GeometryTileWorker::requestNewGlyphs(const GlyphDependencies& glyphDependen
}
}
-void GeometryTileWorker::requestNewIcons(const IconDependencyMap &iconDependencies) {
- for (auto& atlasDependency : iconDependencies) {
- if (icons.find((uintptr_t)atlasDependency.first) == icons.end()) {
- pendingIconDependencies[atlasDependency.first] = IconDependencies();
- }
- }
+void GeometryTileWorker::requestNewIcons(const IconDependencies& iconDependencies) {
+ pendingIconDependencies = iconDependencies;
if (!pendingIconDependencies.empty()) {
parent.invoke(&GeometryTile::getIcons, pendingIconDependencies);
}
@@ -290,9 +281,9 @@ void GeometryTileWorker::redoLayout() {
std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets;
auto featureIndex = std::make_unique<FeatureIndex>();
BucketParameters parameters { id, mode };
-
+
GlyphDependencies glyphDependencies;
- IconDependencyMap iconDependencyMap;
+ IconDependencies iconDependencies;
// Create render layers and group by layout
std::vector<std::unique_ptr<RenderLayer>> renderLayers = toRenderLayers(*layers, id.overscaledZ);
@@ -323,7 +314,7 @@ void GeometryTileWorker::redoLayout() {
if (leader.is<RenderSymbolLayer>()) {
symbolLayoutMap.emplace(leader.getID(),
- leader.as<RenderSymbolLayer>()->createLayout(parameters, group, *geometryLayer, glyphDependencies, iconDependencyMap));
+ leader.as<RenderSymbolLayer>()->createLayout(parameters, group, *geometryLayer, glyphDependencies, iconDependencies));
} else {
const Filter& filter = leader.baseImpl.filter;
const std::string& sourceLayerID = leader.baseImpl.sourceLayer;
@@ -357,9 +348,9 @@ void GeometryTileWorker::redoLayout() {
symbolLayouts.push_back(std::move(it->second));
}
}
-
+
requestNewGlyphs(glyphDependencies);
- requestNewIcons(iconDependencyMap);
+ requestNewIcons(iconDependencies);
parent.invoke(&GeometryTile::onLayout, GeometryTile::LayoutResult {
std::move(buckets),
@@ -403,12 +394,12 @@ void GeometryTileWorker::attemptPlacement() {
if (obsolete) {
return;
}
-
+
if (symbolLayout->state == SymbolLayout::Pending) {
- symbolLayout->prepare(glyphPositions,icons);
+ symbolLayout->prepare(glyphPositions, icons);
symbolLayout->state = SymbolLayout::Placed;
}
-
+
if (!symbolLayout->hasSymbolInstances()) {
continue;
}