Skip to content

Commit

Permalink
Restructure state to shave a few bytes.
Browse files Browse the repository at this point in the history
  • Loading branch information
mbostock committed Aug 13, 2013
1 parent e7a1ff7 commit f1e796a
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 103 deletions.
101 changes: 53 additions & 48 deletions d3.js
Original file line number Diff line number Diff line change
Expand Up @@ -7920,7 +7920,7 @@ d3 = function() {
return subticks;
}
d3.svg.brush = function() {
var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, resizes = d3_svg_brushResizes[0], extent = [ [ 0, 0 ], [ 0, 0 ] ], extent0 = extent, clamp = [ true, true ], extentDomain;
var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtent0 = xExtent, yExtent0 = yExtent, xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
function brush(g) {
g.each(function() {
var g = d3.select(this).style("pointer-events", "all").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
Expand Down Expand Up @@ -7960,10 +7960,13 @@ d3 = function() {
type: "brushstart"
});
}).tween("brush:brush", function() {
var interpolate = d3_interpolateArray(extent0, extent);
extentDomain = null, extent0 = extent = interpolate(0);
var xi = d3_interpolateArray(xExtent0, xExtent), yi = d3_interpolateArray(yExtent0, yExtent);
xExtentDomain = yExtentDomain = null;
xExtent0 = xExtent = xi(0);
yExtent0 = yExtent = yi(0);
return function(t) {
interpolate(t);
xi(t);
yi(t);
event_({
type: "brush",
mode: "resize"
Expand All @@ -7975,8 +7978,9 @@ d3 = function() {
});
});
});
} else if (extent0 !== extent) {
extent0 = extent;
} else if (xExtent0 !== xExtent || yExtent0 !== yExtent) {
xExtent0 = xExtent;
yExtent0 = yExtent;
g.each(function() {
var event_ = event.of(this, arguments);
event_({
Expand All @@ -7994,16 +7998,16 @@ d3 = function() {
}
function redraw(g) {
g.selectAll(".resize").attr("transform", function(d) {
return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")";
return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
});
}
function redrawX(g) {
g.select(".extent").attr("x", extent[0][0]);
g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]);
g.select(".extent").attr("x", xExtent[0]);
g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
}
function redrawY(g) {
g.select(".extent").attr("y", extent[0][1]);
g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]);
g.select(".extent").attr("y", yExtent[0]);
g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
}
function brushstart() {
var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = mouse(), offset;
Expand All @@ -8015,13 +8019,13 @@ d3 = function() {
}
g.interrupt().selectAll("*").interrupt();
if (dragging) {
origin[0] = extent[0][0] - origin[0];
origin[1] = extent[0][1] - origin[1];
origin[0] = xExtent[0] - origin[0];
origin[1] = yExtent[0] - origin[1];
} else if (resizing) {
var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
offset = [ extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1] ];
origin[0] = extent[ex][0];
origin[1] = extent[ey][1];
offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
origin[0] = xExtent[ex];
origin[1] = yExtent[ey];
} else if (d3.event.altKey) center = origin.slice();
g.style("pointer-events", "none").selectAll(".resize").style("display", null);
d3.select("body").style("cursor", eventTarget.style("cursor"));
Expand All @@ -8037,17 +8041,17 @@ d3 = function() {
if (d3.event.keyCode == 32) {
if (!dragging) {
center = null;
origin[0] -= extent[1][0];
origin[1] -= extent[1][1];
origin[0] -= xExtent[1];
origin[1] -= yExtent[1];
dragging = 2;
}
d3_eventPreventDefault();
}
}
function keyup() {
if (d3.event.keyCode == 32 && dragging == 2) {
origin[0] += extent[1][0];
origin[1] += extent[1][1];
origin[0] += xExtent[1];
origin[1] += yExtent[1];
dragging = 0;
d3_eventPreventDefault();
}
Expand All @@ -8060,9 +8064,9 @@ d3 = function() {
}
if (!dragging) {
if (d3.event.altKey) {
if (!center) center = [ (extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2 ];
origin[0] = extent[+(point[0] < center[0])][0];
origin[1] = extent[+(point[1] < center[1])][1];
if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
origin[0] = xExtent[+(point[0] < center[0])];
origin[1] = yExtent[+(point[1] < center[1])];
} else center = null;
}
if (resizingX && move1(point, x, 0)) {
Expand All @@ -8082,12 +8086,12 @@ d3 = function() {
}
}
function move1(point, scale, i) {
var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], size = extent[1][i] - extent[0][i], min, max;
var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
if (dragging) {
r0 -= position;
r1 -= size + position;
}
min = clamp[i] ? Math.max(r0, Math.min(r1, point[i])) : point[i];
min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
if (dragging) {
max = (min += position) + size;
} else {
Expand All @@ -8099,10 +8103,10 @@ d3 = function() {
max = position;
}
}
if (extent[0][i] !== min || extent[1][i] !== max) {
extentDomain = null;
extent[0][i] = min;
extent[1][i] = max;
if (extent[0] ^ min | extent[1] ^ max) {
if (i) yExtentDomain = null; else xExtentDomain = null;
extent[0] = min;
extent[1] = max;
return true;
}
}
Expand Down Expand Up @@ -8130,59 +8134,60 @@ d3 = function() {
return brush;
};
brush.clamp = function(z) {
if (!arguments.length) return x && y ? clamp : x || y ? clamp[+!x] : null;
if (x && y) clamp = [ !!z[0], !!z[1] ]; else if (x || y) clamp[+!x] = !!z;
if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
return brush;
};
brush.extent = function(z) {
var x0, x1, y0, y1, t, dirty;
var x0, x1, y0, y1, t;
if (!arguments.length) {
z = extentDomain || extent;
if (x) {
x0 = z[0][0], x1 = z[1][0];
if (!extentDomain) {
x0 = extent[0][0], x1 = extent[1][0];
if (xExtentDomain) {
x0 = xExtentDomain[0], x1 = xExtentDomain[1];
} else {
x0 = xExtent[0], x1 = xExtent[1];
if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
if (x1 < x0) t = x0, x0 = x1, x1 = t;
}
}
if (y) {
y0 = z[0][1], y1 = z[1][1];
if (!extentDomain) {
y0 = extent[0][1], y1 = extent[1][1];
if (yExtentDomain) {
y0 = yExtentDomain[0], y1 = yExtentDomain[1];
} else {
y0 = yExtent[0], y1 = yExtent[1];
if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
if (y1 < y0) t = y0, y0 = y1, y1 = t;
}
}
return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
}
extentDomain = [ [ 0, 0 ], [ 0, 0 ] ];
if (x) {
x0 = z[0], x1 = z[1];
if (y) x0 = x0[0], x1 = x1[0];
extentDomain[0][0] = x0, extentDomain[1][0] = x1;
xExtentDomain = [ x0, x1 ];
if (x.invert) x0 = x(x0), x1 = x(x1);
if (x1 < x0) t = x0, x0 = x1, x1 = t;
dirty |= x0 ^ extent[0][0] | x1 ^ extent[1][0];
if (x0 ^ xExtent[0] | x1 ^ xExtent[1]) xExtent = [ x0 | 0, x1 | 0 ];
}
if (y) {
y0 = z[0], y1 = z[1];
if (x) y0 = y0[1], y1 = y1[1];
extentDomain[0][1] = y0, extentDomain[1][1] = y1;
yExtentDomain = [ y0, y1 ];
if (y.invert) y0 = y(y0), y1 = y(y1);
if (y1 < y0) t = y0, y0 = y1, y1 = t;
dirty |= y0 ^ extent[0][1] | y1 ^ extent[1][1];
if (y0 ^ yExtent[0] | y1 ^ yExtent[1]) yExtent = [ y0 | 0, y1 | 0 ];
}
if (dirty) extent = [ [ x0 | 0, y0 | 0 ], [ x1 | 0, y1 | 0 ] ];
return brush;
};
brush.clear = function() {
extentDomain = null;
if (!brush.empty()) extent = [ [ 0, 0 ], [ 0, 0 ] ];
if (!brush.empty()) {
xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
xExtentDomain = yExtentDomain = null;
}
return brush;
};
brush.empty = function() {
return x && extent[0][0] === extent[1][0] || y && extent[0][1] === extent[1][1];
return !!x && xExtent[0] === xExtent[1] || !!y && yExtent[0] === yExtent[1];
};
return d3.rebind(brush, event, "on");
};
Expand Down
2 changes: 1 addition & 1 deletion d3.min.js

Large diffs are not rendered by default.

Loading

0 comments on commit f1e796a

Please sign in to comment.