Skip to content

Commit 35417b9

Browse files
committed
library: refactor Color Space
1 parent 1ead069 commit 35417b9

File tree

16 files changed

+168
-156
lines changed

16 files changed

+168
-156
lines changed

example/src/commonMain/kotlin/FourthPage.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ import androidx.compose.foundation.layout.padding
1010
import androidx.compose.foundation.lazy.LazyColumn
1111
import androidx.compose.runtime.Composable
1212
import androidx.compose.runtime.MutableState
13-
import androidx.compose.runtime.getValue
1413
import androidx.compose.runtime.mutableStateOf
1514
import androidx.compose.runtime.remember
16-
import androidx.compose.runtime.rememberUpdatedState
1715
import androidx.compose.ui.Modifier
1816
import androidx.compose.ui.input.nestedscroll.nestedScroll
1917
import androidx.compose.ui.platform.LocalUriHandler

example/src/commonMain/kotlin/SecondPage.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import androidx.compose.runtime.getValue
1212
import androidx.compose.runtime.key
1313
import androidx.compose.runtime.mutableStateOf
1414
import androidx.compose.runtime.remember
15-
import androidx.compose.runtime.rememberUpdatedState
1615
import androidx.compose.runtime.saveable.rememberSaveable
1716
import androidx.compose.runtime.setValue
1817
import androidx.compose.ui.Modifier

example/src/commonMain/kotlin/ThirdPage.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import androidx.compose.foundation.layout.padding
1414
import androidx.compose.foundation.lazy.LazyColumn
1515
import androidx.compose.foundation.shape.RoundedCornerShape
1616
import androidx.compose.runtime.Composable
17-
import androidx.compose.runtime.getValue
18-
import androidx.compose.runtime.rememberUpdatedState
1917
import androidx.compose.ui.Alignment
2018
import androidx.compose.ui.Modifier
2119
import androidx.compose.ui.graphics.Color

example/src/commonMain/kotlin/UITest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import androidx.compose.runtime.mutableFloatStateOf
4545
import androidx.compose.runtime.mutableStateOf
4646
import androidx.compose.runtime.remember
4747
import androidx.compose.runtime.rememberCoroutineScope
48-
import androidx.compose.runtime.rememberUpdatedState
4948
import androidx.compose.runtime.setValue
5049
import androidx.compose.ui.Alignment
5150
import androidx.compose.ui.Alignment.Companion.CenterHorizontally

example/src/commonMain/kotlin/component/OtherComponent.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ import top.yukonga.miuix.kmp.icon.MiuixIcons
6363
import top.yukonga.miuix.kmp.icon.icons.useful.Like
6464
import top.yukonga.miuix.kmp.theme.MiuixTheme
6565
import top.yukonga.miuix.kmp.utils.PressFeedbackType
66-
import top.yukonga.miuix.kmp.utils.toHsv
6766
import kotlin.math.round
6867

6968
fun LazyListScope.otherComponent(
@@ -573,7 +572,7 @@ fun LazyListScope.otherComponent(
573572
}
574573
}
575574

576-
item(key = "colorPicker-hsv") {
575+
item(key = "colorPicker-HSV") {
577576
SmallTitle(text = "ColorPicker (HSV)")
578577
val miuixColor = MiuixTheme.colorScheme.primary
579578
var selectedColor by remember { mutableStateOf(miuixColor) }
@@ -606,7 +605,7 @@ fun LazyListScope.otherComponent(
606605
}
607606
}
608607

609-
item(key = "colorPicker-okHsv") {
608+
item(key = "colorPicker-OKHSV") {
610609
SmallTitle(text = "ColorPicker (OKHSV)")
611610
val miuixColor = MiuixTheme.colorScheme.primary
612611
var selectedColor by remember { mutableStateOf(miuixColor) }
@@ -641,8 +640,8 @@ fun LazyListScope.otherComponent(
641640
}
642641
}
643642

644-
item(key = "colorPicker-okLab") {
645-
SmallTitle(text = "ColorPicker (okLab)")
643+
item(key = "colorPicker-OKLAB") {
644+
SmallTitle(text = "ColorPicker (OKLAB)")
646645
val miuixColor = MiuixTheme.colorScheme.primary
647646
var selectedColor by remember { mutableStateOf(miuixColor) }
648647

@@ -675,8 +674,8 @@ fun LazyListScope.otherComponent(
675674
}
676675
}
677676

678-
item(key = "colorPicker-okLch") {
679-
SmallTitle(text = "ColorPicker (OkLch)")
677+
item(key = "colorPicker-OKLCH") {
678+
SmallTitle(text = "ColorPicker (OKLCH)")
680679
val miuixColor = MiuixTheme.colorScheme.primary
681680
var selectedColor by remember { mutableStateOf(miuixColor) }
682681

@@ -726,16 +725,11 @@ fun LazyListScope.otherComponent(
726725
modifier = Modifier.padding(bottom = 12.dp),
727726
verticalAlignment = Alignment.CenterVertically
728727
) {
729-
val hsv = selectedColor.toHsv()
730728
Text(
731729
text = "HEX: #${selectedColor.toArgb().toHexString(HexFormat.UpperCase)}" +
732730
"\nRGBA: ${(selectedColor.red * 255).toInt()}, " +
733731
"${(selectedColor.green * 255).toInt()}, " +
734732
"${(selectedColor.blue * 255).toInt()}, " +
735-
"${(round(selectedColor.alpha * 100) / 100.0)}" +
736-
"\nHSVA: ${(hsv.h).toInt()}, " +
737-
"${(hsv.s).toInt()}%, " +
738-
"${(hsv.v).toInt()}%, " +
739733
"${(round(selectedColor.alpha * 100) / 100.0)}",
740734
modifier = Modifier.weight(1f)
741735
)

iosApp/iosApp/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<key>CFBundleShortVersionString</key>
1818
<string>1.0.5</string>
1919
<key>CFBundleVersion</key>
20-
<string>595</string>
20+
<string>596</string>
2121
<key>LSRequiresIPhoneOS</key>
2222
<true/>
2323
<key>CADisableMinimumFrameDurationOnPhone</key>

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic/ColorPalette.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ import androidx.compose.ui.unit.dp
3737
import androidx.compose.ui.util.lerp
3838
import com.mocharealm.gaze.capsule.ContinuousCapsule
3939
import com.mocharealm.gaze.capsule.ContinuousRoundedRectangle
40-
import top.yukonga.miuix.kmp.utils.Hsv
41-
import top.yukonga.miuix.kmp.utils.toHsv
40+
import top.yukonga.miuix.kmp.color.api.toHsv
41+
import top.yukonga.miuix.kmp.color.space.Hsv
4242
import kotlin.math.abs
4343
import kotlin.math.min
4444
import kotlin.math.roundToInt

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic/ColorPicker.kt

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,14 @@ import androidx.compose.ui.platform.LocalHapticFeedback
3838
import androidx.compose.ui.unit.Dp
3939
import androidx.compose.ui.unit.dp
4040
import com.mocharealm.gaze.capsule.ContinuousCapsule
41-
import top.yukonga.miuix.kmp.utils.ColorUtils
42-
import top.yukonga.miuix.kmp.utils.Hsv
43-
import top.yukonga.miuix.kmp.utils.OkLab
44-
import top.yukonga.miuix.kmp.utils.OkLch
45-
import top.yukonga.miuix.kmp.utils.toHsv
46-
import top.yukonga.miuix.kmp.utils.toOkLab
47-
import top.yukonga.miuix.kmp.utils.toOkLch
41+
import top.yukonga.miuix.kmp.color.api.toHsv
42+
import top.yukonga.miuix.kmp.color.api.toOkLab
43+
import top.yukonga.miuix.kmp.color.api.toOkLch
44+
import top.yukonga.miuix.kmp.color.core.Transforms
45+
import top.yukonga.miuix.kmp.color.space.Hsv
46+
import top.yukonga.miuix.kmp.color.space.OkHsv
47+
import top.yukonga.miuix.kmp.color.space.OkLab
48+
import top.yukonga.miuix.kmp.color.space.OkLch
4849
import kotlin.math.ceil
4950
import kotlin.math.min
5051

@@ -221,7 +222,7 @@ fun HsvHueSlider(
221222
hapticEffect: SliderDefaults.SliderHapticEffect = SliderDefaults.DefaultHapticEffect
222223
) {
223224
val hsvHueColors = remember {
224-
ColorUtils.generateHsvHueColors()
225+
Transforms.generateHsvHueColors()
225226
}
226227

227228
ColorSlider(
@@ -353,12 +354,16 @@ fun OkHsvColorPicker(
353354
var currentAlpha by remember { mutableStateOf(1f) }
354355

355356
val selectedColor = remember(currentH, currentS, currentV, currentAlpha) {
356-
ColorUtils.okhsvToColor(currentH, currentS, currentV, currentAlpha)
357+
OkHsv(
358+
h = currentH,
359+
s = currentS,
360+
v = currentV
361+
).toColor(currentAlpha)
357362
}
358363

359364
LaunchedEffect(initialColor) {
360365
if (initialSetup) {
361-
val okhsv = ColorUtils.colorToOkhsv(initialColor)
366+
val okhsv = Transforms.colorToOkhsv(initialColor)
362367
currentH = okhsv[0]
363368
currentS = okhsv[1]
364369
currentV = okhsv[2]
@@ -438,7 +443,7 @@ fun OkHsvHueSlider(
438443
hapticEffect: SliderDefaults.SliderHapticEffect = SliderDefaults.DefaultHapticEffect
439444
) {
440445
val okHsvHueColors = remember {
441-
ColorUtils.generateOkHsvHueColors()
446+
Transforms.generateOkHsvHueColors()
442447
}
443448

444449
ColorSlider(
@@ -467,8 +472,8 @@ fun OkHsvSaturationSlider(
467472
) {
468473
val saturationColors = remember(currentH) {
469474
listOf(
470-
ColorUtils.okhsvToColor(currentH, 0f, 1f, 1f),
471-
ColorUtils.okhsvToColor(currentH, 1f, 1f, 1f)
475+
Transforms.okhsvToColor(currentH, 0f, 1f, 1f),
476+
Transforms.okhsvToColor(currentH, 1f, 1f, 1f)
472477
)
473478
}
474479

@@ -500,8 +505,8 @@ fun OkHsvValueSlider(
500505
) {
501506
val valueColors = remember(currentH, currentS) {
502507
listOf(
503-
ColorUtils.okhsvToColor(currentH, currentS, 0f, 1f),
504-
ColorUtils.okhsvToColor(currentH, currentS, 1f, 1f)
508+
Transforms.okhsvToColor(currentH, currentS, 0f, 1f),
509+
Transforms.okhsvToColor(currentH, currentS, 1f, 1f)
505510
)
506511
}
507512

@@ -534,7 +539,7 @@ fun OkHsvAlphaSlider(
534539
hapticEffect: SliderDefaults.SliderHapticEffect = SliderDefaults.DefaultHapticEffect
535540
) {
536541
val alphaColors = remember(currentH, currentS, currentV) {
537-
val baseColor = ColorUtils.okhsvToColor(currentH, currentS, currentV)
542+
val baseColor = Transforms.okhsvToColor(currentH, currentS, currentV)
538543
listOf(baseColor.copy(alpha = 0f), baseColor.copy(alpha = 1f))
539544
}
540545

@@ -761,8 +766,8 @@ fun OkLchLightnessSlider(
761766
val cInternal = currentC * 0.4f
762767
val colors = remember(currentC, currentH) {
763768
listOf(
764-
ColorUtils.oklchToColor(0f, cInternal, hDeg, 1f),
765-
ColorUtils.oklchToColor(1f, cInternal, hDeg, 1f)
769+
Transforms.oklchToColor(0f, cInternal, hDeg, 1f),
770+
Transforms.oklchToColor(1f, cInternal, hDeg, 1f)
766771
)
767772
}
768773

@@ -786,8 +791,8 @@ fun OkLchChromaSlider(
786791
val hDeg = currentH * 360f
787792
val colors = remember(currentL, currentH) {
788793
listOf(
789-
ColorUtils.oklchToColor(currentL, 0f, hDeg, 1f),
790-
ColorUtils.oklchToColor(currentL, 0.4f, hDeg, 1f)
794+
Transforms.oklchToColor(currentL, 0f, hDeg, 1f),
795+
Transforms.oklchToColor(currentL, 0.4f, hDeg, 1f)
791796
)
792797
}
793798

@@ -809,7 +814,7 @@ fun OkLchHueSlider(
809814
hapticEffect: SliderDefaults.SliderHapticEffect = SliderDefaults.DefaultHapticEffect
810815
) {
811816
val colors = remember(currentL, currentC) {
812-
ColorUtils.generateOkLchHueColors(currentL, currentC)
817+
Transforms.generateOkLchHueColors(currentL, currentC)
813818
}
814819

815820
ColorSlider(
@@ -833,7 +838,7 @@ fun OkLchAlphaSlider(
833838
val hDeg = currentH * 360f
834839
val cInternal = currentC * 0.4f
835840
val colors = remember(currentL, currentC, currentH) {
836-
val opaque = ColorUtils.oklchToColor(currentL, cInternal, hDeg, 1f)
841+
val opaque = Transforms.oklchToColor(currentL, cInternal, hDeg, 1f)
837842
val transparent = Color(opaque.red, opaque.green, opaque.blue, 0f)
838843
listOf(transparent, opaque)
839844
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2025, compose-miuix-ui contributors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package top.yukonga.miuix.kmp.color.api
5+
6+
import androidx.compose.ui.graphics.Color
7+
import top.yukonga.miuix.kmp.color.core.Transforms
8+
import top.yukonga.miuix.kmp.color.space.Hsv
9+
import top.yukonga.miuix.kmp.color.space.OkLab
10+
import top.yukonga.miuix.kmp.color.space.OkLch
11+
12+
/** Convert Compose Color to user-friendly OkLab. */
13+
fun Color.toOkLab(): OkLab {
14+
val lab = Transforms.colorToOkLab(this)
15+
val l = (lab[0] * 100.0).coerceIn(0.0, 100.0)
16+
val a = (lab[1] / 0.4 * 100.0).coerceIn(-100.0, 100.0)
17+
val b = (lab[2] / 0.4 * 100.0).coerceIn(-100.0, 100.0)
18+
return OkLab(l, a, b)
19+
}
20+
21+
/** Convert Compose Color to Hvs. */
22+
fun Color.toHsv(): Hsv {
23+
val hsvArr = Transforms.colorToHsv(this)
24+
val h = hsvArr[0].toDouble()
25+
val s = (hsvArr[1] * 100.0).coerceIn(0.0, 100.0)
26+
val v = (hsvArr[2] * 100.0).coerceIn(0.0, 100.0)
27+
return Hsv(h, s, v)
28+
}
29+
30+
/** Convert Compose Color to user-friendly OkLch. */
31+
fun Color.toOkLch(): OkLch {
32+
val lch = Transforms.colorToOklch(this)
33+
val l = (lch[0] * 100.0).coerceIn(0.0, 100.0)
34+
val c = (lch[1] / 0.4 * 100.0).coerceIn(0.0, 100.0)
35+
val h = lch[2].toDouble() // degrees already normalized
36+
return OkLch(l, c, h)
37+
}

0 commit comments

Comments
 (0)