summaryrefslogtreecommitdiff
path: root/src/mbgl/text
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2020-02-11 11:24:14 -0500
committerGitHub <noreply@github.com>2020-02-11 11:24:14 -0500
commit4f18d5fa92df175ac30f856a9273a00349b56cc3 (patch)
tree52efcbe12eb4f40890d6dcdc390036613b233519 /src/mbgl/text
parent98f99e07433d057880dcd30f21bcb4f1e147482d (diff)
downloadqtlocation-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.cpp29
-rw-r--r--src/mbgl/text/placement.hpp3
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;