1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-04-21 12:49:10 +02:00

Compare commits

..

2 Commits

Author SHA1 Message Date
7e10e6640c Added support for the "base-stroke-width" rendertheme parameters 2023-08-09 01:19:41 +02:00
97b61451b1 Removed the zoom level offset hack
In the Mapsforge library the offset is dependent on the tile size which is
in turn dependent on whether the tiles are hidpi or not. In other words
the Mapsforge library is broken and inconsistent between hidpi/non-hdpi
displays. GPXSee is consistent here and we have thus tochoose one zoom level
mapping (i.e. what zoom level corresponds to what resolution). Lets choose
"no offset" = more details on a given zoom level/resolution.
2023-08-09 01:12:42 +02:00
3 changed files with 37 additions and 23 deletions

View File

@ -14,16 +14,13 @@ namespace Mapsforge {
class RasterTile class RasterTile
{ {
public: public:
/* Mapsforge maps zoom levels are offset by one against the standard OSM
zoom levels! We decrease the zoom level internaly here when initializing
_zoom and return the propper/increased value back in zoom() */
RasterTile(const Projection &proj, const Transform &transform, RasterTile(const Projection &proj, const Transform &transform,
const Style *style, MapData *data, int zoom, const QRect &rect, const Style *style, MapData *data, int zoom, const QRect &rect,
qreal ratio) : _proj(proj), _transform(transform), _style(style), qreal ratio) : _proj(proj), _transform(transform), _style(style),
_data(data), _zoom(zoom - 1), _rect(rect), _ratio(ratio), _data(data), _zoom(zoom), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false) {} _pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false) {}
int zoom() const {return _zoom + 1;} int zoom() const {return _zoom;}
QPoint xy() const {return _rect.topLeft();} QPoint xy() const {return _rect.topLeft();}
const QPixmap &pixmap() const {return _pixmap;} const QPixmap &pixmap() const {return _pixmap;}
bool isValid() const {return _valid;} bool isValid() const {return _valid;}

View File

@ -177,7 +177,7 @@ bool Style::Rule::match(int zoom, const QVector<MapData::Tag> &tags) const
} }
void Style::area(QXmlStreamReader &reader, const QString &dir, qreal ratio, void Style::area(QXmlStreamReader &reader, const QString &dir, qreal ratio,
const Rule &rule) qreal baseStrokeWidth, const Rule &rule)
{ {
PathRender ri(rule, _paths.size() + _circles.size()); PathRender ri(rule, _paths.size() + _circles.size());
const QXmlStreamAttributes &attr = reader.attributes(); const QXmlStreamAttributes &attr = reader.attributes();
@ -192,7 +192,8 @@ void Style::area(QXmlStreamReader &reader, const QString &dir, qreal ratio,
if (attr.hasAttribute("stroke")) if (attr.hasAttribute("stroke"))
ri._strokeColor = QColor(attr.value("stroke").toString()); ri._strokeColor = QColor(attr.value("stroke").toString());
if (attr.hasAttribute("stroke-width")) { if (attr.hasAttribute("stroke-width")) {
ri._strokeWidth = attr.value("stroke-width").toFloat(&ok); ri._strokeWidth = attr.value("stroke-width").toFloat(&ok)
* baseStrokeWidth;
if (!ok || ri._strokeWidth < 0) { if (!ok || ri._strokeWidth < 0) {
reader.raiseError("invalid stroke-width value"); reader.raiseError("invalid stroke-width value");
return; return;
@ -240,7 +241,8 @@ void Style::area(QXmlStreamReader &reader, const QString &dir, qreal ratio,
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
void Style::line(QXmlStreamReader &reader, const Rule &rule) void Style::line(QXmlStreamReader &reader, qreal baseStrokeWidth,
const Rule &rule)
{ {
PathRender ri(rule, _paths.size() + _circles.size()); PathRender ri(rule, _paths.size() + _circles.size());
const QXmlStreamAttributes &attr = reader.attributes(); const QXmlStreamAttributes &attr = reader.attributes();
@ -251,7 +253,8 @@ void Style::line(QXmlStreamReader &reader, const Rule &rule)
if (attr.hasAttribute("stroke")) if (attr.hasAttribute("stroke"))
ri._strokeColor = QColor(attr.value("stroke").toString()); ri._strokeColor = QColor(attr.value("stroke").toString());
if (attr.hasAttribute("stroke-width")) { if (attr.hasAttribute("stroke-width")) {
ri._strokeWidth = attr.value("stroke-width").toFloat(&ok); ri._strokeWidth = attr.value("stroke-width").toFloat(&ok)
* baseStrokeWidth;
if (!ok || ri._strokeWidth < 0) { if (!ok || ri._strokeWidth < 0) {
reader.raiseError("invalid stroke-width value"); reader.raiseError("invalid stroke-width value");
return; return;
@ -299,7 +302,7 @@ void Style::line(QXmlStreamReader &reader, const Rule &rule)
ri._curve = true; ri._curve = true;
} }
if (attr.hasAttribute("dy")) { if (attr.hasAttribute("dy")) {
ri._dy = attr.value("dy").toDouble(&ok); ri._dy = attr.value("dy").toDouble(&ok) * baseStrokeWidth;
if (!ok) { if (!ok) {
reader.raiseError("invalid dy value"); reader.raiseError("invalid dy value");
return; return;
@ -312,7 +315,8 @@ void Style::line(QXmlStreamReader &reader, const Rule &rule)
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
void Style::circle(QXmlStreamReader &reader, const Rule &rule) void Style::circle(QXmlStreamReader &reader, qreal baseStrokeWidth,
const Rule &rule)
{ {
CircleRender ri(rule, _paths.size() + _circles.size()); CircleRender ri(rule, _paths.size() + _circles.size());
const QXmlStreamAttributes &attr = reader.attributes(); const QXmlStreamAttributes &attr = reader.attributes();
@ -325,14 +329,14 @@ void Style::circle(QXmlStreamReader &reader, const Rule &rule)
if (attr.hasAttribute("stroke")) if (attr.hasAttribute("stroke"))
strokeColor = QColor(attr.value("stroke").toString()); strokeColor = QColor(attr.value("stroke").toString());
if (attr.hasAttribute("stroke-width")) { if (attr.hasAttribute("stroke-width")) {
strokeWidth = attr.value("stroke-width").toFloat(&ok); strokeWidth = attr.value("stroke-width").toFloat(&ok) * baseStrokeWidth;
if (!ok || strokeWidth < 0) { if (!ok || strokeWidth < 0) {
reader.raiseError("invalid stroke-width value"); reader.raiseError("invalid stroke-width value");
return; return;
} }
} }
if (attr.hasAttribute("radius")) { if (attr.hasAttribute("radius")) {
ri._radius = attr.value("radius").toDouble(&ok); ri._radius = attr.value("radius").toDouble(&ok) * baseStrokeWidth;
if (!ok || ri._radius <= 0) { if (!ok || ri._radius <= 0) {
reader.raiseError("invalid radius value"); reader.raiseError("invalid radius value");
return; return;
@ -495,8 +499,8 @@ void Style::symbol(QXmlStreamReader &reader, const QString &dir, qreal ratio,
} }
void Style::rule(QXmlStreamReader &reader, const QString &dir, void Style::rule(QXmlStreamReader &reader, const QString &dir,
const MapData &data, qreal ratio, const QSet<QString> &cats, const MapData &data, qreal ratio, qreal baseStrokeWidth,
const Rule &parent) const QSet<QString> &cats, const Rule &parent)
{ {
Rule r(parent); Rule r(parent);
const QXmlStreamAttributes &attr = reader.attributes(); const QXmlStreamAttributes &attr = reader.attributes();
@ -541,13 +545,13 @@ void Style::rule(QXmlStreamReader &reader, const QString &dir,
while (reader.readNextStartElement()) { while (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("rule")) if (reader.name() == QLatin1String("rule"))
rule(reader, dir, data, ratio, cats, r); rule(reader, dir, data, ratio, baseStrokeWidth, cats, r);
else if (reader.name() == QLatin1String("area")) else if (reader.name() == QLatin1String("area"))
area(reader, dir, ratio, r); area(reader, dir, ratio, baseStrokeWidth, r);
else if (reader.name() == QLatin1String("line")) else if (reader.name() == QLatin1String("line"))
line(reader, r); line(reader, baseStrokeWidth, r);
else if (reader.name() == QLatin1String("circle")) else if (reader.name() == QLatin1String("circle"))
circle(reader, r); circle(reader, baseStrokeWidth, r);
else if (reader.name() == QLatin1String("pathText")) { else if (reader.name() == QLatin1String("pathText")) {
QList<QList<TextRender>*> list; QList<QList<TextRender>*> list;
list.append(&_pathLabels); list.append(&_pathLabels);
@ -635,10 +639,21 @@ void Style::rendertheme(QXmlStreamReader &reader, const QString &dir,
{ {
Rule r; Rule r;
QSet<QString> cats; QSet<QString> cats;
qreal baseStrokeWidth = 1.0;
const QXmlStreamAttributes &attr = reader.attributes();
if (attr.hasAttribute("base-stroke-width")) {
bool ok;
baseStrokeWidth = attr.value("base-stroke-width").toFloat(&ok);
if (!ok || baseStrokeWidth < 0) {
reader.raiseError("invalid base-stroke-width value");
return;
}
}
while (reader.readNextStartElement()) { while (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("rule")) if (reader.name() == QLatin1String("rule"))
rule(reader, dir, data, ratio, cats, r); rule(reader, dir, data, ratio, baseStrokeWidth, cats, r);
else if (reader.name() == QLatin1String("stylemenu")) { else if (reader.name() == QLatin1String("stylemenu")) {
Menu menu(stylemenu(reader)); Menu menu(stylemenu(reader));
cats = menu.cats(); cats = menu.cats();

View File

@ -298,11 +298,13 @@ private:
Menu stylemenu(QXmlStreamReader &reader); Menu stylemenu(QXmlStreamReader &reader);
QString cat(QXmlStreamReader &reader); QString cat(QXmlStreamReader &reader);
void rule(QXmlStreamReader &reader, const QString &dir, const MapData &data, void rule(QXmlStreamReader &reader, const QString &dir, const MapData &data,
qreal ratio, const QSet<QString> &cats, const Rule &parent); qreal ratio, qreal baseStrokeWidth, const QSet<QString> &cats,
const Rule &parent);
void area(QXmlStreamReader &reader, const QString &dir, qreal ratio, void area(QXmlStreamReader &reader, const QString &dir, qreal ratio,
qreal baseStrokeWidth, const Rule &rule);
void line(QXmlStreamReader &reader, qreal baseStrokeWidth, const Rule &rule);
void circle(QXmlStreamReader &reader, qreal baseStrokeWidth,
const Rule &rule); const Rule &rule);
void line(QXmlStreamReader &reader, const Rule &rule);
void circle(QXmlStreamReader &reader, const Rule &rule);
void text(QXmlStreamReader &reader, const MapData &data, const Rule &rule, void text(QXmlStreamReader &reader, const MapData &data, const Rule &rule,
QList<QList<TextRender> *> &lists); QList<QList<TextRender> *> &lists);
void symbol(QXmlStreamReader &reader, const QString &dir, qreal ratio, void symbol(QXmlStreamReader &reader, const QString &dir, qreal ratio,