summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorartemp <artem@mapnik.org>2014-10-27 12:35:17 -0400
committerartemp <artem@mapnik.org>2014-10-27 14:18:11 -0400
commit9364fd7322166578f6f0b7b57273db5a20bea2f7 (patch)
treef36ac8d81eb8a92c5e1e7f6daa8b5069eb954d01 /src
parent5508285424b68c6f0a26e70ede8e389715d02deb (diff)
downloadqtlocation-mapboxgl-9364fd7322166578f6f0b7b57273db5a20bea2f7.tar.gz
make addGlyphsToAtlas static method of SymbolBucket + add addGlyphs method to minimise number of mutex locking
Diffstat (limited to 'src')
-rw-r--r--src/geometry/glyph_atlas.cpp25
-rw-r--r--src/renderer/symbol_bucket.cpp17
2 files changed, 28 insertions, 14 deletions
diff --git a/src/geometry/glyph_atlas.cpp b/src/geometry/glyph_atlas.cpp
index 6bee475da3..72c961fda5 100644
--- a/src/geometry/glyph_atlas.cpp
+++ b/src/geometry/glyph_atlas.cpp
@@ -22,9 +22,15 @@ GlyphAtlas::~GlyphAtlas() {
}
Rect<uint16_t> GlyphAtlas::addGlyph(uint64_t tile_id, const std::string& face_name,
- const SDFGlyph& glyph) {
+ const SDFGlyph& glyph)
+{
std::lock_guard<std::mutex> lock(mtx);
+ return addGlyph_impl(tile_id, face_name, glyph);
+}
+Rect<uint16_t> GlyphAtlas::addGlyph_impl(uint64_t tile_id, const std::string& face_name,
+ const SDFGlyph& glyph)
+{
// Use constant value for now.
const uint8_t buffer = 3;
@@ -83,6 +89,23 @@ Rect<uint16_t> GlyphAtlas::addGlyph(uint64_t tile_id, const std::string& face_na
return rect;
}
+void GlyphAtlas::addGlyphs(uint64_t tileid, std::u32string const& text, std::string const& stackname, FontStack const& fontStack, GlyphPositions & face)
+{
+ std::lock_guard<std::mutex> lock(mtx);
+
+ std::map<uint32_t, SDFGlyph> const& sdfs = fontStack.getSDFs();
+ for (uint32_t chr : text)
+ {
+ auto sdf_it = sdfs.find(chr);
+ if (sdf_it != sdfs.end())
+ {
+ SDFGlyph const& sdf = sdf_it->second;
+ Rect<uint16_t> rect = addGlyph_impl(tileid, stackname, sdf);
+ face.emplace(chr, Glyph{rect, sdf.metrics});
+ }
+ }
+}
+
void GlyphAtlas::removeGlyphs(uint64_t tile_id) {
std::lock_guard<std::mutex> lock(mtx);
diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp
index 47cc4db44c..7d5036eea3 100644
--- a/src/renderer/symbol_bucket.cpp
+++ b/src/renderer/symbol_bucket.cpp
@@ -34,18 +34,9 @@ bool SymbolBucket::hasTextData() const { return !text.groups.empty(); }
bool SymbolBucket::hasIconData() const { return !icon.groups.empty(); }
void SymbolBucket::addGlyphsToAtlas(uint64_t tileid, const std::string stackname,
- const std::u32string &string, const FontStack &fontStack,
+ const std::u32string &text, const FontStack &fontStack,
GlyphAtlas &glyphAtlas, GlyphPositions &face) {
- const std::map<uint32_t, SDFGlyph> &sdfs = fontStack.getSDFs();
- // Loop through all characters and add glyph to atlas, positions.
- for (uint32_t chr : string) {
- auto sdf_it = sdfs.find(chr);
- if (sdf_it != sdfs.end()) {
- const SDFGlyph &sdf = sdf_it->second;
- const Rect<uint16_t> rect = glyphAtlas.addGlyph(tileid, stackname, sdf);
- face.emplace(chr, Glyph{rect, sdf.metrics});
- }
- }
+ glyphAtlas.addGlyphs(tileid, text, stackname, fontStack,face);
}
std::vector<SymbolFeature> SymbolBucket::processFeatures(const VectorTileLayer &layer,
@@ -150,8 +141,8 @@ void SymbolBucket::addFeatures(const VectorTileLayer &layer, const FilterExpress
// Add the glyphs we need for this label to the glyph atlas.
if (shaping.size()) {
- addGlyphsToAtlas(id.to_uint64(), properties.text.font, feature.label, fontStack,
- glyphAtlas, face);
+ SymbolBucket::addGlyphsToAtlas(id.to_uint64(), properties.text.font, feature.label, fontStack,
+ glyphAtlas, face);
}
}