mirror of
https://github.com/tumic0/QtPBFImagePlugin.git
synced 2024-11-24 03:35:54 +01:00
Some more optimization/code cleanup
This commit is contained in:
parent
0c4624d28e
commit
f4b1952b95
11
src/pbf.cpp
11
src/pbf.cpp
@ -113,7 +113,7 @@ static inline QPoint parameters(quint32 v1, quint32 v2)
|
||||
return QPoint(zigzag32decode(v1), zigzag32decode(v2));
|
||||
}
|
||||
|
||||
static void processFeature(const Feature &feature, Style *style, int styleLayer,
|
||||
static void drawFeature(const Feature &feature, Style *style, int styleLayer,
|
||||
const QSizeF &factor, Tile &tile)
|
||||
{
|
||||
if (!style->match(styleLayer, feature.tags()))
|
||||
@ -151,7 +151,7 @@ static void processFeature(const Feature &feature, Style *style, int styleLayer,
|
||||
}
|
||||
}
|
||||
|
||||
style->processFeature(styleLayer, path, feature.tags(), tile);
|
||||
style->drawFeature(styleLayer, path, feature.tags(), tile);
|
||||
}
|
||||
|
||||
static void drawLayer(const Layer &layer, Style *style, int styleLayer,
|
||||
@ -163,11 +163,9 @@ static void drawLayer(const Layer &layer, Style *style, int styleLayer,
|
||||
QSizeF factor(tile.size().width() / (qreal)layer.data()->extent(),
|
||||
tile.size().height() / (qreal)layer.data()->extent());
|
||||
|
||||
tile.painter().save();
|
||||
style->setPainter(styleLayer, tile);
|
||||
for (int i = 0; i < layer.features().size(); i++)
|
||||
processFeature(layer.features().at(i), style, styleLayer, factor, tile);
|
||||
tile.painter().restore();
|
||||
drawFeature(layer.features().at(i), style, styleLayer, factor, tile);
|
||||
}
|
||||
|
||||
bool PBF::render(const QByteArray &data, int zoom, Style *style, qreal scale,
|
||||
@ -193,6 +191,8 @@ bool PBF::render(const QByteArray &data, int zoom, Style *style, qreal scale,
|
||||
layers.insert(name, Layer(&layer));
|
||||
}
|
||||
|
||||
t.painter().save();
|
||||
|
||||
// Process source layers in order of style layers
|
||||
for (int i = 0; i < style->sourceLayers().size(); i++) {
|
||||
QMap<QString, Layer>::const_iterator it = layers.find(
|
||||
@ -203,6 +203,7 @@ bool PBF::render(const QByteArray &data, int zoom, Style *style, qreal scale,
|
||||
drawLayer(*it, style, i, t);
|
||||
}
|
||||
|
||||
t.painter().restore();
|
||||
t.text().render(&t.painter());
|
||||
|
||||
return true;
|
||||
|
@ -276,6 +276,7 @@ Style::Layer::Layout::Layout(const QJsonObject &json)
|
||||
: _textSize(16), _textMaxWidth(10), _textMaxAngle(45), _lineCap(Qt::FlatCap),
|
||||
_lineJoin(Qt::MiterJoin), _font("Open Sans"), _capitalize(false)
|
||||
{
|
||||
// line
|
||||
if (json.contains("line-cap") && json["line-cap"].isString()) {
|
||||
if (json["line-cap"].toString() == "round")
|
||||
_lineCap = Qt::RoundCap;
|
||||
@ -289,6 +290,7 @@ Style::Layer::Layout::Layout(const QJsonObject &json)
|
||||
_lineJoin = Qt::RoundJoin;
|
||||
}
|
||||
|
||||
// text
|
||||
if (!(json.contains("text-field") && json["text-field"].isString()))
|
||||
return;
|
||||
_textField = json["text-field"].toString();
|
||||
@ -366,7 +368,7 @@ bool Style::Layer::match(int zoom, const QVariantHash &tags) const
|
||||
return _filter.match(tags);
|
||||
}
|
||||
|
||||
void Style::Layer::setPainter(int zoom, Tile &tile) const
|
||||
void Style::Layer::setPathPainter(int zoom, Tile &tile) const
|
||||
{
|
||||
QPen pen(_paint.pen(_type, zoom));
|
||||
QBrush brush(_paint.brush(_type, zoom));
|
||||
@ -381,6 +383,16 @@ void Style::Layer::setPainter(int zoom, Tile &tile) const
|
||||
p.setOpacity(_paint.opacity(_type, zoom));
|
||||
}
|
||||
|
||||
void Style::Layer::setSymbolPainter(int zoom, Tile &tile) const
|
||||
{
|
||||
QPen pen(_paint.pen(_type, zoom));
|
||||
QFont font(_layout.font(zoom));
|
||||
|
||||
QPainter &p = tile.painter();
|
||||
p.setPen(pen);
|
||||
p.setFont(font);
|
||||
}
|
||||
|
||||
void Style::Layer::addSymbol(int zoom, const QPainterPath &path,
|
||||
const QVariantHash &tags, Tile &tile) const
|
||||
{
|
||||
@ -399,14 +411,12 @@ void Style::Layer::addSymbol(int zoom, const QPainterPath &path,
|
||||
if (tt.isEmpty())
|
||||
return;
|
||||
|
||||
QPen pen(_paint.pen(_type, zoom));
|
||||
QFont font(_layout.font(zoom));
|
||||
|
||||
if (path.elementCount() == 1 && path.elementAt(0).isMoveTo())
|
||||
tile.text().addLabel(tt, path.elementAt(0), font, pen,
|
||||
tile.text().addLabel(tt, path.elementAt(0), tile.painter(),
|
||||
_layout.maxTextWidth(zoom));
|
||||
else
|
||||
tile.text().addLabel(tt, path, font, pen, _layout.maxTextAngle(zoom));
|
||||
tile.text().addLabel(tt, path, tile.painter(),
|
||||
_layout.maxTextAngle(zoom));
|
||||
}
|
||||
|
||||
bool Style::load(const QString &fileName)
|
||||
@ -450,10 +460,12 @@ void Style::setPainter(int layer, Tile &tile)
|
||||
const Layer &sl = _styles.at(layer);
|
||||
|
||||
if (sl.isPath())
|
||||
sl.setPainter(_zoom, tile);
|
||||
sl.setPathPainter(_zoom, tile);
|
||||
else if (sl.isSymbol())
|
||||
sl.setSymbolPainter(_zoom, tile);
|
||||
}
|
||||
|
||||
void Style::processFeature(int layer, const QPainterPath &path,
|
||||
void Style::drawFeature(int layer, const QPainterPath &path,
|
||||
const QVariantHash &tags, Tile &tile)
|
||||
{
|
||||
const Layer &sl = _styles.at(layer);
|
||||
@ -475,7 +487,7 @@ void Style::drawBackground(Tile &tile)
|
||||
tile.painter().setPen(Qt::NoPen);
|
||||
tile.painter().drawRect(rect);
|
||||
} else if (_styles.first().isBackground()) {
|
||||
_styles.first().setPainter(_zoom, tile);
|
||||
_styles.first().setPathPainter(_zoom, tile);
|
||||
tile.painter().drawPath(path);
|
||||
}
|
||||
}
|
||||
|
@ -30,12 +30,13 @@ public:
|
||||
|
||||
void drawBackground(Tile &tile);
|
||||
void setPainter(int layer, Tile &tile);
|
||||
void processFeature(int layer, const QPainterPath &path,
|
||||
void drawFeature(int layer, const QPainterPath &path,
|
||||
const QVariantHash &tags, Tile &tile);
|
||||
|
||||
private:
|
||||
class Layer {
|
||||
public:
|
||||
Layer() : _type(Unknown), _minZoom(-1), _maxZoom(-1) {}
|
||||
Layer(const QJsonObject &json);
|
||||
|
||||
const QString &sourceLayer() const {return _sourceLayer;}
|
||||
@ -44,7 +45,8 @@ private:
|
||||
bool isSymbol() const {return (_type == Symbol);}
|
||||
|
||||
bool match(int zoom, const QVariantHash &tags) const;
|
||||
void setPainter(int zoom, Tile &tile) const;
|
||||
void setPathPainter(int zoom, Tile &tile) const;
|
||||
void setSymbolPainter(int zoom, Tile &tile) const;
|
||||
void addSymbol(int zoom, const QPainterPath &path,
|
||||
const QVariantHash &tags, Tile &tile) const;
|
||||
|
||||
@ -140,7 +142,7 @@ private:
|
||||
};
|
||||
|
||||
int _zoom;
|
||||
QList<Layer> _styles;
|
||||
QVector<Layer> _styles;
|
||||
QStringList _sourceLayers;
|
||||
};
|
||||
|
||||
|
20
src/text.cpp
20
src/text.cpp
@ -149,8 +149,8 @@ void Text::render(QPainter *painter) const
|
||||
}
|
||||
}
|
||||
|
||||
void Text::addLabel(const QString &text, const QPointF &pos, const QFont &font,
|
||||
const QPen &pen, qreal maxTextWidth)
|
||||
void Text::addLabel(const QString &text, const QPointF &pos,
|
||||
const QPainter &painter, qreal maxTextWidth)
|
||||
{
|
||||
if (text.isEmpty())
|
||||
return;
|
||||
@ -158,13 +158,13 @@ void Text::addLabel(const QString &text, const QPointF &pos, const QFont &font,
|
||||
TextPointItem *ti;
|
||||
|
||||
if (_fontScale != 1.0) {
|
||||
QFont scaledFont(font);
|
||||
scaledFont.setPixelSize(font.pixelSize() * _fontScale);
|
||||
QFont scaledFont(painter.font());
|
||||
scaledFont.setPixelSize(painter.font().pixelSize() * _fontScale);
|
||||
ti = new TextPointItem(text, pos, scaledFont, maxTextWidth);
|
||||
} else
|
||||
ti = new TextPointItem(text, pos, font, maxTextWidth);
|
||||
ti = new TextPointItem(text, pos, painter.font(), maxTextWidth);
|
||||
|
||||
ti->setPen(pen);
|
||||
ti->setPen(painter.pen());
|
||||
addItem(ti);
|
||||
QList<TextItem*> ci = collidingItems(ti);
|
||||
for (int i = 0; i < ci.size(); i++)
|
||||
@ -172,15 +172,15 @@ void Text::addLabel(const QString &text, const QPointF &pos, const QFont &font,
|
||||
}
|
||||
|
||||
void Text::addLabel(const QString &text, const QPainterPath &path,
|
||||
const QFont &font, const QPen &pen, qreal maxAngle)
|
||||
const QPainter &painter, qreal maxAngle)
|
||||
{
|
||||
if (path.isEmpty())
|
||||
return;
|
||||
if (text.isEmpty())
|
||||
return;
|
||||
|
||||
QFont scaledFont(font);
|
||||
scaledFont.setPixelSize(font.pixelSize() * _fontScale);
|
||||
QFont scaledFont(painter.font());
|
||||
scaledFont.setPixelSize(painter.font().pixelSize() * _fontScale);
|
||||
|
||||
int textWidth = text.size() * scaledFont.pixelSize() * 0.6;
|
||||
if (textWidth > path.length())
|
||||
@ -197,7 +197,7 @@ void Text::addLabel(const QString &text, const QPainterPath &path,
|
||||
delete pi;
|
||||
return;
|
||||
}
|
||||
pi->setPen(pen);
|
||||
pi->setPen(painter.pen());
|
||||
|
||||
addItem(pi);
|
||||
|
||||
|
@ -12,10 +12,10 @@ public:
|
||||
|
||||
void render(QPainter *painter) const;
|
||||
|
||||
void addLabel(const QString &text, const QPointF &pos, const QFont &font,
|
||||
const QPen &pen, qreal maxTextWidth);
|
||||
void addLabel(const QString &text, const QPointF &pos,
|
||||
const QPainter &painter, qreal maxTextWidth);
|
||||
void addLabel(const QString &text, const QPainterPath &path,
|
||||
const QFont &font, const QPen &pen, qreal maxAngle);
|
||||
const QPainter &painter, qreal maxAngle);
|
||||
|
||||
private:
|
||||
void addItem(TextItem *item) {_items.append(item);}
|
||||
|
Loading…
Reference in New Issue
Block a user