diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2017-03-17 14:59:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-17 14:59:24 +0300 |
commit | aabef62d44264f7f40eedec5aa88cbd0820bec64 (patch) | |
tree | 83d96ed17396192adacce3c3153386d7fb527c63 | |
parent | 2d2a9768ffade7873719db44df52d51dae545183 (diff) | |
parent | ae5348f4db4d9563cc38dda3292de7cab83a4263 (diff) |
Merge pull request #5617 from rokuz/multiple-symbols-textures
Multiple symbols textures
32 files changed, 235 insertions, 45 deletions
diff --git a/data/resources-6plus_clear/symbols-ad.png b/data/resources-6plus_clear/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..74537deaf7 --- /dev/null +++ b/data/resources-6plus_clear/symbols-ad.png diff --git a/data/resources-6plus_clear/symbols-ad.sdf b/data/resources-6plus_clear/symbols-ad.sdf new file mode 100644 index 0000000000..348c10bc27 --- /dev/null +++ b/data/resources-6plus_clear/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="128"> + <symbol minX="0" maxX="58" minY="0" maxY="58" name="test-l"/> + <symbol minX="58" maxX="114" minY="0" maxY="56" name="test-m"/> + <symbol minX="0" maxX="42" minY="58" maxY="100" name="test-s"/> + </file> +</root> diff --git a/data/resources-6plus_dark/symbols-ad.png b/data/resources-6plus_dark/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..74537deaf7 --- /dev/null +++ b/data/resources-6plus_dark/symbols-ad.png diff --git a/data/resources-6plus_dark/symbols-ad.sdf b/data/resources-6plus_dark/symbols-ad.sdf new file mode 100644 index 0000000000..348c10bc27 --- /dev/null +++ b/data/resources-6plus_dark/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="128"> + <symbol minX="0" maxX="58" minY="0" maxY="58" name="test-l"/> + <symbol minX="58" maxX="114" minY="0" maxY="56" name="test-m"/> + <symbol minX="0" maxX="42" minY="58" maxY="100" name="test-s"/> + </file> +</root> diff --git a/data/resources-hdpi_clear/symbols-ad.png b/data/resources-hdpi_clear/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..19ffd1d64a --- /dev/null +++ b/data/resources-hdpi_clear/symbols-ad.png diff --git a/data/resources-hdpi_clear/symbols-ad.sdf b/data/resources-hdpi_clear/symbols-ad.sdf new file mode 100644 index 0000000000..909e572c57 --- /dev/null +++ b/data/resources-hdpi_clear/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="64" height="64"> + <symbol minX="0" maxX="31" minY="0" maxY="31" name="test-l"/> + <symbol minX="31" maxX="61" minY="0" maxY="30" name="test-m"/> + <symbol minX="0" maxX="23" minY="31" maxY="54" name="test-s"/> + </file> +</root> diff --git a/data/resources-hdpi_dark/symbols-ad.png b/data/resources-hdpi_dark/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..19ffd1d64a --- /dev/null +++ b/data/resources-hdpi_dark/symbols-ad.png diff --git a/data/resources-hdpi_dark/symbols-ad.sdf b/data/resources-hdpi_dark/symbols-ad.sdf new file mode 100644 index 0000000000..909e572c57 --- /dev/null +++ b/data/resources-hdpi_dark/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="64" height="64"> + <symbol minX="0" maxX="31" minY="0" maxY="31" name="test-l"/> + <symbol minX="31" maxX="61" minY="0" maxY="30" name="test-m"/> + <symbol minX="0" maxX="23" minY="31" maxY="54" name="test-s"/> + </file> +</root> diff --git a/data/resources-mdpi_clear/symbols-ad.png b/data/resources-mdpi_clear/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..7fb264d48c --- /dev/null +++ b/data/resources-mdpi_clear/symbols-ad.png diff --git a/data/resources-mdpi_clear/symbols-ad.sdf b/data/resources-mdpi_clear/symbols-ad.sdf new file mode 100644 index 0000000000..2eaf917db3 --- /dev/null +++ b/data/resources-mdpi_clear/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="64" height="32"> + <symbol minX="0" maxX="22" minY="0" maxY="22" name="test-l"/> + <symbol minX="22" maxX="43" minY="0" maxY="21" name="test-m"/> + <symbol minX="43" maxX="60" minY="0" maxY="17" name="test-s"/> + </file> +</root> diff --git a/data/resources-mdpi_dark/symbols-ad.png b/data/resources-mdpi_dark/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..7fb264d48c --- /dev/null +++ b/data/resources-mdpi_dark/symbols-ad.png diff --git a/data/resources-mdpi_dark/symbols-ad.sdf b/data/resources-mdpi_dark/symbols-ad.sdf new file mode 100644 index 0000000000..2eaf917db3 --- /dev/null +++ b/data/resources-mdpi_dark/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="64" height="32"> + <symbol minX="0" maxX="22" minY="0" maxY="22" name="test-l"/> + <symbol minX="22" maxX="43" minY="0" maxY="21" name="test-m"/> + <symbol minX="43" maxX="60" minY="0" maxY="17" name="test-s"/> + </file> +</root> diff --git a/data/resources-xhdpi_clear/symbols-ad.png b/data/resources-xhdpi_clear/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..6db1fd1f38 --- /dev/null +++ b/data/resources-xhdpi_clear/symbols-ad.png diff --git a/data/resources-xhdpi_clear/symbols-ad.sdf b/data/resources-xhdpi_clear/symbols-ad.sdf new file mode 100644 index 0000000000..0e429884c1 --- /dev/null +++ b/data/resources-xhdpi_clear/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="64"> + <symbol minX="0" maxX="40" minY="0" maxY="40" name="test-l"/> + <symbol minX="40" maxX="79" minY="0" maxY="39" name="test-m"/> + <symbol minX="79" maxX="109" minY="0" maxY="30" name="test-s"/> + </file> +</root> diff --git a/data/resources-xhdpi_dark/symbols-ad.png b/data/resources-xhdpi_dark/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..6db1fd1f38 --- /dev/null +++ b/data/resources-xhdpi_dark/symbols-ad.png diff --git a/data/resources-xhdpi_dark/symbols-ad.sdf b/data/resources-xhdpi_dark/symbols-ad.sdf new file mode 100644 index 0000000000..0e429884c1 --- /dev/null +++ b/data/resources-xhdpi_dark/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="64"> + <symbol minX="0" maxX="40" minY="0" maxY="40" name="test-l"/> + <symbol minX="40" maxX="79" minY="0" maxY="39" name="test-m"/> + <symbol minX="79" maxX="109" minY="0" maxY="30" name="test-s"/> + </file> +</root> diff --git a/data/resources-xxhdpi_clear/symbols-ad.png b/data/resources-xxhdpi_clear/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..74537deaf7 --- /dev/null +++ b/data/resources-xxhdpi_clear/symbols-ad.png diff --git a/data/resources-xxhdpi_clear/symbols-ad.sdf b/data/resources-xxhdpi_clear/symbols-ad.sdf new file mode 100644 index 0000000000..348c10bc27 --- /dev/null +++ b/data/resources-xxhdpi_clear/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="128"> + <symbol minX="0" maxX="58" minY="0" maxY="58" name="test-l"/> + <symbol minX="58" maxX="114" minY="0" maxY="56" name="test-m"/> + <symbol minX="0" maxX="42" minY="58" maxY="100" name="test-s"/> + </file> +</root> diff --git a/data/resources-xxhdpi_dark/symbols-ad.png b/data/resources-xxhdpi_dark/symbols-ad.png Binary files differnew file mode 100644 index 0000000000..74537deaf7 --- /dev/null +++ b/data/resources-xxhdpi_dark/symbols-ad.png diff --git a/data/resources-xxhdpi_dark/symbols-ad.sdf b/data/resources-xxhdpi_dark/symbols-ad.sdf new file mode 100644 index 0000000000..348c10bc27 --- /dev/null +++ b/data/resources-xxhdpi_dark/symbols-ad.sdf @@ -0,0 +1,8 @@ +<!DOCTYPE skin> +<root> + <file width="128" height="128"> + <symbol minX="0" maxX="58" minY="0" maxY="58" name="test-l"/> + <symbol minX="58" maxX="114" minY="0" maxY="56" name="test-m"/> + <symbol minX="0" maxX="42" minY="58" maxY="100" name="test-s"/> + </file> +</root> diff --git a/data/styles/clear/style-clear/symbols-ad/test-l.svg b/data/styles/clear/style-clear/symbols-ad/test-l.svg new file mode 100644 index 0000000000..2f1ac91ac9 --- /dev/null +++ b/data/styles/clear/style-clear/symbols-ad/test-l.svg @@ -0,0 +1,7 @@ +<svg width="27" height="27" viewBox="0 0 27 27"> + <g fill="none" fill-rule="evenodd"> + <circle cx="13.5" cy="13.5" r="13.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="13.5" cy="13.5" r="12.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="17.52 10.219 13.973 10.219 13.973 20 12.012 20 12.012 10.219 8.496 10.219 8.496 8.625 17.52 8.625"/> + </g> +</svg> diff --git a/data/styles/clear/style-clear/symbols-ad/test-m.svg b/data/styles/clear/style-clear/symbols-ad/test-m.svg new file mode 100644 index 0000000000..0471881b12 --- /dev/null +++ b/data/styles/clear/style-clear/symbols-ad/test-m.svg @@ -0,0 +1,7 @@ +<svg width="23" height="23" viewBox="0 0 23 23"> + <g fill="none" fill-rule="evenodd"> + <circle cx="11.5" cy="11.5" r="11.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="11.5" cy="11.5" r="10.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="15.955 8.441 12.851 8.441 12.851 17 11.135 17 11.135 8.441 8.059 8.441 8.059 7.047 15.955 7.047"/> + </g> +</svg> diff --git a/data/styles/clear/style-clear/symbols-ad/test-s.svg b/data/styles/clear/style-clear/symbols-ad/test-s.svg new file mode 100644 index 0000000000..bb4d34774b --- /dev/null +++ b/data/styles/clear/style-clear/symbols-ad/test-s.svg @@ -0,0 +1,7 @@ +<svg width="17" height="17" viewBox="0 0 17 17"> + <g fill="none" fill-rule="evenodd"> + <circle cx="8.5" cy="8.5" r="8.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="8.5" cy="8.5" r="7.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="12.39 5.664 9.729 5.664 9.729 13 8.259 13 8.259 5.664 5.622 5.664 5.622 4.469 12.39 4.469"/> + </g> +</svg> diff --git a/data/styles/clear/style-night/symbols-ad/test-l.svg b/data/styles/clear/style-night/symbols-ad/test-l.svg new file mode 100644 index 0000000000..2f1ac91ac9 --- /dev/null +++ b/data/styles/clear/style-night/symbols-ad/test-l.svg @@ -0,0 +1,7 @@ +<svg width="27" height="27" viewBox="0 0 27 27"> + <g fill="none" fill-rule="evenodd"> + <circle cx="13.5" cy="13.5" r="13.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="13.5" cy="13.5" r="12.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="17.52 10.219 13.973 10.219 13.973 20 12.012 20 12.012 10.219 8.496 10.219 8.496 8.625 17.52 8.625"/> + </g> +</svg> diff --git a/data/styles/clear/style-night/symbols-ad/test-m.svg b/data/styles/clear/style-night/symbols-ad/test-m.svg new file mode 100644 index 0000000000..0471881b12 --- /dev/null +++ b/data/styles/clear/style-night/symbols-ad/test-m.svg @@ -0,0 +1,7 @@ +<svg width="23" height="23" viewBox="0 0 23 23"> + <g fill="none" fill-rule="evenodd"> + <circle cx="11.5" cy="11.5" r="11.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="11.5" cy="11.5" r="10.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="15.955 8.441 12.851 8.441 12.851 17 11.135 17 11.135 8.441 8.059 8.441 8.059 7.047 15.955 7.047"/> + </g> +</svg> diff --git a/data/styles/clear/style-night/symbols-ad/test-s.svg b/data/styles/clear/style-night/symbols-ad/test-s.svg new file mode 100644 index 0000000000..bb4d34774b --- /dev/null +++ b/data/styles/clear/style-night/symbols-ad/test-s.svg @@ -0,0 +1,7 @@ +<svg width="17" height="17" viewBox="0 0 17 17"> + <g fill="none" fill-rule="evenodd"> + <circle cx="8.5" cy="8.5" r="8.5" fill="#FFF" fill-opacity=".6" fill-rule="nonzero"/> + <circle cx="8.5" cy="8.5" r="7.5" fill="#00FF91" fill-rule="nonzero"/> + <polygon fill="#FFF" points="12.39 5.664 9.729 5.664 9.729 13 8.259 13 8.259 5.664 5.622 5.664 5.622 4.469 12.39 4.469"/> + </g> +</svg> diff --git a/drape/symbols_texture.cpp b/drape/symbols_texture.cpp index 4bdad9334f..d66b2fd1f3 100644 --- a/drape/symbols_texture.cpp +++ b/drape/symbols_texture.cpp @@ -20,8 +20,6 @@ namespace dp namespace { -string const SymbolsTextureName = "symbols"; - using TDefinitionInserter = function<void(string const &, m2::RectF const &)>; using TSymbolsLoadingCompletion = function<void(unsigned char *, uint32_t, uint32_t)>; using TSymbolsLoadingFailure = function<void(string const &)>; @@ -114,8 +112,8 @@ private: m2::RectF m_rect; }; -void LoadSymbols(string const & skinPathName, bool convertToUV, - TDefinitionInserter const & definitionInserter, +void LoadSymbols(std::string const & skinPathName, std::string const & textureName, + bool convertToUV, TDefinitionInserter const & definitionInserter, TSymbolsLoadingCompletion const & completionHandler, TSymbolsLoadingFailure const & failureHandler) { @@ -131,7 +129,7 @@ void LoadSymbols(string const & skinPathName, bool convertToUV, DefinitionLoader loader(definitionInserter, convertToUV); { - ReaderPtr<Reader> reader = GetStyleReader().GetResourceReader(SymbolsTextureName + ".sdf", skinPathName); + ReaderPtr<Reader> reader = GetStyleReader().GetResourceReader(textureName + ".sdf", skinPathName); ReaderSource<ReaderPtr<Reader> > source(reader); if (!ParseXML(source, loader)) { @@ -144,7 +142,7 @@ void LoadSymbols(string const & skinPathName, bool convertToUV, } { - ReaderPtr<Reader> reader = GetStyleReader().GetResourceReader(SymbolsTextureName + ".png", skinPathName); + ReaderPtr<Reader> reader = GetStyleReader().GetResourceReader(textureName + ".png", skinPathName); size_t const size = static_cast<size_t>(reader.Size()); rawData.resize(size); reader.Read(0, &rawData[0], size); @@ -201,16 +199,18 @@ Texture::ResourceType SymbolsTexture::SymbolInfo::GetType() const return Symbol; } -SymbolsTexture::SymbolsTexture(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator) +SymbolsTexture::SymbolsTexture(std::string const & skinPathName, std::string const & textureName, + ref_ptr<HWTextureAllocator> allocator) + : m_name(textureName) { Load(skinPathName, allocator); } -void SymbolsTexture::Load(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator) +void SymbolsTexture::Load(std::string const & skinPathName, ref_ptr<HWTextureAllocator> allocator) { auto definitionInserter = [this](string const & name, m2::RectF const & rect) { - m_definition.insert(make_pair(name, SymbolsTexture::SymbolInfo(rect))); + m_definition.insert(std::make_pair(name, SymbolsTexture::SymbolInfo(rect))); }; auto completionHandler = [this, &allocator](unsigned char * data, uint32_t width, uint32_t height) @@ -230,7 +230,8 @@ void SymbolsTexture::Load(string const & skinPathName, ref_ptr<HWTextureAllocato Fail(); }; - LoadSymbols(skinPathName, true /* convertToUV */, definitionInserter, completionHandler, failureHandler); + LoadSymbols(skinPathName, m_name, true /* convertToUV */, definitionInserter, + completionHandler, failureHandler); } void SymbolsTexture::Invalidate(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator) @@ -267,8 +268,14 @@ void SymbolsTexture::Fail() Create(p, make_ref(&alfaTexture)); } -bool SymbolsTexture::DecodeToMemory(string const & skinPathName, vector<uint8_t> & symbolsSkin, - map<string, m2::RectU> & symbolsIndex, +bool SymbolsTexture::IsSymbolContained(std::string const & symbolName) const +{ + return m_definition.find(symbolName) != m_definition.end(); +} + +bool SymbolsTexture::DecodeToMemory(std::string const & skinPathName, std::string const & textureName, + vector<uint8_t> & symbolsSkin, + std::map<string, m2::RectU> & symbolsIndex, uint32_t & skinWidth, uint32_t & skinHeight) { auto definitionInserter = [&symbolsIndex](string const & name, m2::RectF const & rect) @@ -294,7 +301,8 @@ bool SymbolsTexture::DecodeToMemory(string const & skinPathName, vector<uint8_t> result = false; }; - LoadSymbols(skinPathName, false /* convertToUV */, definitionInserter, completionHandler, failureHandler); + LoadSymbols(skinPathName, textureName, false /* convertToUV */, + definitionInserter, completionHandler, failureHandler); return result; } diff --git a/drape/symbols_texture.hpp b/drape/symbols_texture.hpp index 219f7f4e53..9d022d4d37 100644 --- a/drape/symbols_texture.hpp +++ b/drape/symbols_texture.hpp @@ -30,20 +30,25 @@ public: virtual ResourceType GetType() const; }; - explicit SymbolsTexture(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator); + SymbolsTexture(std::string const & skinPathName, std::string const & textureName, + ref_ptr<HWTextureAllocator> allocator); ref_ptr<ResourceInfo> FindResource(Key const & key, bool & newResource) override; void Invalidate(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator); - static bool DecodeToMemory(string const & skinPathName, vector<uint8_t> & symbolsSkin, - map<string, m2::RectU> & symbolsIndex, + bool IsSymbolContained(std::string const & symbolName) const; + + static bool DecodeToMemory(std::string const & skinPathName, std::string const & textureName, + vector<uint8_t> & symbolsSkin, + std::map<string, m2::RectU> & symbolsIndex, uint32_t & skinWidth, uint32_t & skinHeight); private: void Fail(); - void Load(string const & skinPathName, ref_ptr<HWTextureAllocator> allocator); + void Load(std::string const & skinPathName, ref_ptr<HWTextureAllocator> allocator); - typedef map<string, SymbolInfo> TSymDefinition; + using TSymDefinition = map<std::string, SymbolInfo>; + std::string m_name; mutable TSymDefinition m_definition; }; diff --git a/drape/texture_manager.cpp b/drape/texture_manager.cpp index 531e1215fc..30920845a7 100644 --- a/drape/texture_manager.cpp +++ b/drape/texture_manager.cpp @@ -37,6 +37,10 @@ size_t const kReservedColors = 20; float const kGlyphAreaMultiplier = 1.2f; float const kGlyphAreaCoverage = 0.9f; +std::string const kDefaultSymbolsTexture = "symbols"; +std::string const kSymbolTextures[] = { kDefaultSymbolsTexture, "symbols-ad" }; +uint32_t const kDefaultSymbolsIndex = 0; + namespace { @@ -145,7 +149,9 @@ void TextureManager::BaseRegion::SetTexture(ref_ptr<Texture> texture) m2::PointF TextureManager::BaseRegion::GetPixelSize() const { - ASSERT(IsValid(), ()); + if (!IsValid()) + return m2::PointF(0.0f, 0.0f); + m2::RectF const & texRect = m_info->GetTexRect(); return m2::PointF(texRect.SizeX() * m_texture->GetWidth(), texRect.SizeY() * m_texture->GetHeight()); @@ -153,11 +159,20 @@ m2::PointF TextureManager::BaseRegion::GetPixelSize() const float TextureManager::BaseRegion::GetPixelHeight() const { + if (!IsValid()) + return 0.0f; + return m_info->GetTexRect().SizeY() * m_texture->GetHeight(); } m2::RectF const & TextureManager::BaseRegion::GetTexRect() const { + if (!IsValid()) + { + static m2::RectF nilRect(0.0f, 0.0f, 0.0f, 0.0f); + return nilRect; + } + return m_info->GetTexRect(); } @@ -207,7 +222,7 @@ void TextureManager::Release() m_glyphGroups.clear(); m_hybridGlyphGroups.clear(); - m_symbolTexture.reset(); + m_symbolTextures.clear(); m_stipplePenTexture.reset(); m_colorTexture.reset(); @@ -380,7 +395,11 @@ void TextureManager::Init(Params const & params) GLFunctions::glPixelStore(gl_const::GLUnpackAlignment, 1); - m_symbolTexture = make_unique_dp<SymbolsTexture>(params.m_resPostfix, make_ref(m_textureAllocator)); + for (size_t i = 0; i < ARRAY_SIZE(kSymbolTextures); ++i) + { + m_symbolTextures.push_back(make_unique_dp<SymbolsTexture>(params.m_resPostfix, kSymbolTextures[i], + make_ref(m_textureAllocator))); + } m_trafficArrowTexture = make_unique_dp<StaticTexture>("traffic-arrow", params.m_resPostfix, make_ref(m_textureAllocator)); @@ -454,9 +473,12 @@ void TextureManager::Init(Params const & params) void TextureManager::Invalidate(string const & resPostfix) { - ASSERT(m_symbolTexture != nullptr, ()); - ref_ptr<SymbolsTexture> symbolsTexture = make_ref(m_symbolTexture); - symbolsTexture->Invalidate(resPostfix, make_ref(m_textureAllocator)); + for (size_t i = 0; i < m_symbolTextures.size(); ++i) + { + ASSERT(m_symbolTextures[i] != nullptr, ()); + ref_ptr<SymbolsTexture> symbolsTexture = make_ref(m_symbolTextures[i]); + symbolsTexture->Invalidate(resPostfix, make_ref(m_textureAllocator)); + } ASSERT(m_trafficArrowTexture != nullptr, ()); ref_ptr<StaticTexture> staticTexture = make_ref(m_trafficArrowTexture); @@ -465,7 +487,17 @@ void TextureManager::Invalidate(string const & resPostfix) void TextureManager::GetSymbolRegion(string const & symbolName, SymbolRegion & region) { - GetRegionBase(make_ref(m_symbolTexture), region, SymbolsTexture::SymbolKey(symbolName)); + for (size_t i = 0; i < m_symbolTextures.size(); ++i) + { + ASSERT(m_symbolTextures[i] != nullptr, ()); + ref_ptr<SymbolsTexture> symbolsTexture = make_ref(m_symbolTextures[i]); + if (symbolsTexture->IsSymbolContained(symbolName)) + { + GetRegionBase(symbolsTexture, region, SymbolsTexture::SymbolKey(symbolName)); + return; + } + } + LOG(LWARNING, ("Detected using of unknown symbol ", symbolName)); } void TextureManager::GetStippleRegion(TStipplePattern const & pen, StippleRegion & region) @@ -515,7 +547,8 @@ bool TextureManager::AreGlyphsReady(strings::UniString const & str, int fixedHei ref_ptr<Texture> TextureManager::GetSymbolsTexture() const { - return make_ref(m_symbolTexture); + ASSERT(!m_symbolTextures.empty(), ()); + return make_ref(m_symbolTextures[kDefaultSymbolsIndex]); } ref_ptr<Texture> TextureManager::GetTrafficArrowTexture() const diff --git a/drape/texture_manager.hpp b/drape/texture_manager.hpp index 60d18f18a7..15e1d684db 100644 --- a/drape/texture_manager.hpp +++ b/drape/texture_manager.hpp @@ -8,12 +8,15 @@ #include "base/string_utils.hpp" -#include "std/atomic.hpp" -#include "std/unordered_set.hpp" +#include <atomic> +#include <list> +#include <vector> namespace dp { +extern std::string const kDefaultSymbolsTexture; + class HWTextureAllocator; class TextureManager @@ -235,10 +238,10 @@ private: static constexpr size_t GetInvalidGlyphGroup(); private: - drape_ptr<Texture> m_symbolTexture; + std::vector<drape_ptr<Texture>> m_symbolTextures; drape_ptr<Texture> m_stipplePenTexture; drape_ptr<Texture> m_colorTexture; - list<drape_ptr<Texture>> m_glyphTextures; + std::list<drape_ptr<Texture>> m_glyphTextures; drape_ptr<Texture> m_trafficArrowTexture; @@ -248,7 +251,7 @@ private: buffer_vector<GlyphGroup, 64> m_glyphGroups; buffer_vector<HybridGlyphGroup, 4> m_hybridGlyphGroups; - atomic_flag m_nothingToUpload; + std::atomic_flag m_nothingToUpload; }; } // namespace dp diff --git a/drape_frontend/watch/software_renderer.cpp b/drape_frontend/watch/software_renderer.cpp index b7575c0bc2..e7d3f7ead3 100644 --- a/drape_frontend/watch/software_renderer.cpp +++ b/drape_frontend/watch/software_renderer.cpp @@ -2,6 +2,7 @@ #include "drape_frontend/watch/proto_to_styles.hpp" #include "drape/symbols_texture.hpp" +#include "drape/texture_manager.hpp" #include "platform/platform.hpp" @@ -165,7 +166,8 @@ SoftwareRenderer::SoftwareRenderer(GlyphCache::Params const & glyphCacheParams, pl.GetFontNames(fonts); m_glyphCache->addFonts(fonts); - VERIFY(dp::SymbolsTexture::DecodeToMemory(resourcesPostfix, m_symbolsSkin, m_symbolsIndex, m_skinWidth, m_skinHeight), ()); + VERIFY(dp::SymbolsTexture::DecodeToMemory(resourcesPostfix, dp::kDefaultSymbolsTexture, + m_symbolsSkin, m_symbolsIndex, m_skinWidth, m_skinHeight), ()); ASSERT_NOT_EQUAL(m_skinWidth, 0, ()); ASSERT_NOT_EQUAL(m_skinHeight, 0, ()); } diff --git a/tools/unix/generate_symbols.sh b/tools/unix/generate_symbols.sh index 8166d7130d..f1c499e5bc 100755 --- a/tools/unix/generate_symbols.sh +++ b/tools/unix/generate_symbols.sh @@ -40,13 +40,18 @@ fi # Parameter $4 - symbol size # Parameter $5 - does color correction required # Parameter $6 - style suffix (none, _dark, _clear) +# Parameter $7 - symbols folder (symbols, symbols-ad) +# Parameter $8 - symbols suffix (none, -ad) function BuildSkin() { styleType=$1 styleName=$2 resourceName=$3 symbolSize=$4 colorCorrection=$5 - suffix=${6-} + suffix=$6 + symbolsFolder=$7 + symbolsSuffix=${8-} + echo "Building skin for $styleName/$resourceName" # Set environment STYLE_PATH="$DATA_PATH/styles/$styleType/style-$styleName" @@ -59,8 +64,8 @@ function BuildSkin() { else COLOR_CORR= fi - "$SKIN_GENERATOR" --symbolWidth $symbolSize --symbolHeight $symbolSize --symbolsDir "$STYLE_PATH/symbols" \ - --skinName "$DATA_PATH/resources-$resourceName$suffix/basic" --skinSuffix="" $COLOR_CORR + "$SKIN_GENERATOR" --symbolWidth $symbolSize --symbolHeight $symbolSize --symbolsDir "$STYLE_PATH/$symbolsFolder" \ + --skinName "$DATA_PATH/resources-$resourceName$suffix/basic" --skinSuffix="$symbolsSuffix" $COLOR_CORR # Reset environment rm -r $PNG_PATH || true } @@ -75,14 +80,26 @@ done # Build styles -BuildSkin clear night mdpi 18 false _dark -BuildSkin clear night hdpi 27 false _dark -BuildSkin clear night xhdpi 36 false _dark -BuildSkin clear night xxhdpi 54 false _dark -BuildSkin clear night 6plus 54 false _dark +BuildSkin clear night mdpi 18 false _dark symbols +BuildSkin clear night hdpi 27 false _dark symbols +BuildSkin clear night xhdpi 36 false _dark symbols +BuildSkin clear night xxhdpi 54 false _dark symbols +BuildSkin clear night 6plus 54 false _dark symbols + +BuildSkin clear clear mdpi 18 false _clear symbols +BuildSkin clear clear hdpi 27 false _clear symbols +BuildSkin clear clear xhdpi 36 false _clear symbols +BuildSkin clear clear xxhdpi 54 false _clear symbols +BuildSkin clear clear 6plus 54 false _clear symbols + +BuildSkin clear night mdpi 18 false _dark symbols-ad -ad +BuildSkin clear night hdpi 27 false _dark symbols-ad -ad +BuildSkin clear night xhdpi 36 false _dark symbols-ad -ad +BuildSkin clear night xxhdpi 54 false _dark symbols-ad -ad +BuildSkin clear night 6plus 54 false _dark symbols-ad -ad -BuildSkin clear clear mdpi 18 false _clear -BuildSkin clear clear hdpi 27 false _clear -BuildSkin clear clear xhdpi 36 false _clear -BuildSkin clear clear xxhdpi 54 false _clear -BuildSkin clear clear 6plus 54 false _clear +BuildSkin clear clear mdpi 18 false _clear symbols-ad -ad +BuildSkin clear clear hdpi 27 false _clear symbols-ad -ad +BuildSkin clear clear xhdpi 36 false _clear symbols-ad -ad +BuildSkin clear clear xxhdpi 54 false _clear symbols-ad -ad +BuildSkin clear clear 6plus 54 false _clear symbols-ad -ad |