d3.svg.shadow = function (){ return d3_svg_shadow('black',9,2); } function d3_svg_shadow(color, deviation, multiplication) { var id = 0 function shadow(svg) { var filterId = 'shadow-' + id++ var rgb = d3.rgb(color) var filter = svg .append('defs') .append('filter') .attr('id', filterId) .attr('x', '-50%') .attr('y', '-50%') .attr('width', '200%') .attr('height', '200%') filter.append('feGaussianBlur') .attr('in', "SourceAlpha") .attr('stdDeviation', deviation) for (var i=0; i < multiplication; i++){ filter.append('feBlend').attr('mode', 'multiply') } var feComponentTransfer = filter.append('feComponentTransfer') feComponentTransfer.append('feFuncR') .attr('type', 'linear') .attr('slope', 0) .attr('intercept', rgb.r / 255) feComponentTransfer.append('feFuncG') .attr('type', 'linear') .attr('slope', 0) .attr('intercept', rgb.g / 255) feComponentTransfer.append('feFuncB') .attr('type', 'linear') .attr('slope', 0) .attr('intercept', rgb.b / 255) var feMerge = filter.append('feMerge') feMerge.append('feMergeNode') feMerge.append('feMergeNode').attr('in','SourceGraphic') return filterId } shadow.color = function (c){ if (!arguments.length) return color color = c return shadow } shadow.deviation = function (d){ if (!arguments.length) return deviation deviation = d return shadow } shadow.multiplication = function (m){ if (!arguments.length) return multiplication multiplication = m return shadow } return shadow }