diff --git a/.appveyor.yml b/.appveyor.yml
index de900cfe..0447e3b5 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -12,9 +12,8 @@ environment:
- QTDIR: C:\Qt\5.15\msvc2019_64
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
NSISDEF: /DOPENSSL /DANGLE
- - QTDIR: C:\Qt\6.8\msvc2019_64
- OPENSSLDIR: C:\OpenSSL-v33-Win64\bin
- NSISDEF: /DQT6 /DOPENSSL
+ - QTDIR: C:\Qt\6.8\msvc2022_64
+ NSISDEF: /DQT6
install:
- cmd: |-
@@ -36,8 +35,8 @@ build_script:
xcopy lang\*.qm installer\translations\ /sy
xcopy icons\symbols installer\symbols /i
copy licence.txt installer
- copy %OPENSSLDIR%\libcrypto-*-x64.dll installer
- copy %OPENSSLDIR%\libssl-*-x64.dll installer
+ IF DEFINED OPENSSLDIR (copy %OPENSSLDIR%\libcrypto-*-x64.dll installer)
+ IF DEFINED OPENSSLDIR (copy %OPENSSLDIR%\libssl-*-x64.dll installer)
makensis.exe %NSISDEF% installer\gpxsee64.nsi
diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml
index 8e97df33..5733c306 100644
--- a/.github/workflows/osx.yml
+++ b/.github/workflows/osx.yml
@@ -15,7 +15,7 @@ jobs:
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
- version: '6.8.0'
+ version: '6.8.1'
modules: qtpositioning qtserialport qtimageformats
- name: Create localization
run: lrelease gpxsee.pro
diff --git a/gpxsee.pro b/gpxsee.pro
index 43ae4f93..c4bfd6d3 100644
--- a/gpxsee.pro
+++ b/gpxsee.pro
@@ -523,7 +523,7 @@ win32 {
RESOURCES += theme-color.qrc
QMAKE_TARGET_DESCRIPTION = GPXSee
- QMAKE_TARGET_COPYRIGHT = Copyright (c) 2015-2024 Martin Tuma
+ QMAKE_TARGET_COPYRIGHT = Copyright (c) 2015-2025 Martin Tuma
RC_ICONS = icons/app/gpxsee.ico \
icons/formats/gpx.ico \
icons/formats/tcx.ico \
diff --git a/gpxsee.qrc b/gpxsee.qrc
index 15b56a93..b75d8f19 100644
--- a/gpxsee.qrc
+++ b/gpxsee.qrc
@@ -206,6 +206,10 @@
icons/map/marine/kelp.png
icons/map/marine/eddies.png
icons/map/marine/dome.png
+ icons/map/marine/radar-reflector.png
+ icons/map/marine/24h-anchorage.png
+ icons/map/marine/dw-anchorage.png
+ icons/map/marine/tanker-anchorage.png
diff --git a/icons/map/marine/24h-anchorage.png b/icons/map/marine/24h-anchorage.png
new file mode 100644
index 00000000..f2a840d3
Binary files /dev/null and b/icons/map/marine/24h-anchorage.png differ
diff --git a/icons/map/marine/dw-anchorage.png b/icons/map/marine/dw-anchorage.png
new file mode 100644
index 00000000..78c28e18
Binary files /dev/null and b/icons/map/marine/dw-anchorage.png differ
diff --git a/icons/map/marine/radar-reflector.png b/icons/map/marine/radar-reflector.png
new file mode 100644
index 00000000..69da1b2f
Binary files /dev/null and b/icons/map/marine/radar-reflector.png differ
diff --git a/icons/map/marine/tanker-anchorage.png b/icons/map/marine/tanker-anchorage.png
new file mode 100644
index 00000000..a0baf59f
Binary files /dev/null and b/icons/map/marine/tanker-anchorage.png differ
diff --git a/pkg/windows/gpxsee64.nsi b/pkg/windows/gpxsee64.nsi
index 98c669a9..494559e6 100644
--- a/pkg/windows/gpxsee64.nsi
+++ b/pkg/windows/gpxsee64.nsi
@@ -58,7 +58,7 @@ VIProductVersion "${VERSION}.0.0"
VIAddVersionKey "ProductVersion" ${VERSION}
VIAddVersionKey "FileVersion" "${VERSION}.0.0"
VIAddVersionKey "ProductName" "GPXSee"
-VIAddVersionKey "LegalCopyright" "Copyright (c) 2015-2024 Martin Tůma"
+VIAddVersionKey "LegalCopyright" "Copyright (c) 2015-2025 Martin Tůma"
VIAddVersionKey "FileDescription" "GPXSee installer (x64)"
; Registry key to check for directory (so if you install again, it will
diff --git a/src/map/ENC/mapdata.cpp b/src/map/ENC/mapdata.cpp
index a850b6e5..79fd75f6 100644
--- a/src/map/ENC/mapdata.cpp
+++ b/src/map/ENC/mapdata.cpp
@@ -63,16 +63,17 @@ static QMap orderMapInit()
map.insert(TYPE(PILPNT), 34);
map.insert(TYPE(ACHBRT), 35);
map.insert(TYPE(I_ACHBRT), 35);
- map.insert(TYPE(CRANES), 36);
- map.insert(TYPE(I_CRANES), 36);
- map.insert(TYPE(I_WTWGAG), 37);
- map.insert(TYPE(PYLONS), 38);
- map.insert(TYPE(SLCONS), 39);
- map.insert(TYPE(LNDMRK), 40);
- map.insert(TYPE(SILTNK), 41);
- map.insert(TYPE(LNDELV), 42);
- map.insert(TYPE(SMCFAC), 43);
- map.insert(TYPE(BUISGL), 44);
+ map.insert(TYPE(RADRFL), 36);
+ map.insert(TYPE(CRANES), 37);
+ map.insert(TYPE(I_CRANES), 37);
+ map.insert(TYPE(I_WTWGAG), 38);
+ map.insert(TYPE(PYLONS), 39);
+ map.insert(TYPE(SLCONS), 40);
+ map.insert(TYPE(LNDMRK), 41);
+ map.insert(TYPE(SILTNK), 42);
+ map.insert(TYPE(LNDELV), 43);
+ map.insert(TYPE(SMCFAC), 44);
+ map.insert(TYPE(BUISGL), 45);
map.insert(TYPE(I_DISMAR), 0xFFFFFFFE);
map.insert(TYPE(SOUNDG), 0xFFFFFFFF);
@@ -169,6 +170,26 @@ static bool polygonCb(const MapData::Poly *polygon, void *context)
return true;
}
+static bool polygonPointCb(const MapData::Poly *polygon, void *context)
+{
+ QList *points = (QList*)context;
+ uint baseType = polygon->type()>>16;
+
+ if (!polygon->label().isEmpty() || baseType == TSSLPT || baseType == RCTLPT
+ || baseType == I_TRNBSN
+ || polygon->type() == SUBTYPE(ACHARE, 2)
+ || polygon->type() == SUBTYPE(ACHARE, 3)
+ || polygon->type() == SUBTYPE(ACHARE, 9)
+ || polygon->type() == SUBTYPE(I_ACHARE, 2)
+ || polygon->type() == SUBTYPE(I_ACHARE, 3)
+ || polygon->type() == SUBTYPE(I_ACHARE, 9)
+ || polygon->type() == SUBTYPE(I_BERTHS, 6))
+ points->append(MapData::Point(polygon->type(), polygon->bounds().center(),
+ polygon->label(), polygon->param()));
+
+ return true;
+}
+
static Coordinates coordinates(int x, int y, uint COMF)
{
return Coordinates(x / (double)COMF, y / (double)COMF);
@@ -285,7 +306,14 @@ MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
else
_label += "\n(" + QString::fromLatin1(params.at(0))
+ "\xE2\x80\x89m)";
- }
+ } else if ((type == TYPE(TSSLPT) || type == TYPE(RCTLPT)) && params.size())
+ _param = QVariant(params.at(0).toDouble());
+}
+
+MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
+ const QVariant ¶m) : _type(type), _pos(c), _label(label), _param(param)
+{
+ _id = ((quint64)order(type))<<32 | (uint)qHash(c);
}
MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
@@ -293,7 +321,7 @@ MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
{
if (type == TYPE(DEPARE) && params.size())
_type = SUBTYPE(DEPARE, depthLevel(params.at(0)));
- else if (type == TYPE(TSSLPT) && params.size())
+ else if ((type == TYPE(TSSLPT) || type == TYPE(RCTLPT)) && params.size())
_param = QVariant(params.at(0).toDouble());
else if ((type == TYPE(BRIDGE) || type == TYPE(I_BRIDGE))
&& params.size()) {
@@ -302,7 +330,8 @@ MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
_label = QString::fromUtf8("\xE2\x86\x95") + UNIT_SPACE
+ QString::number(clr) + UNIT_SPACE + hUnits(HUNI);
}
- } else if (type>>16 == LNDARE || type>>16 == SEAARE)
+ } else if (type>>16 == LNDARE || type>>16 == SEAARE || type>>16 == BERTHS
+ || type>>16 == I_BERTHS || type>>16 == BUAARE)
_label = label;
}
@@ -595,7 +624,9 @@ MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
|| (OBJL == RDOCAL && key == ORIENT)
|| (OBJL == I_RDOCAL && key == ORIENT)
|| (OBJL == CURENT && key == ORIENT)
- || (OBJL == LNDELV && key == ELEVAT))
+ || (OBJL == LNDELV && key == ELEVAT)
+ || (OBJL == TSSLPT && key == ORIENT)
+ || (OBJL == RCTLPT && key == ORIENT))
params[0] = av.at(1).toByteArray();
if ((OBJL == I_RDOCAL && key == COMCHA)
|| (OBJL == RDOCAL && key == COMCHA)
@@ -668,6 +699,7 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
}
if ((OBJL == TSSLPT && key == ORIENT)
+ || (OBJL == RCTLPT && key == ORIENT)
|| (OBJL == DEPARE && key == DRVAL1))
params[0] = av.at(1).toByteArray();
if ((OBJL == BRIDGE && key == VERCLR)
@@ -842,6 +874,7 @@ void MapData::points(const RectC &rect, QList *points) const
rectcBounds(rect, min, max);
_points.Search(min, max, pointCb, points);
+ _areas.Search(min, max, polygonPointCb, points);
}
void MapData::lines(const RectC &rect, QList *lines) const
diff --git a/src/map/ENC/mapdata.h b/src/map/ENC/mapdata.h
index f5f56174..9dc46d33 100644
--- a/src/map/ENC/mapdata.h
+++ b/src/map/ENC/mapdata.h
@@ -49,6 +49,8 @@ public:
public:
Point(uint type, const Coordinates &c, const QString &label,
const QVector ¶ms);
+ Point(uint type, const Coordinates &c, const QString &label,
+ const QVariant ¶m);
const Coordinates &pos() const {return _pos;}
uint type() const {return _type;}
diff --git a/src/map/ENC/objects.h b/src/map/ENC/objects.h
index d1a5c413..580a5bf6 100644
--- a/src/map/ENC/objects.h
+++ b/src/map/ENC/objects.h
@@ -67,6 +67,7 @@
#define PONTON 95
#define PRCARE 96
#define PYLONS 98
+#define RADRFL 101
#define RADSTA 102
#define RTPBCN 103
#define RDOCAL 104
@@ -74,6 +75,7 @@
#define RAILWY 106
#define RCRTCL 108
#define RECTRC 109
+#define RCTLPT 110
#define RSCSTA 111
#define RESARE 112
#define RIVERS 114
diff --git a/src/map/ENC/rastertile.cpp b/src/map/ENC/rastertile.cpp
index dcba0978..8d2ac9f2 100644
--- a/src/map/ENC/rastertile.cpp
+++ b/src/map/ENC/rastertile.cpp
@@ -40,31 +40,6 @@ static bool showLabel(const QImage *img, const Range &range, int zoom, int type)
return true;
}
-QPointF RasterTile::centroid(const QVector &polygon) const
-{
- Q_ASSERT(polygon.size() > 3);
- Q_ASSERT(polygon.first() == polygon.last());
-
- double area = 0;
- double cx = 0, cy = 0;
- QPointF pi;
- QPointF pj(ll2xy(polygon.at(0)));
-
- for (int i = 0; i < polygon.size() - 1; i++) {
- pi = pj;
- pj = ll2xy(polygon.at(i + 1));
-
- double f = pi.x() * pj.y() - pj.x() * pi.y();
- area += f;
- cx += (pi.x() + pj.x()) * f;
- cy += (pi.y() + pj.y()) * f;
- }
-
- double factor = 1.0 / (3.0 * area);
-
- return QPointF(cx * factor, cy * factor);
-}
-
QPainterPath RasterTile::painterPath(const Polygon &polygon) const
{
QPainterPath path;
@@ -150,19 +125,28 @@ QPolygonF RasterTile::tsslptArrow(const QPointF &p, qreal angle) const
return polygon;
}
-void RasterTile::drawArrows(QPainter *painter,
- const QList &polygons)
+static void drawArrow(QPainter *painter, const QPolygonF &polygon, uint type)
{
- for (int i = 0; i < polygons.size(); i++) {
- const MapData::Poly &poly = polygons.at(i);
+ if (type>>16 == RCTLPT) {
+ painter->setPen(QPen(tsslptPen, 1, Qt::DashLine));
+ painter->setBrush(Qt::NoBrush);
+ } else {
+ painter->setPen(QPen(tsslptPen, 1));
+ painter->setBrush(QBrush(tsslptBrush));
+ }
+ painter->drawPolygon(polygon);
+}
- if (poly.type()>>16 == TSSLPT) {
- QPolygonF polygon(tsslptArrow(centroid(poly.path().first()),
- deg2rad(poly.param().toDouble())));
+void RasterTile::drawArrows(QPainter *painter,
+ const QList &points)
+{
+ for (int i = 0; i < points.size(); i++) {
+ const MapData::Point &point = points.at(i);
- painter->setPen(QPen(tsslptPen, 1));
- painter->setBrush(QBrush(tsslptBrush));
- painter->drawPolygon(polygon);
+ if (point.type()>>16 == TSSLPT || point.type()>>16 == RCTLPT) {
+ QPolygonF polygon(tsslptArrow(ll2xy(point.pos()),
+ deg2rad(point.param().toDouble())));
+ drawArrow(painter, polygon, point.type());
}
}
}
@@ -229,46 +213,6 @@ void RasterTile::drawTextItems(QPainter *painter,
}
}
-void RasterTile::processPolygons(const QList &polygons,
- QList &textItems)
-{
- for (int i = 0; i < polygons.size(); i++) {
- const MapData::Poly &poly = polygons.at(i);
- uint type = poly.type()>>16;
- const QImage *img = 0;
- const QString *label = 0;
- const QFont *fnt = 0;
- const QColor *color = 0, *hColor = 0;
- QPoint offset(0, 0);
-
- if (!poly.label().isEmpty()) {
- const Style::Point &style = _style->point(poly.type());
- fnt = _style->font(style.textFontSize());
- color = &style.textColor();
- hColor = style.haloColor().isValid() ? &style.haloColor() : 0;
- label = &poly.label();
- }
- if (type == HRBFAC || type == I_TRNBSN
- || poly.type() == SUBTYPE(I_BERTHS, 6)) {
- const Style::Point &style = _style->point(poly.type());
- img = style.img().isNull() ? 0 : &style.img();
- offset = style.offset();
- }
-
- if ((!label || !fnt) && !img)
- continue;
-
- TextPointItem *item = new TextPointItem(offset +
- centroid(poly.path().first()).toPoint(), label, fnt, img, color,
- hColor, 0, 0);
- if (item->isValid() && _rect.contains(item->boundingRect().toRect())
- && !item->collides(textItems))
- textItems.append(item);
- else
- delete item;
- }
-}
-
void RasterTile::processPoints(QList &points,
QList &textItems, QList &lights)
{
@@ -389,7 +333,6 @@ void RasterTile::render()
fetchData(polygons, lines, points);
processPoints(points, textItems, lights);
- processPolygons(polygons, textItems);
processLines(lines, textItems);
QPainter painter(&img);
@@ -399,7 +342,7 @@ void RasterTile::render()
drawPolygons(&painter, polygons);
drawLines(&painter, lines);
- drawArrows(&painter, polygons);
+ drawArrows(&painter, points);
drawTextItems(&painter, lights);
drawTextItems(&painter, textItems);
diff --git a/src/map/ENC/rastertile.h b/src/map/ENC/rastertile.h
index 65333f54..2d17a6dd 100644
--- a/src/map/ENC/rastertile.h
+++ b/src/map/ENC/rastertile.h
@@ -47,11 +47,9 @@ private:
QList &textItems, QList &lights);
void processLines(const QList &lines,
QList &textItems);
- void processPolygons(const QList &polygons,
- QList &textItems);
void drawBitmapPath(QPainter *painter, const QImage &img,
const Polygon &polygon);
- void drawArrows(QPainter *painter, const QList &polygons);
+ void drawArrows(QPainter *painter, const QList &points);
void drawPolygons(QPainter *painter, const QList &polygons);
void drawLines(QPainter *painter, const QList &lines);
void drawTextItems(QPainter *painter, const QList &textItems);
diff --git a/src/map/ENC/style.cpp b/src/map/ENC/style.cpp
index 1b009f14..1f94eb2f 100644
--- a/src/map/ENC/style.cpp
+++ b/src/map/ENC/style.cpp
@@ -82,7 +82,27 @@ void Style::polygonStyle()
_polygons[SUBTYPE(I_RESARE, 12)] = Polygon(QImage(":/marine/safety-zone-line.png"));
_polygons[SUBTYPE(RESARE, 1)] = Polygon(QImage(":/marine/safety-zone-line.png"));
_polygons[SUBTYPE(ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
- _polygons[SUBTYPE(I_ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
+ _polygons[SUBTYPE(ACHARE, 2)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 3)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 4)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 5)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 6)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 7)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(ACHARE, 8)] = Polygon(Qt::NoBrush,
+ QPen(QColor(0xeb, 0x49, 0xeb), 1, Qt::DashLine));
+ _polygons[SUBTYPE(ACHARE, 9)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(I_ACHARE, 1)] = _polygons[SUBTYPE(ACHARE, 1)];
+ _polygons[SUBTYPE(I_ACHARE, 2)] = _polygons[SUBTYPE(ACHARE, 2)];
+ _polygons[SUBTYPE(I_ACHARE, 3)] = _polygons[SUBTYPE(ACHARE, 3)];
+ _polygons[SUBTYPE(I_ACHARE, 4)] = _polygons[SUBTYPE(ACHARE, 4)];
+ _polygons[SUBTYPE(I_ACHARE, 5)] = _polygons[SUBTYPE(ACHARE, 5)];
+ _polygons[SUBTYPE(I_ACHARE, 6)] = _polygons[SUBTYPE(ACHARE, 6)];
+ _polygons[SUBTYPE(I_ACHARE, 7)] = _polygons[SUBTYPE(ACHARE, 7)];
+ _polygons[SUBTYPE(I_ACHARE, 8)] = _polygons[SUBTYPE(ACHARE, 8)];
+ _polygons[SUBTYPE(I_ACHARE, 9)] = _polygons[SUBTYPE(ACHARE, 9)];
+ _polygons[SUBTYPE(I_ACHARE, 10)] = _polygons[SUBTYPE(I_ACHARE, 1)];
+ _polygons[SUBTYPE(I_ACHARE, 11)] = _polygons[SUBTYPE(I_ACHARE, 1)];
+ _polygons[SUBTYPE(I_ACHARE, 12)] = _polygons[SUBTYPE(I_ACHARE, 1)];
_polygons[TYPE(PRCARE)] = Polygon(QBrush(QColor(0xeb, 0x49, 0xeb),
Qt::BDiagPattern));
_polygons[TYPE(DAMCON)] = Polygon(QBrush(QColor(0xd9, 0x8b, 0x21)),
@@ -113,8 +133,12 @@ void Style::polygonStyle()
_polygons[TYPE(CBLARE)] = Polygon(QImage(":/marine/cable-area-line.png"));
_polygons[TYPE(PIPARE)] = Polygon(QImage(":/marine/pipeline-area-line.png"));
_polygons[SUBTYPE(MARKUL, 3)] = Polygon(QImage(":/marine/fishing-farm-line.png"));
- _polygons[SUBTYPE(I_BERTHS, 6)] = Polygon(Qt::NoBrush,
- QPen(QColor(0xeb, 0x49, 0xeb), 1, Qt::DashLine));
+ _polygons[TYPE(BERTHS)] = Polygon(Qt::NoBrush, QPen(QColor(0xeb, 0x49, 0xeb),
+ 1, Qt::DashLine));
+ _polygons[TYPE(I_BERTHS)] = _polygons[TYPE(BERTHS)];
+ _polygons[SUBTYPE(I_BERTHS, 6)] = _polygons[TYPE(BERTHS)];
+ _polygons[TYPE(I_TRNBSN)] = Polygon(Qt::NoBrush, QPen(QColor(0xeb, 0x49, 0xeb),
+ 1, Qt::DashLine));
_polygons[TYPE(CONZNE)] = Polygon(Qt::NoBrush, QPen(QColor(0xeb, 0x49, 0xeb),
1, Qt::DashDotLine));
@@ -129,13 +153,20 @@ void Style::polygonStyle()
<< TYPE(I_TERMNL) << TYPE(SLCONS) << TYPE(I_SLCONS) << TYPE(PONTON)
<< TYPE(I_PONTON) << TYPE(HULKES) << TYPE(I_HULKES) << TYPE(FLODOC)
<< TYPE(I_FLODOC) << TYPE(DRYDOC) << TYPE(DAMCON) << TYPE(PYLONS)
- << TYPE(MORFAC) << TYPE(GATCON) << TYPE(I_GATCON) << SUBTYPE(I_BERTHS, 6)
- << TYPE(DMPGRD) << TYPE(TSEZNE) << TYPE(OBSTRN) << TYPE(UWTROC)
- << TYPE(DWRTPT) << SUBTYPE(ACHARE, 1) << SUBTYPE(I_ACHARE, 1)
- << SUBTYPE(RESARE, 9) << SUBTYPE(RESARE, 2) << SUBTYPE(I_RESARE, 2)
- << SUBTYPE(RESARE, 17) << SUBTYPE(I_RESARE, 17) << SUBTYPE(RESARE, 12)
- << SUBTYPE(I_RESARE, 12) << SUBTYPE(RESARE, 1) << TYPE(CBLARE)
- << TYPE(PIPARE) << TYPE(PRCARE) << SUBTYPE(MARKUL, 3) << TYPE(CONZNE);
+ << TYPE(MORFAC) << TYPE(GATCON) << TYPE(I_GATCON) << TYPE(BERTHS)
+ << TYPE(I_BERTHS) << SUBTYPE(I_BERTHS, 6) << TYPE(DMPGRD) << TYPE(TSEZNE)
+ << TYPE(OBSTRN) << TYPE(UWTROC) << TYPE(DWRTPT) << SUBTYPE(ACHARE, 1)
+ << SUBTYPE(ACHARE, 2) << SUBTYPE(ACHARE, 3) << SUBTYPE(ACHARE, 4)
+ << SUBTYPE(ACHARE, 5) << SUBTYPE(ACHARE, 6) << SUBTYPE(ACHARE, 7)
+ << SUBTYPE(ACHARE, 8) << SUBTYPE(ACHARE, 9) << SUBTYPE(I_ACHARE, 1)
+ << SUBTYPE(I_ACHARE, 2) << SUBTYPE(I_ACHARE, 3) << SUBTYPE(I_ACHARE, 4)
+ << SUBTYPE(I_ACHARE, 5) << SUBTYPE(I_ACHARE, 6) << SUBTYPE(I_ACHARE, 7)
+ << SUBTYPE(I_ACHARE, 8) << SUBTYPE(I_ACHARE, 9) << SUBTYPE(I_ACHARE, 10)
+ << SUBTYPE(I_ACHARE, 11) << SUBTYPE(I_ACHARE, 12) << SUBTYPE(RESARE, 9)
+ << SUBTYPE(RESARE, 2) << SUBTYPE(I_RESARE, 2) << SUBTYPE(RESARE, 17)
+ << SUBTYPE(I_RESARE, 17) << SUBTYPE(RESARE, 12) << SUBTYPE(I_RESARE, 12)
+ << SUBTYPE(RESARE, 1) << TYPE(CBLARE) << TYPE(PIPARE) << TYPE(PRCARE)
+ << TYPE(I_TRNBSN) << SUBTYPE(MARKUL, 3) << TYPE(CONZNE);
}
void Style::lineStyle(qreal ratio)
@@ -152,7 +183,7 @@ void Style::lineStyle(qreal ratio)
_lines[TYPE(CBLSUB)].setTextFontSize(Small);
_lines[TYPE(PIPSOL)] = Line(QImage(":/marine/pipeline.png"));
_lines[TYPE(PIPSOL)].setTextFontSize(Small);
- _lines[TYPE(NAVLNE)] = Line(QPen(QColor(0xeb, 0x49, 0xeb), 1, Qt::DashLine));
+ _lines[TYPE(NAVLNE)] = Line(QPen(QColor(0, 0, 0), 1, Qt::DashLine));
_lines[TYPE(COALNE)] = Line(QPen(QColor(0, 0, 0), 1, Qt::SolidLine));
_lines[TYPE(SLCONS)] = Line(QPen(QColor(0, 0, 0), 2, Qt::SolidLine));
_lines[TYPE(I_SLCONS)] = Line(QPen(QColor(0, 0, 0), 2, Qt::SolidLine));
@@ -235,6 +266,7 @@ void Style::pointStyle(qreal ratio)
_points[SUBTYPE(LNDMRK, 7)] = Point(QImage(":/marine/pylon.png"), Small);
_points[SUBTYPE(LNDMRK, 9)] = Point(QImage(":/marine/monument.png"), Small,
QPoint(0, -7));
+ _points[SUBTYPE(LNDMRK, 10)] = Point(QImage(":/marine/pylon.png"), Small);
_points[SUBTYPE(LNDMRK, 15)] = Point(QImage(":/marine/dome.png"), Small,
QPoint(0, -5));
_points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png"), Small,
@@ -323,7 +355,6 @@ void Style::pointStyle(qreal ratio)
_points[SUBTYPE(I_RDOCAL, 3)].setTextColor(QColor(0xeb, 0x49, 0xeb));
_points[SUBTYPE(I_RDOCAL, 4)].setTextColor(QColor(0xeb, 0x49, 0xeb));
_points[TYPE(PYLONS)] = Point(QImage(":/marine/pylon.png"));
- _points[SUBTYPE(I_BERTHS, 6)] = Point(QImage(":/marine/fleeting-area.png"));
_points[SUBTYPE(WATTUR, 1)] = Point(QImage(":/marine/breakers.png"));
_points[SUBTYPE(WATTUR, 2)] = Point(QImage(":/marine/eddies.png"));
_points[SUBTYPE(WATTUR, 3)] = Point(QImage(":/marine/overfalls.png"));
@@ -335,6 +366,19 @@ void Style::pointStyle(qreal ratio)
_points[SUBTYPE(WEDKLP, 0)] = Point(QImage(":/marine/kelp.png"));
_points[SUBTYPE(WEDKLP, 1)] = Point(QImage(":/marine/kelp.png"));
_points[TYPE(SEAARE)].setHaloColor(QColor());
+ _points[TYPE(RADRFL)] = Point(QImage(":/marine/radar-reflector.png"));
+
+ _points[SUBTYPE(I_BERTHS, 6)] = Point(QImage(":/marine/fleeting-area.png"),
+ Small);
+ _points[SUBTYPE(ACHARE, 2)] = Point(QImage(":/marine/dw-anchorage.png"),
+ Small);
+ _points[SUBTYPE(ACHARE, 3)] = Point(QImage(":/marine/tanker-anchorage.png"),
+ Small);
+ _points[SUBTYPE(ACHARE, 9)] = Point(QImage(":/marine/24h-anchorage.png"),
+ Small);
+ _points[SUBTYPE(I_ACHARE, 2)] = _points[SUBTYPE(ACHARE, 2)];
+ _points[SUBTYPE(I_ACHARE, 3)] = _points[SUBTYPE(ACHARE, 3)];
+ _points[SUBTYPE(I_ACHARE, 9)] = _points[SUBTYPE(ACHARE, 9)];
_points[SUBTYPE(SMCFAC, 7)] = Point(svg2img(":/POI/restaurant-11.svg",
ratio), Small);
diff --git a/src/map/IMG/demfile.h b/src/map/IMG/demfile.h
index 7d4cb617..dce210b9 100644
--- a/src/map/IMG/demfile.h
+++ b/src/map/IMG/demfile.h
@@ -11,7 +11,7 @@ class DEMFile : public SubFile
{
public:
DEMFile(const IMGData *img) : SubFile(img) {}
- DEMFile(const QString *path) : SubFile(path) {}
+ DEMFile(const QString &path) : SubFile(path) {}
DEMFile(const SubFile *gmp, quint32 offset) : SubFile(gmp, offset) {}
bool load(Handle &hdl);
diff --git a/src/map/IMG/gmapdata.cpp b/src/map/IMG/gmapdata.cpp
index 1e15c1e2..f5239dd7 100644
--- a/src/map/IMG/gmapdata.cpp
+++ b/src/map/IMG/gmapdata.cpp
@@ -87,12 +87,16 @@ bool GMAPData::loadTile(const QDir &dir)
const QFileInfo &fi = ml.at(i);
SubFile::Type tt = tileType(fi.suffix());
if (VectorTile::isTileFile(tt)) {
- _files.append(new QString(fi.absoluteFilePath()));
- tile->addFile(_files.last(), tt);
+ if (!tile->addFile(fi.absoluteFilePath(), tt)) {
+ qWarning("%s: Invalid map tile structure",
+ qPrintable(dir.path()));
+ delete tile;
+ return false;
+ }
}
}
- if (!tile->init(0)) {
+ if (!tile->init()) {
qWarning("%s: Invalid map tile", qPrintable(dir.path()));
delete tile;
return false;
@@ -131,10 +135,8 @@ GMAPData::GMAPData(const QString &fileName) : MapData(fileName)
loadTile(QDir(fi.absoluteFilePath()));
}
- if (baseDir.exists(typFilePath)) {
- _files.append(new QString(baseDir.filePath(typFilePath)));
- _typ = new SubFile(_files.last());
- }
+ if (baseDir.exists(typFilePath))
+ _typ = new SubFile(baseDir.filePath(typFilePath));
if (!_tileTree.Count())
_errorString = "No usable map tile found";
@@ -143,8 +145,3 @@ GMAPData::GMAPData(const QString &fileName) : MapData(fileName)
computeZooms();
}
-
-GMAPData::~GMAPData()
-{
- qDeleteAll(_files);
-}
diff --git a/src/map/IMG/gmapdata.h b/src/map/IMG/gmapdata.h
index aff4596c..b7ae17a9 100644
--- a/src/map/IMG/gmapdata.h
+++ b/src/map/IMG/gmapdata.h
@@ -12,15 +12,13 @@ class GMAPData : public MapData
{
public:
GMAPData(const QString &fileName);
- ~GMAPData();
private:
bool readXML(const QString &path, QString &dataDir, QString &typFile);
- void mapProduct(QXmlStreamReader &reader, QString &dataDir, QString &typFile);
+ void mapProduct(QXmlStreamReader &reader, QString &dataDir,
+ QString &typFile);
void subProduct(QXmlStreamReader &reader, QString &dataDir);
bool loadTile(const QDir &dir);
-
- QList _files;
};
}
diff --git a/src/map/IMG/imgdata.cpp b/src/map/IMG/imgdata.cpp
index 41ea1a4e..a14cebad 100644
--- a/src/map/IMG/imgdata.cpp
+++ b/src/map/IMG/imgdata.cpp
@@ -117,8 +117,7 @@ bool IMGData::readFAT(QFile *file, TileMap &tileMap)
} else
tile = *it;
- SubFile *subFile = part ? tile->file(tt)
- : tile->addFile(this, tt);
+ SubFile *subFile = part ? tile->file(tt) : tile->addFile(this, tt);
if (!(subFile && readSubFileBlocks(file, offset, subFile)))
return false;
} else if (tt == SubFile::TYP) {
diff --git a/src/map/IMG/lblfile.h b/src/map/IMG/lblfile.h
index 5f866732..0ee5b6d3 100644
--- a/src/map/IMG/lblfile.h
+++ b/src/map/IMG/lblfile.h
@@ -18,7 +18,7 @@ public:
LBLFile(const IMGData *img)
: SubFile(img), _huffmanText(0), _imgIdSize(0), _poiShift(0), _shift(0),
_encoding(0) {}
- LBLFile(const QString *path)
+ LBLFile(const QString &path)
: SubFile(path), _huffmanText(0), _imgIdSize(0), _poiShift(0), _shift(0),
_encoding(0) {}
LBLFile(const SubFile *gmp, quint32 offset)
diff --git a/src/map/IMG/mapdata.cpp b/src/map/IMG/mapdata.cpp
index 68c031a5..aa412c94 100644
--- a/src/map/IMG/mapdata.cpp
+++ b/src/map/IMG/mapdata.cpp
@@ -99,14 +99,14 @@ void MapData::load(qreal ratio)
Q_ASSERT(!_style);
if (_typ)
- _style = new Style(0, ratio, _typ);
+ _style = new Style(ratio, _typ);
else {
QString typFile(ProgramPaths::typFile());
if (QFileInfo::exists(typFile)) {
- SubFile typ(&typFile);
- _style = new Style(0, ratio, &typ);
+ SubFile typ(typFile);
+ _style = new Style(ratio, &typ);
} else
- _style = new Style(0, ratio);
+ _style = new Style(ratio);
}
}
diff --git a/src/map/IMG/netfile.h b/src/map/IMG/netfile.h
index bf63a0de..7f0c191a 100644
--- a/src/map/IMG/netfile.h
+++ b/src/map/IMG/netfile.h
@@ -18,7 +18,7 @@ class NETFile : public SubFile
public:
NETFile(const IMGData *img)
: SubFile(img), _huffmanTable(0), _tp(0), _netShift(0), _linksShift(0) {}
- NETFile(const QString *path)
+ NETFile(const QString &path)
: SubFile(path), _huffmanTable(0), _tp(0), _netShift(0), _linksShift(0) {}
NETFile(const SubFile *gmp, quint32 offset)
: SubFile(gmp, offset), _huffmanTable(0), _tp(0), _netShift(0),
diff --git a/src/map/IMG/nodfile.h b/src/map/IMG/nodfile.h
index 227b3223..dcdf8b53 100644
--- a/src/map/IMG/nodfile.h
+++ b/src/map/IMG/nodfile.h
@@ -62,7 +62,7 @@ public:
NODFile(const IMGData *img)
: SubFile(img), _indexFlags(0), _indexRecordSize(0), _blockRecordSize(0),
_blockShift(0), _nodeShift(0), _indexIdSize(0) {}
- NODFile(const QString *path)
+ NODFile(const QString &path)
: SubFile(path), _indexFlags(0), _indexRecordSize(0), _blockRecordSize(0),
_blockShift(0), _nodeShift(0), _indexIdSize(0) {}
NODFile(const SubFile *gmp, quint32 offset)
diff --git a/src/map/IMG/rastertile.cpp b/src/map/IMG/rastertile.cpp
index dd4c5b20..9fa0ab41 100644
--- a/src/map/IMG/rastertile.cpp
+++ b/src/map/IMG/rastertile.cpp
@@ -152,7 +152,7 @@ void RasterTile::drawPolygons(QPainter *painter,
bool insert = false;
SubFile::Handle *hdl = hc.object(poly.raster.lbl());
if (!hdl) {
- hdl = new SubFile::Handle(_file, poly.raster.lbl());
+ hdl = new SubFile::Handle(poly.raster.lbl(), _file);
insert = true;
}
QPixmap pm(poly.raster.lbl()->image(*hdl, poly.raster.id()));
@@ -445,7 +445,11 @@ void RasterTile::fetchData(QList &polygons,
if (dynamic_cast(_data)) {
_file = new QFile(_data->fileName());
- _file->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+ if (!_file->open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
+ qWarning("%s: %s", qPrintable(_file->fileName()),
+ qPrintable(_file->errorString()));
+ return;
+ }
}
QRectF polyRect(ttl, QPointF(ttl.x() + _rect.width(), ttl.y()
diff --git a/src/map/IMG/rgnfile.h b/src/map/IMG/rgnfile.h
index 7b574e93..7040250c 100644
--- a/src/map/IMG/rgnfile.h
+++ b/src/map/IMG/rgnfile.h
@@ -24,7 +24,7 @@ public:
};
RGNFile(const IMGData *img) : SubFile(img), _huffmanTable(0) {}
- RGNFile(const QString *path) : SubFile(path), _huffmanTable(0) {}
+ RGNFile(const QString &path) : SubFile(path), _huffmanTable(0) {}
RGNFile(const SubFile *gmp, quint32 offset)
: SubFile(gmp, offset), _huffmanTable(0) {}
~RGNFile();
diff --git a/src/map/IMG/style.cpp b/src/map/IMG/style.cpp
index 6e56e81a..02a19acd 100644
--- a/src/map/IMG/style.cpp
+++ b/src/map/IMG/style.cpp
@@ -1268,9 +1268,9 @@ bool Style::parseDrawOrder(SubFile *file, SubFile::Handle &hdl,
return true;
}
-bool Style::parseTYPFile(QFile *file, SubFile *typ)
+bool Style::parseTYPFile(SubFile *typ)
{
- SubFile::Handle hdl(file, typ);
+ SubFile::Handle hdl(typ);
Section points, lines, polygons, order;
quint16 tmp16, codepage;
@@ -1311,7 +1311,7 @@ bool Style::parseTYPFile(QFile *file, SubFile *typ)
return true;
}
-Style::Style(QFile *file, qreal ratio, SubFile *typ)
+Style::Style(qreal ratio, SubFile *typ)
{
_large = pixelSizeFont(16);
_normal = pixelSizeFont(14);
@@ -1326,7 +1326,7 @@ Style::Style(QFile *file, qreal ratio, SubFile *typ)
defaultPointStyle(ratio);
if (typ)
- parseTYPFile(file, typ);
+ parseTYPFile(typ);
}
const Style::Line &Style::line(quint32 type) const
diff --git a/src/map/IMG/style.h b/src/map/IMG/style.h
index 1374083c..d08c70c1 100644
--- a/src/map/IMG/style.h
+++ b/src/map/IMG/style.h
@@ -104,7 +104,7 @@ public:
};
- Style(QFile *file, qreal ratio, SubFile *typ = 0);
+ Style(qreal ratio, SubFile *typ = 0);
const Line &line(quint32 type) const;
const Polygon &polygon(quint32 type) const;
@@ -171,7 +171,7 @@ private:
bool extended;
};
- bool parseTYPFile(QFile *file, SubFile *typ);
+ bool parseTYPFile(SubFile *typ);
bool parsePoints(SubFile *file, SubFile::Handle &hdl,
const Section §ion);
bool parsePoint(SubFile *file, SubFile::Handle &hdl,
diff --git a/src/map/IMG/subfile.h b/src/map/IMG/subfile.h
index 8d76396a..ea868492 100644
--- a/src/map/IMG/subfile.h
+++ b/src/map/IMG/subfile.h
@@ -18,7 +18,7 @@ public:
class Handle
{
public:
- Handle(QFile *file, const SubFile *subFile)
+ Handle(const SubFile *subFile, QFile *file = 0)
: _file(file), _blockNum(-1), _blockPos(-1), _pos(-1), _delete(false)
{
if (!subFile)
@@ -26,7 +26,9 @@ public:
if (!_file) {
_file = new QFile(subFile->fileName());
- _file->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+ if (!_file->open(QIODevice::ReadOnly | QIODevice::Unbuffered))
+ qWarning("%s: %s", qPrintable(_file->fileName()),
+ qPrintable(_file->errorString()));
_delete = true;
}
_data.resize(subFile->blockSize());
@@ -51,13 +53,18 @@ public:
SubFile(const IMGData *img)
: _gmpOffset(0), _img(img), _blocks(new QVector()), _path(0) {}
SubFile(const SubFile *gmp, quint32 offset) : _gmpOffset(offset),
- _img(gmp->_img), _blocks(gmp->_blocks), _path(gmp->_path) {}
- SubFile(const QString *path)
- : _gmpOffset(0), _img(0), _blocks(0), _path(path) {}
+ _img(gmp->_img), _blocks(gmp->_blocks), _path(gmp->_path)
+ {
+ Q_ASSERT(offset);
+ }
+ SubFile(const QString &path)
+ : _gmpOffset(0), _img(0), _blocks(0), _path(new QString(path)) {}
~SubFile()
{
- if (!_gmpOffset)
+ if (!_gmpOffset) {
delete _blocks;
+ delete _path;
+ }
}
void addBlock(quint16 block) {_blocks->append(block);}
diff --git a/src/map/IMG/trefile.cpp b/src/map/IMG/trefile.cpp
index 959a6545..6b736f16 100644
--- a/src/map/IMG/trefile.cpp
+++ b/src/map/IMG/trefile.cpp
@@ -51,7 +51,7 @@ TREFile::~TREFile()
bool TREFile::init(QFile *file)
{
- Handle hdl(file, this);
+ Handle hdl(this, file);
quint8 locked, levels[64];
quint16 hdrLen;
qint32 north, east, south, west;
@@ -156,7 +156,7 @@ int TREFile::readExtEntry(Handle &hdl, quint32 &polygons, quint32 &lines,
bool TREFile::load(QFile *file, int idx)
{
- Handle hdl(file, this);
+ Handle hdl(this, file);
QList sl;
SubDiv *s = 0;
SubDivTree *tree = new SubDivTree();
diff --git a/src/map/IMG/trefile.h b/src/map/IMG/trefile.h
index c309f365..58e235c0 100644
--- a/src/map/IMG/trefile.h
+++ b/src/map/IMG/trefile.h
@@ -18,7 +18,7 @@ class TREFile : public SubFile
public:
TREFile(const IMGData *img)
: SubFile(img), _flags(0), _extItemSize(0) {}
- TREFile(const QString *path)
+ TREFile(const QString &path)
: SubFile(path), _flags(0), _extItemSize(0) {}
TREFile(const SubFile *gmp, quint32 offset)
: SubFile(gmp, offset), _flags(0), _extItemSize(0) {}
diff --git a/src/map/IMG/vectortile.cpp b/src/map/IMG/vectortile.cpp
index 18682338..d46dbd41 100644
--- a/src/map/IMG/vectortile.cpp
+++ b/src/map/IMG/vectortile.cpp
@@ -53,9 +53,12 @@ bool VectorTile::init(QFile *file)
bool VectorTile::initGMP(QFile *file)
{
- SubFile::Handle hdl(file, _gmp);
+ SubFile::Handle hdl(_gmp, file);
quint32 tre, rgn, lbl, net, nod, dem;
+ if (_tre || _rgn || _lbl || _net || _nod || _dem)
+ return false;
+
if (!(_gmp->seek(hdl, 0x19) && _gmp->readUInt32(hdl, tre)
&& _gmp->readUInt32(hdl, rgn) && _gmp->readUInt32(hdl, lbl)
&& _gmp->readUInt32(hdl, net) && _gmp->readUInt32(hdl, nod)
@@ -133,10 +136,10 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
}
if (!_loaded) {
- rgnHdl = new SubFile::Handle(file, _rgn);
- lblHdl = new SubFile::Handle(file, _lbl);
- netHdl = new SubFile::Handle(file, _net);
- nodHdl = new SubFile::Handle(file, _nod);
+ rgnHdl = new SubFile::Handle(_rgn, file);
+ lblHdl = new SubFile::Handle(_lbl, file);
+ netHdl = new SubFile::Handle(_net, file);
+ nodHdl = new SubFile::Handle(_nod, file);
if (!load(*rgnHdl, *lblHdl, *netHdl, *nodHdl)) {
_lock.unlock();
@@ -159,9 +162,9 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
quint32 shift = _tre->shift(subdiv->bits());
if (!rgnHdl) {
- rgnHdl = new SubFile::Handle(file, _rgn);
- lblHdl = new SubFile::Handle(file, _lbl);
- netHdl = new SubFile::Handle(file, _net);
+ rgnHdl = new SubFile::Handle(_rgn, file);
+ lblHdl = new SubFile::Handle(_lbl, file);
+ netHdl = new SubFile::Handle(_net, file);
}
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
@@ -182,9 +185,9 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
if (_net && _net->hasLinks()) {
if (!nodHdl)
- nodHdl = new SubFile::Handle(file, _nod);
+ nodHdl = new SubFile::Handle(_nod, file);
if (!nodHdl2)
- nodHdl2 = new SubFile::Handle(file, _nod);
+ nodHdl2 = new SubFile::Handle(_nod, file);
_rgn->links(*rgnHdl, subdiv, shift, _net, *netHdl, _nod, *nodHdl,
*nodHdl2, _lbl, *lblHdl, &polys->lines);
}
@@ -221,10 +224,10 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
}
if (!_loaded) {
- rgnHdl = new SubFile::Handle(file, _rgn);
- lblHdl = new SubFile::Handle(file, _lbl);
- SubFile::Handle nodHdl(file, _nod);
- SubFile::Handle netHdl(file, _net);
+ rgnHdl = new SubFile::Handle(_rgn, file);
+ lblHdl = new SubFile::Handle(_lbl, file);
+ SubFile::Handle nodHdl(_nod, file);
+ SubFile::Handle netHdl(_net, file);
if (!load(*rgnHdl, *lblHdl, netHdl, nodHdl)) {
_lock.unlock();
@@ -245,8 +248,8 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
cacheLock->unlock();
if (!rgnHdl) {
- rgnHdl = new SubFile::Handle(file, _rgn);
- lblHdl = new SubFile::Handle(file, _lbl);
+ rgnHdl = new SubFile::Handle(_rgn, file);
+ lblHdl = new SubFile::Handle(_lbl, file);
}
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
@@ -290,7 +293,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
}
if (!_demLoaded) {
- hdl = new SubFile::Handle(file, _dem);
+ hdl = new SubFile::Handle(_dem, file);
if (!loadDem(*hdl)) {
_demLock.unlock();
@@ -315,7 +318,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
cacheLock->unlock();
if (!hdl)
- hdl = new SubFile::Handle(file, _dem);
+ hdl = new SubFile::Handle(_dem, file);
el = _dem->elevations(*hdl, level, tile);
if (!el->m.isNull())
diff --git a/src/map/IMG/vectortile.h b/src/map/IMG/vectortile.h
index a4e8bc3b..10184d6f 100644
--- a/src/map/IMG/vectortile.h
+++ b/src/map/IMG/vectortile.h
@@ -21,7 +21,7 @@ public:
delete _dem; delete _gmp;
}
- bool init(QFile *file);
+ bool init(QFile *file = 0);
void clear();
const RectC &bounds() const {return _tre->bounds();}
@@ -49,25 +49,37 @@ public:
}
template
- SubFile *addFile(T *container, SubFile::Type type)
+ SubFile *addFile(T container, SubFile::Type type)
{
switch (type) {
case SubFile::TRE:
+ if (_tre)
+ return 0;
_tre = new TREFile(container);
return _tre;
case SubFile::RGN:
+ if (_rgn)
+ return 0;
_rgn = new RGNFile(container);
return _rgn;
case SubFile::LBL:
+ if (_lbl)
+ return 0;
_lbl = new LBLFile(container);
return _lbl;
case SubFile::NET:
+ if (_net)
+ return 0;
_net = new NETFile(container);
return _net;
case SubFile::NOD:
+ if (_nod)
+ return 0;
_nod = new NODFile(container);
return _nod;
case SubFile::DEM:
+ if (_dem)
+ return 0;
_dem = new DEMFile(container);
return _dem;
case SubFile::GMP:
diff --git a/src/map/aqmmap.cpp b/src/map/aqmmap.cpp
index bc00b658..e2052923 100644
--- a/src/map/aqmmap.cpp
+++ b/src/map/aqmmap.cpp
@@ -258,7 +258,9 @@ void AQMMap::load(const Projection &in, const Projection &out,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
- _file.open(QIODevice::ReadOnly);
+ if (!_file.open(QIODevice::ReadOnly))
+ qWarning("%s: %s", qPrintable(_file.fileName()),
+ qPrintable(_file.errorString()));
}
void AQMMap::unload()
diff --git a/src/map/conversion.cpp b/src/map/conversion.cpp
index c09bc643..5e441531 100644
--- a/src/map/conversion.cpp
+++ b/src/map/conversion.cpp
@@ -141,8 +141,7 @@ bool Conversion::loadList(const QString &path)
bool res;
if (!file.open(QFile::ReadOnly)) {
- qWarning("Error opening projections file: %s: %s", qPrintable(path),
- qPrintable(file.errorString()));
+ qWarning("%s: %s", qPrintable(path), qPrintable(file.errorString()));
return false;
}
diff --git a/src/map/ellipsoid.cpp b/src/map/ellipsoid.cpp
index 97c30e4f..b5fa7c77 100644
--- a/src/map/ellipsoid.cpp
+++ b/src/map/ellipsoid.cpp
@@ -38,8 +38,7 @@ bool Ellipsoid::loadList(const QString &path)
bool res;
if (!file.open(QFile::ReadOnly)) {
- qWarning("Error opening ellipsoids file: %s: %s", qPrintable(path),
- qPrintable(file.errorString()));
+ qWarning("%s: %s", qPrintable(path), qPrintable(file.errorString()));
return false;
}
diff --git a/src/map/gcs.cpp b/src/map/gcs.cpp
index 2aef8dcd..6593c4bc 100644
--- a/src/map/gcs.cpp
+++ b/src/map/gcs.cpp
@@ -102,8 +102,7 @@ bool GCS::loadList(const QString &path)
bool res;
if (!file.open(QFile::ReadOnly)) {
- qWarning("Error opening GCS file: %s: %s", qPrintable(path),
- qPrintable(file.errorString()));
+ qWarning("%s: %s", qPrintable(path), qPrintable(file.errorString()));
return false;
}
diff --git a/src/map/gemfmap.cpp b/src/map/gemfmap.cpp
index 91797df3..1ad68d0b 100644
--- a/src/map/gemfmap.cpp
+++ b/src/map/gemfmap.cpp
@@ -189,7 +189,9 @@ void GEMFMap::load(const Projection &in, const Projection &out,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
- _file.open(QIODevice::ReadOnly);
+ if (!_file.open(QIODevice::ReadOnly))
+ qWarning("%s: %s", qPrintable(_file.fileName()),
+ qPrintable(_file.errorString()));
}
void GEMFMap::unload()
diff --git a/src/map/jnxmap.cpp b/src/map/jnxmap.cpp
index 6cc72d70..bfad6f50 100644
--- a/src/map/jnxmap.cpp
+++ b/src/map/jnxmap.cpp
@@ -162,7 +162,10 @@ void JNXMap::load(const Projection &in, const Projection &out,
_projection = in;
_mapRatio = hidpi ? deviceRatio : 1.0;
- if (_file.open(QIODevice::ReadOnly))
+ if (!_file.open(QIODevice::ReadOnly))
+ qWarning("%s: %s", qPrintable(_file.fileName()),
+ qPrintable(_file.errorString()));
+ else
readTiles();
}
diff --git a/src/map/mapsforge/mapdata.cpp b/src/map/mapsforge/mapdata.cpp
index 63e6ceb2..bae0e91a 100644
--- a/src/map/mapsforge/mapdata.cpp
+++ b/src/map/mapsforge/mapdata.cpp
@@ -459,7 +459,11 @@ RectC MapData::bounds() const
void MapData::load()
{
QFile file(_fileName);
- if (file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
+
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
+ qWarning("%s: %s", qPrintable(file.fileName()),
+ qPrintable(file.errorString()));
+ else
readSubFiles(file);
}
diff --git a/src/map/mapsforge/rastertile.cpp b/src/map/mapsforge/rastertile.cpp
index 3aba51c8..ee42efa9 100644
--- a/src/map/mapsforge/rastertile.cpp
+++ b/src/map/mapsforge/rastertile.cpp
@@ -410,8 +410,11 @@ void RasterTile::fetchData(QList &paths,
QPoint ttl(_rect.topLeft());
QFile file(_data->fileName());
- if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
+ qWarning("%s: %s", qPrintable(file.fileName()),
+ qPrintable(file.errorString()));
return;
+ }
QRectF pathRect(QPointF(ttl.x() - PATHS_EXTENT, ttl.y() - PATHS_EXTENT),
QPointF(ttl.x() + _rect.width() + PATHS_EXTENT, ttl.y() + _rect.height()
diff --git a/src/map/pcs.cpp b/src/map/pcs.cpp
index c72c1dc5..bebe36ce 100644
--- a/src/map/pcs.cpp
+++ b/src/map/pcs.cpp
@@ -31,8 +31,7 @@ bool PCS::loadList(const QString &path)
bool res;
if (!file.open(QFile::ReadOnly)) {
- qWarning("Error opening PCS file: %s: %s", qPrintable(path),
- qPrintable(file.errorString()));
+ qWarning("%s: %s", qPrintable(path), qPrintable(file.errorString()));
return false;
}
diff --git a/src/map/qctmap.cpp b/src/map/qctmap.cpp
index 6d05ef24..4373b1be 100644
--- a/src/map/qctmap.cpp
+++ b/src/map/qctmap.cpp
@@ -361,7 +361,9 @@ void QCTMap::load(const Projection &in, const Projection &out,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
- _file.open(QIODevice::ReadOnly);
+ if (!_file.open(QIODevice::ReadOnly))
+ qWarning("%s: %s", qPrintable(_file.fileName()),
+ qPrintable(_file.errorString()));
}
void QCTMap::unload()
diff --git a/src/map/rmap.cpp b/src/map/rmap.cpp
index b107221c..ef1ac79f 100644
--- a/src/map/rmap.cpp
+++ b/src/map/rmap.cpp
@@ -365,7 +365,9 @@ void RMap::load(const Projection &in, const Projection &out, qreal deviceRatio,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
- _file.open(QIODevice::ReadOnly);
+ if (!_file.open(QIODevice::ReadOnly))
+ qWarning("%s: %s", qPrintable(_file.fileName()),
+ qPrintable(_file.errorString()));
}
void RMap::unload()