Add support for "@3x" image loading.
Implement as generic "@Nx" support in an exported qt_findAtNxFile function. 3x devices now get one extra file existence test in cases where @3x versions are not present. 1x devices are still on the fast path where there are no extra file system accesses. Add an @3x image to the highdpi manual test. Change-Id: I4ce3fc245ada01ea410abe1443ceb1e3abf7c17f Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
This commit is contained in:
parent
9d1fab424e
commit
068a545339
@ -45,6 +45,7 @@
|
||||
#include "qcache.h"
|
||||
#include "qdebug.h"
|
||||
#include "qpalette.h"
|
||||
#include "qmath.h"
|
||||
|
||||
#include "private/qhexstring_p.h"
|
||||
#include "private/qguiapplication_p.h"
|
||||
@ -1026,19 +1027,13 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State
|
||||
} else {
|
||||
detach();
|
||||
}
|
||||
|
||||
d->engine->addFile(fileName, size, mode, state);
|
||||
|
||||
// Check if a "@2x" file exists and add it.
|
||||
static bool disable2xImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");
|
||||
if (!disable2xImageLoading && qApp->devicePixelRatio() > 1.0) {
|
||||
QString at2xfileName = fileName;
|
||||
int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
|
||||
if (dotIndex == -1) /* no dot */
|
||||
dotIndex = fileName.size(); /* append */
|
||||
at2xfileName.insert(dotIndex, QStringLiteral("@2x"));
|
||||
if (QFile::exists(at2xfileName))
|
||||
d->engine->addFile(at2xfileName, size, mode, state);
|
||||
}
|
||||
// Check if a "@Nx" file exists and add it.
|
||||
QString atNxFileName = qt_findAtNxFile(fileName, qApp->devicePixelRatio());
|
||||
if (atNxFileName != fileName)
|
||||
d->engine->addFile(atNxFileName, size, mode, state);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -1375,5 +1370,39 @@ QDebug operator<<(QDebug dbg, const QIcon &i)
|
||||
\internal
|
||||
*/
|
||||
|
||||
/*!
|
||||
\internal
|
||||
\since 5.6
|
||||
Attempts to find a suitable @Nx file for the given \a targetDevicePixelRatio
|
||||
Returns the the \a baseFileName if no such file was found.
|
||||
|
||||
Given base foo.png and a target dpr of 2.5, this function will look for
|
||||
foo@3x.png, then foo@2x, then fall back to foo.png if not found.
|
||||
*/
|
||||
QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRatio)
|
||||
{
|
||||
if (targetDevicePixelRatio <= 1.0)
|
||||
return baseFileName;
|
||||
|
||||
static bool disableNxImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");
|
||||
if (disableNxImageLoading)
|
||||
return baseFileName;
|
||||
|
||||
QString atNx = QLatin1String("@%1x");
|
||||
int dotIndex = baseFileName.lastIndexOf(QLatin1Char('.'));
|
||||
if (dotIndex == -1) /* no dot */
|
||||
dotIndex = baseFileName.size(); /* append */
|
||||
|
||||
// Check for @Nx, ..., @3x, @2x file versions,
|
||||
for (int n = qCeil(targetDevicePixelRatio); n > 1; --n) {
|
||||
QString atNxfileName = baseFileName;
|
||||
atNxfileName.insert(dotIndex, atNx.arg(n));
|
||||
if (QFile::exists(atNxfileName))
|
||||
return atNxfileName;
|
||||
}
|
||||
|
||||
return baseFileName;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
#endif //QT_NO_ICON
|
||||
|
@ -139,6 +139,8 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QIcon &);
|
||||
Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QIcon &);
|
||||
#endif
|
||||
|
||||
Q_GUI_EXPORT QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRatio);
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QICON_H
|
||||
|
@ -44,6 +44,7 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
extern QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRatio);
|
||||
static QString resolveFileName(QString fileName, QUrl *url, qreal targetDevicePixelRatio)
|
||||
{
|
||||
// We might use the fileName for loading if url loading fails
|
||||
@ -62,19 +63,8 @@ static QString resolveFileName(QString fileName, QUrl *url, qreal targetDevicePi
|
||||
if (targetDevicePixelRatio <= 1.0)
|
||||
return fileName;
|
||||
|
||||
// try to find a 2x version
|
||||
|
||||
const int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
|
||||
if (dotIndex != -1) {
|
||||
QString at2xfileName = fileName;
|
||||
at2xfileName.insert(dotIndex, QStringLiteral("@2x"));
|
||||
if (QFile::exists(at2xfileName)) {
|
||||
fileName = at2xfileName;
|
||||
*url = QUrl(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
return fileName;
|
||||
// try to find a Nx version
|
||||
return qt_findAtNxFile(fileName, targetDevicePixelRatio);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
<qresource prefix="/">
|
||||
<file>qticon16.png</file>
|
||||
<file>qticon16@2x.png</file>
|
||||
<file>qticon16@3x.png</file>
|
||||
<file>qticon32.png</file>
|
||||
<file>qticon32@2x.png</file>
|
||||
<file>qticon64.png</file>
|
||||
|
BIN
tests/manual/highdpi/qticon16@3x.png
Normal file
BIN
tests/manual/highdpi/qticon16@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.2 KiB |
Loading…
Reference in New Issue
Block a user