Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

107 lines
2.6 KiB

package org.openrs2.archive.map
import kotlin.math.max
import kotlin.math.min
import kotlin.math.pow
public object Colors {
private val HSL_TO_RGB = IntArray(65536)
private const val BRIGHTNESS = 0.8
init {
var i = 0
for (h in 0 until 64) {
for (s in 0 until 8) {
for (l in 0 until 128) {
val hue = h.toDouble() / 64 + 0.0078125
val saturation = s.toDouble() / 8 + 0.0625
val lightness = l.toDouble() / 128
HSL_TO_RGB[i++] = hslToRgb(hue, saturation, lightness)
}
}
}
}
private fun hslToRgb(h: Double, s: Double, l: Double): Int {
var r = l
var g = l
var b = l
if (s != 0.0) {
val q = if (l * 2 < 1) {
l * (s + 1)
} else {
l + s - (l * s)
}
val p = l * 2 - q
var tr = h + (1.0 / 3)
if (tr > 1) {
tr--
}
var tb = h - (1.0 / 3)
if (tb < 0) {
tb++
}
r = if (tr * 6 < 1) {
tr * (q - p) * 6 + p
} else if (tr * 2 < 1) {
q
} else if (tr * 3 < 2) {
(2.0 / 3 - tr) * (q - p) * 6 + p
} else {
p
}
g = if (h * 6 < 1) {
h * (q - p) * 6 + p
} else if (h * 2 < 1) {
q
} else if (h * 3 < 2) {
(2.0 / 3 - h) * (q - p) * 6 + p
} else {
p
}
b = if (tb * 6 < 1) {
tb * (q - p) * 6 + p
} else if (tb * 2 < 1) {
q
} else if (tb * 3 < 2) {
(2.0 / 3 - tb) * (q - p) * 6 + p
} else {
p
}
}
val red = (r.pow(BRIGHTNESS) * 256).toInt()
val green = (g.pow(BRIGHTNESS) * 256).toInt()
val blue = (b.pow(BRIGHTNESS) * 256).toInt()
var rgb = (red shl 16) or (green shl 8) or blue
if (rgb == 0) {
rgb = 1
}
return rgb
}
public fun hslToRgb(hsl: Int): Int {
return HSL_TO_RGB[hsl]
}
public fun multiplyLightness(hsl: Int, factor: Int): Int {
return when (hsl) {
-2 -> 12345678
-1 -> 127 - min(max(factor, 0), 127)
else -> {
var l = ((hsl and 0x7F) * factor) shr 7
l = min(max(l, 2), 126)
(hsl and 0xFF80) or l
}
}
}
}