Skip to content

Commit

Permalink
Merge branches 'fix-polygon', 'fix-interpolate-transform', 'fix-multi…
Browse files Browse the repository at this point in the history
…year-time-scale' and 'dispatch-chain' into release
  • Loading branch information
mbostock committed Feb 2, 2012
4 parents 85ad3c1 + ca113b6 + 0e5bca1 + fef4f91 commit feb1da1
Show file tree
Hide file tree
Showing 11 changed files with 282 additions and 48 deletions.
63 changes: 55 additions & 8 deletions d3.js
Expand Up @@ -489,7 +489,7 @@ d3.dispatch = function() {
var dispatch = new d3_dispatch(),
i = -1,
n = arguments.length;
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event();
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
return dispatch;
};

Expand All @@ -507,22 +507,23 @@ d3_dispatch.prototype.on = function(type, listener) {

return arguments.length < 2
? this[type].on(name)
: (this[type].on(name, listener), this);
: this[type].on(name, listener);
};

function d3_dispatch_event() {
function d3_dispatch_event(dispatch) {
var listeners = [],
listenerByName = {};

function dispatch() {
function event() {
var z = listeners, // defensive reference
i = -1,
n = z.length,
l;
while (++i < n) if (l = z[i].on) l.apply(this, arguments);
return dispatch;
}

dispatch.on = function(name, listener) {
event.on = function(name, listener) {
var l, i;

// return the current listener, if any
Expand All @@ -543,7 +544,7 @@ function d3_dispatch_event() {
return dispatch;
};

return dispatch;
return event;
};
// TODO align
d3.format = function(specifier) {
Expand Down Expand Up @@ -894,7 +895,54 @@ d3.interpolateString = function(a, b) {
};

d3.interpolateTransform = function(a, b) {
return d3.interpolateString(d3.transform(a) + "", d3.transform(b) + "");
var s = [], // string constants and placeholders
q = [], // number interpolators
n,
A = d3.transform(a),
B = d3.transform(b),
ta = A.translate,
tb = B.translate,
ra = A.rotate,
rb = B.rotate,
wa = A.skew,
wb = B.skew,
ka = A.scale,
kb = B.scale;

if (ta[0] != tb[0] || ta[1] != tb[1]) {
s.push("translate(", null, ",", null, ")");
q.push({i: 1, x: d3.interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3.interpolateNumber(ta[1], tb[1])});
} else if (tb[0] || tb[1]) {
s.push("translate(" + tb + ")");
} else {
s.push("");
}

if (ra != rb) {
q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3.interpolateNumber(ra, rb)});
} else if (rb) {
s.push(s.pop() + "rotate(" + rb + ")");
}

if (wa != wb) {
q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3.interpolateNumber(wa, wb)});
} else if (wb) {
s.push(s.pop() + "skewX(" + wb + ")");
}

if (ka[0] != kb[0] || ka[1] != kb[1]) {
n = s.push(s.pop() + "scale(", null, ",", null, ")");
q.push({i: n - 4, x: d3.interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3.interpolateNumber(ka[1], kb[1])});
} else if (kb[0] != 1 || kb[1] != 1) {
s.push(s.pop() + "scale(" + kb + ")");
}

n = q.length;
return function(t) {
var i = -1, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};

d3.interpolateRgb = function(a, b) {
Expand Down Expand Up @@ -2458,7 +2506,6 @@ function d3_scale_linearNice(dx) {
};
}

// TODO Dates? Ugh.
function d3_scale_linearTickRange(domain, m) {
var extent = d3_scaleExtent(domain),
span = extent[1] - extent[0],
Expand Down
4 changes: 2 additions & 2 deletions d3.min.js

Large diffs are not rendered by default.

49 changes: 44 additions & 5 deletions d3.time.js
Expand Up @@ -552,13 +552,15 @@ function d3_time_scale(linear, methods, format) {
if (typeof m !== "function") {
var span = extent[1] - extent[0],
target = span / m,
i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1);
i = d3.bisect(d3_time_scaleSteps, target);
if (i == d3_time_scaleSteps.length) return methods.year(extent, m);
if (!i) return linear.ticks(m).map(d3_time_scaleDate);
if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
m = methods[i];
k = m[1];
m = m[0];
}
return m(extent[0], extent[1], k);
return m(extent[0], new Date(+extent[1] + 1), k); // inclusive upper bound
};

scale.tickFormat = function() {
Expand Down Expand Up @@ -591,6 +593,19 @@ function d3_time_scaleFormat(formats) {
};
}

function d3_time_scaleSetYear(y) {
var d = new Date(y, 0, 1);
d.setFullYear(y); // Y2K fail
return d;
}

function d3_time_scaleGetYear(d) {
var y = d.getFullYear(),
d0 = d3_time_scaleSetYear(y),
d1 = d3_time_scaleSetYear(y + 1);
return y + (d - d0) / (d1 - d0);
}

var d3_time_scaleSteps = [
1e3, // 1-second
5e3, // 5-second
Expand Down Expand Up @@ -640,10 +655,16 @@ var d3_time_scaleLocalFormats = [
[d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }],
[d3.time.format("%I %p"), function(d) { return d.getHours(); }],
[d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }],
[d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }]
[d3.time.format(":%S"), function(d) { return d.getSeconds(); }],
[d3.time.format(".%L"), function(d) { return d.getMilliseconds(); }]
];

var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
var d3_time_scaleLinear = d3.scale.linear(),
d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);

d3_time_scaleLocalMethods.year = function(extent, m) {
return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear);
};

d3.time.scale = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
Expand Down Expand Up @@ -676,11 +697,29 @@ var d3_time_scaleUTCFormats = [
[d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }],
[d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }],
[d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }],
[d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }]
[d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds(); }],
[d3.time.format.utc(".%L"), function(d) { return d.getUTCMilliseconds(); }]
];

var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);

function d3_time_scaleUTCSetYear(y) {
var d = new Date(Date.UTC(y, 0, 1));
d.setUTCFullYear(y); // Y2K fail
return d;
}

function d3_time_scaleUTCGetYear(d) {
var y = d.getUTCFullYear(),
d0 = d3_time_scaleUTCSetYear(y),
d1 = d3_time_scaleUTCSetYear(y + 1);
return y + (d - d0) / (d1 - d0);
}

d3_time_scaleUTCMethods.year = function(extent, m) {
return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear);
};

d3.time.scale.utc = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
};
Expand Down
2 changes: 1 addition & 1 deletion d3.time.min.js

Large diffs are not rendered by default.

13 changes: 7 additions & 6 deletions src/core/dispatch.js
Expand Up @@ -2,7 +2,7 @@ d3.dispatch = function() {
var dispatch = new d3_dispatch(),
i = -1,
n = arguments.length;
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event();
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
return dispatch;
};

Expand All @@ -20,22 +20,23 @@ d3_dispatch.prototype.on = function(type, listener) {

return arguments.length < 2
? this[type].on(name)
: (this[type].on(name, listener), this);
: this[type].on(name, listener);
};

function d3_dispatch_event() {
function d3_dispatch_event(dispatch) {
var listeners = [],
listenerByName = {};

function dispatch() {
function event() {
var z = listeners, // defensive reference
i = -1,
n = z.length,
l;
while (++i < n) if (l = z[i].on) l.apply(this, arguments);
return dispatch;
}

dispatch.on = function(name, listener) {
event.on = function(name, listener) {
var l, i;

// return the current listener, if any
Expand All @@ -56,5 +57,5 @@ function d3_dispatch_event() {
return dispatch;
};

return dispatch;
return event;
};
49 changes: 48 additions & 1 deletion src/core/interpolate.js
Expand Up @@ -93,7 +93,54 @@ d3.interpolateString = function(a, b) {
};

d3.interpolateTransform = function(a, b) {
return d3.interpolateString(d3.transform(a) + "", d3.transform(b) + "");
var s = [], // string constants and placeholders
q = [], // number interpolators
n,
A = d3.transform(a),
B = d3.transform(b),
ta = A.translate,
tb = B.translate,
ra = A.rotate,
rb = B.rotate,
wa = A.skew,
wb = B.skew,
ka = A.scale,
kb = B.scale;

if (ta[0] != tb[0] || ta[1] != tb[1]) {
s.push("translate(", null, ",", null, ")");
q.push({i: 1, x: d3.interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3.interpolateNumber(ta[1], tb[1])});
} else if (tb[0] || tb[1]) {
s.push("translate(" + tb + ")");
} else {
s.push("");
}

if (ra != rb) {
q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3.interpolateNumber(ra, rb)});
} else if (rb) {
s.push(s.pop() + "rotate(" + rb + ")");
}

if (wa != wb) {
q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3.interpolateNumber(wa, wb)});
} else if (wb) {
s.push(s.pop() + "skewX(" + wb + ")");
}

if (ka[0] != kb[0] || ka[1] != kb[1]) {
n = s.push(s.pop() + "scale(", null, ",", null, ")");
q.push({i: n - 4, x: d3.interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3.interpolateNumber(ka[1], kb[1])});
} else if (kb[0] != 1 || kb[1] != 1) {
s.push(s.pop() + "scale(" + kb + ")");
}

n = q.length;
return function(t) {
var i = -1, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};

d3.interpolateRgb = function(a, b) {
Expand Down
1 change: 0 additions & 1 deletion src/scale/linear.js
Expand Up @@ -83,7 +83,6 @@ function d3_scale_linearNice(dx) {
};
}

// TODO Dates? Ugh.
function d3_scale_linearTickRange(domain, m) {
var extent = d3_scaleExtent(domain),
span = extent[1] - extent[0],
Expand Down
20 changes: 19 additions & 1 deletion src/time/scale-utc.js
Expand Up @@ -26,11 +26,29 @@ var d3_time_scaleUTCFormats = [
[d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }],
[d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }],
[d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }],
[d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }]
[d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds(); }],
[d3.time.format.utc(".%L"), function(d) { return d.getUTCMilliseconds(); }]
];

var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);

function d3_time_scaleUTCSetYear(y) {
var d = new Date(Date.UTC(y, 0, 1));
d.setUTCFullYear(y); // Y2K fail
return d;
}

function d3_time_scaleUTCGetYear(d) {
var y = d.getUTCFullYear(),
d0 = d3_time_scaleUTCSetYear(y),
d1 = d3_time_scaleUTCSetYear(y + 1);
return y + (d - d0) / (d1 - d0);
}

d3_time_scaleUTCMethods.year = function(extent, m) {
return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear);
};

d3.time.scale.utc = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
};
29 changes: 25 additions & 4 deletions src/time/scale.js
Expand Up @@ -20,13 +20,15 @@ function d3_time_scale(linear, methods, format) {
if (typeof m !== "function") {
var span = extent[1] - extent[0],
target = span / m,
i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1);
i = d3.bisect(d3_time_scaleSteps, target);
if (i == d3_time_scaleSteps.length) return methods.year(extent, m);
if (!i) return linear.ticks(m).map(d3_time_scaleDate);
if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
m = methods[i];
k = m[1];
m = m[0];
}
return m(extent[0], extent[1], k);
return m(extent[0], new Date(+extent[1] + 1), k); // inclusive upper bound
};

scale.tickFormat = function() {
Expand Down Expand Up @@ -59,6 +61,19 @@ function d3_time_scaleFormat(formats) {
};
}

function d3_time_scaleSetYear(y) {
var d = new Date(y, 0, 1);
d.setFullYear(y); // Y2K fail
return d;
}

function d3_time_scaleGetYear(d) {
var y = d.getFullYear(),
d0 = d3_time_scaleSetYear(y),
d1 = d3_time_scaleSetYear(y + 1);
return y + (d - d0) / (d1 - d0);
}

var d3_time_scaleSteps = [
1e3, // 1-second
5e3, // 5-second
Expand Down Expand Up @@ -108,10 +123,16 @@ var d3_time_scaleLocalFormats = [
[d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }],
[d3.time.format("%I %p"), function(d) { return d.getHours(); }],
[d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }],
[d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }]
[d3.time.format(":%S"), function(d) { return d.getSeconds(); }],
[d3.time.format(".%L"), function(d) { return d.getMilliseconds(); }]
];

var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
var d3_time_scaleLinear = d3.scale.linear(),
d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);

d3_time_scaleLocalMethods.year = function(extent, m) {
return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear);
};

d3.time.scale = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
Expand Down

0 comments on commit feb1da1

Please sign in to comment.