QtPBFImagePlugin/src/style.h

182 lines
4.3 KiB
C
Raw Normal View History

2018-10-29 00:11:23 +01:00
#ifndef STYLE_H
#define STYLE_H
2018-11-01 08:19:23 +01:00
#include <QObject>
2018-10-29 00:11:23 +01:00
#include <QString>
2018-12-07 00:50:11 +01:00
#include <QVector>
#include <QPair>
2018-11-10 19:34:45 +01:00
#include <QVariantHash>
2018-10-29 00:11:23 +01:00
#include <QStringList>
#include <QSet>
#include <QPen>
#include <QBrush>
#include <QFont>
#include "config.h"
2018-11-22 21:57:21 +01:00
#include "text.h"
2018-10-29 00:11:23 +01:00
#include "function.h"
2018-11-22 21:57:21 +01:00
#include "sprites.h"
2018-10-29 00:11:23 +01:00
class QPainter;
class QPainterPath;
2018-12-07 00:50:11 +01:00
class QJsonArray;
class QJsonObject;
2018-10-29 00:11:23 +01:00
class Tile;
2018-11-01 08:19:23 +01:00
class Style : public QObject
2018-10-29 00:11:23 +01:00
{
public:
2018-11-01 08:19:23 +01:00
Style(QObject *parent = 0) : QObject(parent) {}
2018-10-29 00:11:23 +01:00
bool load(const QString &fileName);
2018-11-30 10:16:41 +01:00
const QStringList &sourceLayers() const
{return _sourceLayers;}
2018-11-22 21:57:21 +01:00
2018-11-30 10:16:41 +01:00
bool match(int zoom, int layer, const QVariantHash &tags) const
{return _layers.at(layer).match(zoom, tags);}
2018-11-22 21:57:21 +01:00
void drawBackground(Tile &tile) const;
2018-11-25 12:46:38 +01:00
void setupLayer(Tile &tile, int layer) const;
2018-11-22 21:57:21 +01:00
void drawFeature(Tile &tile, int layer, const QPainterPath &path,
const QVariantHash &tags) const;
2018-10-29 00:11:23 +01:00
private:
class Layer {
public:
2018-11-13 18:24:51 +01:00
Layer() : _type(Unknown), _minZoom(-1), _maxZoom(-1) {}
2018-10-29 00:11:23 +01:00
Layer(const QJsonObject &json);
const QString &sourceLayer() const {return _sourceLayer;}
bool isPath() const {return (_type == Line || _type == Fill);}
bool isBackground() const {return (_type == Background);}
bool isSymbol() const {return (_type == Symbol);}
2018-11-10 19:34:45 +01:00
bool match(int zoom, const QVariantHash &tags) const;
void setPathPainter(Tile &tile, const Sprites &sprites) const;
2018-11-22 21:57:21 +01:00
void setTextProperties(Tile &tile) const;
void addSymbol(Tile &tile, const QPainterPath &path,
const QVariantHash &tags, const Sprites &sprites) const;
2018-10-29 00:11:23 +01:00
private:
enum Type {
Unknown,
Fill,
Line,
Background,
Symbol
};
class Filter {
public:
Filter() : _type(None) {}
Filter(const QJsonArray &json);
2018-11-10 19:34:45 +01:00
bool match(const QVariantHash &tags) const;
2018-10-29 00:11:23 +01:00
private:
enum Type {
None, Unknown,
EQ, NE, GE, GT, LE, LT,
All, Any,
In, Has
};
Type _type;
bool _not;
QSet<QString> _set;
QPair<QString, QVariant> _kv;
QVector<Filter> _filters;
};
2018-11-22 21:57:21 +01:00
class Template {
public:
Template() {}
Template(const FunctionS &str) : _field(str) {}
QString value(int zoom, const QVariantHash &tags) const;
2018-11-22 21:57:21 +01:00
private:
FunctionS _field;
2018-11-22 21:57:21 +01:00
};
2018-10-29 00:11:23 +01:00
class Layout {
public:
2018-10-31 17:40:43 +01:00
Layout() : _textSize(16), _textMaxWidth(10), _textMaxAngle(45),
2018-11-28 23:39:33 +01:00
_font("Open Sans") {}
2018-10-29 00:11:23 +01:00
Layout(const QJsonObject &json);
2018-11-03 19:16:08 +01:00
qreal maxTextWidth(int zoom) const
{return _textMaxWidth.value(zoom);}
qreal maxTextAngle(int zoom) const
{return _textMaxAngle.value(zoom);}
QString text(int zoom, const QVariantHash &tags) const
2018-11-25 12:46:38 +01:00
{return _text.value(zoom, tags).trimmed();}
QString icon(int zoom, const QVariantHash &tags) const
{return _icon.value(zoom, tags);}
2018-10-29 00:11:23 +01:00
QFont font(int zoom) const;
Qt::PenCapStyle lineCap(int zoom) const;
Qt::PenJoinStyle lineJoin(int zoom) const;
Text::Anchor textAnchor(int zoom) const;
2018-11-28 23:39:33 +01:00
Text::SymbolPlacement symbolPlacement(int zoom) const;
Text::RotationAlignment textRotationAlignment(int zoom) const;
2018-10-29 00:11:23 +01:00
private:
2018-11-25 11:47:14 +01:00
QFont::Capitalization textTransform(int zoom) const;
2018-11-22 21:57:21 +01:00
Template _text;
Template _icon;
2018-10-29 00:11:23 +01:00
FunctionF _textSize;
FunctionF _textMaxWidth;
2018-10-31 17:40:43 +01:00
FunctionF _textMaxAngle;
FunctionS _lineCap;
FunctionS _lineJoin;
FunctionS _textAnchor;
2018-11-24 10:14:23 +01:00
FunctionS _textTransform;
2018-11-28 23:39:33 +01:00
FunctionS _symbolPlacement;
FunctionS _textRotationAlignment;
QFont _font;
2018-10-29 00:11:23 +01:00
};
class Paint {
public:
Paint() : _fillOpacity(1.0), _lineOpacity(1.0), _lineWidth(1.0) {}
2018-10-29 00:11:23 +01:00
Paint(const QJsonObject &json);
QPen pen(Layer::Type type, int zoom) const;
2018-12-05 00:03:41 +01:00
QBrush brush(Layer::Type type, int zoom, const Sprites &sprites)
const;
2018-10-29 00:11:23 +01:00
qreal opacity(Layer::Type type, int zoom) const;
bool antialias(Layer::Type type, int zoom) const;
2018-10-29 00:11:23 +01:00
private:
FunctionC _textColor;
FunctionC _lineColor;
FunctionC _fillColor;
FunctionC _fillOutlineColor;
FunctionC _backgroundColor;
FunctionF _fillOpacity;
FunctionF _lineOpacity;
FunctionF _lineWidth;
FunctionB _fillAntialias;
2018-10-29 00:11:23 +01:00
QVector<qreal> _lineDasharray;
FunctionS _fillPattern;
2018-10-29 00:11:23 +01:00
};
Type _type;
QString _sourceLayer;
int _minZoom, _maxZoom;
Filter _filter;
Layout _layout;
Paint _paint;
};
const Sprites &sprites(const QPointF &scale) const;
2018-11-22 21:57:21 +01:00
QVector<Layer> _layers;
2018-10-29 00:11:23 +01:00
QStringList _sourceLayers;
Sprites _sprites;
#ifdef ENABLE_HIDPI
Sprites _sprites2x;
#endif // QT >= 5.6
2018-10-29 00:11:23 +01:00
};
#endif // STYLE_H