/*
This file is a part of the KDE project
- Copyright © 2006 Zack Rusin <zack@kde.org>
- Copyright © 2006-2007, 2008 Fredrik Höglund <fredrik@kde.org>
+ SPDX-FileCopyrightText: 2006 Zack Rusin <zack@kde.org>
+ SPDX-FileCopyrightText: 2006-2007, 2008 Fredrik Höglund <fredrik@kde.org>
The stack blur algorithm was invented by Mario Klingemann <mario@quasimondo.com>
This implementation is based on the version in Anti-Grain Geometry Version 2.4,
- Copyright © 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ SPDX-FileCopyrightText: 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+
+ SPDX-License-Identifier: BSD-2-Clause
*/
#include "kpixmapmodifier.h"
+#include <QGuiApplication>
#include <QImage>
#include <QPainter>
-#include <QPixmap>
-#include <QSize>
-
-
-#include <config-X11.h> // for HAVE_XRENDER
-#if defined(Q_WS_X11) && defined(HAVE_XRENDER)
-# include <QX11Info>
-# include <X11/Xlib.h>
-# include <X11/extensions/Xrender.h>
-#endif
static const quint32 stackBlur8Mul[255] =
{
pixmap = QPixmap();
return;
}
-
-#if defined(Q_WS_X11) && defined(HAVE_XRENDER)
- // Assume that the texture size limit is 2048x2048
- if ((pixmap.width() <= 2048) && (pixmap.height() <= 2048) && pixmap.x11PictureHandle()) {
- const QPixmap unscaledPixmap = pixmap.copy(); // Make a deep copy for XRender
- QSize scaledPixmapSize = pixmap.size();
- scaledPixmapSize.scale(scaledSize, Qt::KeepAspectRatio);
-
- const qreal factor = scaledPixmapSize.width() / qreal(unscaledPixmap.width());
-
- XTransform xform = {{
- { XDoubleToFixed(1 / factor), 0, 0 },
- { 0, XDoubleToFixed(1 / factor), 0 },
- { 0, 0, XDoubleToFixed(1) }
- }};
-
- QPixmap scaledPixmap(scaledPixmapSize);
- scaledPixmap.fill(Qt::transparent);
-
- Display* dpy = QX11Info::display();
-
- XRenderPictureAttributes attr;
- attr.repeat = RepeatPad;
- XRenderChangePicture(dpy, unscaledPixmap.x11PictureHandle(), CPRepeat, &attr);
-
- XRenderSetPictureFilter(dpy, unscaledPixmap.x11PictureHandle(), FilterBilinear, 0, 0);
- XRenderSetPictureTransform(dpy, unscaledPixmap.x11PictureHandle(), &xform);
- XRenderComposite(dpy, PictOpOver, unscaledPixmap.x11PictureHandle(), None, scaledPixmap.x11PictureHandle(),
- 0, 0, 0, 0, 0, 0, scaledPixmap.width(), scaledPixmap.height());
- pixmap = scaledPixmap;
- } else {
- pixmap = pixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
- }
-#else
+ qreal dpr = pixmap.devicePixelRatio();
pixmap = pixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-#endif
+ pixmap.setDevicePixelRatio(dpr);
}
void KPixmapModifier::applyFrame(QPixmap& icon, const QSize& scaledSize)
{
static TileSet tileSet;
+ qreal dpr = qApp->devicePixelRatio();
// Resize the icon to the maximum size minus the space required for the frame
const QSize size(scaledSize.width() - TileSet::LeftMargin - TileSet::RightMargin,
scaledSize.height() - TileSet::TopMargin - TileSet::BottomMargin);
- scale(icon, size);
+ scale(icon, size * dpr);
+ icon.setDevicePixelRatio(dpr);
- QPixmap framedIcon(icon.size().width() + TileSet::LeftMargin + TileSet::RightMargin,
- icon.size().height() + TileSet::TopMargin + TileSet::BottomMargin);
+ QPixmap framedIcon(icon.size().width() + (TileSet::LeftMargin + TileSet::RightMargin) * dpr,
+ icon.size().height() + (TileSet::TopMargin + TileSet::BottomMargin) * dpr);
+ framedIcon.setDevicePixelRatio(dpr);
framedIcon.fill(Qt::transparent);
QPainter painter;
painter.begin(&framedIcon);
painter.setCompositionMode(QPainter::CompositionMode_Source);
- tileSet.paint(&painter, framedIcon.rect());
+ tileSet.paint(&painter, QRect(QPoint(0,0), framedIcon.size() / dpr));
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawPixmap(TileSet::LeftMargin, TileSet::TopMargin, icon);