diff options
author | Anatoliy Tomilov <tomilovanatoliy@gmail.com> | 2020-07-28 18:19:42 +0300 |
---|---|---|
committer | Tatiana Yan <tatiana.kondakova@gmail.com> | 2020-07-31 11:26:23 +0300 |
commit | e7aa4e0c0b90712fb3197e9f2a75920c8c93ad96 (patch) | |
tree | 5afb852e7ac517b1f4fa8e37b849789e83833290 /drape_frontend/user_mark_shapes.cpp | |
parent | e4c83b0540bab055e8516cbc0416c14ea6dc9e67 (diff) |
[drape] [booking] Add special badge (so called "chip") expanding for price text near the hotel's rating symbol MAPSME-14322
Diffstat (limited to 'drape_frontend/user_mark_shapes.cpp')
-rw-r--r-- | drape_frontend/user_mark_shapes.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index 47bca8c8d9..5bb3a5b2fd 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -66,6 +66,19 @@ void AlignVertical(float halfHeight, dp::Anchor anchor, glsl::vec2 & up, glsl::v dp::Bottom, up, down); } +TextLayout MakePrimaryTextLayout(dp::TitleDecl const & titleDecl, + ref_ptr<dp::TextureManager> textures) +{ + dp::FontDecl const & fontDecl = titleDecl.m_primaryTextFont; + auto const vs = static_cast<float>(df::VisualParams::Instance().GetVisualScale()); + bool const isSdf = fontDecl.m_outlineColor != dp::Color::Transparent() || + df::VisualParams::Instance().IsSdfPrefered(); + TextLayout textLayout; + textLayout.Init(strings::MakeUniString(titleDecl.m_primaryText), fontDecl.m_size * vs, isSdf, + textures); + return textLayout; +} + struct UserPointVertex : public gpu::BaseVertex { using TTexCoord = glsl::vec4; @@ -135,13 +148,7 @@ void GenerateColoredSymbolShapes(ref_ptr<dp::GraphicsContext> context, ref_ptr<d if (isTextBg) { auto const & titleDecl = renderInfo.m_titleDecl->at(0); - dp::FontDecl const & fontDecl = titleDecl.m_primaryTextFont; - auto isSdf = df::VisualParams::Instance().IsSdfPrefered(); - isSdf = fontDecl.m_outlineColor != dp::Color::Transparent() ? true : isSdf; - auto const vs = static_cast<float>(df::VisualParams::Instance().GetVisualScale()); - - TextLayout textLayout; - textLayout.Init(strings::MakeUniString(titleDecl.m_primaryText), fontDecl.m_size * vs, isSdf, textures); + auto textLayout = MakePrimaryTextLayout(titleDecl, textures); sizeInc.x = textLayout.GetPixelLength(); sizeInc.y = textLayout.GetPixelHeight(); @@ -222,6 +229,29 @@ void GeneratePoiSymbolShape(ref_ptr<dp::GraphicsContext> context, ref_ptr<dp::Te m2::PointF const & symbolOffset, dp::Batcher & batcher) { PoiSymbolViewParams params(renderInfo.m_featureId); + params.m_offset = symbolOffset; + + if (renderInfo.m_badgeInfo->m_badgeTitleIndex) + { + size_t const badgeTitleIndex = *renderInfo.m_badgeInfo->m_badgeTitleIndex; + CHECK_LESS(badgeTitleIndex, renderInfo.m_titleDecl->size(), ()); + + dp::TitleDecl const & titleDecl = (*renderInfo.m_titleDecl)[badgeTitleIndex]; + TextLayout textLayout = MakePrimaryTextLayout(titleDecl, textures); + float const textWidth = textLayout.GetPixelLength(); + + dp::TextureManager::SymbolRegion region; + textures->GetSymbolRegion(symbolName, region); + float const pixelHalfWidth = 0.5f * region.GetPixelSize().x; + + float constexpr kBadgeSpecialMarginsAdjustmentMultplier = 4.0f; + float const badgeSpecialMarginsAdjustment = + kBadgeSpecialMarginsAdjustmentMultplier * titleDecl.m_primaryOffset.x; + + params.m_pixelWidth = 3.0f * pixelHalfWidth + textWidth + badgeSpecialMarginsAdjustment; + params.m_offset.x += 0.5f * (pixelHalfWidth + textWidth + badgeSpecialMarginsAdjustment); + } + params.m_tileCenter = tileCenter; params.m_depthTestEnabled = renderInfo.m_depthTestEnabled; params.m_depth = renderInfo.m_depth; @@ -231,7 +261,6 @@ void GeneratePoiSymbolShape(ref_ptr<dp::GraphicsContext> context, ref_ptr<dp::Te params.m_specialPriority = renderInfo.m_priority; params.m_symbolName = symbolName; params.m_anchor = renderInfo.m_anchor; - params.m_offset = symbolOffset; bool const hasColoredOverlay = renderInfo.m_coloredSymbols != nullptr && renderInfo.m_coloredSymbols->m_needOverlay; params.m_startOverlayRank = hasColoredOverlay ? dp::OverlayRank1 : dp::OverlayRank0; @@ -482,11 +511,12 @@ void CacheUserMarks(ref_ptr<dp::GraphicsContext> context, TileKey const & tileKe if (renderInfo.m_titleDecl != nullptr) GenerateTextShapes(context, textures, renderInfo, tileKey, tileCenter, symbolOffset, symbolSize, batcher); - if (renderInfo.m_badgeNames != nullptr) + if (renderInfo.m_badgeInfo != nullptr) { ASSERT(!renderInfo.m_symbolIsPOI || renderInfo.m_symbolNames == nullptr, ("Multiple POI shapes in an usermark are not supported yet")); - auto const badgeName = GetSymbolNameForZoomLevel(make_ref(renderInfo.m_badgeNames), tileKey); + auto const badgeName = + GetSymbolNameForZoomLevel(make_ref(&renderInfo.m_badgeInfo->m_zoomInfo), tileKey); if (!badgeName.empty()) { // TODO: Badges use symbol offset. Refactor and create own "offset"-method for badges. |