You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.5 KiB
101 lines
2.5 KiB
/* |
|
KWin - the KDE window manager |
|
This file is part of the KDE project. |
|
|
|
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
#include "decorationrenderer.h" |
|
#include "decoratedclient.h" |
|
#include "decorations/decorations_logging.h" |
|
#include "deleted.h" |
|
#include "abstract_client.h" |
|
#include "screens.h" |
|
|
|
#include <KDecoration2/Decoration> |
|
#include <KDecoration2/DecoratedClient> |
|
|
|
#include <QDebug> |
|
#include <QPainter> |
|
|
|
namespace KWin |
|
{ |
|
namespace Decoration |
|
{ |
|
|
|
Renderer::Renderer(DecoratedClientImpl *client) |
|
: QObject(client) |
|
, m_client(client) |
|
, m_imageSizesDirty(true) |
|
{ |
|
auto markImageSizesDirty = [this]{ |
|
schedule(m_client->client()->rect()); |
|
m_imageSizesDirty = true; |
|
}; |
|
connect(client->client(), &AbstractClient::screenScaleChanged, this, markImageSizesDirty); |
|
connect(client->decoration(), &KDecoration2::Decoration::bordersChanged, this, markImageSizesDirty); |
|
connect(client->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, markImageSizesDirty); |
|
} |
|
|
|
Renderer::~Renderer() = default; |
|
|
|
void Renderer::schedule(const QRect &rect) |
|
{ |
|
m_scheduled = m_scheduled.united(rect); |
|
emit renderScheduled(rect); |
|
} |
|
|
|
QRegion Renderer::getScheduled() |
|
{ |
|
QRegion region = m_scheduled; |
|
m_scheduled = QRegion(); |
|
return region; |
|
} |
|
|
|
QImage Renderer::renderToImage(const QRect &geo) |
|
{ |
|
Q_ASSERT(m_client); |
|
auto dpr = client()->client()->screenScale(); |
|
|
|
// Guess the pixel format of the X pixmap into which the QImage will be copied. |
|
QImage::Format format; |
|
const int depth = client()->client()->depth(); |
|
switch (depth) { |
|
case 30: |
|
format = QImage::Format_A2RGB30_Premultiplied; |
|
break; |
|
case 24: |
|
case 32: |
|
format = QImage::Format_ARGB32_Premultiplied; |
|
break; |
|
default: |
|
qCCritical(KWIN_DECORATIONS) << "Unsupported client depth" << depth; |
|
format = QImage::Format_ARGB32_Premultiplied; |
|
break; |
|
}; |
|
|
|
QImage image(geo.width() * dpr, geo.height() * dpr, format); |
|
image.setDevicePixelRatio(dpr); |
|
image.fill(Qt::transparent); |
|
QPainter p(&image); |
|
p.setRenderHint(QPainter::Antialiasing); |
|
p.setWindow(QRect(geo.topLeft(), geo.size() * dpr)); |
|
p.setClipRect(geo); |
|
renderToPainter(&p, geo); |
|
return image; |
|
} |
|
|
|
void Renderer::renderToPainter(QPainter *painter, const QRect &rect) |
|
{ |
|
client()->decoration()->paint(painter, rect); |
|
} |
|
|
|
void Renderer::reparent(Deleted *deleted) |
|
{ |
|
setParent(deleted); |
|
m_client = nullptr; |
|
} |
|
|
|
} |
|
}
|
|
|