From 0a9077545b0f622156556cdac1cccf01871d9778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Fri, 24 Aug 2018 12:26:32 +0200 Subject: [PATCH] Make huge images work under OpenGL (at least memory-ineficient) --- src/map/image.cpp | 26 +++++++++++++++++++++++--- src/map/image.h | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/map/image.cpp b/src/map/image.cpp index b2f05214..9fe4ae7f 100644 --- a/src/map/image.cpp +++ b/src/map/image.cpp @@ -1,9 +1,12 @@ #include +#include #include "config.h" #include "image.h" -Image::Image(const QString &fileName) : _img(fileName) +#define TILE_SIZE 256 + +Image::Image(const QString &fileName) : _img(fileName), _fileName(fileName) { } @@ -17,8 +20,25 @@ void Image::draw(QPainter *painter, const QRectF &rect, Map::Flags flags) QRectF sr(rect.topLeft() * ratio, rect.size() * ratio); if (flags & Map::OpenGL) { - QImage img(_img.copy(sr.toRect())); - painter->drawImage(rect.topLeft(), img); + for (int i = sr.left()/TILE_SIZE; i <= sr.right()/TILE_SIZE; i++) { + for (int j = sr.top()/TILE_SIZE; j <= sr.bottom()/TILE_SIZE; j++) { + QString key = _fileName + "-" + QString::number(i) + "_" + + QString::number(j); + QPoint tl(i * TILE_SIZE, j * TILE_SIZE); + QPixmap pm; + + if (!QPixmapCache::find(key, &pm)) { + QRect tile(tl, QSize(TILE_SIZE, TILE_SIZE)); + pm = QPixmap::fromImage(_img.copy(tile)); + if (!pm.isNull()) + QPixmapCache::insert(key, pm); + } +#ifdef ENABLE_HIDPI + pm.setDevicePixelRatio(ratio); +#endif // ENABLE_HIDPI + painter->drawPixmap(tl/ratio, pm); + } + } } else painter->drawImage(rect.topLeft(), _img, sr); } diff --git a/src/map/image.h b/src/map/image.h index 720d1dfe..fc05fc63 100644 --- a/src/map/image.h +++ b/src/map/image.h @@ -16,6 +16,7 @@ public: private: QImage _img; + QString _fileName; }; #endif // IMAGE_H