/* Layout — контейнер cells и оркестратор apply_template (Phase 11b). * * Layout::apply() принимает LayoutTemplate + список активных pool-entries * (sorted by priority DESC) + output W×H. Создаёт нужные Cell-подклассы: * * CameraCell для каждой template-cell с role=CAMERA — берёт source * по индексу из active list (active[0]=order 0, active[1]=order 1, ...) * Если active меньше чем camera-cells — лишние cells = BlankCell. * WidgetCell для template-cell с role=WIDGET — placeholder. * * Decorations добавляются здесь же: * LabelDecoration "{key} prio={N}" в каждый CameraCell. * LabelDecoration с именем widget'а в каждый WidgetCell. * (Border, Badge — Phase 12+) * * Layout::render(stream, dst) — итеративно вызывает cell->draw(). * * Лицензия: LGPL-2.1+ */ #ifndef CUFRAMES_COMPOSER_CPP_LAYOUT_HPP #define CUFRAMES_COMPOSER_CPP_LAYOUT_HPP #include "cell.hpp" #include "source_pool.hpp" #include "template.hpp" #include #include #include namespace cfc { class Layout { public: Layout() = default; /* Применить template — пересоздаёт cells + decorations. * active_sorted — список pool-entries, уже отсортированный priority DESC. */ void apply(const LayoutTemplate& tpl, const std::vector& active_sorted, int frame_w, int frame_h); /* Прорисовать все cells в dst буфер. */ void render(CUstream stream, NV12Ref& dst); const std::string& name() const noexcept { return current_name_; } int cell_count() const noexcept { return static_cast(cells_.size()); } /* Найти текущий pixel-rect для камеры с заданным cuframes-key. NULL * если этой камеры в layout сейчас нет. Используется detbox-overlay'ями * для пересчёта bbox при смене layout. */ const Rect* find_camera_cell_rect(const std::string& source_key) const; private: std::vector> cells_; std::string current_name_; }; } // namespace cfc #endif /* CUFRAMES_COMPOSER_CPP_LAYOUT_HPP */