From c103eb8f5c0c14c1b6e6b36c19b2c16a03a62837 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 26 Apr 2021 10:38:18 +0300 Subject: [PATCH] qpa: Simplify backing store blitting We can use QPainter::drawImage() to update the dirty area of the front buffer. This way, we don't need to call std::copy(). --- src/plugins/qpa/backingstore.cpp | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/plugins/qpa/backingstore.cpp b/src/plugins/qpa/backingstore.cpp index 1a0a4c9cfe..b965fd04e0 100644 --- a/src/plugins/qpa/backingstore.cpp +++ b/src/plugins/qpa/backingstore.cpp @@ -12,6 +12,8 @@ #include "internal_client.h" +#include + namespace KWin { namespace QPA @@ -47,29 +49,16 @@ void BackingStore::resize(const QSize &size, const QRegion &staticContents) m_frontBuffer.setDevicePixelRatio(devicePixelRatio); } -static void blitImage(const QImage &source, QImage &target, const QRect &rect) +static QRect scaledRect(const QRect &rect, qreal devicePixelRatio) { - Q_ASSERT(source.format() == QImage::Format_ARGB32_Premultiplied); - Q_ASSERT(target.format() == QImage::Format_ARGB32_Premultiplied); - - const int devicePixelRatio = target.devicePixelRatio(); - - const int x = rect.x() * devicePixelRatio; - const int y = rect.y() * devicePixelRatio; - const int width = rect.width() * devicePixelRatio; - const int height = rect.height() * devicePixelRatio; - - for (int i = y; i < y + height; ++i) { - const uint32_t *in = reinterpret_cast(source.scanLine(i)); - uint32_t *out = reinterpret_cast(target.scanLine(i)); - std::copy(in + x, in + x + width, out + x); - } + return QRect(rect.topLeft() * devicePixelRatio, rect.size() * devicePixelRatio); } static void blitImage(const QImage &source, QImage &target, const QRegion ®ion) { + QPainter painter(&target); for (const QRect &rect : region) { - blitImage(source, target, rect); + painter.drawImage(rect, source, scaledRect(rect, source.devicePixelRatio())); } }