23 #include "ImageCache.h" 25 ImageCache::ImageCache()
26 : QQuickImageProvider(QQmlImageProviderBase::Image,
27 QQmlImageProviderBase::ForceAsynchronousImageLoading)
31 QString ImageCache::imageCacheRoot()
33 QString xdgCache(qgetenv(
"XDG_CACHE_HOME"));
34 if (xdgCache.isEmpty()) {
35 xdgCache = QDir::homePath() + QStringLiteral(
"/.cache");
38 return QDir::cleanPath(xdgCache) + QStringLiteral(
"/unity8/imagecache");
41 QFileInfo ImageCache::imagePath(
const QUrl &image)
43 QUrlQuery query(image);
45 auto name = query.queryItemValue(QStringLiteral(
"name"));
47 name = QStringLiteral(
"/paths") + image.toLocalFile();
49 name = QStringLiteral(
"/names/") + name;
52 return QFileInfo(imageCacheRoot() + name);
55 bool ImageCache::needsUpdate(
const QUrl &image,
const QFileInfo &cachePath,
const QSize &imageSize,
const QSize &requestedSize, QSize &finalSize)
57 if (!cachePath.exists())
60 QFileInfo imageInfo(image.toLocalFile());
61 if (imageInfo.lastModified() > cachePath.lastModified())
64 QSize cacheSize(QImageReader(cachePath.filePath()).size());
65 finalSize = calculateSize(imageSize, requestedSize);
66 if (finalSize.isValid() && cacheSize != finalSize)
72 QSize ImageCache::calculateSize(
const QSize &imageSize,
const QSize &requestedSize)
74 QSize finalSize(requestedSize);
76 if (finalSize.width() == 0) {
77 finalSize.setWidth(imageSize.width() * (((double)finalSize.height()) / imageSize.height()));
78 }
else if (finalSize.height() == 0) {
79 finalSize.setHeight(imageSize.height() * (((double)finalSize.width()) / imageSize.width()));
85 QImage ImageCache::loadAndCacheImage(QImageReader &reader,
const QFileInfo &cachePath,
const QSize &finalSize)
87 reader.setQuality(100);
88 reader.setScaledSize(finalSize);
89 auto format = reader.format();
91 QImage loadedImage(reader.read());
92 if (loadedImage.isNull()) {
93 qWarning() <<
"ImageCache could not read image" << reader.fileName() <<
":" << reader.errorString();
97 cachePath.dir().mkpath(QStringLiteral(
"."));
98 loadedImage.save(cachePath.filePath(), format, 100);
103 QImage ImageCache::requestImage(
const QString &
id, QSize *size,
const QSize &requestedSize)
106 QImageReader imageReader(image.toLocalFile());
107 QSize imageSize(imageReader.size());
111 if ((requestedSize.width() <= 0 && requestedSize.height() <= 0) ||
112 imageSize.isEmpty() ||
113 requestedSize.height() >= imageSize.height() ||
114 requestedSize.width() >= imageSize.width()) {
116 result = imageReader.read();
117 *size = result.size();
121 auto cachePath = imagePath(image);
124 if (needsUpdate(image, cachePath, imageSize, requestedSize, finalSize)) {
125 if (finalSize.isEmpty()) {
126 finalSize = calculateSize(imageSize, requestedSize);
128 result = loadAndCacheImage(imageReader, cachePath, finalSize);
130 result = QImage(cachePath.filePath());
133 *size = result.size();