#pragma once #include "geometry/rect2d.hpp" #include "geometry/any_rect2d.hpp" #include "geometry/point2d.hpp" #include "geometry/tree4d.hpp" #include "base/matrix.hpp" #include "base/mutex.hpp" #include "base/buffer_vector.hpp" #include "std/list.hpp" #include "std/shared_ptr.hpp" namespace graphics { class OverlayRenderer; class OverlayElement; struct OverlayElementTraits { static m2::RectD const LimitRect(shared_ptr const & elem); }; class OverlayStorage { public: OverlayStorage(); OverlayStorage(m2::RectD const & clipRect); size_t GetSize() const; void AddElement(shared_ptr const & elem); template void ForEach(Functor const & fn) { for (shared_ptr const & e : m_elements) fn(e); } private: m2::AnyRectD m_clipRect; bool m_needClip; buffer_vector, 128> m_elements; }; class Overlay { private: threads::Mutex m_mutex; m4::Tree, OverlayElementTraits> m_tree; void replaceOverlayElement(shared_ptr const & oe); void processOverlayElement(shared_ptr const & oe); void processOverlayElement(shared_ptr const & oe, math::Matrix const & m); Overlay(Overlay const & src) {} public: Overlay() {} void selectOverlayElements(m2::RectD const & rect, list > & res) const; size_t getElementsCount() const; void lock(); void unlock(); void clear(); void merge(shared_ptr const & infoLayer, math::Matrix const & m); void merge(shared_ptr const & infoLayer); void clip(m2::RectI const & r); template void forEach(Fn fn) { m_tree.ForEach(fn); } }; }