diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 7c5a2024fc..e0b4d183a2 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -241,6 +241,7 @@ void DrapeEngine::UpdateUserMarksGroup(MarkGroupID groupId, UserMarksProvider * renderInfo->m_pixelOffset = mark->GetPixelOffset(); renderInfo->m_symbolName = mark->GetSymbolName(); renderInfo->m_titleDecl = mark->GetTitleDecl(); + renderInfo->m_symbolSizes = mark->GetSymbolSizes(); renderInfo->m_hasSymbolPriority = mark->HasSymbolPriority(); renderInfo->m_hasTitlePriority = mark->HasTitlePriority(); renderInfo->m_priority = mark->GetPriority(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index aa23e8d43f..9454d93b15 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1201,6 +1201,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) { StencilWriterGuard guard(make_ref(m_postprocessRenderer)); RenderUserMarksLayer(modelView, RenderState::UserMarkLayer); + RenderUserMarksLayer(modelView, RenderState::TransitMarkLayer); RenderUserMarksLayer(modelView, RenderState::RoutingMarkLayer); } @@ -1324,6 +1325,7 @@ void FrontendRenderer::BuildOverlayTree(ScreenBase const & modelView) static std::vector layers = {RenderState::OverlayLayer, RenderState::LocalAdsMarkLayer, RenderState::NavigationLayer, + RenderState::TransitMarkLayer, RenderState::RoutingMarkLayer}; BeginUpdateOverlayTree(modelView); for (auto const & layerId : layers) diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index 78ecbef798..5f807984c7 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -164,6 +164,7 @@ bool RenderGroup::IsUserMark() const auto const depthLayer = GetDepthLayer(m_state); return depthLayer == RenderState::UserLineLayer || depthLayer == RenderState::UserMarkLayer || + depthLayer == RenderState::TransitMarkLayer || depthLayer == RenderState::RoutingMarkLayer || depthLayer == RenderState::LocalAdsMarkLayer; } diff --git a/drape_frontend/render_state.hpp b/drape_frontend/render_state.hpp index 45370ab0fc..c095d21ad7 100644 --- a/drape_frontend/render_state.hpp +++ b/drape_frontend/render_state.hpp @@ -18,6 +18,7 @@ public: LocalAdsMarkLayer, UserMarkLayer, NavigationLayer, + TransitMarkLayer, RoutingMarkLayer, GuiLayer, LayersCount diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index ee9621dd2d..d593e2f76a 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -130,7 +130,7 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr texture PoiSymbolShape(renderInfo.m_pivot, params, tileKey, 0 /* textIndex */).Draw(&batcher, textures); } - else + else if (!renderInfo.m_symbolName.empty()) { buffer.reserve(vertexCount); @@ -180,9 +180,16 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr texture params.m_specialPriority = renderInfo.m_priority; } - dp::TextureManager::SymbolRegion region; - textures->GetSymbolRegion(renderInfo.m_symbolName, region); - m2::PointF const symbolSize = region.GetPixelSize(); + m2::PointF symbolSize; + if (renderInfo.m_symbolSizes != nullptr) + { + symbolSize = renderInfo.m_symbolSizes->at(static_cast(tileKey.m_zoomLevel)) * vs; + } + else + { + textures->GetSymbolRegion(renderInfo.m_symbolName, region); + symbolSize = region.GetPixelSize(); + } TextShape(renderInfo.m_pivot, params, tileKey, renderInfo.m_hasSymbolPriority /* hasPOI */, symbolSize, renderInfo.m_anchor, 0 /* textIndex */).Draw(&batcher, textures); diff --git a/drape_frontend/user_mark_shapes.hpp b/drape_frontend/user_mark_shapes.hpp index 70431808f5..a35e72ab9d 100644 --- a/drape_frontend/user_mark_shapes.hpp +++ b/drape_frontend/user_mark_shapes.hpp @@ -20,6 +20,7 @@ struct UserMarkRenderParams m2::PointD m_pixelOffset = m2::PointD(0.0, 0.0); std::string m_symbolName; dp::Anchor m_anchor = dp::Center; + drape_ptr> m_symbolSizes; drape_ptr m_titleDecl; bool m_hasSymbolPriority = false; bool m_hasTitlePriority = false; diff --git a/drape_frontend/user_marks_provider.hpp b/drape_frontend/user_marks_provider.hpp index c74027921b..df14bf0a7a 100644 --- a/drape_frontend/user_marks_provider.hpp +++ b/drape_frontend/user_marks_provider.hpp @@ -54,6 +54,7 @@ public: virtual RenderState::DepthLayer GetDepthLayer() const = 0; virtual bool IsVisible() const = 0; virtual drape_ptr GetTitleDecl() const = 0; + virtual drape_ptr> GetSymbolSizes() const = 0; virtual uint16_t GetPriority() const = 0; virtual bool HasSymbolPriority() const = 0; virtual bool HasTitlePriority() const = 0; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 6a28daaf26..20b5dad853 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -38,6 +38,7 @@ using ApiUserMarkContainer = SpecifiedUserMarkContainer; using RouteUserMarkContainer = SpecifiedUserMarkContainer; using LocalAdsMarkContainer = SpecifiedUserMarkContainer; +using TransitMarkContainer = SpecifiedUserMarkContainer; using StaticUserMarkContainer = SpecifiedUserMarkContainer; // Returns extension with a dot in a lower case. @@ -69,12 +70,13 @@ BookmarkManager::BookmarkManager(GetStringsBundleFn && getStringsBundleFn) { ASSERT(m_getStringsBundle != nullptr, ()); - m_userMarkLayers.reserve(6); + m_userMarkLayers.reserve(7); m_userMarkLayers.emplace_back(my::make_unique()); m_userMarkLayers.emplace_back(my::make_unique()); m_userMarkLayers.emplace_back(my::make_unique()); m_userMarkLayers.emplace_back(my::make_unique()); m_userMarkLayers.emplace_back(my::make_unique()); + m_userMarkLayers.emplace_back(my::make_unique()); auto staticMarksContainer = my::make_unique(); m_selectionMark = my::make_unique(staticMarksContainer.get()); diff --git a/map/routing_mark.cpp b/map/routing_mark.cpp index ee6bb26c5b..003fcee7b5 100644 --- a/map/routing_mark.cpp +++ b/map/routing_mark.cpp @@ -11,9 +11,14 @@ static std::string const kRouteMarkPrimaryTextOutline = "RouteMarkPrimaryTextOut static std::string const kRouteMarkSecondaryText = "RouteMarkSecondaryText"; static std::string const kRouteMarkSecondaryTextOutline = "RouteMarkSecondaryTextOutline"; +// TODO(@darina) Use separate colors. +static std::string const kTransitMarkText = "RouteMarkPrimaryText"; +static std::string const kTransitMarkTextOutline = "RouteMarkPrimaryTextOutline"; + float const kRouteMarkPrimaryTextSize = 11.0f; float const kRouteMarkSecondaryTextSize = 10.0f; float const kRouteMarkSecondaryOffsetY = 2.0f; +float const kTransitMarkTextSize = 13.0f; } // namespace RouteMarkPoint::RouteMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container) @@ -367,3 +372,70 @@ void RoutePointsLayout::NotifyChanges() { m_routeMarks.NotifyChanges(); } + +TransitMark::TransitMark(m2::PointD const & ptOrg, UserMarkContainer * container) + : UserMark(ptOrg, container) +{ + m_titleDecl.m_anchor = dp::Center; + m_titleDecl.m_primaryTextFont.m_color = df::GetColorConstant(kTransitMarkText); + m_titleDecl.m_primaryTextFont.m_outlineColor = df::GetColorConstant(kTransitMarkTextOutline); + m_titleDecl.m_primaryTextFont.m_size = kTransitMarkTextSize; + m_titleDecl.m_secondaryTextFont.m_color = df::GetColorConstant(kTransitMarkText); + m_titleDecl.m_secondaryTextFont.m_outlineColor = df::GetColorConstant(kTransitMarkTextOutline); + m_titleDecl.m_secondaryTextFont.m_size = kTransitMarkTextSize; +} + +void TransitMark::SetMinZoom(int minZoom) +{ + SetDirty(); + m_minZoom = minZoom; +} + +void TransitMark::SetSymbolSizes(std::vector const & symbolSizes) +{ + SetDirty(); + m_symbolSizes = symbolSizes; +} + +void TransitMark::SetPrimaryText(std::string const & primary) +{ + SetDirty(); + m_titleDecl.m_primaryText = primary; +} + +void TransitMark::SetSecondaryText(std::string const & secondary) +{ + SetDirty(); + m_titleDecl.m_secondaryText = secondary; +} + +void TransitMark::SetTextPosition(dp::Anchor anchor, + m2::PointF const & primaryOffset, m2::PointF const & secondaryOffset) +{ + SetDirty(); + m_titleDecl.m_primaryOffset = primaryOffset; + m_titleDecl.m_secondaryOffset = secondaryOffset; + m_titleDecl.m_anchor = anchor; +} + +void TransitMark::SetPrimaryTextColor(dp::Color color) +{ + SetDirty(); + m_titleDecl.m_primaryTextFont.m_color = color; +} + +void TransitMark::SetSecondaryTextColor(dp::Color color) +{ + SetDirty(); + m_titleDecl.m_secondaryTextFont.m_color = color; +} + +drape_ptr TransitMark::GetTitleDecl() const +{ + return make_unique_dp(m_titleDecl); +} + +drape_ptr> TransitMark::GetSymbolSizes() const +{ + return make_unique_dp>(m_symbolSizes); +} diff --git a/map/routing_mark.hpp b/map/routing_mark.hpp index 691138d98e..01e19b9346 100644 --- a/map/routing_mark.hpp +++ b/map/routing_mark.hpp @@ -100,3 +100,37 @@ private: UserMarksController & m_routeMarks; }; + +class TransitMark : public UserMark +{ +public: + TransitMark(m2::PointD const & ptOrg, UserMarkContainer * container); + virtual ~TransitMark() {} + + dp::Anchor GetAnchor() const override { return dp::Center; } + df::RenderState::DepthLayer GetDepthLayer() const override { return df::RenderState::TransitMarkLayer; } + std::string GetSymbolName() const override { return ""; } + UserMark::Type GetMarkType() const override { return Type::TRANSIT; } + + bool HasSymbolPriority() const override { return false; } + bool HasTitlePriority() const override { return true; } + + void SetMinZoom(int minZoom); + int GetMinZoom() const override { return m_minZoom; } + + void SetSymbolSizes(std::vector const & symbolSizes); + drape_ptr> GetSymbolSizes() const override; + + void SetPrimaryText(std::string const & primary); + void SetSecondaryText(std::string const & secondary); + void SetTextPosition(dp::Anchor anchor, m2::PointF const & primaryOffset = m2::PointF(0.0f, 0.0f), + m2::PointF const & secondaryOffset = m2::PointF(0.0f, 0.0f)); + void SetPrimaryTextColor(dp::Color color); + void SetSecondaryTextColor(dp::Color color); + drape_ptr GetTitleDecl() const override; + +private: + int m_minZoom = 1; + dp::TitleDecl m_titleDecl; + std::vector m_symbolSizes; +}; diff --git a/map/user_mark.cpp b/map/user_mark.cpp index a5eff5c297..fdf2d32c6e 100644 --- a/map/user_mark.cpp +++ b/map/user_mark.cpp @@ -86,5 +86,6 @@ string DebugPrint(UserMark::Type type) case UserMark::Type::DEBUG_MARK: return "DEBUG_MARK"; case UserMark::Type::ROUTING: return "ROUTING"; case UserMark::Type::LOCAL_ADS: return "LOCAL_ADS"; + case UserMark::Type::TRANSIT: return "TRANSIT"; } } diff --git a/map/user_mark.hpp b/map/user_mark.hpp index b431c42674..ec337b9351 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -27,6 +27,7 @@ public: STATIC, BOOKMARK, ROUTING, + TRANSIT, LOCAL_ADS, DEBUG_MARK }; @@ -43,6 +44,7 @@ public: float GetDepth() const override; df::RenderState::DepthLayer GetDepthLayer() const override; drape_ptr GetTitleDecl() const override { return nullptr; } + drape_ptr> GetSymbolSizes() const override { return nullptr; } uint16_t GetPriority() const override { return kDefaultUserMarkPriority; } bool HasSymbolPriority() const override { return false; } bool HasTitlePriority() const override { return false; }