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 }