1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-12-03 16:09:08 +01:00
GPXSee/src/map/image.cpp

37 lines
1.1 KiB
C++
Raw Normal View History

2018-08-23 20:26:10 +02:00
#include <QPainter>
#include "image.h"
#define TILE_SIZE 256
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
#define OPENGL_SIZE_LIMIT 536870912 /* 512MB */
#else
#define OPENGL_SIZE_LIMIT 134217728 /* 128MB */
#endif
2018-08-23 20:26:10 +02:00
void Image::draw(QPainter *painter, const QRectF &rect, Map::Flags flags)
{
2018-08-24 00:14:40 +02:00
qreal ratio = _img.devicePixelRatioF();
QRectF sr(rect.topLeft() * ratio, rect.size() * ratio);
2018-08-23 20:26:10 +02:00
2020-11-27 01:11:50 +01:00
/* When OpenGL is used, big images are rendered incredibly slow or not at
all using the QPainter::drawImage() function with a source rect set. So
we have to tile the image ourself before it can be drawn. */
if (flags & Map::OpenGL && _img.sizeInBytes() > OPENGL_SIZE_LIMIT) {
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++) {
QPoint tl(i * TILE_SIZE, j * TILE_SIZE);
2020-11-27 01:11:50 +01:00
QRect tile(tl, QSize(TILE_SIZE, TILE_SIZE));
QImage img(_img.copy(tile));
img.setDevicePixelRatio(ratio);
painter->drawImage(tl/ratio, img);
}
}
2018-08-23 20:26:10 +02:00
} else
painter->drawImage(rect.topLeft(), _img, sr);
}
void Image::setDevicePixelRatio(qreal ratio)
{
2018-08-24 00:14:40 +02:00
_img.setDevicePixelRatio(ratio);
2018-08-23 20:26:10 +02:00
}