diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2020-02-11 11:24:14 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-11 11:24:14 -0500 |
commit | 4f18d5fa92df175ac30f856a9273a00349b56cc3 (patch) | |
tree | 52efcbe12eb4f40890d6dcdc390036613b233519 /src/mbgl/text | |
parent | 98f99e07433d057880dcd30f21bcb4f1e147482d (diff) | |
download | qtlocation-mapboxgl-4f18d5fa92df175ac30f856a9273a00349b56cc3.tar.gz |
[core] sort symbols using symbol-sort-key before placement (#16023)
fix #15964
partially port mapbox/mapbox-gl-js#9054
Diffstat (limited to 'src/mbgl/text')
-rw-r--r-- | src/mbgl/text/placement.cpp | 29 | ||||
-rw-r--r-- | src/mbgl/text/placement.hpp | 3 |
2 files changed, 22 insertions, 10 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index c927fdd782..57cf1f0f1f 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -1,11 +1,11 @@ -#include <mbgl/text/placement.hpp> - +#include <list> #include <mbgl/layout/symbol_layout.hpp> #include <mbgl/renderer/bucket.hpp> #include <mbgl/renderer/buckets/symbol_bucket.hpp> #include <mbgl/renderer/render_layer.hpp> #include <mbgl/renderer/render_tile.hpp> #include <mbgl/renderer/update_parameters.hpp> +#include <mbgl/text/placement.hpp> #include <mbgl/tile/geometry_tile.hpp> #include <mbgl/util/math.hpp> #include <utility> @@ -113,7 +113,12 @@ void Placement::placeLayer(const RenderLayer& layer) { std::set<uint32_t> seenCrossTileIDs; for (const auto& item : layer.getPlacementData()) { Bucket& bucket = item.bucket; - BucketPlacementParameters params{item.tile, layer.baseImpl->source, item.featureIndex}; + BucketPlacementParameters params{item.tile, + layer.baseImpl->source, + item.featureIndex, + item.sortKey, + item.symbolInstanceStart, + item.symbolInstanceEnd}; bucket.place(*this, params, seenCrossTileIDs); } } @@ -656,18 +661,20 @@ void Placement::placeBucket(const SymbolBucket& bucket, } } else { - for (const SymbolInstance& symbol : bucket.symbolInstances) { - placeSymbol(symbol); + auto beginIt = bucket.symbolInstances.begin() + params.symbolInstanceStart; + auto endIt = bucket.symbolInstances.begin() + params.symbolInstanceEnd; + assert(params.symbolInstanceStart < params.symbolInstanceEnd); + assert(params.symbolInstanceEnd <= bucket.symbolInstances.size()); + for (auto it = beginIt; it != endIt; ++it) { + placeSymbol(*it); } } - bucket.justReloaded = false; - // As long as this placement lives, we have to hold onto this bucket's // matching FeatureIndex/data for querying purposes retainedQueryData.emplace(std::piecewise_construct, - std::forward_as_tuple(bucket.bucketInstanceId), - std::forward_as_tuple(bucket.bucketInstanceId, params.featureIndex, overscaledID)); + std::forward_as_tuple(bucket.bucketInstanceId), + std::forward_as_tuple(bucket.bucketInstanceId, params.featureIndex, overscaledID)); } void Placement::commit() { @@ -737,7 +744,9 @@ void Placement::commit() { void Placement::updateLayerBuckets(const RenderLayer& layer, const TransformState& state, bool updateOpacities) const { std::set<uint32_t> seenCrossTileIDs; for (const auto& item : layer.getPlacementData()) { - item.bucket.get().updateVertices(*this, updateOpacities, state, item.tile, seenCrossTileIDs); + if (item.firstInBucket) { + item.bucket.get().updateVertices(*this, updateOpacities, state, item.tile, seenCrossTileIDs); + } } } diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 46d560b673..9fbd6b9743 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -91,6 +91,9 @@ public: const RenderTile& tile; std::string sourceId; std::shared_ptr<FeatureIndex> featureIndex; + float sortKey; + size_t symbolInstanceStart; + size_t symbolInstanceEnd; }; class Placement; |