KWin
Loading...
Searching...
No Matches
showpaint.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: 2007 Lubos Lunak <l.lunak@kde.org>
6 SPDX-FileCopyrightText: 2010 Martin Gräßlin <mgraesslin@kde.org>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10
11#include "showpaint.h"
12
13#include "core/pixelgrid.h"
14#include "core/renderviewport.h"
16#include "opengl/glutils.h"
17
18#include <KGlobalAccel>
19#include <KLocalizedString>
20
21#include <QAction>
22#include <QPainter>
23
24namespace KWin
25{
26
27static const qreal s_alpha = 0.2;
28static const QList<QColor> s_colors{
29 Qt::red,
30 Qt::green,
31 Qt::blue,
32 Qt::cyan,
33 Qt::magenta,
34 Qt::yellow,
35 Qt::gray};
36
38{
39 auto *toggleAction = new QAction(this);
40 toggleAction->setObjectName(QStringLiteral("Toggle"));
41 toggleAction->setText(i18n("Toggle Show Paint"));
42 KGlobalAccel::self()->setDefaultShortcut(toggleAction, {});
43 KGlobalAccel::self()->setShortcut(toggleAction, {});
44
45 connect(toggleAction, &QAction::triggered, this, &ShowPaintEffect::toggle);
46}
47
48void ShowPaintEffect::paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
49{
50 m_painted = QRegion();
51 effects->paintScreen(renderTarget, viewport, mask, region, screen);
53 paintGL(viewport.projectionMatrix(), viewport.scale());
55 paintQPainter();
56 }
57 if (++m_colorIndex == s_colors.count()) {
58 m_colorIndex = 0;
59 }
60}
61
62void ShowPaintEffect::paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data)
63{
64 m_painted += region;
65 effects->paintWindow(renderTarget, viewport, w, mask, region, data);
66}
67
68void ShowPaintEffect::paintGL(const QMatrix4x4 &projection, qreal scale)
69{
71 vbo->reset();
73 binder.shader()->setUniform(GLShader::Mat4Uniform::ModelViewProjectionMatrix, projection);
74 glEnable(GL_BLEND);
75 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
76 QColor color = s_colors[m_colorIndex];
77 color.setAlphaF(s_alpha);
78 binder.shader()->setUniform(GLShader::ColorUniform::Color, color);
79 QList<QVector2D> verts;
80 verts.reserve(m_painted.rectCount() * 12);
81 for (const QRect &r : m_painted) {
82 const auto deviceRect = snapToPixelGridF(scaledRect(r, scale));
83 verts.push_back(QVector2D(deviceRect.x() + deviceRect.width(), deviceRect.y()));
84 verts.push_back(QVector2D(deviceRect.x(), deviceRect.y()));
85 verts.push_back(QVector2D(deviceRect.x(), deviceRect.y() + deviceRect.height()));
86 verts.push_back(QVector2D(deviceRect.x(), deviceRect.y() + deviceRect.height()));
87 verts.push_back(QVector2D(deviceRect.x() + deviceRect.width(), deviceRect.y() + deviceRect.height()));
88 verts.push_back(QVector2D(deviceRect.x() + deviceRect.width(), deviceRect.y()));
89 }
90 vbo->setVertices(verts);
91 vbo->render(GL_TRIANGLES);
92 glDisable(GL_BLEND);
93}
94
95void ShowPaintEffect::paintQPainter()
96{
97 QColor color = s_colors[m_colorIndex];
98 color.setAlphaF(s_alpha);
99 for (const QRect &r : m_painted) {
100 effects->scenePainter()->fillRect(r, color);
101 }
102}
103
105{
106 return m_active;
107}
108
109void ShowPaintEffect::toggle()
110{
111 m_active = !m_active;
113}
114
115} // namespace KWin
116
117#include "moc_showpaint.cpp"
Representation of a window used by/for Effect classes.
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
CompositingType compositingType
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
Q_SCRIPTABLE void addRepaintFull()
QPainter * scenePainter()
Provides access to the QPainter which is rendering to the back buffer.
Vertex Buffer Object.
static GLVertexBuffer * streamingBuffer()
void render(GLenum primitiveMode)
void setVertices(const T &range)
QMatrix4x4 projectionMatrix() const
bool isActive() const override
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override
Definition showpaint.cpp:62
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen) override
Definition showpaint.cpp:48
KWIN_EXPORT QPointF snapToPixelGridF(const QPointF &point)
Definition pixelgrid.h:21
@ QPainterCompositing
Definition globals.h:39
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)
Definition globals.h:243
EffectsHandler * effects