summaryrefslogtreecommitdiff
path: root/src/mbgl/layout
diff options
context:
space:
mode:
authorzmiao <miao.zhao@mapbox.com>2019-08-30 08:24:03 +0300
committerGitHub <noreply@github.com>2019-08-30 08:24:03 +0300
commit6ef2710e5cfb5ee4258583a20d55320e90faa8a5 (patch)
tree1c840291ea93ec38c2745348678879f10217bf7c /src/mbgl/layout
parent29b11a503766efb469036b38f010400cea57967e (diff)
downloadqtlocation-mapboxgl-6ef2710e5cfb5ee4258583a20d55320e90faa8a5.tar.gz
[core] fix collisionBox alignment when Icon/text translation is enabled (#15467)
* add initial fix * fix bug for collision circle * refind code structure * fix indentation * update test * refind code structure * Add changelog * Add comment for boolean
Diffstat (limited to 'src/mbgl/layout')
-rw-r--r--src/mbgl/layout/symbol_layout.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp
index fe169785ce..0ee4143894 100644
--- a/src/mbgl/layout/symbol_layout.cpp
+++ b/src/mbgl/layout/symbol_layout.cpp
@@ -812,12 +812,15 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) {
return;
}
- for (const SymbolInstance &symbolInstance : symbolInstances) {
- auto populateCollisionBox = [&](const auto& feature) {
- SymbolBucket::CollisionBuffer& collisionBuffer = feature.alongLine ?
- static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateCollisionCircleBuffer()) :
- static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateCollisionBox());
- for (const CollisionBox &box : feature.boxes) {
+ for (const SymbolInstance& symbolInstance : symbolInstances) {
+ auto populateCollisionBox = [&](const auto& feature, bool isText) {
+ SymbolBucket::CollisionBuffer& collisionBuffer =
+ feature.alongLine ? (isText ? static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateTextCollisionCircleBuffer())
+ : static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateIconCollisionCircleBuffer()))
+ : (isText ? static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateTextCollisionBox())
+ : static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateIconCollisionBox()));
+
+ for (const CollisionBox& box : feature.boxes) {
auto& anchor = box.anchor;
Point<float> tl{box.x1, box.y1};
@@ -829,8 +832,11 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) {
const std::size_t indexLength = feature.alongLine ? 6 : 8;
if (collisionBuffer.segments.empty() || collisionBuffer.segments.back().vertexLength + vertexLength > std::numeric_limits<uint16_t>::max()) {
- collisionBuffer.segments.emplace_back(collisionBuffer.vertices.elements(),
- feature.alongLine ? bucket.collisionCircle->triangles.elements() : bucket.collisionBox->lines.elements());
+ collisionBuffer.segments.emplace_back(
+ collisionBuffer.vertices.elements(),
+ feature.alongLine
+ ? (isText ? bucket.textCollisionCircle->triangles.elements() : bucket.iconCollisionCircle->triangles.elements())
+ : (isText ? bucket.textCollisionBox->lines.elements() : bucket.iconCollisionBox->lines.elements()));
}
auto& segment = collisionBuffer.segments.back();
@@ -850,27 +856,29 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) {
collisionBuffer.dynamicVertices.emplace_back(dynamicVertex);
if (feature.alongLine) {
- bucket.collisionCircle->triangles.emplace_back(index, index + 1, index + 2);
- bucket.collisionCircle->triangles.emplace_back(index, index + 2, index + 3);
+ auto& collisionCircle = (isText ? bucket.textCollisionCircle : bucket.iconCollisionCircle);
+ collisionCircle->triangles.emplace_back(index, index + 1, index + 2);
+ collisionCircle->triangles.emplace_back(index, index + 2, index + 3);
} else {
- bucket.collisionBox->lines.emplace_back(index + 0, index + 1);
- bucket.collisionBox->lines.emplace_back(index + 1, index + 2);
- bucket.collisionBox->lines.emplace_back(index + 2, index + 3);
- bucket.collisionBox->lines.emplace_back(index + 3, index + 0);
+ auto& collisionBox = (isText ? bucket.textCollisionBox : bucket.iconCollisionBox);
+ collisionBox->lines.emplace_back(index + 0, index + 1);
+ collisionBox->lines.emplace_back(index + 1, index + 2);
+ collisionBox->lines.emplace_back(index + 2, index + 3);
+ collisionBox->lines.emplace_back(index + 3, index + 0);
}
segment.vertexLength += vertexLength;
segment.indexLength += indexLength;
}
};
- populateCollisionBox(symbolInstance.textCollisionFeature);
+ populateCollisionBox(symbolInstance.textCollisionFeature, true /*isText*/);
if (symbolInstance.verticalTextCollisionFeature) {
- populateCollisionBox(*symbolInstance.verticalTextCollisionFeature);
+ populateCollisionBox(*symbolInstance.verticalTextCollisionFeature, true /*isText*/);
}
if (symbolInstance.verticalIconCollisionFeature) {
- populateCollisionBox(*symbolInstance.verticalIconCollisionFeature);
+ populateCollisionBox(*symbolInstance.verticalIconCollisionFeature, false /*isText*/);
}
- populateCollisionBox(symbolInstance.iconCollisionFeature);
+ populateCollisionBox(symbolInstance.iconCollisionFeature, false /*isText*/);
}
}