diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 5bcee9e7a6..48fdb313b4 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -277,7 +277,6 @@ void BookmarkManager::DrawItems(shared_ptr const & e) const graphics::Screen * pScreen = e->drawer()->screen(); pScreen->beginFrame(); - PaintOverlayEvent event(e->drawer(), screen); m_selection.Draw(event, m_cache); for_each(m_userMarkLayers.begin(), m_userMarkLayers.end(), bind(&UserMarkContainer::Draw, _1, event, m_cache)); diff --git a/map/events.hpp b/map/events.hpp index 5a6fdecbcf..9c5a6dec66 100644 --- a/map/events.hpp +++ b/map/events.hpp @@ -71,6 +71,7 @@ public: ScreenBase const & GetModelView() const { return m_modelView; } Drawer * GetDrawer() const { return m_drawer; } + m2::RectD const & GetClipRect() const { return m_modelView.ClipRect(); } private: Drawer * m_drawer; diff --git a/map/user_mark_container.cpp b/map/user_mark_container.cpp index 933c05a26c..0a03eb6abc 100644 --- a/map/user_mark_container.cpp +++ b/map/user_mark_container.cpp @@ -131,13 +131,21 @@ UserMarkContainer::~UserMarkContainer() Clear(); } +template +void UserMarkContainer::ForEachInRect(m2::RectD const & rect, ToDo toDo) const +{ + for (size_t i = 0; i < m_userMarks.size(); ++i) + if (rect.IsPointInside(m_userMarks[i]->GetOrg())) + toDo(m_userMarks[i]); +} + UserMark const * UserMarkContainer::FindMarkInRect(m2::AnyRectD const & rect, double & d) const { UserMark * mark = NULL; if (IsVisible()) { FindMarkFunctor f(&mark, d, rect); - for_each(m_userMarks.begin(), m_userMarks.end(), f); + ForEachInRect(rect.GetGlobalRect(), f); } return mark; } @@ -147,8 +155,8 @@ void UserMarkContainer::Draw(PaintOverlayEvent const & e, UserMarkDLCache * cach if (IsVisible() && IsDrawable()) { UserMarkDLCache::Key defaultKey(GetTypeName(), graphics::EPosCenter, m_layerDepth); - for_each(m_userMarks.begin(), m_userMarks.end(), bind(&DrawUserMark, 1.0, m_framework.GetVisualScale(), - e, cache, defaultKey, _1)); + ForEachInRect(e.GetClipRect(), bind(&DrawUserMark, 1.0, m_framework.GetVisualScale(), + e, cache, defaultKey, _1)); } } diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index 2bf0b54411..e8ddd6d682 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -96,6 +96,8 @@ private: void DeleteUserMark(size_t index); void DeleteUserMark(UserMark const * mark); + template void ForEachInRect(m2::RectD const & rect, ToDo toDo) const; + protected: Framework & m_framework;