mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-06-07 10:43:02 +02:00
Compare commits
5 Commits
535f4c0752
...
7f591cb2c2
Author | SHA1 | Date | |
---|---|---|---|
7f591cb2c2 | |||
f3b97cb71f | |||
ab3940d445 | |||
6bb0c72361 | |||
4d33631844 |
@ -312,6 +312,7 @@
|
||||
<file alias="shellfish-farm-line.png">icons/map/marine/shellfish-farm-line.png</file>
|
||||
<file alias="degaussing-line.png">icons/map/marine/degaussing-line.png</file>
|
||||
<file alias="nofishing-line.png">icons/map/marine/nofishing-line.png</file>
|
||||
<file alias="fishing-line.png">icons/map/marine/fishing-line.png</file>
|
||||
</qresource>
|
||||
|
||||
<!-- Patterns (Mapsforge) -->
|
||||
|
BIN
icons/map/marine/fishing-line.png
Normal file
BIN
icons/map/marine/fishing-line.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 336 B |
@ -5,6 +5,7 @@
|
||||
#define CATBUA 10
|
||||
#define CATCOV 18
|
||||
#define CATDIS 21
|
||||
#define CATDPG 23
|
||||
#define CATHAF 30
|
||||
#define CATLMK 35
|
||||
#define CATLIT 37
|
||||
|
@ -87,6 +87,7 @@ static QMap<uint,uint> orderMapInit()
|
||||
map.insert(TYPE(BUISGL), 46);
|
||||
map.insert(TYPE(ACHARE), 47);
|
||||
map.insert(TYPE(I_ACHARE), 47);
|
||||
map.insert(TYPE(DMPGRD), 48);
|
||||
|
||||
map.insert(TYPE(I_DISMAR), 0xFFFFFFFE);
|
||||
map.insert(TYPE(SOUNDG), 0xFFFFFFFF);
|
||||
@ -191,7 +192,7 @@ static bool polygonPointCb(const MapData::Poly *polygon, void *context)
|
||||
if (baseType == TSSLPT || baseType == RCTLPT || baseType == I_TRNBSN
|
||||
|| baseType == BRIDGE || baseType == I_BRIDGE || baseType == BUAARE
|
||||
|| baseType == LNDARE || baseType == LNDRGN || baseType == I_BUNSTA
|
||||
|| baseType == PILBOP
|
||||
|| baseType == PILBOP || baseType == DMPGRD
|
||||
|| type == SUBTYPE(ACHARE, 2) || type == SUBTYPE(I_ACHARE, 2)
|
||||
|| type == SUBTYPE(ACHARE, 3) || type == SUBTYPE(I_ACHARE, 3)
|
||||
|| type == SUBTYPE(ACHARE, 9) || type == SUBTYPE(I_ACHARE, 9)
|
||||
@ -477,6 +478,8 @@ MapData::Poly::Poly(uint type, const Polygon &path, const Attributes &attr,
|
||||
subtype = I_CATBRT;
|
||||
else if (type == M_COVR)
|
||||
subtype = CATCOV;
|
||||
else if (type == DMPGRD)
|
||||
subtype = CATDPG;
|
||||
|
||||
switch (type) {
|
||||
case DEPARE:
|
||||
|
@ -104,7 +104,19 @@ void Style::polygonStyle()
|
||||
_polygons[SUBTYPE(DEPARE, 5)] = Polygon(QBrush(QColor(0xc0, 0xe0, 0xff)));
|
||||
_polygons[SUBTYPE(DEPARE, 6)] = Polygon(QBrush(QColor(0xff, 0xff, 0xff)));
|
||||
_polygons[TYPE(DMPGRD)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense3Pattern));
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 1)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 2)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 3)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 4)] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 5)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[SUBTYPE(DMPGRD, 6)] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[TYPE(FAIRWY)] = Polygon(Qt::NoBrush, QPen(QColor(0x88, 0x88, 0x88),
|
||||
1, Qt::DashDotDotLine));
|
||||
_polygons[TYPE(OBSTRN)] = Polygon(Qt::NoBrush, QPen(QColor(0, 0, 0), 1.5,
|
||||
@ -244,7 +256,9 @@ void Style::polygonStyle()
|
||||
<< TYPE(HULKES) << TYPE(I_HULKES) << TYPE(FLODOC) << TYPE(I_FLODOC)
|
||||
<< TYPE(DRYDOC) << TYPE(DAMCON) << TYPE(PYLONS) << TYPE(MORFAC)
|
||||
<< TYPE(GATCON) << TYPE(I_GATCON) << TYPE(BERTHS) << TYPE(I_BERTHS)
|
||||
<< SUBTYPE(I_BERTHS, 6) << TYPE(DMPGRD) << TYPE(TSEZNE) << TYPE(OBSTRN)
|
||||
<< SUBTYPE(I_BERTHS, 6) << TYPE(DMPGRD) << SUBTYPE(DMPGRD, 1)
|
||||
<< SUBTYPE(DMPGRD, 2) << SUBTYPE(DMPGRD, 3) << SUBTYPE(DMPGRD, 4)
|
||||
<< SUBTYPE(DMPGRD, 5) << SUBTYPE(DMPGRD, 6) << 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)
|
||||
@ -542,6 +556,15 @@ void Style::pointStyle(qreal ratio)
|
||||
_points[SUBTYPE(I_RESARE, 23)] = _points[SUBTYPE(RESARE, 23)];
|
||||
_points[SUBTYPE(I_RESARE, 25)] = _points[SUBTYPE(RESARE, 25)];
|
||||
_points[SUBTYPE(I_RESARE, 26)] = _points[SUBTYPE(RESARE, 26)];
|
||||
_points[TYPE(DMPGRD)].setTextColor(QColor(0x5d, 0x5b, 0x59));
|
||||
_points[TYPE(DMPGRD)].setHaloColor(QColor());
|
||||
_points[SUBTYPE(DMPGRD, 1)] = _points[TYPE(DMPGRD)];
|
||||
_points[SUBTYPE(DMPGRD, 2)] = _points[TYPE(DMPGRD)];
|
||||
_points[SUBTYPE(DMPGRD, 3)] = _points[TYPE(DMPGRD)];
|
||||
_points[SUBTYPE(DMPGRD, 4)].setTextColor(QColor(0xff, 0x40, 0x40));
|
||||
_points[SUBTYPE(DMPGRD, 4)].setHaloColor(QColor());
|
||||
_points[SUBTYPE(DMPGRD, 5)] = _points[TYPE(DMPGRD)];
|
||||
_points[SUBTYPE(DMPGRD, 6)] = _points[TYPE(DMPGRD)];
|
||||
|
||||
_points[SUBTYPE(I_BUNSTA, 1)] = Point(svg2img(":/POI/fuel-11.svg", ratio),
|
||||
Small);
|
||||
|
@ -29,7 +29,12 @@ class MapData
|
||||
{
|
||||
public:
|
||||
struct Poly {
|
||||
Poly() : oneway(false) {}
|
||||
Poly() : flags(0) {}
|
||||
|
||||
enum Flags {
|
||||
OneWay = 1,
|
||||
Invert = 2
|
||||
};
|
||||
|
||||
/* QPointF insted of Coordinates for performance reasons (no need to
|
||||
duplicate all the vectors for drawing). Note, that we do not want to
|
||||
@ -40,7 +45,7 @@ public:
|
||||
Raster raster;
|
||||
quint32 type;
|
||||
RectC boundingRect;
|
||||
bool oneway;
|
||||
quint32 flags;
|
||||
|
||||
bool operator<(const Poly &other) const
|
||||
{return type > other.type;}
|
||||
@ -50,7 +55,6 @@ public:
|
||||
Point() : id(0), flags(0) {}
|
||||
|
||||
enum Flags {
|
||||
NoFlag = 0,
|
||||
ClassLabel = 1,
|
||||
};
|
||||
|
||||
|
@ -480,7 +480,7 @@ bool NETFile::link(const SubDiv *subdiv, quint32 shift, Handle &hdl,
|
||||
if (lbl)
|
||||
linkLabel(hdl, linkOffset, lbl, lblHdl, poly.label);
|
||||
if ((linkInfo.flags >> 3) & 1)
|
||||
poly.oneway = true;
|
||||
poly.flags |= MapData::Poly::OneWay;
|
||||
|
||||
lines->append(poly);
|
||||
|
||||
|
@ -206,9 +206,12 @@ void RasterTile::drawLines(QPainter *painter,
|
||||
const MapData::Poly &poly = lines.at(i);
|
||||
const Style::Line &style = _data->style()->line(poly.type);
|
||||
|
||||
if (!style.img().isNull())
|
||||
BitmapLine::draw(painter, poly.points, style.img());
|
||||
else if (style.foreground() != Qt::NoPen) {
|
||||
if (!style.img().isNull()) {
|
||||
if (poly.flags & MapData::Poly::Invert)
|
||||
BitmapLine::drawR(painter, poly.points, style.img());
|
||||
else
|
||||
BitmapLine::draw(painter, poly.points, style.img());
|
||||
} else if (style.foreground() != Qt::NoPen) {
|
||||
painter->setPen(style.foreground());
|
||||
painter->drawPolyline(poly.points);
|
||||
}
|
||||
@ -383,7 +386,7 @@ void RasterTile::processStreetNames(const QList<MapData::Poly> &lines,
|
||||
? &style.text().color() : Style::isContourLine(poly.type)
|
||||
? 0 : &textColor;
|
||||
const QColor *hColor = Style::isContourLine(poly.type) ? 0 : &haloColor;
|
||||
const QImage *img = poly.oneway
|
||||
const QImage *img = (poly.flags & MapData::Poly::OneWay)
|
||||
? Style::isWaterLine(poly.type)
|
||||
? &arrows[WATER] : &arrows[ROAD] : 0;
|
||||
const QString *label = poly.label.text().isEmpty()
|
||||
|
@ -244,6 +244,22 @@ bool RGNFile::readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RGNFile::readLineInfo(Handle &hdl, quint32 size, MapData::Poly *line) const
|
||||
{
|
||||
if (size == 1) {
|
||||
quint32 val;
|
||||
|
||||
if (!readUInt8(hdl, val))
|
||||
return false;
|
||||
|
||||
if (((val >> 3) & 3) & 2)
|
||||
line->flags |= MapData::Poly::Invert;
|
||||
|
||||
return true;
|
||||
} else
|
||||
return (!size);
|
||||
}
|
||||
|
||||
bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
|
||||
void *object, LBLFile *lbl, Handle &lblHdl) const
|
||||
{
|
||||
@ -251,6 +267,8 @@ bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
|
||||
quint32 rs = 0;
|
||||
MapData::Poly *poly = (segmentType == Polygon)
|
||||
? (MapData::Poly *) object : 0;
|
||||
MapData::Poly *line = (segmentType == Line)
|
||||
? (MapData::Poly *) object : 0;
|
||||
MapData::Point *point = (segmentType == Point)
|
||||
? (MapData::Point *) object : 0;
|
||||
|
||||
@ -289,6 +307,9 @@ bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
|
||||
if (point && Style::isLight(point->type))
|
||||
readLightInfo(hdl, flags, rs, point);
|
||||
|
||||
if (line && Style::isMarineLine(line->type))
|
||||
readLineInfo(hdl, rs, line);
|
||||
|
||||
return seek(hdl, off + rs);
|
||||
}
|
||||
|
||||
@ -597,8 +618,7 @@ bool RGNFile::polyObjects(Handle &hdl, const SubDiv *subdiv,
|
||||
poly.type = (segmentType == Polygon)
|
||||
? ((quint32)(type & 0x7F)) << 8 : ((quint32)(type & 0x3F)) << 8;
|
||||
if (segmentType == Line && type & 0x40)
|
||||
poly.oneway = true;
|
||||
|
||||
poly.flags |= MapData::Poly::OneWay;
|
||||
|
||||
QPoint pos(subdiv->lon() + LS(lon, 24-subdiv->bits()),
|
||||
subdiv->lat() + LS(lat, 24-subdiv->bits()));
|
||||
|
@ -69,6 +69,7 @@ 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 readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl,
|
||||
quint8 flags, quint32 size, MapData::Point *point) const;
|
||||
bool readLclNavaid(Handle &hdl, quint32 size,
|
||||
|
@ -351,7 +351,9 @@ void Style::defaultPolygonStyle()
|
||||
_polygons[0x10307] = Polygon(QBrush(QColor(0xff, 0xff, 0xff)));
|
||||
_polygons[0x10308] = Polygon(QBrush(QColor(0xff, 0xff, 0xff)));
|
||||
_polygons[0x10407] = Polygon(QBrush(QColor(0xa3, 0xa3, 0xa3),
|
||||
Qt::Dense3Pattern));
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[0x10408] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
|
||||
Qt::Dense5Pattern));
|
||||
_polygons[0x10409] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
|
||||
Qt::FDiagPattern));
|
||||
_polygons[0x10503] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
|
||||
@ -382,8 +384,8 @@ void Style::defaultPolygonStyle()
|
||||
<< TYPE(0x26) << TYPE(0x0d) << 0x1090a << TYPE(0x0e) << 0x1090b
|
||||
<< TYPE(0x0f) << TYPE(0x10) << TYPE(0x11) << TYPE(0x12)
|
||||
<< TYPE(0x19) << 0x1090d << TYPE(0x13) << 0x10900
|
||||
<< 0x10613 /*raster*/ << 0x1060a << 0x10407 << 0x10409 << 0x10503
|
||||
<< 0x10105;
|
||||
<< 0x10613 /*raster*/ << 0x1060a << 0x10407 << 0x10408 << 0x10409
|
||||
<< 0x10503 << 0x10105;
|
||||
}
|
||||
|
||||
void Style::defaultLineStyle(qreal ratio)
|
||||
@ -497,6 +499,7 @@ void Style::defaultLineStyle(qreal ratio)
|
||||
_lines[0x10405] = Line(QImage(":/marine/pipeline-area-line.png"));
|
||||
_lines[0x10406] = Line(QImage(":/marine/cable-area-line.png"));
|
||||
_lines[0x10407] = Line(QPen(QColor(0xa3, 0xa3, 0xa3), 1, Qt::DashLine));
|
||||
_lines[0x10408] = Line(QPen(QColor(0xff, 0x40, 0x40), 1, Qt::DashLine));
|
||||
_lines[0x10409] = Line(QPen(QColor(0, 0, 0), 1, Qt::DotLine));
|
||||
_lines[0x10501] = Line(QImage(":/marine/noanchor-line.png"));
|
||||
_lines[0x10502] = Line(QImage(":/marine/nofishing-line.png"));
|
||||
@ -505,9 +508,12 @@ void Style::defaultLineStyle(qreal ratio)
|
||||
_lines[0x10505] = Line(QImage(":/marine/noanchor-line.png"));
|
||||
_lines[0x10506] = Line(QImage(":/marine/nature-reserve-line.png"));
|
||||
_lines[0x10507] = Line(QImage(":/marine/safety-zone-line.png"));
|
||||
_lines[0x10601] = Line(QPen(QColor(0, 0, 0), 1, Qt::SolidLine));
|
||||
_lines[0x10603] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 2, Qt::DashDotLine));
|
||||
_lines[0x10601] = Line(QPen(QColor(0, 0, 0), 1, Qt::DashLine));
|
||||
_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[0x10606] = Line(QImage(":/marine/anchor-line.png"));
|
||||
_lines[0x10608] = Line(QImage(":/marine/fishing-line.png"));
|
||||
_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));
|
||||
|
@ -154,6 +154,8 @@ public:
|
||||
{return (type >= 0x10100 && type < 0x10200);}
|
||||
static bool isMarinePoint(quint32 type)
|
||||
{return type >= 0x10100 && type < 0x10a00;}
|
||||
static bool isMarineLine(quint32 type)
|
||||
{return type >= 0x10400 && type < 0x10700;}
|
||||
static bool isMarina(quint32 type)
|
||||
{return type == 0x10703;}
|
||||
static bool hasColorset(quint32 type)
|
||||
|
@ -53,6 +53,26 @@ void BitmapLine::draw(QPainter *painter, const QPolygonF &line,
|
||||
}
|
||||
}
|
||||
|
||||
void BitmapLine::drawR(QPainter *painter, const QPolygonF &line,
|
||||
const QImage &img)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
for (int i = line.size() - 1; i > 0; i--) {
|
||||
QLineF segment(line.at(i).x(), line.at(i).y(), line.at(i-1).x(),
|
||||
line.at(i-1).y());
|
||||
int len = qCeil(segment.length() * img.devicePixelRatio());
|
||||
|
||||
painter->save();
|
||||
painter->translate(segment.p1());
|
||||
painter->rotate(-segment.angle());
|
||||
painter->drawImage(0.0, -img.height()/2.0, img2line(img, len, offset));
|
||||
painter->restore();
|
||||
|
||||
offset = (len + offset) % img.width();
|
||||
}
|
||||
}
|
||||
|
||||
void BitmapLine::draw(QPainter *painter, const QVector<QPolygonF> &lines,
|
||||
const QImage &img)
|
||||
{
|
||||
|
@ -11,6 +11,7 @@ class QPainterPath;
|
||||
namespace BitmapLine
|
||||
{
|
||||
void draw(QPainter *painter, const QPolygonF &line, const QImage &img);
|
||||
void drawR(QPainter *painter, const QPolygonF &line, const QImage &img);
|
||||
void draw(QPainter *painter, const QVector<QPolygonF> &lines,
|
||||
const QImage &img);
|
||||
void draw(QPainter *painter, const QPainterPath &line, const QImage &img);
|
||||
|
Loading…
x
Reference in New Issue
Block a user