diff --git a/drape/glyph_manager.cpp b/drape/glyph_manager.cpp index 7aff244a0c..a75eb7fe74 100644 --- a/drape/glyph_manager.cpp +++ b/drape/glyph_manager.cpp @@ -60,8 +60,7 @@ namespace dp namespace { -int const SDF_SCALE_FACTOR = 4; -int const SDF_BORDER = 4 * SDF_SCALE_FACTOR; +uint32_t const kSdfBorder = 4; template void ParseUniBlocks(string const & uniBlocksFile, ToDo toDo) @@ -121,8 +120,9 @@ void ParseFontList(string const & fontListFile, ToDo toDo) class Font { public: - Font(ReaderPtr fontReader, FT_Library lib) + Font(uint32_t sdfScale, ReaderPtr fontReader, FT_Library lib) : m_fontReader(fontReader) + , m_sdfScale(sdfScale) { m_stream.base = 0; m_stream.size = m_fontReader.Size(); @@ -161,7 +161,7 @@ public: GlyphManager::Glyph GetGlyph(strings::UniChar unicodePoint, uint32_t baseHeight) const { - FREETYPE_CHECK(FT_Set_Pixel_Sizes(m_fontFace, SDF_SCALE_FACTOR * baseHeight, SDF_SCALE_FACTOR * baseHeight)); + FREETYPE_CHECK(FT_Set_Pixel_Sizes(m_fontFace, m_sdfScale * baseHeight, m_sdfScale * baseHeight)); FREETYPE_CHECK(FT_Load_Glyph(m_fontFace, FT_Get_Char_Index(m_fontFace, unicodePoint), FT_LOAD_RENDER)); FT_Glyph glyph; @@ -172,14 +172,14 @@ public: FT_Bitmap bitmap = m_fontFace->glyph->bitmap; - float const scale = 1.0f / SDF_SCALE_FACTOR; + float const scale = 1.0f / m_sdfScale; SharedBufferManager::shared_buffer_ptr_t data; int imageWidth = bitmap.width; int imageHeight = bitmap.rows; if (bitmap.buffer != nullptr) { - sdf_image::SdfImage img(bitmap.rows, bitmap.pitch, bitmap.buffer, SDF_BORDER); + sdf_image::SdfImage img(bitmap.rows, bitmap.pitch, bitmap.buffer, m_sdfScale * kSdfBorder); imageWidth = img.GetWidth() * scale; imageHeight = img.GetHeight() * scale; @@ -219,9 +219,9 @@ public: resultGlyph.m_fontIndex = glyph.m_fontIndex; sdf_image::SdfImage img(glyph.m_image.m_bitmapRows, glyph.m_image.m_bitmapPitch, - glyph.m_image.m_data->data(), SDF_BORDER); + glyph.m_image.m_data->data(), m_sdfScale * kSdfBorder); - img.GenerateSDF(1.0f / (float)SDF_SCALE_FACTOR); + img.GenerateSDF(1.0f / (float)m_sdfScale); ASSERT(img.GetWidth() == glyph.m_image.m_width, ()); ASSERT(img.GetHeight() == glyph.m_image.m_height, ()); @@ -267,6 +267,7 @@ private: ReaderPtr m_fontReader; FT_StreamRec_ m_stream; FT_Face m_fontFace; + uint32_t m_sdfScale; }; } @@ -376,7 +377,7 @@ GlyphManager::GlyphManager(GlyphManager::Params const & params) vector charCodes; try { - m_impl->m_fonts.emplace_back(GetPlatform().GetReader(fontName), m_impl->m_library); + m_impl->m_fonts.emplace_back(params.m_sdfScale, GetPlatform().GetReader(fontName), m_impl->m_library); m_impl->m_fonts.back().GetCharcodes(charCodes); } catch(RootException const & e) diff --git a/drape/glyph_manager.hpp b/drape/glyph_manager.hpp index 32c71800ab..4b1d64218d 100644 --- a/drape/glyph_manager.hpp +++ b/drape/glyph_manager.hpp @@ -24,6 +24,7 @@ public: vector m_fonts; uint32_t m_baseGlyphHeight = 20; + uint32_t m_sdfScale = 4; }; struct GlyphMetrics diff --git a/drape/shaders/text_fragment_shader.fsh b/drape/shaders/text_fragment_shader.fsh index 1ae3c5147a..bd4178e504 100755 --- a/drape/shaders/text_fragment_shader.fsh +++ b/drape/shaders/text_fragment_shader.fsh @@ -5,30 +5,25 @@ varying vec2 v_maskTexCoord; uniform sampler2D u_colorTex; uniform sampler2D u_maskTex; uniform float u_opacity; - -const lowp float OUTLINE_MIN_VALUE0 = 0.41; -const lowp float OUTLINE_MIN_VALUE1 = 0.565; -const lowp float OUTLINE_MAX_VALUE0 = 0.57; -const lowp float OUTLINE_MAX_VALUE1 = 0.95; -const lowp float GLYPH_MIN_VALUE = 0.45; -const lowp float GLYPH_MAX_VALUE = 0.6; +uniform vec4 u_outlineGlyphParams; +uniform vec2 u_glyphParams; vec4 colorize(vec4 base, vec4 outline, float alpha) { - if (alpha > OUTLINE_MAX_VALUE1) + if (alpha > u_outlineGlyphParams.w) return vec4(outline.rgb, 0); - if (alpha > OUTLINE_MAX_VALUE0) + if (alpha > u_outlineGlyphParams.z) { - float oFactor = smoothstep(OUTLINE_MAX_VALUE1, OUTLINE_MAX_VALUE0, alpha); + float oFactor = smoothstep(u_outlineGlyphParams.w, u_outlineGlyphParams.z, alpha); return mix(vec4(outline.rgb,0), outline, oFactor); } - if (alpha > OUTLINE_MIN_VALUE1) + if (alpha > u_outlineGlyphParams.y) { return outline; } - if (alpha > OUTLINE_MIN_VALUE0) + if (alpha > u_outlineGlyphParams.x) { - float oFactor = smoothstep(OUTLINE_MIN_VALUE0, OUTLINE_MIN_VALUE1, alpha); + float oFactor = smoothstep(u_outlineGlyphParams.x, u_outlineGlyphParams.y, alpha); return mix(base, outline, oFactor); } return base; @@ -36,9 +31,9 @@ vec4 colorize(vec4 base, vec4 outline, float alpha) vec4 without_outline(vec4 base, float alpha) { - if (alpha > GLYPH_MIN_VALUE) + if (alpha > u_glyphParams.x) { - float oFactor = smoothstep(GLYPH_MIN_VALUE, GLYPH_MAX_VALUE, alpha); + float oFactor = smoothstep(u_glyphParams.x, u_glyphParams.y, alpha); return mix(base, vec4(0, 0, 0, 0), oFactor); } return base; diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index d32adbbee7..93c616eae9 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -261,6 +261,7 @@ void BackendRenderer::InitGLDependentResource() params.m_glyphMngParams.m_uniBlocks = "unicode_blocks.txt"; params.m_glyphMngParams.m_whitelist = "fonts_whitelist.txt"; params.m_glyphMngParams.m_blacklist = "fonts_blacklist.txt"; + params.m_glyphMngParams.m_sdfScale = VisualParams::Instance().GetGlyphSdfScale(); GetPlatform().GetFontNames(params.m_glyphMngParams.m_fonts); m_texMng->Init(params); diff --git a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp index 1ec9564a68..185c774ea5 100644 --- a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp +++ b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp @@ -5,6 +5,7 @@ #include "base/thread.hpp" #include "std/bind.hpp" +#include "std/cstring.hpp" #include "std/list.hpp" #ifdef DEBUG diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index a20f129dd8..be745f722f 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -1,7 +1,11 @@ #include "drape_frontend/render_group.hpp" +#include "drape_frontend/visual_params.hpp" + +#include "drape/shader_def.hpp" + +#include "geometry/screenbase.hpp" #include "base/stl_add.hpp" -#include "geometry/screenbase.hpp" #include "std/bind.hpp" @@ -17,6 +21,15 @@ RenderGroup::RenderGroup(dp::GLState const & state, df::TileKey const & tileKey) : TBase(state, tileKey) , m_pendingOnDelete(false) { + if (state.GetProgramIndex() == gpu::TEXT_PROGRAM) + { + auto const & params = VisualParams::Instance().GetGlyphVisualParams(); + m_uniforms.SetFloatValue("u_outlineGlyphParams", + params.m_outlineMinStart, params.m_outlineMinEnd, + params.m_outlineMaxStart, params.m_outlineMaxEnd); + m_uniforms.SetFloatValue("u_glyphParams", + params.m_alphaGlyphMin, params.m_alphaGlyphMax); + } } RenderGroup::~RenderGroup() diff --git a/drape_frontend/visual_params.cpp b/drape_frontend/visual_params.cpp index 2d8a2c3e2d..2408919374 100644 --- a/drape_frontend/visual_params.cpp +++ b/drape_frontend/visual_params.cpp @@ -39,9 +39,21 @@ void VisualParams::Init(double vs, uint32_t tileSize, vector const & a g_VizParams.m_visualScale = vs; if (find(additionalOptions.begin(), additionalOptions.end(), YotaDevice) != additionalOptions.end()) g_VizParams.m_isYotaDevice = true; + + // Here we set up glyphs rendering parameters separately for high-res and low-res screens. + if (vs <= 1.0) + g_VizParams.m_glyphVisualParams = { 0.48, 0.625, 0.64, 0.95, 0.48, 0.625 }; + else + g_VizParams.m_glyphVisualParams = { 0.41, 0.565, 0.57, 0.95, 0.45, 0.6 }; + RISE_INITED; } +uint32_t VisualParams::GetGlyphSdfScale() const +{ + return (m_visualScale <= 1.0) ? 3 : 4; +} + VisualParams & VisualParams::Instance() { ASSERT_INITED; @@ -110,6 +122,11 @@ double VisualParams::GetDragThreshold() const return 10.0 * GetVisualScale(); } +VisualParams::GlyphVisualParams const & VisualParams::GetGlyphVisualParams() const +{ + return m_glyphVisualParams; +} + VisualParams::VisualParams() : m_tileSize(0) , m_visualScale(0.0) diff --git a/drape_frontend/visual_params.hpp b/drape_frontend/visual_params.hpp index 0baa4f365d..a7a981ba35 100644 --- a/drape_frontend/visual_params.hpp +++ b/drape_frontend/visual_params.hpp @@ -30,10 +30,24 @@ public: uint32_t GetTouchRectRadius() const; double GetDragThreshold() const; + struct GlyphVisualParams + { + float m_outlineMinStart; + float m_outlineMinEnd; + float m_outlineMaxStart; + float m_outlineMaxEnd; + float m_alphaGlyphMin; + float m_alphaGlyphMax; + }; + + GlyphVisualParams const & GetGlyphVisualParams() const; + uint32_t GetGlyphSdfScale() const; + private: int m_tileSize; double m_visualScale; bool m_isYotaDevice; + GlyphVisualParams m_glyphVisualParams; }; m2::RectD const & GetWorldRect();