Start on a condense branch. This is related to #20

See https://gist.github.com/4329932 for more detail.
This commit is contained in:
Tom MacWright 2012-12-18 13:27:04 -05:00
parent 4c7af7f492
commit 13bc8c3488
4 changed files with 38 additions and 25 deletions

View File

@ -60,13 +60,15 @@ carto.Renderer.prototype.render = function render(m, callback) {
});
var rules = inheritRules(matching, env);
var sorted = sortStyles(rules, env);
_(sorted).each(function(rule) {
var style = new tree.Style(l.name, rule.attachment, rule);
if (style) {
l.styles.push(style.name);
var xml = style.toXML(env);
// env.effects can be modified by this call
output.push(style.toXML(env));
output.push(xml);
}
});
if (l.styles.length) {
@ -170,7 +172,8 @@ function addRules(current, definition, existing) {
k++;
}
}
} else if (updatedFilters === null) {
} else if (updatedFilters === null &&
current[k].zoom === definition.zoom) {
// Filters can be added, but they don't change the
// filters. This means we don't have to split the
// definition.
@ -213,6 +216,7 @@ function inheritRules(definitions, env) {
byAttachment[attachment].push(current[k]);
}
}
// console.log(JSON.stringify(result, null, 4));
if (env.benchmark) console.warn('Inheritance time: ' + ((new Date() - inheritTime)) + 'ms');

View File

@ -65,13 +65,13 @@ tree.Definition.prototype.appliesTo = function(id, classes) {
};
tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
var xml = ' <Rule>\n';
var xml = ' <Rule>\n', key;
xml += tree.Zoom.toXML(zoom).join('');
xml += this.filters.toXML(env);
// Sort symbolizers by the index of their first property definition
var sym_order = [], indexes = [];
for (var key in symbolizers) {
for (key in symbolizers) {
indexes = [];
for (var prop in symbolizers[key]) {
indexes.push(symbolizers[key][prop].index);
@ -87,6 +87,10 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
return v[0];
});
function capitalize(str) {
return str[1].toUpperCase();
}
for (var i = 0; i < sym_order.length; i++) {
var attributes = symbolizers[sym_order[i]];
var symbolizer = sym_order[i].split('/').pop();
@ -106,13 +110,11 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
}
var name = symbolizer.charAt(0).toUpperCase() +
symbolizer.slice(1).replace(/\-./, function(str) {
return str[1].toUpperCase();
}) + 'Symbolizer';
symbolizer.slice(1).replace(/\-./, capitalize) + 'Symbolizer';
var selfclosing = true, tagcontent;
xml += ' <' + name + ' ';
for (var key in attributes) {
for (key in attributes) {
if (symbolizer === 'map') env.error({
message: 'Map properties are not permitted in other rules',
index: attributes[key].index,
@ -140,6 +142,8 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) {
return xml;
};
// Take a zoom range of zooms and 'i', the index of a rule in this.rules,
// and finds all applicable symbolizers
tree.Definition.prototype.collectSymbolizers = function(zooms, i) {
var symbolizers = {}, child;

View File

@ -46,6 +46,8 @@ Object.defineProperty(tree.Filterset.prototype, 'cloneWith', {
var additions;
for (var id in other) {
var status = this.addable(other[id]);
// status is true, false or null. if it's null we don't fail this
// clone nor do we add the filter.
if (status === false) {
return false;
}
@ -58,7 +60,9 @@ Object.defineProperty(tree.Filterset.prototype, 'cloneWith', {
// Adding the other filters doesn't make this filterset invalid, but it
// doesn't add anything to it either.
if (!additions) return null;
if (!additions) {
return null;
}
// We can successfully add all filters. Now clone the filterset and add the
// new rules.
@ -66,7 +70,7 @@ Object.defineProperty(tree.Filterset.prototype, 'cloneWith', {
// We can add the rules that are already present without going through the
// add function as a Filterset is always in it's simplest canonical form.
for (var id in this) {
for (id in this) {
clone[id] = this[id];
}
@ -79,13 +83,14 @@ Object.defineProperty(tree.Filterset.prototype, 'cloneWith', {
}
});
/**
* Returns true when the new filter can be added, false otherwise.
*/
// Returns true when the new filter can be added, false otherwise.
// It can also return null, and on the other side we test for === true or
// false
Object.defineProperty(tree.Filterset.prototype, 'addable', {
enumerable: false,
value: function(filter) {
var key = filter.key, value = filter.val;
var key = filter.key,
value = filter.val;
switch (filter.op) {
case '=':
@ -150,11 +155,11 @@ Object.defineProperty(tree.Filterset.prototype, 'addable', {
Object.defineProperty(tree.Filterset.prototype, 'add', {
enumerable: false,
value: function(filter) {
var key = filter.key;
var key = filter.key, id;
switch (filter.op) {
case '=':
for (var id in this) {
for (id in this) {
if (this[id].key == key) {
delete this[id];
}
@ -174,7 +179,7 @@ Object.defineProperty(tree.Filterset.prototype, 'add', {
// If there are other filters that are also >
// but are less than this one, they don't matter, so
// remove them.
for (var id in this) {
for (id in this) {
if (this[id].key == key && this[id].val <= filter.val) {
delete this[id];
}
@ -183,7 +188,7 @@ Object.defineProperty(tree.Filterset.prototype, 'add', {
break;
case '>=':
for (var id in this) {
for (id in this) {
if (this[id].key == key && this[id].val < filter.val) {
delete this[id];
}
@ -199,7 +204,7 @@ Object.defineProperty(tree.Filterset.prototype, 'add', {
break;
case '<':
for (var id in this) {
for (id in this) {
if (this[id].key == key && this[id].val >= filter.val) {
delete this[id];
}
@ -208,7 +213,7 @@ Object.defineProperty(tree.Filterset.prototype, 'add', {
break;
case '<=':
for (var id in this) {
for (id in this) {
if (this[id].key == key && this[id].val > filter.val) {
delete this[id];
}

View File

@ -17,7 +17,7 @@
},
{
"Datasource": {
"file": "http://tilemill-data.s3.amazonaws.com/natural-earth-10m-1.3.0/urban_areas.zip",
"file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip",
"type": "shape"
},
"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",