Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions halogen-core/src/commonMain/kotlin/halogen/ContrastValidator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,14 @@ internal object ContrastValidator {
/**
* Compute the relative luminance of an ARGB color.
*
* Uses the sRGB linearization formula per WCAG 2.1:
* - Normalize each channel to 0.0-1.0.
* - Linearize: if value <= 0.04045, divide by 12.92;
* otherwise, ((value + 0.055) / 1.055) ^ 2.4.
* - L = 0.2126 * R + 0.7152 * G + 0.0722 * B.
* Uses a pre-computed lookup table for the sRGB linearization formula
* to significantly improve performance in this hot path by avoiding
* repetitive division and Math.pow() calculations.
*/
fun relativeLuminance(argb: Int): Double {
val r = linearize(((argb shr 16) and 0xFF) / 255.0)
val g = linearize(((argb shr 8) and 0xFF) / 255.0)
val b = linearize((argb and 0xFF) / 255.0)
val r = LINEARIZE_LUT[(argb shr 16) and 0xFF]
val g = LINEARIZE_LUT[(argb shr 8) and 0xFF]
val b = LINEARIZE_LUT[argb and 0xFF]
return 0.2126 * r + 0.7152 * g + 0.0722 * b
}

Expand All @@ -120,8 +118,9 @@ internal object ContrastValidator {
return contrastRatio(foreground, background) >= AA_RATIO
}

private fun linearize(component: Double): Double {
return if (component <= 0.04045) {
private val LINEARIZE_LUT: DoubleArray = DoubleArray(256) { i ->
val component = i / 255.0
if (component <= 0.04045) {
component / 12.92
} else {
((component + 0.055) / 1.055).pow(2.4)
Expand Down
Loading