diff options
Diffstat (limited to 'node_modules/stylus/lib/functions/transparentify.js')
| -rw-r--r-- | node_modules/stylus/lib/functions/transparentify.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/node_modules/stylus/lib/functions/transparentify.js b/node_modules/stylus/lib/functions/transparentify.js new file mode 100644 index 00000000..b7758e81 --- /dev/null +++ b/node_modules/stylus/lib/functions/transparentify.js @@ -0,0 +1,63 @@ +var utils = require('../utils') + , nodes = require('../nodes'); + +/** + * Returns the transparent version of the given `top` color, + * as if it was blend over the given `bottom` color. + * + * Examples: + * + * transparentify(#808080) + * => rgba(0,0,0,0.5) + * + * transparentify(#414141, #000) + * => rgba(255,255,255,0.25) + * + * transparentify(#91974C, #F34949, 0.5) + * => rgba(47,229,79,0.5) + * + * @param {RGBA|HSLA} top + * @param {RGBA|HSLA} [bottom=#fff] + * @param {Unit} [alpha] + * @return {RGBA} + * @api public + */ + +module.exports = function transparentify(top, bottom, alpha){ + utils.assertColor(top); + top = top.rgba; + // Handle default arguments + bottom = bottom || new nodes.RGBA(255, 255, 255, 1); + if (!alpha && bottom && !bottom.rgba) { + alpha = bottom; + bottom = new nodes.RGBA(255, 255, 255, 1); + } + utils.assertColor(bottom); + bottom = bottom.rgba; + var bestAlpha = ['r', 'g', 'b'].map(function(channel){ + return (top[channel] - bottom[channel]) / ((0 < (top[channel] - bottom[channel]) ? 255 : 0) - bottom[channel]); + }).sort(function(a, b){return a < b;})[0]; + if (alpha) { + utils.assertType(alpha, 'unit', 'alpha'); + if ('%' == alpha.type) { + bestAlpha = alpha.val / 100; + } else if (!alpha.type) { + bestAlpha = alpha = alpha.val; + } + } + bestAlpha = Math.max(Math.min(bestAlpha, 1), 0); + // Calculate the resulting color + function processChannel(channel) { + if (0 == bestAlpha) { + return bottom[channel] + } else { + return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha + } + } + return new nodes.RGBA( + processChannel('r'), + processChannel('g'), + processChannel('b'), + Math.round(bestAlpha * 100) / 100 + ); +} |
