summaryrefslogtreecommitdiff
path: root/src/mbgl/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/layout')
-rw-r--r--src/mbgl/layout/symbol_instance.cpp17
-rw-r--r--src/mbgl/layout/symbol_instance.hpp9
-rw-r--r--src/mbgl/layout/symbol_layout.cpp32
-rw-r--r--src/mbgl/layout/symbol_layout.hpp6
4 files changed, 46 insertions, 18 deletions
diff --git a/src/mbgl/layout/symbol_instance.cpp b/src/mbgl/layout/symbol_instance.cpp
index 094f859830..5c92d2f678 100644
--- a/src/mbgl/layout/symbol_instance.cpp
+++ b/src/mbgl/layout/symbol_instance.cpp
@@ -31,10 +31,10 @@ SymbolInstanceSharedData::SymbolInstanceSharedData(GeometryCoordinates line_,
: line(std::move(line_)) {
// Create the quads used for rendering the icon and glyphs.
if (shapedIcon) {
- iconQuad = getIconQuad(*shapedIcon, getAnyShaping(shapedTextOrientations).writingMode, iconType);
+ iconQuads = getIconQuads(*shapedIcon, getAnyShaping(shapedTextOrientations).writingMode, iconType);
if (verticallyShapedIcon) {
- verticalIconQuad =
- getIconQuad(*verticallyShapedIcon, shapedTextOrientations.vertical.writingMode, iconType);
+ verticalIconQuads =
+ getIconQuads(*verticallyShapedIcon, shapedTextOrientations.vertical.writingMode, iconType);
}
}
@@ -130,6 +130,7 @@ SymbolInstance::SymbolInstance(Anchor& anchor_,
centerJustifiedGlyphQuadsSize = sharedData->centerJustifiedGlyphQuads.size();
leftJustifiedGlyphQuadsSize = sharedData->leftJustifiedGlyphQuads.size();
verticalGlyphQuadsSize = sharedData->verticalGlyphQuads.size();
+ iconQuadsSize = sharedData->iconQuads ? sharedData->iconQuads->size() : 0;
if (rightJustifiedGlyphQuadsSize || centerJustifiedGlyphQuadsSize || leftJustifiedGlyphQuadsSize) {
writingModes |= WritingModeType::Horizontal;
@@ -165,11 +166,11 @@ const SymbolQuads& SymbolInstance::verticalGlyphQuads() const {
return sharedData->verticalGlyphQuads;
}
-const optional<SymbolQuad>& SymbolInstance::iconQuad() const {
+const optional<SymbolQuads>& SymbolInstance::iconQuads() const {
assert(sharedData);
- return sharedData->iconQuad;
+ return sharedData->iconQuads;
}
-
+
bool SymbolInstance::hasText() const {
return static_cast<bool>(symbolContent & SymbolContent::Text);
}
@@ -182,9 +183,9 @@ bool SymbolInstance::hasSdfIcon() const {
return static_cast<bool>(symbolContent & SymbolContent::IconSDF);
}
-const optional<SymbolQuad>& SymbolInstance::verticalIconQuad() const {
+const optional<SymbolQuads>& SymbolInstance::verticalIconQuads() const {
assert(sharedData);
- return sharedData->verticalIconQuad;
+ return sharedData->verticalIconQuads;
}
void SymbolInstance::releaseSharedData() {
diff --git a/src/mbgl/layout/symbol_instance.hpp b/src/mbgl/layout/symbol_instance.hpp
index e20c05a0ab..74124d3364 100644
--- a/src/mbgl/layout/symbol_instance.hpp
+++ b/src/mbgl/layout/symbol_instance.hpp
@@ -41,8 +41,8 @@ struct SymbolInstanceSharedData {
SymbolQuads centerJustifiedGlyphQuads;
SymbolQuads leftJustifiedGlyphQuads;
SymbolQuads verticalGlyphQuads;
- optional<SymbolQuad> iconQuad;
- optional<SymbolQuad> verticalIconQuad;
+ optional<SymbolQuads> iconQuads;
+ optional<SymbolQuads> verticalIconQuads;
};
class SymbolInstance {
@@ -79,8 +79,8 @@ public:
bool hasText() const;
bool hasIcon() const;
bool hasSdfIcon() const;
- const optional<SymbolQuad>& iconQuad() const;
- const optional<SymbolQuad>& verticalIconQuad() const;
+ const optional<SymbolQuads>& iconQuads() const;
+ const optional<SymbolQuads>& verticalIconQuads() const;
void releaseSharedData();
private:
@@ -94,6 +94,7 @@ public:
std::size_t centerJustifiedGlyphQuadsSize;
std::size_t leftJustifiedGlyphQuadsSize;
std::size_t verticalGlyphQuadsSize;
+ std::size_t iconQuadsSize;
CollisionFeature textCollisionFeature;
CollisionFeature iconCollisionFeature;
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp
index 8fea0858e4..98274136ec 100644
--- a/src/mbgl/layout/symbol_layout.cpp
+++ b/src/mbgl/layout/symbol_layout.cpp
@@ -745,7 +745,7 @@ void SymbolLayout::createBucket(const ImagePositions&, std::unique_ptr<FeatureIn
if (hasIcon) {
const Range<float> sizeData = bucket->iconSizeBinder->getVertexSizeData(feature);
auto& iconBuffer = symbolInstance.hasSdfIcon() ? bucket->sdfIcon : bucket->icon;
- const auto placeIcon = [&](const SymbolQuad& iconQuad, auto& index, const WritingModeType writingMode) {
+ const auto placeIcon = [&](const SymbolQuads& iconQuads, auto& index, const WritingModeType writingMode) {
iconBuffer.placedSymbols.emplace_back(symbolInstance.anchor.point,
symbolInstance.anchor.segment.value_or(0u),
sizeData.min,
@@ -757,13 +757,15 @@ void SymbolLayout::createBucket(const ImagePositions&, std::unique_ptr<FeatureIn
index = iconBuffer.placedSymbols.size() - 1;
PlacedSymbol& iconSymbol = iconBuffer.placedSymbols.back();
iconSymbol.angle = (allowVerticalPlacement && writingMode == WritingModeType::Vertical) ? M_PI_2 : 0;
- iconSymbol.vertexStartIndex = addSymbol(iconBuffer, sizeData, iconQuad,
- symbolInstance.anchor, iconSymbol, feature.sortKey);
+ iconSymbol.vertexStartIndex =
+ addSymbols(iconBuffer, sizeData, iconQuads, symbolInstance.anchor, iconSymbol, feature.sortKey);
};
- placeIcon(*symbolInstance.iconQuad(), symbolInstance.placedIconIndex, WritingModeType::None);
- if (symbolInstance.verticalIconQuad()) {
- placeIcon(*symbolInstance.verticalIconQuad(), symbolInstance.placedVerticalIconIndex, WritingModeType::Vertical);
+ placeIcon(*symbolInstance.iconQuads(), symbolInstance.placedIconIndex, WritingModeType::None);
+ if (symbolInstance.verticalIconQuads()) {
+ placeIcon(*symbolInstance.verticalIconQuads(),
+ symbolInstance.placedVerticalIconIndex,
+ WritingModeType::Vertical);
}
for (auto& pair : bucket->paintProperties) {
@@ -959,6 +961,24 @@ size_t SymbolLayout::addSymbol(SymbolBucket::Buffer& buffer,
return index;
}
+size_t SymbolLayout::addSymbols(SymbolBucket::Buffer& buffer,
+ const Range<float> sizeData,
+ const SymbolQuads& symbols,
+ const Anchor& labelAnchor,
+ PlacedSymbol& placedSymbol,
+ float sortKey) {
+ bool firstSymbol = true;
+ size_t firstIndex = 0;
+ for (auto& symbol : symbols) {
+ const size_t index = addSymbol(buffer, sizeData, symbol, labelAnchor, placedSymbol, sortKey);
+ if (firstSymbol) {
+ firstIndex = index;
+ firstSymbol = false;
+ }
+ }
+ return firstIndex;
+}
+
void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) {
if (!hasSymbolInstances()) {
diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp
index 57a104bf45..b906b0b36c 100644
--- a/src/mbgl/layout/symbol_layout.hpp
+++ b/src/mbgl/layout/symbol_layout.hpp
@@ -81,6 +81,12 @@ private:
const Anchor& labelAnchor,
PlacedSymbol& placedSymbol,
float sortKey);
+ size_t addSymbols(SymbolBucket::Buffer&,
+ const Range<float> sizeData,
+ const SymbolQuads&,
+ const Anchor& labelAnchor,
+ PlacedSymbol& placedSymbol,
+ float sortKey);
// Adds symbol quads to bucket and returns formatted section index of last
// added quad.