KWin
Loading...
Searching...
No Matches
cursordelegate_qpainter.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
8#include "compositor.h"
9#include "core/output.h"
10#include "core/renderlayer.h"
11#include "core/rendertarget.h"
12#include "core/renderviewport.h"
13#include "cursor.h"
14#include "scene/cursorscene.h"
15
16#include <QPainter>
17
18namespace KWin
19{
20
22 : m_output(output)
23{
24}
25
26void CursorDelegateQPainter::paint(const RenderTarget &renderTarget, const QRegion &region)
27{
28 if (!region.intersects(layer()->mapToGlobal(layer()->rect()).toAlignedRect())) {
29 return;
30 }
31
32 QImage *buffer = renderTarget.image();
33 if (Q_UNLIKELY(!buffer)) {
34 return;
35 }
36
37 const QSize bufferSize = (Cursors::self()->currentCursor()->rect().size() * m_output->scale()).toSize();
38 if (m_buffer.size() != bufferSize) {
39 m_buffer = QImage(bufferSize, QImage::Format_ARGB32_Premultiplied);
40 }
41
42 RenderTarget offscreenRenderTarget(&m_buffer);
43
44 RenderLayer renderLayer(layer()->loop());
45 renderLayer.setDelegate(std::make_unique<SceneDelegate>(Compositor::self()->cursorScene(), m_output));
46 renderLayer.delegate()->prePaint();
47 renderLayer.delegate()->paint(offscreenRenderTarget, infiniteRegion());
48 renderLayer.delegate()->postPaint();
49
50 QPainter painter(buffer);
51 painter.setClipRegion(region);
52 painter.drawImage(layer()->mapToGlobal(layer()->rect()), m_buffer);
53}
54
55} // namespace KWin
static Compositor * self()
void paint(const RenderTarget &renderTarget, const QRegion &region) override
QRectF rect() const
Definition cursor.cpp:195
static Cursors * self()
Definition cursor.cpp:35
Cursor * currentCursor() const
Definition cursor.h:285
qreal scale() const
Definition output.cpp:455
virtual void paint(const RenderTarget &renderTarget, const QRegion &region)=0
void setDelegate(std::unique_ptr< RenderLayerDelegate > delegate)
RenderLayerDelegate * delegate() const
QImage * image() const
KWIN_EXPORT QRect infiniteRegion()
Definition globals.h:234