diff --git a/gpxsee.qrc b/gpxsee.qrc index c385c813..8a1a9b40 100644 --- a/gpxsee.qrc +++ b/gpxsee.qrc @@ -328,6 +328,9 @@ icons/map/marine/nofishing-line.png icons/map/marine/fishing-line.png icons/map/marine/minefield-line.png + icons/map/marine/international-maritime-boundary.png + icons/map/marine/straight-territorial-sea-baseline.png + icons/map/marine/seaward-limit-of-territorial-sea.png diff --git a/icons/map/marine/international-maritime-boundary.png b/icons/map/marine/international-maritime-boundary.png new file mode 100644 index 00000000..86a5c02e Binary files /dev/null and b/icons/map/marine/international-maritime-boundary.png differ diff --git a/icons/map/marine/seaward-limit-of-territorial-sea.png b/icons/map/marine/seaward-limit-of-territorial-sea.png new file mode 100644 index 00000000..d8049b27 Binary files /dev/null and b/icons/map/marine/seaward-limit-of-territorial-sea.png differ diff --git a/icons/map/marine/straight-territorial-sea-baseline.png b/icons/map/marine/straight-territorial-sea-baseline.png new file mode 100644 index 00000000..e03a2f2e Binary files /dev/null and b/icons/map/marine/straight-territorial-sea-baseline.png differ diff --git a/src/map/IMG/rastertile.cpp b/src/map/IMG/rastertile.cpp index d4f616be..cd840aa6 100644 --- a/src/map/IMG/rastertile.cpp +++ b/src/map/IMG/rastertile.cpp @@ -186,6 +186,16 @@ void RasterTile::drawPolygons(QPainter *painter, } } +static quint32 lineType(quint32 type, quint32 flags) +{ + if (Style::isMiscLine(type)) + return type | (flags & 0xFF000000); + else if (flags & MapData::Poly::Direction) + return type | 1<<20; + else + return type; +} + void RasterTile::drawLines(QPainter *painter, const QList &lines) const { @@ -205,8 +215,7 @@ void RasterTile::drawLines(QPainter *painter, for (int i = 0; i < lines.size(); i++) { const MapData::Poly &poly = lines.at(i); const Style::Line &style = _data->style()->line( - (poly.flags & MapData::Poly::Direction) - ? poly.type | 1<<20 : poly.type); + lineType(poly.type, poly.flags)); if (!style.img().isNull()) { if (poly.flags & MapData::Poly::Invert) @@ -528,7 +537,8 @@ void RasterTile::processPoints(QList &points, const MapData::Point &point = points.at(i); const Style *style = _data->style(); const Style::Point &ps = style->point(Style::hasColorset(point.type) - ? point.type | (point.flags & 0xFF000000) : point.type); + ? point.type | (point.flags & 0xFF000000) + : point.type | (point.flags & 0x00F00000)); bool poi = Style::isPOI(point.type); bool sl = sectorLight(point.lights); diff --git a/src/map/IMG/rgnfile.cpp b/src/map/IMG/rgnfile.cpp index 4b3cfd41..ab7599d2 100644 --- a/src/map/IMG/rgnfile.cpp +++ b/src/map/IMG/rgnfile.cpp @@ -244,8 +244,11 @@ bool RGNFile::readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl, return true; } -bool RGNFile::readLineInfo(Handle &hdl, quint32 size, MapData::Poly *line) const +bool RGNFile::readLineInfo(Handle &hdl, quint8 flags, quint32 size, + MapData::Poly *line) const { + line->flags |= (flags & 0xf)<<24; + if (size == 1) { quint32 val; @@ -308,9 +311,11 @@ bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType, readBuoyInfo(hdl, flags, rs, point); if (point && Style::isLight(point->type)) readLightInfo(hdl, flags, rs, point); + if (point && Style::isLabelPoint(point->type)) + point->flags |= (flags & 0xf)<<20; if (line && Style::isMarineLine(line->type)) - readLineInfo(hdl, rs, line); + readLineInfo(hdl, flags, rs, line); return seek(hdl, off + rs); } diff --git a/src/map/IMG/rgnfile.h b/src/map/IMG/rgnfile.h index 76ed48cb..b6b6b576 100644 --- a/src/map/IMG/rgnfile.h +++ b/src/map/IMG/rgnfile.h @@ -69,7 +69,8 @@ private: MapData::Point *point) const; bool readLightInfo(Handle &hdl, quint8 flags, quint32 size, MapData::Point *point) const; - bool readLineInfo(Handle &hdl, quint32 size, MapData::Poly *line) const; + bool readLineInfo(Handle &hdl, quint8 flags, quint32 size, + MapData::Poly *line) const; bool readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl, quint8 flags, quint32 size, MapData::Point *point) const; bool readLclNavaid(Handle &hdl, quint32 size, diff --git a/src/map/IMG/style.cpp b/src/map/IMG/style.cpp index 27b50572..98e8dd32 100644 --- a/src/map/IMG/style.cpp +++ b/src/map/IMG/style.cpp @@ -7,8 +7,8 @@ using namespace IMG; using namespace Util; -#define PNT(type, color, img, dx, dy) \ - _points[(type) | (color)<<24] = Point(QImage(img), QPoint(dx, dy)); +#define PNT(type, index, img, dx, dy) \ + _points[(type) | (index)<<24] = Point(QImage(img), QPoint(dx, dy)); #define COLORSET(type, name, dx, dy) \ PNT(type, 0, ":/marine/" name ".png", dx, dy); \ @@ -490,9 +490,11 @@ void Style::defaultLineStyle(qreal ratio) _lines[0x10106] = Line(QImage(":/marine/cable-line.png")); _lines[0x10107] = Line(QPen(QColor(0xa5, 0x81, 0x40), 3, Qt::SolidLine)); _lines[0x10108] = Line(QPen(QColor(0, 0, 0), 1, Qt::SolidLine)); + _lines[0x10301] = Line(QPen(QColor(0x0e, 0x10, 0x87), 1, Qt::SolidLine)); _lines[0x10307] = Line(QPen(QColor(0x05, 0x62, 0x0e), 1, Qt::SolidLine)); _lines[0x10309] = Line(QPen(QColor(0x0e, 0x10, 0x87), 1, Qt::SolidLine)); + _lines[0x10401] = Line(QImage(":/marine/cable.png")); _lines[0x10402] = Line(QImage(":/marine/pipeline.png")); _lines[0x10403] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 2, Qt::DotLine)); @@ -507,6 +509,7 @@ void Style::defaultLineStyle(qreal ratio) _lines[0x10409] = Line(QPen(QColor(0, 0, 0), 1, Qt::DotLine)); _lines[0x1040b] = Line(QPen(QColor(0, 0, 0), 2, Qt::DashLine)); _lines[0x1040c] = Line(QPen(QColor(0, 0, 0), 2)); + _lines[0x10501] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); _lines[0x110501] = Line(QImage(":/marine/noanchor-line.png")); _lines[0x10502] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); @@ -514,6 +517,7 @@ void Style::defaultLineStyle(qreal ratio) _lines[0x10503] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); _lines[0x110503] = Line(QImage(":/marine/entry-prohibited-line.png")); _lines[0x10504] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); + _lines[0x110504] = Line(QImage(":/marine/entry-prohibited-line.png")); _lines[0x10505] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); _lines[0x110505] = Line(QImage(":/marine/noanchor-line.png")); _lines[0x10506] = Line(QPen(QColor(0x30, 0xa0, 0x1b), 1, Qt::DashLine)); @@ -522,15 +526,36 @@ void Style::defaultLineStyle(qreal ratio) _lines[0x110507] = Line(QImage(":/marine/safety-zone-line.png")); _lines[0x10508] = Line(QPen(QColor(0xff, 0x40, 0x40), 1, Qt::DashLine)); _lines[0x110508] = Line(QImage(":/marine/minefield-line.png")); - _lines[0x10601] = Line(QPen(QColor(0, 0, 0), 1, Qt::DashLine)); + + _lines[0x10601] = Line(QPen(QColor(0, 0, 0), 1)); + _lines[0x10601 | 1<<24] = Line(QPen(QColor(0, 0x90, 0xfc), 1)); + _lines[0x10601 | 2<<24] = Line(QPen(QColor(0x30, 0xa0, 0x1b), 1)); + _lines[0x10601 | 3<<24] = Line(QPen(QColor(0xa7, 0xf1, 0xfc), 1)); + _lines[0x10601 | 4<<24] = Line(QPen(QColor(0xff, 0x40, 0x40), 1)); + _lines[0x10601 | 5<<24] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1)); + _lines[0x10601 | 6<<24] = Line(QPen(QColor(0xfc, 0xe0, 0x1f), 1)); + _lines[0x10601 | 7<<24] = Line(QPen(QColor(0xfc, 0x79, 0x1e), 1)); + _lines[0x10601 | 8<<24] = Line(QPen(QColor(0x40, 0x40, 0x40), 1)); + _lines[0x10601 | 9<<24] = Line(QPen(QColor(0x84, 0xe6, 0xfc), 1)); + _lines[0x10601 | 10<<24] = Line(QPen(QColor(0x83, 0x53, 0x15), 1)); + _lines[0x10601 | 11<<24] = Line(QPen(QColor(0xd2, 0xfc, 0xfc), 1)); + _lines[0x10601 | 12<<24] = Line(QPen(QColor(0xc5, 0xf1, 0xc2), 1)); + _lines[0x10601 | 13<<24] = Line(QPen(QColor(0xfc, 0xc6, 0xfc), 1)); + _lines[0x10601 | 14<<24] = Line(QPen(QColor(0xe2, 0xdc, 0xa9), 1)); + _lines[0x10601 | 15<<24] = Line(QPen(QColor(0xcd, 0xcd, 0xcd), 1)); _lines[0x10602] = Line(QPen(QColor(0xfc, 0xb4, 0xfc), 2)); - _lines[0x10603] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1.5, Qt::DashDotLine)); - _lines[0x10604] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashDotLine)); + _lines[0x10603] = Line(QImage(":/marine/international-maritime-boundary.png")); + _lines[0x110603] = Line(QImage(":/marine/international-maritime-boundary.png")); + _lines[0x10604] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1)); + _lines[0x110604] = Line(QImage(":/marine/straight-territorial-sea-baseline.png")); + _lines[0x10605] = Line(QImage(":/marine/seaward-limit-of-territorial-sea.png")); + _lines[0x110605] = Line(QImage(":/marine/seaward-limit-of-territorial-sea.png")); _lines[0x10606] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); _lines[0x110606] = Line(QImage(":/marine/anchor-line.png")); _lines[0x10608] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine)); _lines[0x110608] = Line(QImage(":/marine/fishing-line.png")); _lines[0x1060b] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashDotDotLine)); + _lines[0x11060b] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashDotDotLine)); _lines[0x1060c] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::SolidLine)); _lines[0x1060d] = Line(QPen(QColor(0xeb, 0x49, 0xeb), 1, Qt::DashLine)); _lines[0x10611] = Line(QPen(QColor(0xeb, 0x49, 0xeb), 1, Qt::DashLine)); @@ -833,6 +858,23 @@ void Style::defaultPointStyle(qreal ratio) _points[0x1040a] = Point(QImage(":/marine/rock-dangerous.png")); _points[0x1040c] = Point(QImage(":/marine/rock-exposed.png")); + _points[0x10500] = Point(Small, QColor(0, 0, 0)); + _points[0x10500 | 1<<20] = Point(Small, QColor(0, 0x90, 0xfc)); + _points[0x10500 | 2<<20] = Point(Small, QColor(0x30, 0xa0, 0x1b)); + _points[0x10500 | 3<<20] = Point(Small, QColor(0xa7, 0xf1, 0xfc)); + _points[0x10500 | 4<<20] = Point(Small, QColor(0xff, 0x40, 0x40)); + _points[0x10500 | 5<<20] = Point(Small, QColor(0xe7, 0x28, 0xe7)); + _points[0x10500 | 6<<20] = Point(Small, QColor(0xfc, 0xe0, 0x1f)); + _points[0x10500 | 7<<20] = Point(Small, QColor(0xfc, 0x79, 0x1e)); + _points[0x10500 | 8<<20] = Point(Small, QColor(0x40, 0x40, 0x40)); + _points[0x10500 | 9<<20] = Point(Small, QColor(0x84, 0xe6, 0xfc)); + _points[0x10500 | 10<<20] = Point(Small, QColor(0x83, 0x53, 0x15)); + _points[0x10500 | 11<<20] = Point(Small, QColor(0xd2, 0xfc, 0xfc)); + _points[0x10500 | 12<<20] = Point(Small, QColor(0xc5, 0xf1, 0xc2)); + _points[0x10500 | 13<<20] = Point(Small, QColor(0xfc, 0xc6, 0xfc)); + _points[0x10500 | 14<<20] = Point(Small, QColor(0xe2, 0xdc, 0xa9)); + _points[0x10500 | 15<<20] = Point(Small, QColor(0xcd, 0xcd, 0xcd)); + _points[0x10701] = Point(QImage(":/marine/anchorage.png")); _points[0x10702] = Point(QImage(":/marine/boarding-place.png")); _points[0x10703] = Point(QImage(":/marine/yacht-harbor.png")); diff --git a/src/map/IMG/style.h b/src/map/IMG/style.h index 57f8a18b..755133c3 100644 --- a/src/map/IMG/style.h +++ b/src/map/IMG/style.h @@ -152,12 +152,17 @@ public: {return (type >= 0x10200 && type < 0x10300);} static bool isLight(quint32 type) {return (type >= 0x10100 && type < 0x10200);} + static bool isLabelPoint(quint32 type) + {return type == 0x10500;} static bool isMarinePoint(quint32 type) {return type >= 0x10100 && type < 0x10a00;} static bool isMarineLine(quint32 type) {return type >= 0x10400 && type < 0x10700;} + static bool isMiscLine(quint32 type) + {return type == 0x10601;} static bool isMarina(quint32 type) {return type == 0x10703;} + static bool hasColorset(quint32 type) {return (isBuoy(type) && !(type == 0x1020d || type >= 0x10216));}