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