get rid of separate vector for symbol geometries
This commit is contained in:
@@ -86,11 +86,31 @@ std::vector<SymbolFeature> SymbolBucket::processFeatures(const VectorTileLayer &
|
||||
}
|
||||
|
||||
if (ft.label.length() || ft.sprite.length()) {
|
||||
ft.geometry = feature.geometry;
|
||||
|
||||
auto &multiline = ft.geometry;
|
||||
|
||||
// Decode line
|
||||
Geometry::command cmd;
|
||||
pbf geom(feature.geometry);
|
||||
Geometry geometry(geom);
|
||||
bool first = true;
|
||||
int32_t x, y;
|
||||
while ((cmd = geometry.next(x, y)) != Geometry::end) {
|
||||
if (first || cmd == Geometry::move_to) {
|
||||
multiline.emplace_back();
|
||||
first = false;
|
||||
}
|
||||
multiline.back().emplace_back(x, y);
|
||||
}
|
||||
|
||||
features.push_back(std::move(ft));
|
||||
}
|
||||
}
|
||||
|
||||
if (properties.placement == PlacementType::Line) {
|
||||
util::mergeLines(features);
|
||||
}
|
||||
|
||||
glyphStore.waitForGlyphRanges(properties.text.font, ranges);
|
||||
sprite.waitUntilLoaded();
|
||||
|
||||
@@ -146,36 +166,8 @@ void SymbolBucket::addFeatures(const VectorTileLayer &layer, const FilterExpress
|
||||
|
||||
const FontStack &fontStack = glyphStore.getFontStack(properties.text.font);
|
||||
|
||||
std::vector<std::vector<std::vector<Coordinate>>> geometries;
|
||||
|
||||
for (unsigned int k = 0; k < features.size(); k++) {
|
||||
const SymbolFeature &feature = features[k];
|
||||
|
||||
geometries.emplace_back();
|
||||
std::vector<std::vector<Coordinate>> &multiline = geometries.back();
|
||||
|
||||
// Decode all lines.
|
||||
Geometry::command cmd;
|
||||
bool first = true;
|
||||
pbf geom(feature.geometry);
|
||||
Geometry geometry(geom);
|
||||
int32_t x, y;
|
||||
while ((cmd = geometry.next(x, y)) != Geometry::end) {
|
||||
if (first || cmd == Geometry::move_to) {
|
||||
multiline.emplace_back();
|
||||
first = false;
|
||||
}
|
||||
multiline.back().emplace_back(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
if (properties.placement == PlacementType::Line) {
|
||||
util::mergeLines(features, geometries);
|
||||
}
|
||||
|
||||
for (unsigned int k = 0; k < geometries.size(); k++) {
|
||||
if (!geometries[k].size()) continue;
|
||||
const SymbolFeature &feature = features[k];
|
||||
for (const SymbolFeature &feature : features) {
|
||||
if (!feature.geometry.size()) continue;
|
||||
|
||||
Shaping shaping;
|
||||
Rect<uint16_t> image;
|
||||
@@ -212,8 +204,7 @@ void SymbolBucket::addFeatures(const VectorTileLayer &layer, const FilterExpress
|
||||
|
||||
// if either shaping or icon position is present, add the feature
|
||||
if (shaping.size() || image) {
|
||||
std::vector<std::vector<Coordinate>> &multiline = geometries[k];
|
||||
for (const std::vector<Coordinate> &line : multiline) {
|
||||
for (const std::vector<Coordinate> &line : feature.geometry) {
|
||||
if (line.size()) {
|
||||
addFeature(line, shaping, face, image);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class FontStack;
|
||||
|
||||
class SymbolFeature {
|
||||
public:
|
||||
pbf geometry;
|
||||
std::vector<std::vector<Coordinate>> geometry;
|
||||
std::u32string label;
|
||||
std::string sprite;
|
||||
};
|
||||
|
||||
@@ -8,12 +8,11 @@
|
||||
#include <mbgl/renderer/symbol_bucket.hpp>
|
||||
|
||||
|
||||
#include <iostream>
|
||||
namespace mbgl {
|
||||
namespace util {
|
||||
|
||||
unsigned int mergeFromRight(
|
||||
std::vector<std::vector<std::vector<Coordinate>>> &geometries,
|
||||
std::vector<SymbolFeature> &features,
|
||||
std::map<std::string,unsigned int> &rightIndex,
|
||||
std::map<std::string,unsigned int>::iterator left,
|
||||
std::string &rightKey,
|
||||
@@ -22,14 +21,14 @@ unsigned int mergeFromRight(
|
||||
unsigned int index = left->second;
|
||||
rightIndex.erase(left);
|
||||
rightIndex[rightKey] = index;
|
||||
geometries[index][0].pop_back();
|
||||
geometries[index][0].insert(geometries[index][0].end(), geom[0].begin(), geom[0].end());
|
||||
features[index].geometry[0].pop_back();
|
||||
features[index].geometry[0].insert(features[index].geometry[0].end(), geom[0].begin(), geom[0].end());
|
||||
geom[0].clear();
|
||||
return index;
|
||||
}
|
||||
|
||||
unsigned int mergeFromLeft(
|
||||
std::vector<std::vector<std::vector<Coordinate>>> &geometries,
|
||||
std::vector<SymbolFeature> &features,
|
||||
std::map<std::string,unsigned int> &leftIndex,
|
||||
std::string &leftKey,
|
||||
std::map<std::string,unsigned int>::iterator right,
|
||||
@@ -39,9 +38,9 @@ unsigned int mergeFromLeft(
|
||||
leftIndex.erase(right);
|
||||
leftIndex[leftKey] = index;
|
||||
geom[0].pop_back();
|
||||
geom[0].insert(geom[0].end(), geometries[index][0].begin(), geometries[index][0].end());
|
||||
geometries[index][0].clear();
|
||||
std::swap(geometries[index][0], geom[0]);
|
||||
geom[0].insert(geom[0].end(), features[index].geometry[0].begin(), features[index].geometry[0].end());
|
||||
features[index].geometry[0].clear();
|
||||
std::swap(features[index].geometry[0], geom[0]);
|
||||
return index;
|
||||
}
|
||||
|
||||
@@ -56,16 +55,14 @@ std::string getKey(const std::u32string &text, const std::vector<std::vector<Coo
|
||||
}
|
||||
|
||||
|
||||
void mergeLines(const std::vector<SymbolFeature> &features, std::vector<std::vector<std::vector<Coordinate>>> &geometries) {
|
||||
void mergeLines(std::vector<SymbolFeature> &features) {
|
||||
|
||||
std::map<std::string,unsigned int> leftIndex;
|
||||
std::map<std::string,unsigned int> rightIndex;
|
||||
|
||||
if (features.size()) getKey(features[0].label, geometries[0], false);
|
||||
|
||||
for (unsigned int k = 0; k < features.size(); k++) {
|
||||
const SymbolFeature &feature = features[k];
|
||||
std::vector<std::vector<Coordinate>> &geometry = geometries[k];
|
||||
SymbolFeature &feature = features[k];
|
||||
std::vector<std::vector<Coordinate>> &geometry = feature.geometry;
|
||||
|
||||
if (!feature.label.length()) {
|
||||
continue;
|
||||
@@ -79,20 +76,20 @@ void mergeLines(const std::vector<SymbolFeature> &features, std::vector<std::vec
|
||||
|
||||
if ((left != rightIndex.end()) && (right != leftIndex.end()) && (left->second != right->second)) {
|
||||
// found lines with the same text adjacent to both ends of the current line, merge all three
|
||||
unsigned int j = mergeFromLeft(geometries, leftIndex, leftKey, right, geometry);
|
||||
unsigned int i = mergeFromRight(geometries, rightIndex, left, rightKey, geometries[j]);
|
||||
unsigned int j = mergeFromLeft(features, leftIndex, leftKey, right, geometry);
|
||||
unsigned int i = mergeFromRight(features, rightIndex, left, rightKey, features[j].geometry);
|
||||
|
||||
leftIndex.erase(leftIndex.find(leftKey));
|
||||
rightIndex.erase(rightIndex.find(rightKey));
|
||||
rightIndex[getKey(feature.label, geometries[i], true)] = i;
|
||||
rightIndex[getKey(feature.label, features[i].geometry, true)] = i;
|
||||
|
||||
} else if (left != rightIndex.end()) {
|
||||
// found mergeable line adjacent to the start of the current line, merge
|
||||
mergeFromRight(geometries, rightIndex, left, rightKey, geometry);
|
||||
mergeFromRight(features, rightIndex, left, rightKey, geometry);
|
||||
|
||||
} else if (right != leftIndex.end()) {
|
||||
// found mergeable line adjacent to the end of the current line, merge
|
||||
mergeFromLeft(geometries, leftIndex, leftKey, right, geometry);
|
||||
mergeFromLeft(features, leftIndex, leftKey, right, geometry);
|
||||
|
||||
} else {
|
||||
// no adjacent lines, add as a new item
|
||||
|
||||
Reference in New Issue
Block a user