1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-02-17 16:20:48 +01:00

Improved error handling

This commit is contained in:
Martin Tůma 2017-04-15 08:59:31 +02:00
parent ccf91bb29f
commit fd53e89ea5
4 changed files with 92 additions and 70 deletions

View File

@ -305,7 +305,7 @@ bool OfflineMap::getImageInfo(const QString &path)
}
if (_imgPath.endsWith("ozf2")) {
_ozf.load(_imgPath);
if (_ozf.load(_imgPath))
_size = _ozf.size();
} else {
QImageReader img(_imgPath);
@ -540,9 +540,8 @@ void OfflineMap::unload()
}
}
void OfflineMap::draw(QPainter *painter, const QRectF &rect)
void OfflineMap::drawTiled(QPainter *painter, const QRectF &rect)
{
if (_tileSize.isValid()) {
QPoint tl = QPoint((int)floor(rect.left() / (qreal)_tileSize.width())
* _tileSize.width(), (int)floor(rect.top() / _tileSize.height())
* _tileSize.height());
@ -552,6 +551,12 @@ void OfflineMap::draw(QPainter *painter, const QRectF &rect)
for (int j = 0; j < ceil(s.height() / _tileSize.height()); j++) {
int x = tl.x() + i * _tileSize.width();
int y = tl.y() + j * _tileSize.height();
if (!QRectF(QPointF(x, y), _ozf.tileSize()).intersects(bounds())) {
painter->fillRect(QRectF(QPoint(x, y), _tileSize), Qt::white);
continue;
}
QString tileName(_tileName.arg(QString::number(x),
QString::number(y)));
QPixmap pixmap;
@ -570,25 +575,30 @@ void OfflineMap::draw(QPainter *painter, const QRectF &rect)
if (pixmap.isNull()) {
qWarning("%s: error loading tile image", qPrintable(
_tileName.arg(QString::number(x), QString::number(y))));
painter->fillRect(QRectF(QPoint(x, y), _tileSize),
Qt::white);
painter->fillRect(QRectF(QPoint(x, y), _tileSize), Qt::white);
} else
painter->drawPixmap(QPoint(x, y), pixmap);
}
}
} else if (_ozf.isOpen()) {
QPoint tl = QPoint((int)floor(rect.left()
/ (qreal)_ozf.tileSize().width()) * _ozf.tileSize().width(),
(int)floor(rect.top() / _ozf.tileSize().height())
* _ozf.tileSize().height());
}
void OfflineMap::drawOZF(QPainter *painter, const QRectF &rect)
{
QPoint tl = QPoint((int)floor(rect.left() / _ozf.tileSize().width())
* _ozf.tileSize().width(), (int)floor(rect.top()
/ _ozf.tileSize().height()) * _ozf.tileSize().height());
QSizeF s(rect.right() - tl.x(), rect.bottom() - tl.y());
for (int i = 0; i < ceil(s.width() / _ozf.tileSize().width()); i++) {
for (int j = 0; j < ceil(s.height() / _ozf.tileSize().height());
j++) {
for (int j = 0; j < ceil(s.height() / _ozf.tileSize().height()); j++) {
int x = tl.x() + i * _ozf.tileSize().width();
int y = tl.y() + j * _ozf.tileSize().height();
if (!QRectF(QPointF(x, y), _ozf.tileSize()).intersects(bounds())) {
painter->fillRect(QRectF(QPoint(x, y), _tileSize), Qt::white);
continue;
}
QPixmap pixmap;
QString key = _ozf.fileName() + "/" + QString::number(x)
+ "_" + QString::number(y);
@ -598,10 +608,17 @@ void OfflineMap::draw(QPainter *painter, const QRectF &rect)
QPixmapCache::insert(key, pixmap);
}
if (pixmap.isNull()) {
qWarning("%s: error loading tile image", qPrintable(key));
painter->fillRect(QRectF(QPoint(x, y), _tileSize), Qt::white);
} else
painter->drawPixmap(QPoint(x, y), pixmap);
}
}
} else {
}
void OfflineMap::drawImage(QPainter *painter, const QRectF &rect)
{
if (!_img || _img->isNull())
painter->fillRect(rect, Qt::white);
else {
@ -610,4 +627,13 @@ void OfflineMap::draw(QPainter *painter, const QRectF &rect)
painter->drawImage(rect.topLeft(), crop);
}
}
void OfflineMap::draw(QPainter *painter, const QRectF &rect)
{
if (_ozf.isOpen())
drawOZF(painter, rect);
else if (_tileSize.isValid())
drawTiled(painter, rect);
else
drawImage(painter, rect);
}

View File

@ -79,6 +79,10 @@ private:
bool getTileInfo(const QStringList &tiles, const QString &path = QString());
bool getImageInfo(const QString &path);
void drawTiled(QPainter *painter, const QRectF &rect);
void drawOZF(QPainter *painter, const QRectF &rect);
void drawImage(QPainter *painter, const QRectF &rect);
QString _name;
QSize _size;
Projection *_projection;

View File

@ -113,33 +113,26 @@ bool OZF::load(const QString &path)
return true;
}
QPixmap OZF::blankTile()
{
QPixmap p(tileSize());
p.fill();
return p;
}
QPixmap OZF::tile(int x, int y)
{
Q_ASSERT(_file.isOpen());
int i = (y/tileSize().height()) * _dim.width() + (x/tileSize().width());
if (i >= _tiles.size() - 1 || i < 0)
return blankTile();
return QPixmap();
int size = _tiles.at(i+1) - _tiles.at(i);
if (!_file.seek(_tiles.at(i)))
return blankTile();
return QPixmap();
QByteArray ba = _file.read(size);
if (ba.size() != size)
return blankTile();
return QPixmap();
quint32 bes = qToBigEndian(tileSize().width() * tileSize().height());
ba.prepend(QByteArray((char*)&bes, sizeof(bes)));
QByteArray uba = qUncompress(ba);
if (uba.size() != tileSize().width() * tileSize().height())
return blankTile();
return QPixmap();
QImage img((const uchar*)uba.constData(), tileSize().width(),
tileSize().height(), QImage::Format_Indexed8);

View File

@ -24,7 +24,6 @@ private:
template<class T> bool readValue(T &val);
bool readHeaders();
bool readTileTable();
QPixmap blankTile();
QSize _size;
QSize _dim;