KWin
Loading...
Searching...
No Matches
scene.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "scene/scene.h"
8#include "core/output.h"
9#include "core/renderlayer.h"
10#include "scene/itemrenderer.h"
11
12namespace KWin
13{
14
16 : m_scene(scene)
17 , m_output(output)
18{
19 m_scene->addDelegate(this);
20}
21
23{
24 m_scene->removeDelegate(this);
25}
26
28{
29 return m_scene->scanoutCandidate();
30}
31
33{
34 return m_scene->prePaint(this);
35}
36
38{
39 m_scene->postPaint();
40}
41
42void SceneDelegate::paint(const RenderTarget &renderTarget, const QRegion &region)
43{
44 m_scene->paint(renderTarget, region == infiniteRegion() ? infiniteRegion() : region.translated(viewport().topLeft()));
45}
46
48{
49 m_scene->frame(this, frame);
50}
51
53{
54 return m_output;
55}
56
58{
59 return m_output ? m_output->scale() : 1.0;
60}
61
63{
64 return m_output ? m_output->geometry() : m_scene->geometry();
65}
66
67Scene::Scene(std::unique_ptr<ItemRenderer> &&renderer)
68 : m_renderer(std::move(renderer))
69{
70}
71
73{
74}
75
77{
78 return m_renderer.get();
79}
80
85
86void Scene::addRepaint(int x, int y, int width, int height)
87{
88 addRepaint(QRegion(x, y, width, height));
89}
90
91void Scene::addRepaint(const QRegion &region)
92{
93 for (const auto &delegate : std::as_const(m_delegates)) {
94 const QRect viewport = delegate->viewport();
95 QRegion dirtyRegion = region & viewport;
96 dirtyRegion.translate(-viewport.topLeft());
97 if (!dirtyRegion.isEmpty()) {
98 delegate->layer()->addRepaint(dirtyRegion);
99 }
100 }
101}
102
103QRegion Scene::damage() const
104{
105 return QRegion();
106}
107
108QRect Scene::geometry() const
109{
110 return m_geometry;
111}
112
113void Scene::setGeometry(const QRect &rect)
114{
115 if (m_geometry != rect) {
116 m_geometry = rect;
118 }
119}
120
121QList<SceneDelegate *> Scene::delegates() const
122{
123 return m_delegates;
124}
125
127{
128 m_delegates.append(delegate);
129}
130
132{
133 m_delegates.removeOne(delegate);
134 Q_EMIT delegateRemoved(delegate);
135}
136
138{
139 return nullptr;
140}
141
143{
144}
145
146} // namespace KWin
147
148#include "moc_scene.cpp"
qreal scale() const
Definition output.cpp:455
QRect geometry
Definition output.h:134
SurfaceItem * scanoutCandidate() const override
Definition scene.cpp:27
~SceneDelegate() override
Definition scene.cpp:22
void paint(const RenderTarget &renderTarget, const QRegion &region) override
Definition scene.cpp:42
void postPaint() override
Definition scene.cpp:37
Output * output() const
Definition scene.cpp:52
QRegion prePaint() override
Definition scene.cpp:32
void frame(OutputFrame *frame) override
Definition scene.cpp:47
QRect viewport() const
Definition scene.cpp:62
qreal scale() const
Definition scene.cpp:57
SceneDelegate(Scene *scene, Output *output)
Definition scene.cpp:15
virtual void frame(SceneDelegate *delegate, OutputFrame *frame)
Definition scene.cpp:142
void setGeometry(const QRect &rect)
Definition scene.cpp:113
Scene(std::unique_ptr< ItemRenderer > &&renderer)
Definition scene.cpp:67
~Scene() override
Definition scene.cpp:72
QList< SceneDelegate * > delegates() const
Definition scene.cpp:121
virtual void paint(const RenderTarget &renderTarget, const QRegion &region)=0
void addRepaintFull()
Definition scene.cpp:81
QRect m_geometry
Definition scene.h:96
virtual SurfaceItem * scanoutCandidate() const
Definition scene.cpp:137
virtual QRegion damage() const
Definition scene.cpp:103
virtual void postPaint()=0
void addDelegate(SceneDelegate *delegate)
Definition scene.cpp:126
QRect geometry() const
Definition scene.cpp:108
QList< SceneDelegate * > m_delegates
Definition scene.h:95
std::unique_ptr< ItemRenderer > m_renderer
Definition scene.h:94
void removeDelegate(SceneDelegate *delegate)
Definition scene.cpp:131
void addRepaint(const QRegion &region)
Definition scene.cpp:91
ItemRenderer * renderer() const
Definition scene.cpp:76
virtual QRegion prePaint(SceneDelegate *delegate)=0
void delegateRemoved(SceneDelegate *delegate)
KWIN_EXPORT QRect infiniteRegion()
Definition globals.h:234