mirror of
https://github.com/tumic0/QtPBFImagePlugin.git
synced 2024-11-24 03:35:54 +01:00
Some more code cleanup
This commit is contained in:
parent
2637594c0a
commit
9a314c408e
@ -164,8 +164,7 @@ static void drawLayer(const Layer &layer, Style *style, int styleLayer,
|
||||
QSizeF factor(tile.size().width() / scale.x() / (qreal)layer.data()->extent(),
|
||||
tile.size().height() / scale.y() / (qreal)layer.data()->extent());
|
||||
|
||||
style->setPainter(tile, styleLayer);
|
||||
style->setTextProperties(tile, styleLayer);
|
||||
style->setupLayer(tile, styleLayer);
|
||||
|
||||
for (int i = 0; i < layer.features().size(); i++)
|
||||
drawFeature(layer.features().at(i), style, styleLayer, factor, tile);
|
||||
|
@ -430,44 +430,30 @@ void Style::Layer::setPathPainter(Tile &tile, const Sprites &sprites) const
|
||||
p.setOpacity(_paint.opacity(_type, tile.zoom()));
|
||||
}
|
||||
|
||||
void Style::Layer::setSymbolPainter(Tile &tile) const
|
||||
{
|
||||
QPen pen(_paint.pen(_type, tile.zoom()));
|
||||
QFont font(_layout.font(tile.zoom()));
|
||||
|
||||
QPainter &p = tile.painter();
|
||||
p.setPen(pen);
|
||||
p.setFont(font);
|
||||
}
|
||||
|
||||
void Style::Layer::setTextProperties(Tile &tile) const
|
||||
{
|
||||
Text::Properties prop;
|
||||
prop.maxWidth = _layout.maxTextWidth(tile.zoom());
|
||||
prop.maxAngle = _layout.maxTextAngle(tile.zoom());
|
||||
prop.anchor = _layout.textAnchor(tile.zoom());
|
||||
|
||||
tile.text().setProperties(prop);
|
||||
tile.text().setMaxWidth(_layout.maxTextWidth(tile.zoom()));
|
||||
tile.text().setMaxAngle(_layout.maxTextAngle(tile.zoom()));
|
||||
tile.text().setAnchor(_layout.textAnchor(tile.zoom()));
|
||||
tile.text().setPen(_paint.pen(_type, tile.zoom()));
|
||||
tile.text().setFont(_layout.font(tile.zoom()));
|
||||
}
|
||||
|
||||
void Style::Layer::addSymbol(Tile &tile, const QPainterPath &path,
|
||||
const QVariantHash &tags, const Sprites &sprites) const
|
||||
{
|
||||
QString text = _layout.text(tile.zoom(), tags);
|
||||
QString tt(text.trimmed());
|
||||
if (tt.isEmpty())
|
||||
if (text.isEmpty())
|
||||
return;
|
||||
|
||||
QString icon = _layout.icon(tile.zoom(), tags);
|
||||
|
||||
if (_layout.viewportAlignment())
|
||||
tile.text().addLabel(tt, path.elementAt(0), tile.painter(), false,
|
||||
sprites.icon(icon));
|
||||
tile.text().addLabel(text, path.elementAt(0), false, sprites.icon(icon));
|
||||
else if (path.elementCount() == 1 && path.elementAt(0).isMoveTo())
|
||||
tile.text().addLabel(tt, path.elementAt(0), tile.painter(), true,
|
||||
sprites.icon(icon));
|
||||
tile.text().addLabel(text, path.elementAt(0), true, sprites.icon(icon));
|
||||
else
|
||||
tile.text().addLabel(tt, path, tile.painter());
|
||||
tile.text().addLabel(text, path);
|
||||
}
|
||||
|
||||
bool Style::load(const QString &fileName)
|
||||
@ -516,20 +502,14 @@ bool Style::match(int zoom, int layer, const QVariantHash &tags) const
|
||||
return _layers.at(layer).match(zoom, tags);
|
||||
}
|
||||
|
||||
void Style::setTextProperties(Tile &tile, int layer) const
|
||||
void Style::setupLayer(Tile &tile, int layer) const
|
||||
{
|
||||
const Layer &sl = _layers.at(layer);
|
||||
|
||||
if (sl.isSymbol())
|
||||
sl.setTextProperties(tile);
|
||||
}
|
||||
|
||||
void Style::setPainter(Tile &tile, int layer) const
|
||||
{
|
||||
const Layer &sl = _layers.at(layer);
|
||||
|
||||
if (sl.isPath())
|
||||
else if (sl.isPath())
|
||||
sl.setPathPainter(tile, _sprites);
|
||||
else if (sl.isSymbol())
|
||||
sl.setSymbolPainter(tile);
|
||||
}
|
||||
|
||||
void Style::drawFeature(Tile &tile, int layer, const QPainterPath &path,
|
||||
|
@ -30,8 +30,7 @@ public:
|
||||
bool match(int zoom, int layer, const QVariantHash &tags) const;
|
||||
|
||||
void drawBackground(Tile &tile) const;
|
||||
void setPainter(Tile &tile, int layer) const;
|
||||
void setTextProperties(Tile &tile, int layer) const;
|
||||
void setupLayer(Tile &tile, int layer) const;
|
||||
void drawFeature(Tile &tile, int layer, const QPainterPath &path,
|
||||
const QVariantHash &tags) const;
|
||||
|
||||
@ -48,7 +47,6 @@ private:
|
||||
|
||||
bool match(int zoom, const QVariantHash &tags) const;
|
||||
void setPathPainter(Tile &tile, const Sprites &sprites) const;
|
||||
void setSymbolPainter(Tile &tile) const;
|
||||
void setTextProperties(Tile &tile) const;
|
||||
void addSymbol(Tile &tile, const QPainterPath &path,
|
||||
const QVariantHash &tags, const Sprites &sprites) const;
|
||||
@ -104,7 +102,7 @@ private:
|
||||
qreal maxTextAngle(int zoom) const
|
||||
{return _textMaxAngle.value(zoom);}
|
||||
QString text(int zoom, const QVariantHash &tags) const
|
||||
{return _text.value(zoom, tags);}
|
||||
{return _text.value(zoom, tags).trimmed();}
|
||||
QString icon(int zoom, const QVariantHash &tags) const
|
||||
{return _icon.value(zoom, tags);}
|
||||
QFont font(int zoom) const;
|
||||
|
23
src/text.cpp
23
src/text.cpp
@ -149,16 +149,16 @@ void Text::render(QPainter *painter) const
|
||||
}
|
||||
}
|
||||
|
||||
void Text::addLabel(const QString &text, const QPointF &pos,
|
||||
const QPainter &painter, bool overlap, const QImage &icon)
|
||||
void Text::addLabel(const QString &text, const QPointF &pos, bool overlap,
|
||||
const QImage &icon)
|
||||
{
|
||||
TextPointItem *ti = new TextPointItem(text, pos, painter.font(),
|
||||
_properties, icon);
|
||||
TextPointItem *ti = new TextPointItem(text, pos, _font, _maxWidth, _anchor,
|
||||
icon);
|
||||
if (!overlap && !_sceneRect.contains(ti->boundingRect())) {
|
||||
delete ti;
|
||||
return;
|
||||
}
|
||||
ti->setPen(painter.pen());
|
||||
ti->setPen(_pen);
|
||||
addItem(ti);
|
||||
|
||||
QList<TextItem*> ci = collidingItems(ti);
|
||||
@ -166,25 +166,24 @@ void Text::addLabel(const QString &text, const QPointF &pos,
|
||||
ci[i]->setVisible(false);
|
||||
}
|
||||
|
||||
void Text::addLabel(const QString &text, const QPainterPath &path,
|
||||
const QPainter &painter)
|
||||
void Text::addLabel(const QString &text, const QPainterPath &path)
|
||||
{
|
||||
int textWidth = text.size() * painter.font().pixelSize() * 0.6;
|
||||
int textWidth = text.size() * _font.pixelSize() * 0.6;
|
||||
if (textWidth > path.length())
|
||||
return;
|
||||
|
||||
QPainterPath tp(textPath(path, textWidth, _properties.maxAngle,
|
||||
painter.font().pixelSize() / 2, _sceneRect));
|
||||
QPainterPath tp(textPath(path, textWidth, _maxAngle, _font.pixelSize() / 2,
|
||||
_sceneRect));
|
||||
if (tp.isEmpty())
|
||||
return;
|
||||
|
||||
TextPathItem *ti = new TextPathItem(text, reverse(tp) ? tp.toReversed()
|
||||
: tp, painter.font());
|
||||
: tp, _font);
|
||||
if (!_sceneRect.contains(ti->boundingRect())) {
|
||||
delete ti;
|
||||
return;
|
||||
}
|
||||
ti->setPen(painter.pen());
|
||||
ti->setPen(_pen);
|
||||
|
||||
addItem(ti);
|
||||
|
||||
|
36
src/text.h
36
src/text.h
@ -1,8 +1,14 @@
|
||||
#ifndef TEXT_H
|
||||
#define TEXT_H
|
||||
|
||||
#include <QImage>
|
||||
#include <QList>
|
||||
#include <QRectF>
|
||||
#include <QFont>
|
||||
#include <QPen>
|
||||
|
||||
class QImage;
|
||||
class QPainterPath;
|
||||
class QPainter;
|
||||
class TextItem;
|
||||
|
||||
class Text
|
||||
@ -16,24 +22,19 @@ public:
|
||||
Bottom
|
||||
};
|
||||
|
||||
struct Properties {
|
||||
int maxWidth;
|
||||
int maxAngle;
|
||||
Anchor anchor;
|
||||
};
|
||||
|
||||
|
||||
Text(const QSize &size)
|
||||
: _sceneRect(QRectF(QPointF(0, 0), size)) {}
|
||||
~Text();
|
||||
|
||||
void setProperties(const Properties &prop)
|
||||
{_properties = prop;}
|
||||
void setFont(const QFont &font) {_font = font;}
|
||||
void setPen(const QPen &pen) {_pen = pen;}
|
||||
void setAnchor(Anchor anchor) {_anchor = anchor;}
|
||||
void setMaxWidth(int width) {_maxWidth = width;}
|
||||
void setMaxAngle(int angle) {_maxAngle = angle;}
|
||||
|
||||
void addLabel(const QString &text, const QPointF &pos,
|
||||
const QPainter &painter, bool overlap, const QImage &icon);
|
||||
void addLabel(const QString &text, const QPainterPath &path,
|
||||
const QPainter &painter);
|
||||
void addLabel(const QString &text, const QPointF &pos, bool overlap,
|
||||
const QImage &icon);
|
||||
void addLabel(const QString &text, const QPainterPath &path);
|
||||
|
||||
void render(QPainter *painter) const;
|
||||
|
||||
@ -43,7 +44,12 @@ private:
|
||||
|
||||
QRectF _sceneRect;
|
||||
QList<TextItem *> _items;
|
||||
Properties _properties;
|
||||
|
||||
int _maxWidth;
|
||||
int _maxAngle;
|
||||
Anchor _anchor;
|
||||
QFont _font;
|
||||
QPen _pen;
|
||||
};
|
||||
|
||||
#endif // TEXT_H
|
||||
|
@ -6,10 +6,10 @@
|
||||
#define FLAGS (Qt::AlignCenter | Qt::TextWordWrap | Qt::TextDontClip)
|
||||
|
||||
static QRectF exactBoundingRect(const QString &str, const QFont &font,
|
||||
const Text::Properties &prop)
|
||||
int maxWidth)
|
||||
{
|
||||
QFontMetrics fm(font);
|
||||
int limit = font.pixelSize() * prop.maxWidth;
|
||||
int limit = font.pixelSize() * maxWidth;
|
||||
// Italic fonts overflow the computed bounding rect, so reduce it
|
||||
// a little bit.
|
||||
if (font.italic())
|
||||
@ -25,9 +25,9 @@ static QRectF exactBoundingRect(const QString &str, const QFont &font,
|
||||
}
|
||||
|
||||
static QRectF fuzzyBoundingRect(const QString &str, const QFont &font,
|
||||
const Text::Properties &prop)
|
||||
int maxWidth)
|
||||
{
|
||||
int limit = font.pixelSize() * prop.maxWidth;
|
||||
int limit = font.pixelSize() * maxWidth;
|
||||
qreal acw = (font.capitalization() == QFont::AllUppercase) ? 0.66 : 0.55;
|
||||
qreal cw = font.pixelSize() * acw;
|
||||
if (font.bold())
|
||||
@ -72,9 +72,9 @@ static QRectF fuzzyBoundingRect(const QString &str, const QFont &font,
|
||||
QRectF TextPointItem::computeTextRect(BoundingRectFunction brf) const
|
||||
{
|
||||
QRectF iconRect = _icon.isNull() ? QRectF() : _icon.rect();
|
||||
QRectF textRect = brf(text(), _font, _properties);
|
||||
QRectF textRect = brf(text(), _font, _maxWidth);
|
||||
|
||||
switch (_properties.anchor) {
|
||||
switch (_anchor) {
|
||||
case Text::Center:
|
||||
textRect.moveCenter(_pos);
|
||||
break;
|
||||
@ -100,8 +100,9 @@ QRectF TextPointItem::computeTextRect(BoundingRectFunction brf) const
|
||||
}
|
||||
|
||||
TextPointItem::TextPointItem(const QString &text, const QPointF &pos,
|
||||
const QFont &font, const Text::Properties &prop, const QImage &icon)
|
||||
: TextItem(text), _pos(pos), _font(font), _icon(icon), _properties(prop)
|
||||
const QFont &font, int maxWidth, Text::Anchor anchor, const QImage &icon)
|
||||
: TextItem(text), _pos(pos), _font(font), _icon(icon), _maxWidth(maxWidth),
|
||||
_anchor(anchor)
|
||||
{
|
||||
_boundingRect = computeTextRect(fuzzyBoundingRect);
|
||||
|
||||
|
@ -11,7 +11,7 @@ class TextPointItem : public TextItem
|
||||
{
|
||||
public:
|
||||
TextPointItem(const QString &text, const QPointF &pos, const QFont &font,
|
||||
const Text::Properties &prop, const QImage &icon);
|
||||
int maxWidth, Text::Anchor anchor, const QImage &icon);
|
||||
|
||||
QRectF boundingRect() const {return _boundingRect;}
|
||||
QPainterPath shape() const {return _shape;}
|
||||
@ -20,8 +20,7 @@ public:
|
||||
void setPen(const QPen &pen) {_pen = pen;}
|
||||
|
||||
private:
|
||||
typedef QRectF (*BoundingRectFunction)(const QString &, const QFont &,
|
||||
const Text::Properties &);
|
||||
typedef QRectF (*BoundingRectFunction)(const QString &, const QFont &, int);
|
||||
QRectF computeTextRect(BoundingRectFunction brf) const;
|
||||
|
||||
QPointF _pos;
|
||||
@ -30,7 +29,8 @@ private:
|
||||
QFont _font;
|
||||
QPen _pen;
|
||||
QImage _icon;
|
||||
Text::Properties _properties;
|
||||
int _maxWidth;
|
||||
Text::Anchor _anchor;
|
||||
};
|
||||
|
||||
#endif // TEXTPOINTITEM_H
|
||||
|
Loading…
Reference in New Issue
Block a user