KWin
Loading...
Searching...
No Matches
workspacescene_qpainter.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
10// KWin
13#include "window.h"
14
15// Qt
16#include <KDecoration2/Decoration>
17#include <QDebug>
18#include <QPainter>
19
20#include <cmath>
21
22namespace KWin
23{
24
25//****************************************
26// SceneQPainter
27//****************************************
28
30 : WorkspaceScene(std::make_unique<ItemRendererQPainter>())
31 , m_backend(backend)
32{
33}
34
38
40{
41 return std::make_unique<SceneQPainterDecorationRenderer>(impl);
42}
43
44std::unique_ptr<ShadowTextureProvider> WorkspaceSceneQPainter::createShadowTextureProvider(Shadow *shadow)
45{
46 return std::make_unique<QPainterShadowTextureProvider>(shadow);
47}
48
49//****************************************
50// QPainterShadow
51//****************************************
56
60
61//****************************************
62// QPainterDecorationRenderer
63//****************************************
68
70{
71 Q_ASSERT(part != DecorationPart::Count);
72 return m_images[int(part)];
73}
74
75void SceneQPainterDecorationRenderer::render(const QRegion &region)
76{
77 if (areImageSizesDirty()) {
78 resizeImages();
80 }
81
82 auto imageSize = [this](DecorationPart part) {
83 return m_images[int(part)].size() / m_images[int(part)].devicePixelRatio();
84 };
85
86 const QRect top(QPoint(0, 0), imageSize(DecorationPart::Top));
87 const QRect left(QPoint(0, top.height()), imageSize(DecorationPart::Left));
88 const QRect right(QPoint(top.width() - imageSize(DecorationPart::Right).width(), top.height()), imageSize(DecorationPart::Right));
89 const QRect bottom(QPoint(0, left.y() + left.height()), imageSize(DecorationPart::Bottom));
90
91 const QRect geometry = region.boundingRect();
92 auto renderPart = [this](const QRect &rect, const QRect &partRect, int index) {
93 if (rect.isEmpty()) {
94 return;
95 }
96 QPainter painter(&m_images[index]);
97 painter.setRenderHint(QPainter::Antialiasing);
98 painter.setWindow(QRect(partRect.topLeft(), partRect.size() * effectiveDevicePixelRatio()));
99 painter.setClipRect(rect);
100 painter.save();
101 // clear existing part
102 painter.setCompositionMode(QPainter::CompositionMode_Source);
103 painter.fillRect(rect, Qt::transparent);
104 painter.restore();
105 client()->decoration()->paint(&painter, rect);
106 };
107
108 renderPart(left.intersected(geometry), left, int(DecorationPart::Left));
109 renderPart(top.intersected(geometry), top, int(DecorationPart::Top));
110 renderPart(right.intersected(geometry), right, int(DecorationPart::Right));
111 renderPart(bottom.intersected(geometry), bottom, int(DecorationPart::Bottom));
112}
113
114void SceneQPainterDecorationRenderer::resizeImages()
115{
116 QRectF left, top, right, bottom;
117 client()->window()->layoutDecorationRects(left, top, right, bottom);
118
119 auto checkAndCreate = [this](int index, const QSizeF &size) {
120 auto dpr = effectiveDevicePixelRatio();
121 if (m_images[index].size() != size * dpr || m_images[index].devicePixelRatio() != dpr) {
122 m_images[index] = QImage(size.toSize() * dpr, QImage::Format_ARGB32_Premultiplied);
123 m_images[index].setDevicePixelRatio(dpr);
124 m_images[index].fill(Qt::transparent);
125 }
126 };
127 checkAndCreate(int(DecorationPart::Left), left.size());
128 checkAndCreate(int(DecorationPart::Right), right.size());
129 checkAndCreate(int(DecorationPart::Top), top.size());
130 checkAndCreate(int(DecorationPart::Bottom), bottom.size());
131}
132
133} // KWin
134
135#include "moc_workspacescene_qpainter.cpp"
Decoration::DecoratedClientImpl * client() const
bool areImageSizesDirty() const
qreal effectiveDevicePixelRatio() const
void render(const QRegion &region) override
QImage image(DecorationPart part) const
SceneQPainterDecorationRenderer(Decoration::DecoratedClientImpl *client)
Class representing a Window's Shadow to be rendered by the Compositor.
Definition shadow.h:48
void layoutDecorationRects(QRectF &left, QRectF &top, QRectF &right, QRectF &bottom) const
Definition window.cpp:2690
WorkspaceSceneQPainter(QPainterBackend *backend)
std::unique_ptr< ShadowTextureProvider > createShadowTextureProvider(Shadow *shadow) override
std::unique_ptr< DecorationRenderer > createDecorationRenderer(Decoration::DecoratedClientImpl *impl) override