From 416bd3472fee3a94dc2d15d4dd89426f19e5d442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Wed, 22 Mar 2023 00:41:03 +0100 Subject: [PATCH] Render lights merged with the root objects, not as separate objects --- gpxsee.qrc | 1 + icons/map/marine/light.png | Bin 0 -> 441 bytes src/common/coordinates.h | 9 +++++++ src/map/ENC/mapdata.cpp | 53 +++++++++++++++++++------------------ src/map/ENC/rastertile.cpp | 39 ++++++++++++++++++++++----- src/map/ENC/rastertile.h | 3 ++- 6 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 icons/map/marine/light.png diff --git a/gpxsee.qrc b/gpxsee.qrc index be537c0f..ab25cd7b 100644 --- a/gpxsee.qrc +++ b/gpxsee.qrc @@ -194,6 +194,7 @@ icons/map/marine/breakers.png icons/map/marine/overfalls.png icons/map/marine/boarding-place.png + icons/map/marine/light.png diff --git a/icons/map/marine/light.png b/icons/map/marine/light.png new file mode 100644 index 0000000000000000000000000000000000000000..a11ed95ff46ac95442795e364f56b0aca7d2fb24 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK1|+Sd9?b$$Y)RhkEDwr&_FcZ<*x?;;5ZrGJ=d z%kVi0u)xv5|L&`IeqDcUS4rQ!$7`R3uHIQTafx)#qu|w%8K#HpcVD<*x&1_G%@Gc} z2X&L~hw8>22{#P4^WWI`Q$_yD4LR9q8~@(^XM7{m^zv1;*h}*cgiXH?mtc1C_f=2v zkGywY8zYp7?{wdvZ<9S9$GPQY)9gxlES)$_QO zZdNC&Bi;mlTefXUqOAY<8NVa-<{p%YUAt(ksUHx3vIVCg!0Li(-l>h($ literal 0 HcmV?d00001 diff --git a/src/common/coordinates.h b/src/common/coordinates.h index cfdb39c7..5e5439d9 100644 --- a/src/common/coordinates.h +++ b/src/common/coordinates.h @@ -38,6 +38,15 @@ inline bool operator==(const Coordinates &c1, const Coordinates &c2) {return (c1.lat() == c2.lat() && c1.lon() == c2.lon());} inline bool operator!=(const Coordinates &c1, const Coordinates &c2) {return !(c1 == c2);} +inline bool operator<(const Coordinates &c1, const Coordinates &c2) +{ + if (c1.lon() < c2.lon()) + return true; + else if (c1.lon() > c2.lon()) + return false; + else + return (c1.lat() < c2.lat()); +} #ifndef QT_NO_DEBUG QDebug operator<<(QDebug dbg, const Coordinates &c); diff --git a/src/map/ENC/mapdata.cpp b/src/map/ENC/mapdata.cpp index 99e0a9ad..489374d9 100644 --- a/src/map/ENC/mapdata.cpp +++ b/src/map/ENC/mapdata.cpp @@ -19,32 +19,33 @@ static QMap orderMapInit() { QMap map; - map.insert(TYPE(CGUSTA), 0); - map.insert(SUBTYPE(BUAARE, 1), 1); - map.insert(SUBTYPE(BUAARE, 5), 2); - map.insert(SUBTYPE(BUAARE, 4), 3); - map.insert(SUBTYPE(BUAARE, 3), 4); - map.insert(SUBTYPE(BUAARE, 2), 5); - map.insert(SUBTYPE(BUAARE, 6), 6); - map.insert(SUBTYPE(BUAARE, 0), 7); - map.insert(TYPE(RDOSTA), 8); - map.insert(TYPE(RADSTA), 9); - map.insert(TYPE(RTPBCN), 10); - map.insert(TYPE(BCNISD), 11); - map.insert(TYPE(BCNLAT), 12); - map.insert(TYPE(I_BCNLAT), 12); - map.insert(TYPE(BCNSAW), 13); - map.insert(TYPE(BCNSPP), 14); - map.insert(TYPE(BOYCAR), 15); - map.insert(TYPE(BOYINB), 16); - map.insert(TYPE(BOYISD), 17); - map.insert(TYPE(BOYLAT), 18); - map.insert(TYPE(I_BOYLAT), 18); - map.insert(TYPE(BOYSAW), 19); - map.insert(TYPE(BOYSPP), 20); - map.insert(TYPE(MORFAC), 21); - map.insert(TYPE(OFSPLF), 22); - map.insert(TYPE(LIGHTS), 23); + map.insert(TYPE(LIGHTS), 0); + + map.insert(TYPE(CGUSTA), 1); + map.insert(SUBTYPE(BUAARE, 1), 2); + map.insert(SUBTYPE(BUAARE, 5), 3); + map.insert(SUBTYPE(BUAARE, 4), 4); + map.insert(SUBTYPE(BUAARE, 3), 5); + map.insert(SUBTYPE(BUAARE, 2), 6); + map.insert(SUBTYPE(BUAARE, 6), 7); + map.insert(SUBTYPE(BUAARE, 0), 8); + map.insert(TYPE(RDOSTA), 9); + map.insert(TYPE(RADSTA), 10); + map.insert(TYPE(RTPBCN), 11); + map.insert(TYPE(BCNISD), 12); + map.insert(TYPE(BCNLAT), 13); + map.insert(TYPE(I_BCNLAT), 13); + map.insert(TYPE(BCNSAW), 14); + map.insert(TYPE(BCNSPP), 15); + map.insert(TYPE(BOYCAR), 16); + map.insert(TYPE(BOYINB), 17); + map.insert(TYPE(BOYISD), 18); + map.insert(TYPE(BOYLAT), 19); + map.insert(TYPE(I_BOYLAT), 19); + map.insert(TYPE(BOYSAW), 20); + map.insert(TYPE(BOYSPP), 21); + map.insert(TYPE(MORFAC), 22); + map.insert(TYPE(OFSPLF), 23); map.insert(TYPE(OBSTRN), 24); map.insert(TYPE(WRECKS), 25); map.insert(TYPE(UWTROC), 26); diff --git a/src/map/ENC/rastertile.cpp b/src/map/ENC/rastertile.cpp index 4d0dc898..2d45d160 100644 --- a/src/map/ENC/rastertile.cpp +++ b/src/map/ENC/rastertile.cpp @@ -13,6 +13,8 @@ using namespace ENC; #define TSSLPT_SIZE 0.005 /* ll */ #define RDOCAL_SIZE 12 /* px */ +typedef QMap PointMap; + const float C1 = 0.866025f; /* sqrt(3)/2 */ static const QColor haloColor(Qt::white); @@ -49,6 +51,12 @@ static QFont *font(Style::FontSize size) } } +static const QImage *light() +{ + static QImage img(":/marine/light.png"); + return &img; +} + static const Style& style() { static Style s; @@ -266,13 +274,25 @@ void RasterTile::processPolygons(QList &textItems) } void RasterTile::processPoints(QList &textItems, - QList &images) + QList &lights, QList &images) { const Style &s = style(); + PointMap lightsMap; + int i; std::sort(_points.begin(), _points.end(), pointLess); - for (int i = 0; i < _points.size(); i++) { + /* Lights */ + for (i = 0; i < _points.size(); i++) { + const MapData::Point *point = _points.at(i); + if (point->type()>>16 == LIGHTS) + lightsMap.insert(point->pos(), point); + else + break; + } + + /* Everything else */ + for ( ; i < _points.size(); i++) { const MapData::Point *point = _points.at(i); const Style::Point &style = s.point(point->type()); @@ -288,12 +308,17 @@ void RasterTile::processPoints(QList &textItems, if ((!label || !fnt) && !img) continue; - TextPointItem *item = new TextPointItem(ll2xy(point->pos()).toPoint(), - label, fnt, img, color, hColor, 0, ICON_PADDING); + QPoint pos(ll2xy(point->pos()).toPoint()); + TextPointItem *item = new TextPointItem(pos, label, fnt, img, color, + hColor, 0, ICON_PADDING); if (item->isValid() && !item->collides(textItems)) { textItems.append(item); if (rimg) images.append(rimg); + const PointMap::const_iterator it = lightsMap.find(point->pos()); + if (it != lightsMap.constEnd()) + lights.append(new TextPointItem(pos, 0, 0, light(), 0, 0, 0, + ICON_PADDING)); } else { delete item; delete rimg; @@ -328,14 +353,14 @@ void RasterTile::processLines(QList &textItems) void RasterTile::render() { - QList textItems; + QList textItems, lights; QList images; _pixmap.setDevicePixelRatio(_ratio); _pixmap.fill(Qt::transparent); processPolygons(textItems); - processPoints(textItems, images); + processPoints(textItems, lights, images); processLines(textItems); QPainter painter(&_pixmap); @@ -347,9 +372,11 @@ void RasterTile::render() drawLines(&painter); drawArrows(&painter); + drawTextItems(&painter, lights); drawTextItems(&painter, textItems); qDeleteAll(textItems); + qDeleteAll(lights); qDeleteAll(images); //painter.setPen(Qt::red); diff --git a/src/map/ENC/rastertile.h b/src/map/ENC/rastertile.h index 7acf2a58..eac85e6f 100644 --- a/src/map/ENC/rastertile.h +++ b/src/map/ENC/rastertile.h @@ -33,7 +33,8 @@ private: QPainterPath painterPath(const Polygon &polygon) const; QPolygonF polyline(const QVector &path) const; QPolygonF tsslptArrow(const Coordinates &c, qreal angle) const; - void processPoints(QList &textItems, QList &images); + void processPoints(QList &textItems, QList &lights, + QList &images); void processLines(QList &textItems); void processPolygons(QList &textItems); void drawBitmapPath(QPainter *painter, const QImage &img,