/* KWin - the KDE window manager This file is part of the KDE project. SPDX-FileCopyrightText: 2014 Martin Gräßlin 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 #include #include #include 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; } } }