File indexing completed on 2024-05-12 05:32:07
0001 /* 0002 SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include "core/renderlayerdelegate.h" 0010 0011 #include <QObject> 0012 0013 #include <memory> 0014 0015 namespace KWin 0016 { 0017 0018 class ItemRenderer; 0019 class Output; 0020 class Scene; 0021 0022 class KWIN_EXPORT SceneDelegate : public RenderLayerDelegate 0023 { 0024 public: 0025 explicit SceneDelegate(Scene *scene, Output *output); 0026 ~SceneDelegate() override; 0027 0028 Output *output() const; 0029 qreal scale() const; 0030 QRect viewport() const; 0031 0032 SurfaceItem *scanoutCandidate() const override; 0033 void frame(OutputFrame *frame) override; 0034 QRegion prePaint() override; 0035 void postPaint() override; 0036 void paint(const RenderTarget &renderTarget, const QRegion ®ion) override; 0037 0038 private: 0039 Scene *m_scene; 0040 Output *m_output = nullptr; 0041 }; 0042 0043 class KWIN_EXPORT Scene : public QObject 0044 { 0045 Q_OBJECT 0046 0047 public: 0048 // Flags controlling how painting is done. 0049 enum { 0050 // WindowItem (or at least part of it) will be painted opaque. 0051 PAINT_WINDOW_OPAQUE = 1 << 0, 0052 // WindowItem (or at least part of it) will be painted translucent. 0053 PAINT_WINDOW_TRANSLUCENT = 1 << 1, 0054 // WindowItem will be painted with transformed geometry. 0055 PAINT_WINDOW_TRANSFORMED = 1 << 2, 0056 // Paint only a region of the screen (can be optimized, cannot 0057 // be used together with TRANSFORMED flags). 0058 PAINT_SCREEN_REGION = 1 << 3, 0059 // Whole screen will be painted with transformed geometry. 0060 PAINT_SCREEN_TRANSFORMED = 1 << 4, 0061 // At least one window will be painted with transformed geometry. 0062 PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS = 1 << 5, 0063 // Clear whole background as the very first step, without optimizing it 0064 PAINT_SCREEN_BACKGROUND_FIRST = 1 << 6, 0065 }; 0066 0067 explicit Scene(std::unique_ptr<ItemRenderer> &&renderer); 0068 ~Scene() override; 0069 0070 ItemRenderer *renderer() const; 0071 0072 void addRepaint(const QRegion ®ion); 0073 void addRepaint(int x, int y, int width, int height); 0074 void addRepaintFull(); 0075 virtual QRegion damage() const; 0076 0077 QRect geometry() const; 0078 void setGeometry(const QRect &rect); 0079 0080 QList<SceneDelegate *> delegates() const; 0081 void addDelegate(SceneDelegate *delegate); 0082 void removeDelegate(SceneDelegate *delegate); 0083 0084 virtual SurfaceItem *scanoutCandidate() const; 0085 virtual QRegion prePaint(SceneDelegate *delegate) = 0; 0086 virtual void postPaint() = 0; 0087 virtual void paint(const RenderTarget &renderTarget, const QRegion ®ion) = 0; 0088 virtual void frame(SceneDelegate *delegate, OutputFrame *frame); 0089 0090 Q_SIGNALS: 0091 void delegateRemoved(SceneDelegate *delegate); 0092 0093 protected: 0094 std::unique_ptr<ItemRenderer> m_renderer; 0095 QList<SceneDelegate *> m_delegates; 0096 QRect m_geometry; 0097 }; 0098 0099 } // namespace KWin