From ec794a537fe9b62e554cd6744d0d66f4eccbcf60 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 8 Nov 2022 18:14:39 +0200 Subject: [PATCH] kwin: deal with TODO related to XRenderPicture Signed-off-by: Ivailo Monev --- kwin/effects/trackmouse/trackmouse.cpp | 8 ++++---- kwin/effects/zoom/zoom.cpp | 2 +- kwin/libkwineffects/kwinxrenderutils.cpp | 10 ---------- kwin/libkwineffects/kwinxrenderutils.h | 2 -- kwin/scene_xrender.cpp | 12 ++++++------ kwin/scene_xrender.h | 2 +- kwin/shadow.h | 4 ++-- 7 files changed, 14 insertions(+), 26 deletions(-) diff --git a/kwin/effects/trackmouse/trackmouse.cpp b/kwin/effects/trackmouse/trackmouse.cpp index 9b9d6f6d..e72c7a03 100644 --- a/kwin/effects/trackmouse/trackmouse.cpp +++ b/kwin/effects/trackmouse/trackmouse.cpp @@ -210,10 +210,10 @@ void TrackMouseEffect::loadTexture() for (int i = 0; i < 2; ++i) { #ifdef KWIN_BUILD_COMPOSITE if ( effects->compositingType() == XRenderCompositing) { - QPixmap pixmap(f[i]); - m_picture[i] = new XRenderPicture(pixmap); - m_size[i] = pixmap.size(); - m_lastRect[i].setSize(pixmap.size()); + QImage image(f[i]); + m_picture[i] = new XRenderPicture(image); + m_size[i] = image.size(); + m_lastRect[i].setSize(image.size()); } #endif } diff --git a/kwin/effects/zoom/zoom.cpp b/kwin/effects/zoom/zoom.cpp index b6c8727b..0c527cb8 100644 --- a/kwin/effects/zoom/zoom.cpp +++ b/kwin/effects/zoom/zoom.cpp @@ -173,7 +173,7 @@ void ZoomEffect::recreateTexture() QImage img((uchar*)ximg->pixels, imageWidth, imageHeight, QImage::Format_ARGB32_Premultiplied); #ifdef KWIN_BUILD_COMPOSITE if (effects->compositingType() == XRenderCompositing) - xrenderPicture.reset(new XRenderPicture(QPixmap::fromImage(img))); + xrenderPicture.reset(new XRenderPicture(img)); #endif XcursorImageDestroy(ximg); } diff --git a/kwin/libkwineffects/kwinxrenderutils.cpp b/kwin/libkwineffects/kwinxrenderutils.cpp index 05c0218f..41d3f1e3 100644 --- a/kwin/libkwineffects/kwinxrenderutils.cpp +++ b/kwin/libkwineffects/kwinxrenderutils.cpp @@ -107,17 +107,7 @@ static xcb_render_picture_t createPicture(xcb_pixmap_t pix, int depth) return pic; } -XRenderPicture::XRenderPicture(const QPixmap &pix) -{ - fromImage(pix.toImage()); -} - XRenderPicture::XRenderPicture(const QImage &img) -{ - fromImage(img); -} - -void XRenderPicture::fromImage(const QImage &img) { const int depth = img.depth(); xcb_pixmap_t xpix = xcb_generate_id(connection()); diff --git a/kwin/libkwineffects/kwinxrenderutils.h b/kwin/libkwineffects/kwinxrenderutils.h index 186f7a5e..8423c1b2 100644 --- a/kwin/libkwineffects/kwinxrenderutils.h +++ b/kwin/libkwineffects/kwinxrenderutils.h @@ -68,8 +68,6 @@ class KWIN_EXPORT XRenderPicture { public: explicit XRenderPicture(xcb_render_picture_t pic = XCB_RENDER_PICTURE_NONE); - // TODO: Qt5 - replace QPixmap by QImage to make it more obvious that it uses PutImage - explicit XRenderPicture(const QPixmap &pix); explicit XRenderPicture(const QImage &img); XRenderPicture(xcb_pixmap_t pix, int depth); operator xcb_render_picture_t(); diff --git a/kwin/scene_xrender.cpp b/kwin/scene_xrender.cpp index 473a2462..4eb88bc8 100644 --- a/kwin/scene_xrender.cpp +++ b/kwin/scene_xrender.cpp @@ -860,7 +860,7 @@ void SceneXrender::EffectFrame::render(QRegion region, double opacity, double fr QPoint topLeft(m_effectFrame->geometry().x(), m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2); if (!m_iconPicture) // lazy creation - m_iconPicture = new XRenderPicture(m_effectFrame->icon()); + m_iconPicture = new XRenderPicture(m_effectFrame->icon().toImage()); QRect geom = QRect(topLeft, m_effectFrame->iconSize()); xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *m_iconPicture, fill, effects->xrenderBufferPicture(), @@ -994,15 +994,15 @@ void SceneXrender::EffectFrame::updateTextPicture() text = metrics.elidedText(text, Qt::ElideRight, rect.width()); } - QPixmap pixmap(m_effectFrame->geometry().size()); - pixmap.fill(Qt::transparent); - QPainter p(&pixmap); + QImage image(m_effectFrame->geometry().size(), QImage::Format_ARGB32_Premultiplied); + image.fill(Qt::transparent); + QPainter p(&image); p.setFont(m_effectFrame->font()); // TODO: What about no frame? Custom color setting required p.setPen(Qt::white); p.drawText(rect, m_effectFrame->alignment(), text); p.end(); - m_textPicture = new XRenderPicture(pixmap); + m_textPicture = new XRenderPicture(image); } SceneXRenderShadow::SceneXRenderShadow(Toplevel *toplevel) @@ -1067,7 +1067,7 @@ bool SceneXRenderShadow::prepareBackend() const uint32_t values[] = {XCB_RENDER_REPEAT_NORMAL}; for (int i=0; i