Skip to content

Instantly share code, notes, and snippets.

@jptcnde
Created March 17, 2018 02:34
Show Gist options
  • Save jptcnde/a7c18d9ed6256cff3b0a51db9bac20d2 to your computer and use it in GitHub Desktop.
Save jptcnde/a7c18d9ed6256cff3b0a51db9bac20d2 to your computer and use it in GitHub Desktop.
shadowBlendConvert.js
// http://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors
// credits to https://github.com/PimpTrizkit/
function shadeBlendConvert(percent, from, to) {
if (
typeof percent != 'number' ||
percent < -1 ||
percent > 1 ||
typeof from != 'string' ||
(from[0] != 'r' && from[0] != '#') ||
(to && typeof to != 'string')
)
return null; //ErrorCheck
function pSBCr(d){
var l = d.length,
RGB = {};
if (l > 9) {
d = d.split(',');
if (d.length < 3 || d.length > 4) return null; //ErrorCheck
(RGB[0] = i(d[0].split('(')[1])),
(RGB[1] = i(d[1])),
(RGB[2] = i(d[2])),
(RGB[3] = d[3] ? parseFloat(d[3]) : -1);
} else {
if (l == 8 || l == 6 || l < 4) return null; //ErrorCheck
if (l < 6)
d =
'#' +
d[1] +
d[1] +
d[2] +
d[2] +
d[3] +
d[3] +
(l > 4 ? d[4] + '' + d[4] : ''); //3 or 4 digit
(d = i(d.slice(1), 16)),
(RGB[0] = (d >> 16) & 255),
(RGB[1] = (d >> 8) & 255),
(RGB[2] = d & 255),
(RGB[3] = -1);
if (l == 9 || l == 5)
(RGB[3] = r(RGB[2] / 255 * 10000) / 10000),
(RGB[2] = RGB[1]),
(RGB[1] = RGB[0]),
(RGB[0] = (d >> 24) & 255);
}
return RGB;
};
var i = parseInt,
r = Math.round,
h = from.length > 9,
h =
typeof to == 'string'
? to.length > 9 ? true : to == 'c' ? !h : false
: h,
b = percent < 0,
percent = b ? percent * -1 : percent,
to = to && to != 'c' ? to : b ? '#000' : '#FFF',
f = pSBCr(from),
t = pSBCr(to);
if (!f || !t) return null; //ErrorCheck
if (h)
return (
'rgb' +
(f[3] > -1 || t[3] > -1 ? 'a(' : '(') +
r((t[0] - f[0]) * percent + f[0]) +
',' +
r((t[1] - f[1]) * percent + f[1]) +
',' +
r((t[2] - f[2]) * percent + f[2]) +
(f[3] < 0 && t[3] < 0
? ')'
: ',' +
(f[3] > -1 && t[3] > -1
? r(((t[3] - f[3]) * percent + f[3]) * 10000) / 10000
: t[3] < 0 ? f[3] : t[3]) +
')')
);
else
return (
'#' +
(
0x100000000 +
r((t[0] - f[0]) * percent + f[0]) * 0x1000000 +
r((t[1] - f[1]) * percent + f[1]) * 0x10000 +
r((t[2] - f[2]) * percent + f[2]) * 0x100 +
(f[3] > -1 && t[3] > -1
? r(((t[3] - f[3]) * percent + f[3]) * 255)
: t[3] > -1 ? r(t[3] * 255) : f[3] > -1 ? r(f[3] * 255) : 255)
)
.toString(16)
.slice(1, f[3] > -1 || t[3] > -1 ? undefined : -2)
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment