move render type to layer top level

refs https://github.com/mapbox/mapbox-gl-style-spec/issues/80
This commit is contained in:
Konstantin Käfer
2014-07-09 18:43:28 -07:00
parent cd69784edb
commit d9bebe84a5
10 changed files with 181 additions and 278 deletions

View File

@@ -548,6 +548,15 @@ void StyleParser::parseLayer(std::pair<JSVal, std::shared_ptr<StyleLayer>> &pair
return;
}
if (value.HasMember("type")) {
JSVal type = value["type"];
if (!type.IsString()) {
fprintf(stderr, "[WARNING] layer type of '%s' must be a string\n", layer->id.c_str());
} else {
layer->type = parseStyleLayerType({ type.GetString(), type.GetStringLength() });
}
}
// Make sure we have not previously attempted to parse this layer.
if (std::find(stack.begin(), stack.end(), layer.get()) != stack.end()) {
fprintf(stderr, "[WARNING] layer reference of '%s' is circular\n", layer->id.c_str());
@@ -694,20 +703,24 @@ void StyleParser::parseReference(JSVal value, std::shared_ptr<StyleLayer> &layer
parseLayer(it->second);
stack.pop_front();
std::shared_ptr<StyleLayer> reference = it->second.second;
layer->type = reference->type;
if (reference->layers) {
fprintf(stderr, "[WARNING] layer '%s' references composite layer\n", layer->id.c_str());
// We cannot parse this layer further.
return;
} else {
layer->bucket = reference->bucket;
}
layer->bucket = reference->bucket;
}
#pragma mark - Parse Bucket
void StyleParser::parseBucket(JSVal value, std::shared_ptr<StyleLayer> &layer) {
layer->bucket = std::make_shared<StyleBucket>();
layer->bucket = std::make_shared<StyleBucket>(layer->type);
// We name the buckets according to the layer that defined it.
layer->bucket->name = layer->id;
@@ -844,23 +857,14 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer) {
StyleBucket &bucket = *layer->bucket;
if (value.HasMember("type")) {
JSVal type = value["type"];
if (type.IsString()) {
bucket.type = parseBucketType({ type.GetString(), type.GetStringLength() });
}
}
switch (bucket.type) {
case BucketType::Fill: {
bucket.render = StyleBucketFill{};
switch (layer->type) {
case StyleLayerType::Fill: {
StyleBucketFill &render = bucket.render.get<StyleBucketFill>();
parseRenderProperty(value, render.winding, "fill-winding", parseWindingType);
} break;
case BucketType::Line: {
bucket.render = StyleBucketLine{};
case StyleLayerType::Line: {
StyleBucketLine &render = bucket.render.get<StyleBucketLine>();
parseRenderProperty(value, render.cap, "line-cap", parseCapType);
@@ -869,8 +873,7 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer) {
parseRenderProperty(value, render.round_limit, "line-round-limit");
} break;
case BucketType::Icon: {
bucket.render = StyleBucketIcon{};
case StyleLayerType::Icon: {
StyleBucketIcon &render = bucket.render.get<StyleBucketIcon>();
parseRenderProperty(value, render.size, "icon-size");
@@ -884,8 +887,7 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer) {
parseRenderProperty(value, render.translate_anchor, "icon-translate-anchor", parseTranslateAnchorType);
} break;
case BucketType::Text: {
bucket.render = StyleBucketText{};
case StyleLayerType::Text: {
StyleBucketText &render = bucket.render.get<StyleBucketText>();
parseRenderProperty(value, render.field, "text-field");
@@ -915,15 +917,6 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer) {
}
parseRenderProperty(value, render.translate_anchor, "text-translate-anchor", parseTranslateAnchorType);
} break;
case BucketType::Raster: {
bucket.render = StyleBucketRaster{};
} break;
default:
layer->bucket.reset();
fprintf(stderr, "[WARNING] bucket type of layer '%s' is invalid\n", layer->id.c_str());
break;
}
}