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 &region) 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 &region);
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 &region) = 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