diff --git a/libs/drape/drape_tests/glyph_mng_tests.cpp b/libs/drape/drape_tests/glyph_mng_tests.cpp index fa53a8117..f0084c555 100644 --- a/libs/drape/drape_tests/glyph_mng_tests.cpp +++ b/libs/drape/drape_tests/glyph_mng_tests.cpp @@ -81,7 +81,7 @@ public: QPainter painter(device); painter.fillRect(QRectF(0.0, 0.0, device->width(), device->height()), Qt::white); - auto const shapedText = m_mng->ShapeText(m_utf8, m_fontPixelSize, m_lang); + auto const shapedText = m_mng->ShapeText(m_utf8, m_fontPixelSize); std::cout << "Total width: " << shapedText.m_lineWidthInPixels << '\n'; std::cout << "Max height: " << shapedText.m_maxLineHeightInPixels << '\n'; diff --git a/libs/drape/glyph_manager.cpp b/libs/drape/glyph_manager.cpp index f8bef2485..353d8ff57 100644 --- a/libs/drape/glyph_manager.cpp +++ b/libs/drape/glyph_manager.cpp @@ -5,6 +5,7 @@ #include "drape/harfbuzz_shaping.hpp" #include "platform/platform.hpp" +#include "platform/preferred_languages.hpp" #include "coding/hex.hpp" #include "coding/reader.hpp" @@ -328,6 +329,9 @@ FreetypeError constexpr g_FT_Errors[] = TUniBlockIter m_lastUsedBlock; std::vector> m_fonts; + std::string const lang = languages::GetCurrentOrig(); + hb_language_t const m_language = hb_language_from_string(lang.data(), static_cast(lang.size())); + // Required to use std::string_view as a search key for std::unordered_map::find(). struct StringHash : public std::hash { @@ -563,21 +567,8 @@ FreetypeError constexpr g_FT_Errors[] = return m_impl->m_fonts[key.m_fontIndex]->GetGlyphImage(key.m_glyphId, pixelHeight, sdf); } - namespace - { - hb_language_t OrganicMapsLanguageToHarfbuzzLanguage(int8_t lang) - { - // TODO(AB): can langs be converted faster? - auto const svLang = StringUtf8Multilang::GetLangByCode(lang); - auto const hbLanguage = hb_language_from_string(svLang.data(), static_cast(svLang.size())); - if (hbLanguage == HB_LANGUAGE_INVALID) - return hb_language_get_default(); - return hbLanguage; - } - } // namespace - // This method is NOT multithreading-safe. - text::TextMetrics GlyphManager::ShapeText(std::string_view utf8, int fontPixelHeight, int8_t lang) + text::TextMetrics GlyphManager::ShapeText(std::string_view utf8, int fontPixelHeight) { #ifdef DEBUG static int const fontSize = fontPixelHeight; @@ -591,9 +582,6 @@ FreetypeError constexpr g_FT_Errors[] = auto const [text, segments] = harfbuzz_shaping::GetTextSegments(utf8); - // TODO(AB): Optimize language conversion. - hb_language_t const hbLanguage = OrganicMapsLanguageToHarfbuzzLanguage(lang); - text::TextMetrics allGlyphs; // For SplitText it's enough to know if the last visual (first logical) segment is RTL. allGlyphs.m_isRTL = segments.back().m_direction == HB_DIRECTION_RTL; @@ -609,7 +597,8 @@ FreetypeError constexpr g_FT_Errors[] = static_cast(text.size()), substring.m_start, substring.m_length); hb_buffer_set_direction(m_impl->m_harfbuzzBuffer, substring.m_direction); hb_buffer_set_script(m_impl->m_harfbuzzBuffer, substring.m_script); - hb_buffer_set_language(m_impl->m_harfbuzzBuffer, hbLanguage); + // TODO: This property is static, is it possible to set it only once? + hb_buffer_set_language(m_impl->m_harfbuzzBuffer, m_impl->m_language); auto u32CharacterIter{text.begin() + substring.m_start}; auto const end{u32CharacterIter + substring.m_length}; @@ -646,10 +635,4 @@ FreetypeError constexpr g_FT_Errors[] = return allGlyphs; } - - text::TextMetrics GlyphManager::ShapeText(std::string_view utf8, int fontPixelHeight, char const * lang) - { - return ShapeText(utf8, fontPixelHeight, StringUtf8Multilang::GetLangIndex(lang)); - } - } // namespace dp diff --git a/libs/drape/glyph_manager.hpp b/libs/drape/glyph_manager.hpp index 73fa2b08e..c8e7f2d73 100644 --- a/libs/drape/glyph_manager.hpp +++ b/libs/drape/glyph_manager.hpp @@ -73,8 +73,7 @@ public: int GetFontIndex(strings::UniChar unicodePoint); int GetFontIndex(std::u16string_view sv); - text::TextMetrics ShapeText(std::string_view utf8, int fontPixelHeight, int8_t lang); - text::TextMetrics ShapeText(std::string_view utf8, int fontPixelHeight, char const * lang); + text::TextMetrics ShapeText(std::string_view utf8, int fontPixelHeight); GlyphImage GetGlyphImage(GlyphFontAndId key, int pixelHeight, bool sdf) const; diff --git a/libs/drape/texture_manager.cpp b/libs/drape/texture_manager.cpp index 9ceec7437..01dc50f27 100644 --- a/libs/drape/texture_manager.cpp +++ b/libs/drape/texture_manager.cpp @@ -372,7 +372,7 @@ void TextureManager::Init(ref_ptr context, Params const & p m_maxGlypsCount = static_cast(ceil(kGlyphAreaCoverage * textureSquare / averageGlyphSquare)); std::string_view constexpr kSpace{" "}; - m_spaceGlyph = m_glyphManager->ShapeText(kSpace, dp::kBaseFontSizePixels, "en").m_glyphs.front().m_key; + m_spaceGlyph = m_glyphManager->ShapeText(kSpace, dp::kBaseFontSizePixels).m_glyphs.front().m_key; LOG(LDEBUG, ("Glyphs texture size =", kGlyphsTextureSize, "with max glyphs count =", m_maxGlypsCount)); @@ -467,8 +467,7 @@ text::TextMetrics TextureManager::ShapeSingleTextLine(float fontPixelHeight, std // TODO(AB): Is this mutex too slow? std::lock_guard lock(m_calcGlyphsMutex); - // TODO(AB): Fix hard-coded lang. - auto textMetrics = m_glyphManager->ShapeText(utf8, fontPixelHeight, "en"); + auto textMetrics = m_glyphManager->ShapeText(utf8, fontPixelHeight); auto const & glyphs = textMetrics.m_glyphs;