From 5670fb397ffe7ce596d94a91ee5aaf5e2b348e9a Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Thu, 8 Jan 2015 23:50:12 -0500 Subject: [PATCH] get rid of separate vector for symbol geometries --- src/mbgl/renderer/symbol_bucket.cpp | 57 ++++++++++++----------------- src/mbgl/renderer/symbol_bucket.hpp | 2 +- src/mbgl/util/merge_lines.hpp | 33 ++++++++--------- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index b0cfbf974..c6a7c8c4e 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -86,11 +86,31 @@ std::vector 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>> geometries; - - for (unsigned int k = 0; k < features.size(); k++) { - const SymbolFeature &feature = features[k]; - - geometries.emplace_back(); - std::vector> &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 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> &multiline = geometries[k]; - for (const std::vector &line : multiline) { + for (const std::vector &line : feature.geometry) { if (line.size()) { addFeature(line, shaping, face, image); } diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index f90ff8999..bc148579f 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -30,7 +30,7 @@ class FontStack; class SymbolFeature { public: - pbf geometry; + std::vector> geometry; std::u32string label; std::string sprite; }; diff --git a/src/mbgl/util/merge_lines.hpp b/src/mbgl/util/merge_lines.hpp index 433e0b276..6e4c56125 100644 --- a/src/mbgl/util/merge_lines.hpp +++ b/src/mbgl/util/merge_lines.hpp @@ -8,12 +8,11 @@ #include -#include namespace mbgl { namespace util { unsigned int mergeFromRight( - std::vector>> &geometries, + std::vector &features, std::map &rightIndex, std::map::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>> &geometries, + std::vector &features, std::map &leftIndex, std::string &leftKey, std::map::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 &features, std::vector>> &geometries) { +void mergeLines(std::vector &features) { std::map leftIndex; std::map 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> &geometry = geometries[k]; + SymbolFeature &feature = features[k]; + std::vector> &geometry = feature.geometry; if (!feature.label.length()) { continue; @@ -79,20 +76,20 @@ void mergeLines(const std::vector &features, std::vectorsecond != 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