diff --git a/lib/carto/functions.js b/lib/carto/functions.js
index 021f90501..613f6c614 100644
--- a/lib/carto/functions.js
+++ b/lib/carto/functions.js
@@ -10,6 +10,24 @@ tree.functions = {
if (rgb.some(isNaN) || isNaN(a)) return null;
return new tree.Color(rgb, a);
},
+ // Only require val
+ stop: function (val) {
+ if (arguments.length > 1) var color = arguments[1];
+ if (arguments.length > 2) var mode = arguments[2];
+
+ return {
+ is: 'tag',
+ val: val,
+ color: color,
+ mode: mode,
+ toString: function(env) {
+ return '\n\t';
+ }
+ };
+ },
hsl: function (h, s, l) {
return this.hsla(h, s, l, 1.0);
},
diff --git a/lib/carto/tree/call.js b/lib/carto/tree/call.js
index 13c22b6fc..07423bc10 100644
--- a/lib/carto/tree/call.js
+++ b/lib/carto/tree/call.js
@@ -29,7 +29,7 @@ tree.Call.prototype = {
}
if (this.name in tree.functions) {
- if (tree.functions[this.name].length === args.length) {
+ if (tree.functions[this.name].length <= args.length) {
var val = tree.functions[this.name].apply(tree.functions, args);
if (val === null) {
env.error({
diff --git a/lib/carto/tree/definition.js b/lib/carto/tree/definition.js
index f1a80acb0..c2e730563 100644
--- a/lib/carto/tree/definition.js
+++ b/lib/carto/tree/definition.js
@@ -130,6 +130,9 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
if (x && x.serialization && x.serialization === 'content') {
selfclosing = false;
tagcontent = attributes[j].ev(env).toXML(env, true);
+ } else if (x && x.serialization && x.serialization === 'tag') {
+ selfclosing = false;
+ tagcontent = attributes[j].ev(env).toXML(env, true);
} else {
xml += attributes[j].ev(env).toXML(env) + ' ';
}
@@ -137,7 +140,7 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
if (selfclosing) {
xml += '/>\n';
} else {
- if (tagcontent.indexOf('' + tagcontent + '' + name + '>\n';
} else {
xml += '>' + name + '>\n';
diff --git a/lib/carto/tree/reference.js b/lib/carto/tree/reference.js
index 1dae32eed..a10fa8fbc 100644
--- a/lib/carto/tree/reference.js
+++ b/lib/carto/tree/reference.js
@@ -163,6 +163,12 @@ ref.validValue = function(env, selector, value) {
}
}
return true;
+ } else if (ref.selector(selector).type == 'tags') {
+ if (!value.value) return false;
+ for (i = 0; i < value.value[0].value.length; i++) {
+ if (value.value[0].value[i].is !== 'tag') return false;
+ }
+ return true;
} else if (ref.selector(selector).type == 'functions') {
// For backwards compatibility, you can specify a string for `functions`-compatible
// values, though they will not be validated.
diff --git a/package.json b/package.json
index 5b63d71a9..3ee3129f4 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
},
"dependencies": {
"underscore": "~1.4.3",
- "mapnik-reference": "~5.0.3",
+ "mapnik-reference": "https://github.com/mapnik/mapnik-reference/archive/raster-colorizer.tar.gz",
"xml2js": "~0.1.13",
"optimist": "~0.3.5"
},
diff --git a/test/rendering/rastercolorizer.mml b/test/rendering/rastercolorizer.mml
new file mode 100644
index 000000000..719e22a59
--- /dev/null
+++ b/test/rendering/rastercolorizer.mml
@@ -0,0 +1,14 @@
+{
+ "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
+ "Stylesheet": [
+ "rastercolorizer.mss"
+ ],
+ "Layer": [{
+ "name": "world",
+ "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
+ "Datasource": {
+ "file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
+ "type": "shape"
+ }
+ }]
+}
\ No newline at end of file
diff --git a/test/rendering/rastercolorizer.mss b/test/rendering/rastercolorizer.mss
new file mode 100644
index 000000000..c13c9403f
--- /dev/null
+++ b/test/rendering/rastercolorizer.mss
@@ -0,0 +1,10 @@
+#world {
+ raster-opacity:0;
+ raster-colorizer-default-mode:discrete;
+ raster-colorizer-default-color:#f00;
+ raster-colorizer-epsilon:0.05;
+ raster-colorizer-stops:
+ stop(5, #f00)
+ stop(10, #f40, linear)
+ stop(10, #f80);
+}
\ No newline at end of file