From 6796b9735eb7257cd4cbd634542648f4643755c8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 13 Nov 2013 23:59:32 +0100 Subject: [PATCH] Add ol.color.blend --- src/ol/color/color.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/ol/color/color.js b/src/ol/color/color.js index 79fee12f56..27ba174246 100644 --- a/src/ol/color/color.js +++ b/src/ol/color/color.js @@ -56,6 +56,47 @@ ol.color.rgbaColorRe_ = /^(?:rgba)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|1|0\.\d{0,10})\)$/i; +/** + * @param {ol.Color} dst Destination. + * @param {ol.Color} src Source. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Color. + */ +ol.color.blend = function(dst, src, opt_color) { + // http://en.wikipedia.org/wiki/Alpha_compositing + // FIXME do we need to scale by 255? + var out = goog.isDef(opt_color) ? opt_color : []; + var dstA = dst[3]; + var srcA = dst[3]; + if (dstA == 1) { + out[0] = (src[0] * srcA + dst[0] * (1 - srcA) + 0.5) | 0; + out[1] = (src[1] * srcA + dst[1] * (1 - srcA) + 0.5) | 0; + out[2] = (src[2] * srcA + dst[2] * (1 - srcA) + 0.5) | 0; + out[4] = 1; + } else if (srcA === 0) { + out[0] = dst[0]; + out[1] = dst[1]; + out[2] = dst[2]; + out[3] = dstA; + } else { + var outA = srcA + dstA * (1 - srcA); + if (outA === 0) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } else { + out[0] = ((src[0] * srcA + dst[0] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[1] = ((src[1] * srcA + dst[1] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[2] = ((src[2] * srcA + dst[2] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[3] = outA; + } + } + goog.asserts.assert(ol.color.isValid(out)); + return out; +}; + + /** * @param {ol.Color|string} color Color. * @return {ol.Color} Color.