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>
|
2018-11-06 22:35:30 +01:00
|
|
|
#include <QFont>
|
2018-12-17 18:31:26 +01:00
|
|
|
#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;
|
2018-11-23 23:35:28 +01:00
|
|
|
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() {}
|
2018-11-23 23:35:28 +01:00
|
|
|
Template(const FunctionS &str) : _field(str) {}
|
|
|
|
QString value(int zoom, const QVariantHash &tags) const;
|
2018-11-22 21:57:21 +01:00
|
|
|
|
|
|
|
private:
|
2018-11-23 23:35:28 +01:00
|
|
|
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);}
|
2018-11-23 23:35:28 +01:00
|
|
|
QString text(int zoom, const QVariantHash &tags) const
|
2018-11-25 12:46:38 +01:00
|
|
|
{return _text.value(zoom, tags).trimmed();}
|
2018-11-23 23:35:28 +01:00
|
|
|
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;
|
2018-11-24 09:52:54 +01:00
|
|
|
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;
|
2018-11-24 09:52:54 +01:00
|
|
|
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;
|
2018-11-06 22:35:30 +01:00
|
|
|
QFont _font;
|
2018-10-29 00:11:23 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
class Paint {
|
|
|
|
public:
|
2018-11-06 22:35:30 +01:00
|
|
|
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;
|
2018-11-06 22:35:30 +01:00
|
|
|
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;
|
2018-11-06 22:35:30 +01:00
|
|
|
FunctionB _fillAntialias;
|
2018-10-29 00:11:23 +01:00
|
|
|
QVector<qreal> _lineDasharray;
|
2018-11-23 23:35:28 +01:00
|
|
|
FunctionS _fillPattern;
|
2018-10-29 00:11:23 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
Type _type;
|
|
|
|
QString _sourceLayer;
|
|
|
|
int _minZoom, _maxZoom;
|
|
|
|
Filter _filter;
|
|
|
|
Layout _layout;
|
|
|
|
Paint _paint;
|
|
|
|
};
|
|
|
|
|
2018-12-17 18:31:26 +01:00
|
|
|
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;
|
2018-12-17 18:31:26 +01:00
|
|
|
Sprites _sprites;
|
|
|
|
#ifdef ENABLE_HIDPI
|
|
|
|
Sprites _sprites2x;
|
|
|
|
#endif // QT >= 5.6
|
2018-10-29 00:11:23 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // STYLE_H
|