Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit 16c435b

Browse files
committed
[core, node] Implement bindings for addLayer
1 parent c4e4cc5 commit 16c435b

File tree

83 files changed

+841
-815
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+841
-815
lines changed

include/mbgl/style/conversion.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ namespace conversion {
2828
The implementation of `convert` requires that the following are legal expressions for a value `v`
2929
of type `const V&`:
3030
31+
* `isUndefined(v)` -- returns a boolean indication whether `v` is undefined or a JSON null
32+
3133
* `isArray(v)` -- returns a boolean indicating whether `v` represents a JSON array
3234
* `arrayLength(v)` -- called only if `isArray(v)`; returns a size_t length
3335
* `arrayMember(v)` -- called only if `isArray(v)`; returns `V` or `V&`
@@ -36,6 +38,9 @@ namespace conversion {
3638
* `objectMember(v, name)` -- called only if `isObject(v)`; `name` is `const char *`; return value:
3739
* is true when evaluated in a boolean context iff the named member exists
3840
* is convertable to a `V` or `V&` when dereferenced
41+
* `eachMember(v, [] (const std::string&, const V&) -> optional<Error> {...})` -- called
42+
only if `isObject(v)`; calls the provided lambda once for each key and value of the object;
43+
short-circuits if any call returns an `Error`
3944
4045
* `toBool(v)` -- returns `optional<bool>`, absence indicating `v` is not a JSON boolean
4146
* `toNumber(v)` -- returns `optional<float>`, absence indicating `v` is not a JSON number
+208
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
#pragma once
2+
3+
#include <mbgl/style/layer.hpp>
4+
#include <mbgl/style/layers/background_layer.hpp>
5+
#include <mbgl/style/layers/circle_layer.hpp>
6+
#include <mbgl/style/layers/fill_layer.hpp>
7+
#include <mbgl/style/layers/line_layer.hpp>
8+
#include <mbgl/style/layers/raster_layer.hpp>
9+
#include <mbgl/style/layers/symbol_layer.hpp>
10+
#include <mbgl/style/conversion.hpp>
11+
#include <mbgl/style/conversion/constant.hpp>
12+
#include <mbgl/style/conversion/filter.hpp>
13+
#include <mbgl/style/conversion/make_property_setters.hpp>
14+
15+
namespace mbgl {
16+
namespace style {
17+
namespace conversion {
18+
19+
template <class V>
20+
optional<Error> setLayoutProperty(Layer& layer, const std::string& name, const V& value) {
21+
static const auto setters = makeLayoutPropertySetters<V>();
22+
auto it = setters.find(name);
23+
if (it == setters.end()) {
24+
return Error { "property not found" };
25+
}
26+
return it->second(layer, value);
27+
}
28+
29+
template <class V>
30+
optional<Error> setPaintProperty(Layer& layer, const std::string& name, const V& value, const optional<std::string>& klass) {
31+
static const auto setters = makePaintPropertySetters<V>();
32+
auto it = setters.find(name);
33+
if (it == setters.end()) {
34+
return Error { "property not found" };
35+
}
36+
return it->second(layer, value, klass);
37+
}
38+
39+
template <class V>
40+
optional<Error> setPaintProperties(Layer& layer, const V& value) {
41+
return eachMember(value, [&] (const std::string& paintName, const V& paintValue) -> optional<Error> {
42+
if (paintName.compare(0, 5, "paint") != 0) {
43+
return {};
44+
}
45+
46+
optional<std::string> klass;
47+
if (paintName.compare(0, 6, "paint.") == 0) {
48+
klass = paintName.substr(6);
49+
}
50+
51+
return eachMember(paintValue, [&] (const std::string& k, const V& v) {
52+
return setPaintProperty(layer, k, v, klass);
53+
});
54+
});
55+
}
56+
57+
template <>
58+
struct Converter<std::unique_ptr<Layer>> {
59+
public:
60+
template <class V>
61+
Result<std::unique_ptr<Layer>> operator()(const V& value) const {
62+
if (!isObject(value)) {
63+
return Error { "layer must be an object" };
64+
}
65+
66+
auto idValue = objectMember(value, "id");
67+
if (!idValue) {
68+
return Error { "layer must have an id" };
69+
}
70+
71+
optional<std::string> id = toString(*idValue);
72+
if (!id) {
73+
return Error { "layer id must be a string" };
74+
}
75+
76+
auto typeValue = objectMember(value, "type");
77+
if (!typeValue) {
78+
return Error { "layer must have a type" };
79+
}
80+
81+
optional<std::string> type = toString(*typeValue);
82+
if (!type) {
83+
return Error { "layer type must be a string" };
84+
}
85+
86+
Result<std::unique_ptr<Layer>> converted;
87+
88+
if (*type == "fill") {
89+
converted = convertVectorLayer<FillLayer>(*id, value);
90+
} else if (*type == "line") {
91+
converted = convertVectorLayer<LineLayer>(*id, value);
92+
} else if (*type == "circle") {
93+
converted = convertVectorLayer<CircleLayer>(*id, value);
94+
} else if (*type == "symbol") {
95+
converted = convertVectorLayer<SymbolLayer>(*id, value);
96+
} else if (*type == "raster") {
97+
converted = convertRasterLayer(*id, value);
98+
} else if (*type == "background") {
99+
converted = convertBackgroundLayer(*id, value);
100+
} else {
101+
return Error { "invalid layer type" };
102+
}
103+
104+
if (!converted) {
105+
return converted;
106+
}
107+
108+
std::unique_ptr<Layer> layer = std::move(*converted);
109+
110+
auto minzoomValue = objectMember(value, "minzoom");
111+
if (minzoomValue) {
112+
optional<float> minzoom = toNumber(*minzoomValue);
113+
if (!minzoom) {
114+
return Error { "minzoom must be numeric" };
115+
}
116+
layer->setMinZoom(*minzoom);
117+
}
118+
119+
auto maxzoomValue = objectMember(value, "maxzoom");
120+
if (maxzoomValue) {
121+
optional<float> maxzoom = toNumber(*maxzoomValue);
122+
if (!maxzoom) {
123+
return Error { "maxzoom must be numeric" };
124+
}
125+
layer->setMaxZoom(*maxzoom);
126+
}
127+
128+
auto layoutValue = objectMember(value, "layout");
129+
if (layoutValue) {
130+
if (!isObject(*layoutValue)) {
131+
return Error { "layout must be an object" };
132+
}
133+
optional<Error> error = eachMember(*layoutValue, [&] (const std::string& k, const V& v) {
134+
return setLayoutProperty(*layer, k, v);
135+
});
136+
if (error) {
137+
return *error;
138+
}
139+
}
140+
141+
optional<Error> error = setPaintProperties(*layer, value);
142+
if (error) {
143+
return *error;
144+
}
145+
146+
return std::move(layer);
147+
}
148+
149+
private:
150+
template <class LayerType, class V>
151+
Result<std::unique_ptr<Layer>> convertVectorLayer(const std::string& id, const V& value) const {
152+
auto sourceValue = objectMember(value, "source");
153+
if (!sourceValue) {
154+
return Error { "layer must have a source" };
155+
}
156+
157+
optional<std::string> source = toString(*sourceValue);
158+
if (!source) {
159+
return Error { "layer source must be a string" };
160+
}
161+
162+
std::unique_ptr<LayerType> layer = std::make_unique<LayerType>(id, *source);
163+
164+
auto sourceLayerValue = objectMember(value, "source-layer");
165+
if (sourceLayerValue) {
166+
optional<std::string> sourceLayer = toString(*sourceLayerValue);
167+
if (!sourceLayer) {
168+
return Error { "layer source-layer must be a string" };
169+
}
170+
layer->setSourceLayer(*sourceLayer);
171+
}
172+
173+
auto filterValue = objectMember(value, "filter");
174+
if (filterValue) {
175+
Result<Filter> filter = convert<Filter>(*filterValue);
176+
if (!filter) {
177+
return filter.error();
178+
}
179+
layer->setFilter(*filter);
180+
}
181+
182+
return std::move(layer);
183+
}
184+
185+
template <class V>
186+
Result<std::unique_ptr<Layer>> convertRasterLayer(const std::string& id, const V& value) const {
187+
auto sourceValue = objectMember(value, "source");
188+
if (!sourceValue) {
189+
return Error { "layer must have a source" };
190+
}
191+
192+
optional<std::string> source = toString(*sourceValue);
193+
if (!source) {
194+
return Error { "layer source must be a string" };
195+
}
196+
197+
return std::make_unique<RasterLayer>(id, *source);
198+
}
199+
200+
template <class V>
201+
Result<std::unique_ptr<Layer>> convertBackgroundLayer(const std::string& id, const V&) const {
202+
return std::make_unique<BackgroundLayer>(id);
203+
}
204+
};
205+
206+
} // namespace conversion
207+
} // namespace style
208+
} // namespace mbgl
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// This file is generated. Edit make_property_setters.hpp.ejs, then run `make style-code`.
2+
3+
#include <mbgl/style/conversion/property_setter.hpp>
4+
5+
#include <mbgl/style/layers/fill_layer.hpp>
6+
#include <mbgl/style/layers/line_layer.hpp>
7+
#include <mbgl/style/layers/symbol_layer.hpp>
8+
#include <mbgl/style/layers/circle_layer.hpp>
9+
#include <mbgl/style/layers/raster_layer.hpp>
10+
#include <mbgl/style/layers/background_layer.hpp>
11+
12+
#include <unordered_map>
13+
14+
namespace mbgl {
15+
namespace style {
16+
namespace conversion {
17+
18+
template <class V>
19+
auto makeLayoutPropertySetters() {
20+
std::unordered_map<std::string, LayoutPropertySetter<V>> result;
21+
22+
result["visibility"] = &setVisibility<V>;
23+
24+
25+
result["line-cap"] = makePropertySetter<V>(&LineLayer::setLineCap);
26+
result["line-join"] = makePropertySetter<V>(&LineLayer::setLineJoin);
27+
result["line-miter-limit"] = makePropertySetter<V>(&LineLayer::setLineMiterLimit);
28+
result["line-round-limit"] = makePropertySetter<V>(&LineLayer::setLineRoundLimit);
29+
30+
result["symbol-placement"] = makePropertySetter<V>(&SymbolLayer::setSymbolPlacement);
31+
result["symbol-spacing"] = makePropertySetter<V>(&SymbolLayer::setSymbolSpacing);
32+
result["symbol-avoid-edges"] = makePropertySetter<V>(&SymbolLayer::setSymbolAvoidEdges);
33+
result["icon-allow-overlap"] = makePropertySetter<V>(&SymbolLayer::setIconAllowOverlap);
34+
result["icon-ignore-placement"] = makePropertySetter<V>(&SymbolLayer::setIconIgnorePlacement);
35+
result["icon-optional"] = makePropertySetter<V>(&SymbolLayer::setIconOptional);
36+
result["icon-rotation-alignment"] = makePropertySetter<V>(&SymbolLayer::setIconRotationAlignment);
37+
result["icon-size"] = makePropertySetter<V>(&SymbolLayer::setIconSize);
38+
result["icon-text-fit"] = makePropertySetter<V>(&SymbolLayer::setIconTextFit);
39+
result["icon-text-fit-padding"] = makePropertySetter<V>(&SymbolLayer::setIconTextFitPadding);
40+
result["icon-image"] = makePropertySetter<V>(&SymbolLayer::setIconImage);
41+
result["icon-rotate"] = makePropertySetter<V>(&SymbolLayer::setIconRotate);
42+
result["icon-padding"] = makePropertySetter<V>(&SymbolLayer::setIconPadding);
43+
result["icon-keep-upright"] = makePropertySetter<V>(&SymbolLayer::setIconKeepUpright);
44+
result["icon-offset"] = makePropertySetter<V>(&SymbolLayer::setIconOffset);
45+
result["text-pitch-alignment"] = makePropertySetter<V>(&SymbolLayer::setTextPitchAlignment);
46+
result["text-rotation-alignment"] = makePropertySetter<V>(&SymbolLayer::setTextRotationAlignment);
47+
result["text-field"] = makePropertySetter<V>(&SymbolLayer::setTextField);
48+
result["text-font"] = makePropertySetter<V>(&SymbolLayer::setTextFont);
49+
result["text-size"] = makePropertySetter<V>(&SymbolLayer::setTextSize);
50+
result["text-max-width"] = makePropertySetter<V>(&SymbolLayer::setTextMaxWidth);
51+
result["text-line-height"] = makePropertySetter<V>(&SymbolLayer::setTextLineHeight);
52+
result["text-letter-spacing"] = makePropertySetter<V>(&SymbolLayer::setTextLetterSpacing);
53+
result["text-justify"] = makePropertySetter<V>(&SymbolLayer::setTextJustify);
54+
result["text-anchor"] = makePropertySetter<V>(&SymbolLayer::setTextAnchor);
55+
result["text-max-angle"] = makePropertySetter<V>(&SymbolLayer::setTextMaxAngle);
56+
result["text-rotate"] = makePropertySetter<V>(&SymbolLayer::setTextRotate);
57+
result["text-padding"] = makePropertySetter<V>(&SymbolLayer::setTextPadding);
58+
result["text-keep-upright"] = makePropertySetter<V>(&SymbolLayer::setTextKeepUpright);
59+
result["text-transform"] = makePropertySetter<V>(&SymbolLayer::setTextTransform);
60+
result["text-offset"] = makePropertySetter<V>(&SymbolLayer::setTextOffset);
61+
result["text-allow-overlap"] = makePropertySetter<V>(&SymbolLayer::setTextAllowOverlap);
62+
result["text-ignore-placement"] = makePropertySetter<V>(&SymbolLayer::setTextIgnorePlacement);
63+
result["text-optional"] = makePropertySetter<V>(&SymbolLayer::setTextOptional);
64+
65+
66+
67+
68+
return result;
69+
}
70+
71+
template <class V>
72+
auto makePaintPropertySetters() {
73+
std::unordered_map<std::string, PaintPropertySetter<V>> result;
74+
75+
result["fill-antialias"] = makePropertySetter<V>(&FillLayer::setFillAntialias);
76+
result["fill-opacity"] = makePropertySetter<V>(&FillLayer::setFillOpacity);
77+
result["fill-color"] = makePropertySetter<V>(&FillLayer::setFillColor);
78+
result["fill-outline-color"] = makePropertySetter<V>(&FillLayer::setFillOutlineColor);
79+
result["fill-translate"] = makePropertySetter<V>(&FillLayer::setFillTranslate);
80+
result["fill-translate-anchor"] = makePropertySetter<V>(&FillLayer::setFillTranslateAnchor);
81+
result["fill-pattern"] = makePropertySetter<V>(&FillLayer::setFillPattern);
82+
83+
result["line-opacity"] = makePropertySetter<V>(&LineLayer::setLineOpacity);
84+
result["line-color"] = makePropertySetter<V>(&LineLayer::setLineColor);
85+
result["line-translate"] = makePropertySetter<V>(&LineLayer::setLineTranslate);
86+
result["line-translate-anchor"] = makePropertySetter<V>(&LineLayer::setLineTranslateAnchor);
87+
result["line-width"] = makePropertySetter<V>(&LineLayer::setLineWidth);
88+
result["line-gap-width"] = makePropertySetter<V>(&LineLayer::setLineGapWidth);
89+
result["line-offset"] = makePropertySetter<V>(&LineLayer::setLineOffset);
90+
result["line-blur"] = makePropertySetter<V>(&LineLayer::setLineBlur);
91+
result["line-dasharray"] = makePropertySetter<V>(&LineLayer::setLineDasharray);
92+
result["line-pattern"] = makePropertySetter<V>(&LineLayer::setLinePattern);
93+
94+
result["icon-opacity"] = makePropertySetter<V>(&SymbolLayer::setIconOpacity);
95+
result["icon-color"] = makePropertySetter<V>(&SymbolLayer::setIconColor);
96+
result["icon-halo-color"] = makePropertySetter<V>(&SymbolLayer::setIconHaloColor);
97+
result["icon-halo-width"] = makePropertySetter<V>(&SymbolLayer::setIconHaloWidth);
98+
result["icon-halo-blur"] = makePropertySetter<V>(&SymbolLayer::setIconHaloBlur);
99+
result["icon-translate"] = makePropertySetter<V>(&SymbolLayer::setIconTranslate);
100+
result["icon-translate-anchor"] = makePropertySetter<V>(&SymbolLayer::setIconTranslateAnchor);
101+
result["text-opacity"] = makePropertySetter<V>(&SymbolLayer::setTextOpacity);
102+
result["text-color"] = makePropertySetter<V>(&SymbolLayer::setTextColor);
103+
result["text-halo-color"] = makePropertySetter<V>(&SymbolLayer::setTextHaloColor);
104+
result["text-halo-width"] = makePropertySetter<V>(&SymbolLayer::setTextHaloWidth);
105+
result["text-halo-blur"] = makePropertySetter<V>(&SymbolLayer::setTextHaloBlur);
106+
result["text-translate"] = makePropertySetter<V>(&SymbolLayer::setTextTranslate);
107+
result["text-translate-anchor"] = makePropertySetter<V>(&SymbolLayer::setTextTranslateAnchor);
108+
109+
result["circle-radius"] = makePropertySetter<V>(&CircleLayer::setCircleRadius);
110+
result["circle-color"] = makePropertySetter<V>(&CircleLayer::setCircleColor);
111+
result["circle-blur"] = makePropertySetter<V>(&CircleLayer::setCircleBlur);
112+
result["circle-opacity"] = makePropertySetter<V>(&CircleLayer::setCircleOpacity);
113+
result["circle-translate"] = makePropertySetter<V>(&CircleLayer::setCircleTranslate);
114+
result["circle-translate-anchor"] = makePropertySetter<V>(&CircleLayer::setCircleTranslateAnchor);
115+
116+
result["raster-opacity"] = makePropertySetter<V>(&RasterLayer::setRasterOpacity);
117+
result["raster-hue-rotate"] = makePropertySetter<V>(&RasterLayer::setRasterHueRotate);
118+
result["raster-brightness-min"] = makePropertySetter<V>(&RasterLayer::setRasterBrightnessMin);
119+
result["raster-brightness-max"] = makePropertySetter<V>(&RasterLayer::setRasterBrightnessMax);
120+
result["raster-saturation"] = makePropertySetter<V>(&RasterLayer::setRasterSaturation);
121+
result["raster-contrast"] = makePropertySetter<V>(&RasterLayer::setRasterContrast);
122+
result["raster-fade-duration"] = makePropertySetter<V>(&RasterLayer::setRasterFadeDuration);
123+
124+
result["background-color"] = makePropertySetter<V>(&BackgroundLayer::setBackgroundColor);
125+
result["background-pattern"] = makePropertySetter<V>(&BackgroundLayer::setBackgroundPattern);
126+
result["background-opacity"] = makePropertySetter<V>(&BackgroundLayer::setBackgroundOpacity);
127+
128+
return result;
129+
}
130+
131+
} // namespace conversion
132+
} // namespace style
133+
} // namespace mbgl

0 commit comments

Comments
 (0)