diff options
Diffstat (limited to 'src/imports/sharedimage/sharedimageprovider.cpp')
-rw-r--r-- | src/imports/sharedimage/sharedimageprovider.cpp | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/src/imports/sharedimage/sharedimageprovider.cpp b/src/imports/sharedimage/sharedimageprovider.cpp index 2dd3a130e9..f33057936d 100644 --- a/src/imports/sharedimage/sharedimageprovider.cpp +++ b/src/imports/sharedimage/sharedimageprovider.cpp @@ -39,18 +39,27 @@ #include <sharedimageprovider.h> #include <qsharedimageloader_p.h> -#include <qquickimageprovider.h> +#include <private/qquickpixmapcache_p.h> #include <private/qimage_p.h> #include <QImageReader> #include <QFileInfo> #include <QDir> +Q_DECLARE_METATYPE(QQuickImageProviderOptions) + class QuickSharedImageLoader : public QSharedImageLoader { Q_OBJECT friend class SharedImageProvider; public: + enum ImageParameter { + OriginalSize = 0, + RequestedSize, + ProviderOptions, + NumImageParameters + }; + QuickSharedImageLoader(QObject *parent = Q_NULLPTR) : QSharedImageLoader(parent) { @@ -61,29 +70,17 @@ protected: { QImageReader imgio(path); QSize realSize = imgio.size(); - QSize requestSize = params ? params->value(RequestedSize).toSize() : QSize(); + QSize requestSize; + QQuickImageProviderOptions options; + if (params) { + requestSize = params->value(RequestedSize).toSize(); + options = params->value(ProviderOptions).value<QQuickImageProviderOptions>(); + } - // Following qquickpixmapcache's readImage, from here... - const bool force_scale = imgio.format() == "svg" || imgio.format() == "svgz"; + QSize scSize = QQuickImageProviderWithOptions::loadSize(imgio.size(), requestSize, imgio.format(), options); - if (requestSize.width() > 0 || requestSize.height() > 0) { - QSize s = realSize; - qreal ratio = 0.0; - if (requestSize.width() && (force_scale || requestSize.width() < s.width())) { - ratio = qreal(requestSize.width())/s.width(); - } - if (requestSize.height() && (force_scale || requestSize.height() < s.height())) { - qreal hr = qreal(requestSize.height())/s.height(); - if (ratio == 0.0 || hr < ratio) - ratio = hr; - } - if (ratio > 0.0) { - s.setHeight(qRound(s.height() * ratio)); - s.setWidth(qRound(s.width() * ratio)); - imgio.setScaledSize(s); - } - } - // ... to here + if (scSize.isValid()) + imgio.setScaledSize(scSize); QImage image; if (imgio.read(&image)) { @@ -108,11 +105,17 @@ protected: QString key(const QString &path, ImageParameters *params) override { - QSize reqSz = params->value(RequestedSize).toSize(); + QSize reqSz; + QQuickImageProviderOptions opts; + if (params) { + reqSz = params->value(RequestedSize).toSize(); + opts = params->value(ProviderOptions).value<QQuickImageProviderOptions>(); + } if (!reqSz.isValid()) return path; + int aspect = opts.preserveAspectRatioCrop() || opts.preserveAspectRatioFit() ? 1 : 0; - QString key = path + QStringLiteral("_%1x%2").arg(reqSz.width()).arg(reqSz.height()); + QString key = path + QStringLiteral("_%1x%2_%3").arg(reqSz.width()).arg(reqSz.height()).arg(aspect); qCDebug(lcSharedImage) << "KEY:" << key; return key; } @@ -120,19 +123,20 @@ protected: SharedImageProvider::SharedImageProvider() - : QQuickImageProvider(QQuickImageProvider::Image), loader(new QuickSharedImageLoader) + : QQuickImageProviderWithOptions(QQuickImageProvider::Image), loader(new QuickSharedImageLoader) { } -QImage SharedImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) +QImage SharedImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize, const QQuickImageProviderOptions &options) { QFileInfo fi(QDir::root(), id); QString path = fi.canonicalFilePath(); if (path.isEmpty()) return QImage(); - QSharedImageLoader::ImageParameters params(QSharedImageLoader::NumImageParameters); - params[QSharedImageLoader::RequestedSize].setValue(requestedSize); + QSharedImageLoader::ImageParameters params(QuickSharedImageLoader::NumImageParameters); + params[QuickSharedImageLoader::RequestedSize].setValue(requestedSize); + params[QuickSharedImageLoader::ProviderOptions].setValue(options); QImage img = loader->load(path, ¶ms); if (img.isNull()) { |