33
44package top.yukonga.miuix.kmp.utils
55
6+ import androidx.annotation.IntRange
7+ import androidx.annotation.Size
8+
69object ColorUtils {
710 /* *
811 * Converts RGB color values to HSV color space.
@@ -16,17 +19,11 @@ object ColorUtils {
1619 * - value: 0.0-1.0
1720 */
1821 fun rgbToHsv (
19- r : Int ,
20- g : Int ,
21- b : Int ,
22- hsv : FloatArray ,
22+ @IntRange(from = 0 , to = 255 ) r : Int ,
23+ @IntRange(from = 0 , to = 255 ) g : Int ,
24+ @IntRange(from = 0 , to = 255 ) b : Int ,
25+ @Size( 3 ) hsv : FloatArray ,
2326 ) {
24- require(hsv.size >= 3 ) { " HSV array must have at least 3 elements" }
25- require(r in 0 .. 255 ) { " Red component must be in range 0-255, got $r " }
26- require(g in 0 .. 255 ) { " Green component must be in range 0-255, got $g " }
27- require(b in 0 .. 255 ) { " Blue component must be in range 0-255, got $b " }
28-
29- // Normalize RGB values to 0.0-1.0 range
3027 val rf = r * INV_255
3128 val gf = g * INV_255
3229 val bf = b * INV_255
@@ -35,24 +32,17 @@ object ColorUtils {
3532 val min = minOf(rf, gf, bf)
3633 val delta = max - min
3734
38- // Value (brightness)
39- hsv[2 ] = max
40-
41- // Saturation
42- hsv[1 ] = if (max > 0f ) delta / max else 0f
43-
44- // Hue
45- hsv[0 ] = when {
35+ val hue = when {
4636 delta == 0f -> 0f
47- max == rf -> {
48- val hue = (gf - bf) / delta * 60f
49- if (hue < 0f ) hue + 360f else hue
50- }
51-
52- max == gf -> (bf - rf) / delta * 60f + 120f
53- else -> (rf - gf) / delta * 60f + 240f
37+ max == rf -> (60f * ((gf - bf) / delta) + 360f ) % 360f
38+ max == gf -> (60f * ((bf - rf) / delta) + 120f ) % 360f
39+ else -> (60f * ((rf - gf) / delta) + 240f ) % 360f
5440 }
41+
42+ hsv[0 ] = hue
43+ hsv[1 ] = if (max > 0f ) delta / max else 0f
44+ hsv[2 ] = max
5545 }
5646
5747 private const val INV_255 = 1f / 255f
58- }
48+ }
0 commit comments