28 if (
size.width() != other.
size.width()) {
29 return size.width() < other.
size.width();
31 return size.height() < other.
size.height();
46using ResourceKey = QPair<QString, QString>;
47using ThumbnailCacheT = QMap<ImageScalingParameters, QImage>;
60 key(
const QString &storageLocation,
const QString &resourceType,
const QString &filename)
const;
68 const auto scaledThumbnail = thumbnailEntries->find(param);
69 if (scaledThumbnail != thumbnailEntries->end()) {
70 return *scaledThumbnail;
84 return originalImageCache[key];
92 originalImageCache.insert(key, image);
97 return originalImageCache.contains(key);
101 const QString &resourceType,
102 const QString &filename)
const
104 return {storageLocation, resourceType +
"/" + filename};
122 const QString &resourceType,
123 const QString &filename)
const
125 const ResourceKey key =
m_d->key(storageLocation, resourceType, filename);
126 return m_d->containsOriginal(key) ?
m_d->getOriginal(key) : QImage();
130 const QString &resourceType,
131 const QString &filename,
134 if (image.isNull()) {
137 insert(
m_d->key(storageLocation, resourceType, filename), image);
142 m_d->insertOriginal(key, image);
146 const QString &resourceType,
147 const QString &filename)
149 remove(
m_d->key(storageLocation, resourceType, filename));
154 if (
m_d->originalImageCache.contains(key)) {
155 m_d->originalImageCache.remove(key);
157 if (
m_d->scaledThumbnailCache.contains(key)) {
158 m_d->scaledThumbnailCache.remove(key);
169 Qt::AspectRatioMode aspectMode,
170 Qt::TransformationMode transformMode)
174 const QString resourceType =
180 ResourceKey key =
m_d->key(storageLocation, resourceType, filename);
182 QImage result =
m_d->getExactMatch(key, param);
183 if (!result.isNull()) {
185 }
else if (
m_d->containsOriginal(key)) {
186 result =
m_d->getOriginal(key);
196 if (!result.isNull() && param.size.isValid()) {
197 const QImage scaledImage = result.scaled(param.size, param.aspectRatioMode, param.transformationMode);
198 if (
m_d->scaledThumbnailCache.contains(key)) {
199 m_d->scaledThumbnailCache[key].insert(param, scaledImage);
201 ThumbnailCacheT scaledCacheMap;
202 scaledCacheMap.insert(param, scaledImage);
203 m_d->scaledThumbnailCache.insert(key, scaledCacheMap);
Q_GLOBAL_STATIC(KisResourceThumbnailCache, s_instance)
QString makeStorageLocationAbsolute(QString storageLocation) const
static KisResourceLocator * instance()
KisResourceThumbnailCache()
void insert(const QString &storageLocation, const QString &resourceType, const QString &filename, const QImage &image)
static KisResourceThumbnailCache * instance()
~KisResourceThumbnailCache()
void remove(const QString &storageLocation, const QString &resourceType, const QString &filename)
QImage originalImage(const QString &storageLocation, const QString &resourceType, const QString &filename) const
QImage getImage(const QModelIndex &index, const QSize size=QSize(-1, -1), Qt::AspectRatioMode aspectMode=Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode=Qt::FastTransformation)
QScopedPointer< Private > m_d
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Qt::AspectRatioMode aspectRatioMode
Qt::TransformationMode transformationMode
bool operator<(const ImageScalingParameters &other) const
QImage getOriginal(const ResourceKey &key) const
QMap< ResourceKey, ThumbnailCacheT > scaledThumbnailCache
QMap< ResourceKey, QImage > originalImageCache
QImage getExactMatch(const ResourceKey &key, ImageScalingParameters param) const
void insertOriginal(const ResourceKey &key, const QImage &image)
bool containsOriginal(const ResourceKey &key) const
ResourceKey key(const QString &storageLocation, const QString &resourceType, const QString &filename) const