diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2018-04-11 06:56:46 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-05-13 13:52:35 -0700 |
commit | c0bca3ad04762a7178bda37be4c2ed87ae7e5f4e (patch) | |
tree | 916494e45f8818b4075043a61bd55e56596c2493 /qt-models | |
parent | 6b4e830670d2e49b258f30f7083372318a2bcf36 (diff) | |
download | subsurface-c0bca3ad04762a7178bda37be4c2ed87ae7e5f4e.tar.gz |
Dive pictures: Scale thumbnails on demand
To potentially conserve memory, don't keep copies of scaled thumbnails.
Scale the thumbnails on demand.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/divepicturemodel.cpp | 29 | ||||
-rw-r--r-- | qt-models/divepicturemodel.h | 4 |
2 files changed, 19 insertions, 14 deletions
diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp index 804e2013f..b27799c67 100644 --- a/qt-models/divepicturemodel.cpp +++ b/qt-models/divepicturemodel.cpp @@ -17,7 +17,7 @@ static QImage getThumbnailFromCache(const PictureEntry &entry) return thumbnailCache.value(entry.filename); } -static void scaleImages(PictureEntry &entry, int size, int maxSize) +static void scaleImages(PictureEntry &entry, int maxSize) { QImage thumbnail = getThumbnailFromCache(entry); // If thumbnails were written by an earlier version, they might be smaller than needed. @@ -29,9 +29,7 @@ static void scaleImages(PictureEntry &entry, int size, int maxSize) thumbnailCache.insert(entry.filename, thumbnail); } - entry.imageProfile = thumbnail.scaled(maxSize / maxZoom, maxSize / maxZoom, Qt::KeepAspectRatio); - entry.image = size == maxSize ? thumbnail - : thumbnail.scaled(size, size, Qt::KeepAspectRatio); + entry.image = thumbnail; } DivePictureModel *DivePictureModel::instance() @@ -42,7 +40,8 @@ DivePictureModel *DivePictureModel::instance() DivePictureModel::DivePictureModel() : rowDDStart(0), rowDDEnd(0), - zoomLevel(0.0) + zoomLevel(0.0), + defaultSize(defaultIconMetrics().sz_pic) { } @@ -62,11 +61,11 @@ void DivePictureModel::setZoomLevel(int level) zoomLevel = -1.0; if (zoomLevel > 1.0) zoomLevel = 1.0; - updateThumbnails(); + updateZoom(); layoutChanged(); } -void DivePictureModel::updateThumbnails() +void DivePictureModel::updateZoom() { // Calculate size of thumbnails. The standard size is defaultIconMetrics().sz_pic. // We use exponential scaling so that the central point is the standard @@ -75,10 +74,14 @@ void DivePictureModel::updateThumbnails() // Naturally, these three zoom levels are then represented by // -1.0 (minimum), 0 (standard) and 1.0 (maximum). The actual size is // calculated as standard_size*3.0^zoomLevel. - int defaultSize = defaultIconMetrics().sz_pic; + size = static_cast<int>(round(defaultSize * pow(maxZoom, zoomLevel))); +} + +void DivePictureModel::updateThumbnails() +{ int maxSize = defaultSize * maxZoom; - int size = static_cast<int>(round(defaultSize * pow(maxZoom, zoomLevel))); - QtConcurrent::blockingMap(pictures, [size, maxSize](PictureEntry &entry){scaleImages(entry, size, maxSize);}); + updateZoom(); + QtConcurrent::blockingMap(pictures, [maxSize](PictureEntry &entry){scaleImages(entry, maxSize);}); } void DivePictureModel::updateDivePictures() @@ -101,7 +104,7 @@ void DivePictureModel::updateDivePictures() if (dive->id == displayed_dive.id) rowDDStart = pictures.count(); FOR_EACH_PICTURE(dive) - pictures.push_back({picture, picture->filename, {}, {}, picture->offset.seconds}); + pictures.push_back({picture, picture->filename, {}, picture->offset.seconds}); if (dive->id == displayed_dive.id) rowDDEnd = pictures.count(); } @@ -134,10 +137,10 @@ QVariant DivePictureModel::data(const QModelIndex &index, int role) const ret = entry.filename; break; case Qt::DecorationRole: - ret = entry.image; + ret = entry.image.scaled(size, size, Qt::KeepAspectRatio); break; case Qt::UserRole: // Used by profile widget to access bigger thumbnails - ret = entry.imageProfile; + ret = entry.image.scaled(defaultSize, defaultSize, Qt::KeepAspectRatio); break; case Qt::DisplayRole: ret = QFileInfo(entry.filename).fileName(); diff --git a/qt-models/divepicturemodel.h b/qt-models/divepicturemodel.h index 74f92f449..443be4a0e 100644 --- a/qt-models/divepicturemodel.h +++ b/qt-models/divepicturemodel.h @@ -10,7 +10,6 @@ struct PictureEntry { struct picture *picture; QString filename; QImage image; - QImage imageProfile; // For the profile widget keep a copy of a constant sized image int offsetSeconds; }; @@ -31,7 +30,10 @@ private: DivePictureModel(); QList<PictureEntry> pictures; double zoomLevel; // -1.0: minimum, 0.0: standard, 1.0: maximum + int defaultSize; + int size; void updateThumbnails(); + void updateZoom(); }; #endif |