55 lines
1.8 KiB
JavaScript
55 lines
1.8 KiB
JavaScript
function Color (hex = '#000000', rgb) {
|
|
if (rgb) {
|
|
this.rgb = rgb
|
|
this.hex = '#' + ('0' + parseInt(rgb.r, 10).toString(16)).slice(-2) + ('0' + parseInt(rgb.g, 10).toString(16)).slice(-2) + ('0' + parseInt(rgb.b, 10).toString(16)).slice(-2)
|
|
} else {
|
|
this.hex = hex
|
|
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(this.hex)
|
|
this.rgb = { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) }
|
|
}
|
|
|
|
this.r = this.rgb.r
|
|
this.g = this.rgb.g
|
|
this.b = this.rgb.b
|
|
|
|
this.average = parseInt((this.r + this.g + this.b) / 3)
|
|
this.invert = { r: 255 - this.rgb.r, g: 255 - this.rgb.g, b: 255 - this.rgb.b }
|
|
|
|
this.rgba = function () {
|
|
return 'rgba(' + this.rgb().r + ',' + this.rgb().g + ',' + this.rgb().b + ',1)'
|
|
}
|
|
|
|
this.floats = function () {
|
|
var rgb = this.rgb
|
|
return { r: rgb.r / 255, g: rgb.g / 255, b: rgb.b / 255 }
|
|
}
|
|
|
|
this.render = function () {
|
|
return this.hex
|
|
}
|
|
|
|
this.rgb_to_hex = function (rgb) {
|
|
return '#' + ('0' + parseInt(rgb[0], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2)
|
|
}
|
|
|
|
this.brightness = function () {
|
|
return this.rgb() ? (this.rgb().r + this.rgb().g + this.rgb().b) / 3 : 0
|
|
}
|
|
|
|
this.style = function () {
|
|
return this.brightness() > 150 ? 'bright' : 'dark'
|
|
}
|
|
|
|
this.tween = function (target, value) {
|
|
var c1 = this.floats()
|
|
var c2 = target.floats()
|
|
|
|
var r = ((255 * c1.r) * value) + ((255 * c2.r) * (1 - value))
|
|
var g = ((255 * c1.g) * value) + ((255 * c2.g) * (1 - value))
|
|
var b = ((255 * c1.b) * value) + ((255 * c2.b) * (1 - value))
|
|
var rgb = [parseInt(r), parseInt(g), parseInt(b)]
|
|
var hex = new Color().rgb_to_hex(rgb)
|
|
return hex
|
|
}
|
|
}
|