File indexing completed on 2024-05-19 16:34:46
0001 /* 0002 SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "scene/scene.h" 0008 #include "core/output.h" 0009 #include "core/renderlayer.h" 0010 #include "scene/itemrenderer.h" 0011 0012 namespace KWin 0013 { 0014 0015 SceneDelegate::SceneDelegate(Scene *scene) 0016 : m_scene(scene) 0017 { 0018 m_scene->addDelegate(this); 0019 } 0020 0021 SceneDelegate::SceneDelegate(Scene *scene, Output *output) 0022 : m_scene(scene) 0023 , m_output(output) 0024 { 0025 m_scene->addDelegate(this); 0026 } 0027 0028 SceneDelegate::~SceneDelegate() 0029 { 0030 m_scene->removeDelegate(this); 0031 } 0032 0033 QRegion SceneDelegate::repaints() const 0034 { 0035 return m_scene->damage().translated(-viewport().topLeft()); 0036 } 0037 0038 SurfaceItem *SceneDelegate::scanoutCandidate() const 0039 { 0040 return m_scene->scanoutCandidate(); 0041 } 0042 0043 void SceneDelegate::prePaint() 0044 { 0045 m_scene->prePaint(this); 0046 } 0047 0048 void SceneDelegate::postPaint() 0049 { 0050 m_scene->postPaint(); 0051 } 0052 0053 void SceneDelegate::paint(RenderTarget *renderTarget, const QRegion ®ion) 0054 { 0055 m_scene->paint(renderTarget, region.translated(viewport().topLeft())); 0056 } 0057 0058 Output *SceneDelegate::output() const 0059 { 0060 return m_output; 0061 } 0062 0063 QRect SceneDelegate::viewport() const 0064 { 0065 return m_output ? m_output->geometry() : m_scene->geometry(); 0066 } 0067 0068 Scene::Scene(std::unique_ptr<ItemRenderer> &&renderer) 0069 : m_renderer(std::move(renderer)) 0070 { 0071 } 0072 0073 Scene::~Scene() 0074 { 0075 } 0076 0077 ItemRenderer *Scene::renderer() const 0078 { 0079 return m_renderer.get(); 0080 } 0081 0082 void Scene::addRepaintFull() 0083 { 0084 addRepaint(geometry()); 0085 } 0086 0087 void Scene::addRepaint(int x, int y, int width, int height) 0088 { 0089 addRepaint(QRegion(x, y, width, height)); 0090 } 0091 0092 void Scene::addRepaint(const QRegion ®ion) 0093 { 0094 for (const auto &delegate : std::as_const(m_delegates)) { 0095 const QRect viewport = delegate->viewport(); 0096 QRegion dirtyRegion = region & viewport; 0097 dirtyRegion.translate(-viewport.topLeft()); 0098 if (!dirtyRegion.isEmpty()) { 0099 delegate->layer()->addRepaint(dirtyRegion); 0100 } 0101 } 0102 } 0103 0104 QRegion Scene::damage() const 0105 { 0106 return QRegion(); 0107 } 0108 0109 QRect Scene::geometry() const 0110 { 0111 return m_geometry; 0112 } 0113 0114 void Scene::setGeometry(const QRect &rect) 0115 { 0116 if (m_geometry != rect) { 0117 m_geometry = rect; 0118 addRepaintFull(); 0119 } 0120 } 0121 0122 QList<SceneDelegate *> Scene::delegates() const 0123 { 0124 return m_delegates; 0125 } 0126 0127 void Scene::addDelegate(SceneDelegate *delegate) 0128 { 0129 m_delegates.append(delegate); 0130 } 0131 0132 void Scene::removeDelegate(SceneDelegate *delegate) 0133 { 0134 m_delegates.removeOne(delegate); 0135 Q_EMIT delegateRemoved(delegate); 0136 } 0137 0138 SurfaceItem *Scene::scanoutCandidate() const 0139 { 0140 return nullptr; 0141 } 0142 0143 } // namespace KWin