From 8e867851e97b41768e5e96da4633abba5c8a549e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Mon, 18 Oct 2021 23:10:09 +0200 Subject: [PATCH] Various GPI symbol handling fixes --- src/data/gpiparser.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/data/gpiparser.cpp b/src/data/gpiparser.cpp index 00f6c84e..8242f8fa 100644 --- a/src/data/gpiparser.cpp +++ b/src/data/gpiparser.cpp @@ -537,7 +537,7 @@ static quint32 readPOI(DataStream &stream, QVector &waypoints, quint8 rs; quint32 ds; qint32 lat, lon; - quint16 s3, id; + quint16 s3, iconId = 0; QList obj; rs = stream.readRecordHeader(rh); @@ -553,8 +553,7 @@ static quint32 readPOI(DataStream &stream, QVector &waypoints, while (stream.status() == QDataStream::Ok && ds < rh.size) { switch (stream.nextHeaderType()) { case 4: - ds += readIconId(stream, id); - icons.append(QPair(waypoints.size() - 1, id)); + ds += readIconId(stream, iconId); break; case 10: ds += readDescription(stream, waypoints.last()); @@ -576,6 +575,8 @@ static quint32 readPOI(DataStream &stream, QVector &waypoints, } } + icons.append(QPair(waypoints.size() - 1, iconId)); + if (ds != rh.size) stream.setStatus(QDataStream::ReadCorruptData); @@ -659,11 +660,16 @@ static quint32 readSymbol(DataStream &stream, QPixmap &pixmap) img.setColorTable(palette); } else img = QImage((uchar*)data.data(), width, height, lineSize, - QImage::Format_RGB32); + QImage::Format_RGBX8888).rgbSwapped(); pixmap = QPixmap::fromImage(img); - if (ds != rh.size) + /* There should be no more data left in the record, but broken GPI files + generated by pinns.co.uk tools exist in the wild so we read out + the record as a workaround for such files. */ + if (ds > rh.size) stream.setStatus(QDataStream::ReadCorruptData); + else if (ds < rh.size) + stream.skipRawData(rh.size - ds); return rs + rh.size; }