File indexing completed on 2024-04-28 04:05:02

0001 /*
0002     SPDX-FileCopyrightText: 2012 Viranch Mehta <viranch.mehta@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "kgameimageprovider_p.h"
0008 
0009 // own
0010 #include "kgamethemeprovider.h"
0011 // Qt
0012 #include <QGuiApplication>
0013 #include <QPainter>
0014 
0015 KGameImageProvider::KGameImageProvider(KGameThemeProvider *prov)
0016     : QQuickImageProvider(Image)
0017     , m_provider(prov)
0018 {
0019     reloadRenderer();
0020 }
0021 
0022 void KGameImageProvider::reloadRenderer()
0023 {
0024     m_renderer.load(m_provider->currentTheme()->graphicsPath());
0025     m_themeName = m_provider->currentThemeName();
0026 }
0027 
0028 QImage KGameImageProvider::requestImage(const QString &source, QSize *size, const QSize &requestedSize)
0029 {
0030     Q_UNUSED(requestedSize); // this is always QSize(-1,-1) for some reason
0031 
0032     QImage image;
0033 
0034     const QList<QStringView> tokens = QStringView(source).split(QLatin1Char('/'));
0035     if (tokens.size() > 2) {
0036         const QStringView &theme = tokens[0];
0037         const QString spriteKey = tokens[1].toString();
0038         const QList<QStringView> size = tokens[2].split(QLatin1Char('x'));
0039         uint width = qRound(size[0].toDouble());
0040         uint height = qRound(size[1].toDouble());
0041 
0042         if (theme != m_themeName) {
0043             reloadRenderer();
0044         }
0045 
0046         if (m_renderer.isValid()) {
0047             if (width == 0 || height == 0) {
0048                 image = QImage(m_renderer.boundsOnElement(spriteKey).size().toSize() * qApp->devicePixelRatio(), QImage::Format_ARGB32_Premultiplied);
0049             } else {
0050                 image = QImage(QSize(width, height) * qApp->devicePixelRatio(), QImage::Format_ARGB32_Premultiplied);
0051             }
0052             image.fill(Qt::transparent);
0053             QPainter *painter = new QPainter(&image);
0054             m_renderer.render(painter, spriteKey);
0055 
0056             // this is deliberately set after .render as Qt <= 5.4 has a bug in QSVGRenderer which makes it not fill the image properly
0057             image.setDevicePixelRatio(qApp->devicePixelRatio());
0058             delete painter;
0059         }
0060     }
0061 
0062     if (size)
0063         *size = image.size();
0064 
0065     return image;
0066 }