7#include "mapcssdeclaration_p.h"
9#include "mapcssproperty.h"
23}
static constexpr const property_types[] = {
26 {
"casing-color", MapCSSProperty::CasingColor, MapCSSDeclaration::NoFlag },
27 {
"casing-dashes", MapCSSProperty::CasingDashes, MapCSSDeclaration::NoFlag },
28 {
"casing-linecap", MapCSSProperty::CasingLineCap, MapCSSDeclaration::NoFlag },
29 {
"casing-linejoin", MapCSSProperty::CasingLineJoin, MapCSSDeclaration::NoFlag },
30 {
"casing-opacity", MapCSSProperty::CasingOpacity, MapCSSDeclaration::NoFlag },
31 {
"casing-width", MapCSSProperty::CasingWidth, MapCSSDeclaration::NoFlag },
32 {
"color", MapCSSProperty::Color, MapCSSDeclaration::LineProperty },
33 {
"dashes", MapCSSProperty::Dashes, MapCSSDeclaration::NoFlag },
34 {
"extrude", MapCSSProperty::Extrude, MapCSSDeclaration::ExtrudeProperty },
35 {
"fill-color", MapCSSProperty::FillColor, MapCSSDeclaration::AreaProperty | MapCSSDeclaration::CanvasProperty },
36 {
"fill-image", MapCSSProperty::FillImage, MapCSSDeclaration::AreaProperty | MapCSSDeclaration::CanvasProperty },
37 {
"fill-opacity", MapCSSProperty::FillOpacity, MapCSSDeclaration::AreaProperty },
38 {
"font-family", MapCSSProperty::FontFamily, MapCSSDeclaration::NoFlag },
39 {
"font-size", MapCSSProperty::FontSize, MapCSSDeclaration::NoFlag },
40 {
"font-style", MapCSSProperty::FontStyle, MapCSSDeclaration::NoFlag },
41 {
"font-variant", MapCSSProperty::FontVariant, MapCSSDeclaration::NoFlag },
42 {
"font-weight", MapCSSProperty::FontWeight, MapCSSDeclaration::NoFlag },
43 {
"icon-allow-icon-overlap", MapCSSProperty::IconAllowIconOverlap, MapCSSDeclaration::NoFlag },
44 {
"icon-allow-text-overlap", MapCSSProperty::IconAllowTextOverlap, MapCSSDeclaration::NoFlag },
45 {
"icon-color", MapCSSProperty::IconColor, MapCSSDeclaration::NoFlag },
46 {
"icon-height", MapCSSProperty::IconHeight, MapCSSDeclaration::NoFlag },
47 {
"icon-image", MapCSSProperty::IconImage, MapCSSDeclaration::LabelProperty },
48 {
"icon-opacity", MapCSSProperty::IconOpacity, MapCSSDeclaration::NoFlag },
49 {
"icon-width", MapCSSProperty::IconWidth, MapCSSDeclaration::NoFlag },
50 {
"image", MapCSSProperty::Image, MapCSSDeclaration::LineProperty },
51 {
"linecap", MapCSSProperty::LineCap, MapCSSDeclaration::NoFlag },
52 {
"linejoin", MapCSSProperty::LineJoin, MapCSSDeclaration::NoFlag },
53 {
"max-width", MapCSSProperty::MaxWidth, MapCSSDeclaration::NoFlag },
54 {
"opacity", MapCSSProperty::Opacity, MapCSSDeclaration::NoFlag },
55 {
"shield-casing-color", MapCSSProperty::ShieldCasingColor, MapCSSDeclaration::LabelProperty },
56 {
"shield-casing-width", MapCSSProperty::ShieldCasingWidth, MapCSSDeclaration::NoFlag },
57 {
"shield-color", MapCSSProperty::ShieldColor, MapCSSDeclaration::LabelProperty },
58 {
"shield-frame-color", MapCSSProperty::ShieldFrameColor, MapCSSDeclaration::LabelProperty },
59 {
"shield-frame-width", MapCSSProperty::ShieldFrameWidth, MapCSSDeclaration::NoFlag },
60 {
"shield-image", MapCSSProperty::ShieldImage, MapCSSDeclaration::LabelProperty },
61 {
"shield-opacity", MapCSSProperty::ShieldOpacity, MapCSSDeclaration::NoFlag },
62 {
"shield-shape", MapCSSProperty::ShieldShape, MapCSSDeclaration::NoFlag },
63 {
"shield-text", MapCSSProperty::ShieldText, MapCSSDeclaration::LabelProperty },
64 {
"text", MapCSSProperty::Text, MapCSSDeclaration::LabelProperty },
65 {
"text-color", MapCSSProperty::TextColor, MapCSSDeclaration::CanvasProperty },
66 {
"text-decoration", MapCSSProperty::TextDecoration, MapCSSDeclaration::NoFlag },
67 {
"text-halo-color", MapCSSProperty::TextHaloColor, MapCSSDeclaration::NoFlag },
68 {
"text-halo-radius", MapCSSProperty::TextHaloRadius, MapCSSDeclaration::NoFlag },
69 {
"text-offset", MapCSSProperty::TextOffset, MapCSSDeclaration::NoFlag },
70 {
"text-opacity", MapCSSProperty::TextOpacity, MapCSSDeclaration::NoFlag },
71 {
"text-position", MapCSSProperty::TextPosition, MapCSSDeclaration::NoFlag },
72 {
"text-transform", MapCSSProperty::TextTransform, MapCSSDeclaration::NoFlag },
73 {
"width", MapCSSProperty::Width, MapCSSDeclaration::LineProperty },
74 {
"z-index", MapCSSProperty::ZIndex, MapCSSDeclaration::NoFlag },
80}
static constexpr const capstyle_map[] = {
89}
static constexpr const joinstyle_map[] = {
98}
static constexpr const capitalizationstyle_map[] = {
109 MapCSSDeclaration::Unit unit;
110}
static constexpr const unit_map[] = {
111 {
"m", MapCSSDeclaration::Meters },
112 {
"pt", MapCSSDeclaration::Point },
113 {
"px", MapCSSDeclaration::Pixels },
118 MapCSSDeclaration::Position position;
119}
static constexpr const position_map[] = {
120 {
"center", MapCSSDeclaration::Position::Center },
121 {
"line", MapCSSDeclaration::Position::Line },
124MapCSSDeclaration::MapCSSDeclaration(Type type)
129MapCSSDeclaration::~MapCSSDeclaration() =
default;
131bool MapCSSDeclaration::isValid()
const
134 case PropertyDeclaration:
135 return property() != MapCSSProperty::Unknown;
137 return !m_identValue.isEmpty();
138 case ClassDeclaration:
139 return !m_class.isNull();
146MapCSSDeclaration::Type MapCSSDeclaration::type()
const
156int MapCSSDeclaration::propertyFlags()
const
161int MapCSSDeclaration::intValue()
const
163 return m_doubleValue;
166double MapCSSDeclaration::doubleValue()
const
168 return m_doubleValue;
171bool MapCSSDeclaration::boolValue()
const
176QString MapCSSDeclaration::stringValue()
const
178 return m_stringValue;
181QColor MapCSSDeclaration::colorValue()
const
183 if (!m_colorValue.isValid() && !m_stringValue.isEmpty()) {
184 return QColor(m_stringValue);
204void MapCSSDeclaration::setDoubleValue(
double val)
209void MapCSSDeclaration::setBoolValue(
bool val)
214void MapCSSDeclaration::setPropertyName(
const char *name, std::size_t len)
216 const auto it = std::lower_bound(std::begin(property_types), std::end(property_types), name, [len](
const auto &lhs,
const char *rhs) {
217 const auto lhsLen = std::strlen(lhs.name);
218 const auto cmp = std::strncmp(lhs.name, rhs, std::min(lhsLen, len));
219 return cmp < 0 || (cmp == 0 && lhsLen < len);
221 if (it == std::end(property_types) || std::strncmp((*it).name, name, std::max(len, std::strlen((*it).name))) != 0) {
223 m_property = MapCSSProperty::Unknown;
226 m_property = (*it).property;
227 m_flags = (*it).flags;
230void MapCSSDeclaration::setIdentifierValue(
const char *val,
int len)
235void MapCSSDeclaration::setStringValue(
char *str)
241void MapCSSDeclaration::setColorRgba(uint32_t argb)
249 m_dashValue = dashes;
254 for (
const auto &c : capstyle_map) {
255 if (std::strcmp(c.name, m_identValue.constData()) == 0) {
259 qDebug() <<
"unknown line cap style:" << m_identValue;
265 for (
const auto &j : joinstyle_map) {
266 if (std::strcmp(j.name, m_identValue.constData()) == 0) {
275 for (
const auto &c : capitalizationstyle_map) {
276 if (std::strcmp(c.name, m_identValue.constData()) == 0) {
277 return c.capitalizationStyle;
283bool MapCSSDeclaration::isBoldStyle()
const
285 return m_identValue ==
"bold";
288bool MapCSSDeclaration::isItalicStyle()
const
290 return m_identValue ==
"italic";
293bool MapCSSDeclaration::isUnderlineStyle()
const
295 return m_identValue ==
"underline";
298MapCSSDeclaration::Position MapCSSDeclaration::textPosition()
const
300 for (
const auto &p : position_map) {
301 if (std::strcmp(p.name, m_identValue.constData()) == 0) {
305 return Position::NoPostion;
308MapCSSDeclaration::Unit MapCSSDeclaration::unit()
const
313void MapCSSDeclaration::setUnit(
const char *val,
int len)
315 for (
const auto &u : unit_map) {
316 if (std::strncmp(u.name, val, std::max<std::size_t>(std::strlen(u.name), len)) == 0) {
325ClassSelectorKey MapCSSDeclaration::classSelectorKey()
const
330void MapCSSDeclaration::setClassSelectorKey(ClassSelectorKey key)
335void MapCSSDeclaration::compile(
const OSM::DataSet &dataSet)
339 if (m_type == TagDeclaration) {
341 m_tagKey = dataSet.
tagKey(m_identValue.constData());
345void MapCSSDeclaration::write(
QIODevice *out)
const
350 case PropertyDeclaration:
351 for (
const auto &p : property_types) {
352 if (p.property == m_property) {
359 if (!std::isnan(m_doubleValue)) {
361 }
else if (m_colorValue.isValid()) {
363 }
else if (!m_dashValue.isEmpty()) {
364 for (
const auto &d : m_dashValue) {
368 }
else if (!m_stringValue.isNull()) {
370 out->
write(m_stringValue.toUtf8());
372 }
else if (!m_identValue.isEmpty()) {
373 out->
write(m_identValue);
375 out->
write(m_boolValue ?
"true" :
"false");
378 for (
const auto &u : unit_map) {
379 if (u.unit == m_unit) {
387 out->
write(m_identValue);
388 if (!std::isnan(m_doubleValue)) {
391 }
else if (!m_stringValue.isEmpty()) {
393 out->
write(m_stringValue.toUtf8());
397 case ClassDeclaration:
399 out->
write(m_class.name());
A set of nodes, ways and relations.
TagKey tagKey(const char *keyName) const
Look up a tag key for the given tag name, if it exists.
OSM-based multi-floor indoor maps for buildings.
MapCSSProperty
Known properties in MapCSS declarations.
QByteArray fromRawData(const char *data, qsizetype size)
QByteArray number(double n, char format, int precision)
QColor fromRgba(QRgb rgba)
qint64 write(const QByteArray &data)
QString fromUtf8(QByteArrayView str)