/* SPDX-FileCopyrightText: 2022 Vlad Zahorodnii SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "core/renderlayerdelegate.h" #include #include namespace KWin { class ItemRenderer; class Output; class Scene; class KWIN_EXPORT SceneDelegate : public RenderLayerDelegate { public: explicit SceneDelegate(Scene *scene, Output *output); ~SceneDelegate() override; Output *output() const; qreal scale() const; QRect viewport() const; QList scanoutCandidates(ssize_t maxCount) const override; void frame(OutputFrame *frame) override; QRegion prePaint() override; void postPaint() override; void paint(const RenderTarget &renderTarget, const QRegion ®ion) override; private: Scene *m_scene; Output *m_output = nullptr; }; class KWIN_EXPORT Scene : public QObject { Q_OBJECT public: // Flags controlling how painting is done. enum { // WindowItem (or at least part of it) will be painted opaque. PAINT_WINDOW_OPAQUE = 1 << 0, // WindowItem (or at least part of it) will be painted translucent. PAINT_WINDOW_TRANSLUCENT = 1 << 1, // WindowItem will be painted with transformed geometry. PAINT_WINDOW_TRANSFORMED = 1 << 2, // Paint only a region of the screen (can be optimized, cannot // be used together with TRANSFORMED flags). PAINT_SCREEN_REGION = 1 << 3, // Whole screen will be painted with transformed geometry. PAINT_SCREEN_TRANSFORMED = 1 << 4, // At least one window will be painted with transformed geometry. PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS = 1 << 5, // Clear whole background as the very first step, without optimizing it PAINT_SCREEN_BACKGROUND_FIRST = 1 << 6, }; explicit Scene(std::unique_ptr &&renderer); ~Scene() override; ItemRenderer *renderer() const; void addRepaint(const QRegion ®ion); void addRepaint(int x, int y, int width, int height); void addRepaintFull(); virtual QRegion damage() const; QRect geometry() const; void setGeometry(const QRect &rect); QList delegates() const; void addDelegate(SceneDelegate *delegate); void removeDelegate(SceneDelegate *delegate); virtual QList scanoutCandidates(ssize_t maxCount) const; virtual QRegion prePaint(SceneDelegate *delegate) = 0; virtual void postPaint() = 0; virtual void paint(const RenderTarget &renderTarget, const QRegion ®ion) = 0; virtual void frame(SceneDelegate *delegate, OutputFrame *frame); Q_SIGNALS: void delegateRemoved(SceneDelegate *delegate); protected: std::unique_ptr m_renderer; QList m_delegates; QRect m_geometry; }; } // namespace KWin