From 752661ae6e92bb0514634215b57ecfaae8650c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 21 May 2014 10:29:36 +0200 Subject: [PATCH] allow functions to be referenced from constants fixes #224 --- bin/style.js | 26 ++++++++++++++------------ src/style/style_parser.cpp | 16 +++++++++------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/bin/style.js b/bin/style.js index 7760406c5..7318ce377 100644 --- a/bin/style.js +++ b/bin/style.js @@ -1359,7 +1359,19 @@ module.exports = { "motorway_night": "#eee", "main_night": "#95ccdb", "street_night": "#0291b5", - "contour_night": "#ffff80" + "contour_night": "#ffff80", + + "road_main_width": [ + "stops", + {"z": 5, "val": 1}, + {"z": 12, "val": 1}, + {"z": 13, "val": 1.5}, + {"z": 14, "val": 2}, + {"z": 15, "val": 3}, + {"z": 16, "val": 6}, + {"z": 17, "val": 10}, + {"z": 18, "val": 12} + ] }, "classes": [ { @@ -1915,17 +1927,7 @@ module.exports = { "road_main": { "transition-color": {"duration": 300}, "color": "main", - "width": [ - "stops", - {"z": 5, "val": 1}, - {"z": 12, "val": 1}, - {"z": 13, "val": 1.5}, - {"z": 14, "val": 2}, - {"z": 15, "val": 3}, - {"z": 16, "val": 6}, - {"z": 17, "val": 10}, - {"z": 18, "val": 12} - ], + "width": "road_main_width", "opacity": [ "stops", {"z": 6.5, "val": 0}, diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 9972c39ee..06936ded6 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -391,16 +391,18 @@ FunctionProperty::fn StyleParser::parseFunctionType(JSVal type) { } FunctionProperty StyleParser::parseFunction(JSVal value) { + JSVal rvalue = replaceConstant(value); + FunctionProperty property; - if (value.IsArray()) { - if (value.Size() < 1) { + if (rvalue.IsArray()) { + if (rvalue.Size() < 1) { throw Style::exception("value function does not have arguments"); } - property.function = parseFunctionType(value[(rapidjson::SizeType)0]); - for (rapidjson::SizeType i = 1; i < value.Size(); ++i) { - JSVal stop = value[i]; + property.function = parseFunctionType(rvalue[(rapidjson::SizeType)0]); + for (rapidjson::SizeType i = 1; i < rvalue.Size(); ++i) { + JSVal stop = rvalue[i]; if (stop.IsObject()) { if (!stop.HasMember("z")) { throw Style::exception("stop must have zoom level specification"); @@ -427,9 +429,9 @@ FunctionProperty StyleParser::parseFunction(JSVal value) { throw Style::exception("function argument must be a numeric value"); } } - } else if (value.IsNumber()) { + } else if (rvalue.IsNumber()) { property.function = &functions::constant; - property.values.push_back(value.GetDouble()); + property.values.push_back(rvalue.GetDouble()); } return property;