mirror of
https://github.com/austinried/subtracks.git
synced 2026-11-11 15:29:15 +01:00
smooth the warm damping so switching artwork does not flash
This commit is contained in:
@@ -34,6 +34,9 @@ private const val DARKEN_END_SCREENS = 1.5f
|
|||||||
private const val DARKEN_KNEE = 0.2f
|
private const val DARKEN_KNEE = 0.2f
|
||||||
private const val PLAYER_SURFACE_SATURATION_FACTOR = 1.6f
|
private const val PLAYER_SURFACE_SATURATION_FACTOR = 1.6f
|
||||||
private const val LIBRARY_SURFACE_LIGHTNESS = 0.10f
|
private const val LIBRARY_SURFACE_LIGHTNESS = 0.10f
|
||||||
|
private const val WARM_SURFACE_SATURATION_DAMPING = 0.2f
|
||||||
|
private const val WARM_HUE_FULL = 90f
|
||||||
|
private const val WARM_HUE_NONE = 150f
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class ArtworkColors(
|
data class ArtworkColors(
|
||||||
@@ -209,17 +212,19 @@ fun ArtworkTheme(
|
|||||||
|
|
||||||
fun playerSurfaceColor(artwork: ArtworkColors): Color {
|
fun playerSurfaceColor(artwork: ArtworkColors): Color {
|
||||||
val (hue, saturation, lightness) = artwork.scheme.surfaceContainerHigh.toHsl()
|
val (hue, saturation, lightness) = artwork.scheme.surfaceContainerHigh.toHsl()
|
||||||
if (isWarmHue(hue)) return artwork.gradientHigh
|
val factor = PLAYER_SURFACE_SATURATION_FACTOR * surfaceSaturationFactor(hue)
|
||||||
return Color.hsl(hue, (saturation * PLAYER_SURFACE_SATURATION_FACTOR).coerceIn(0f, 1f), lightness)
|
return Color.hsl(hue, (saturation * factor).coerceIn(0f, 1f), lightness)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun librarySurfaceColor(artwork: ArtworkColors): Color {
|
fun librarySurfaceColor(artwork: ArtworkColors): Color {
|
||||||
val (hue, saturation, _) = artwork.scheme.surfaceContainerHigh.toHsl()
|
val (hue, saturation, _) = artwork.scheme.surfaceContainerHigh.toHsl()
|
||||||
if (isWarmHue(hue)) return lerp(artwork.gradientHigh, artwork.scheme.surfaceContainerHigh, 0.5f)
|
return Color.hsl(hue, (saturation * surfaceSaturationFactor(hue)).coerceIn(0f, 1f), LIBRARY_SURFACE_LIGHTNESS)
|
||||||
return Color.hsl(hue, saturation, LIBRARY_SURFACE_LIGHTNESS)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isWarmHue(hue: Float): Boolean = hue in 0f..120f
|
private fun surfaceSaturationFactor(hue: Float): Float {
|
||||||
|
val warm = ((WARM_HUE_NONE - hue) / (WARM_HUE_NONE - WARM_HUE_FULL)).coerceIn(0f, 1f)
|
||||||
|
return 1f + (WARM_SURFACE_SATURATION_DAMPING - 1f) * warm
|
||||||
|
}
|
||||||
|
|
||||||
fun heroBarColor(
|
fun heroBarColor(
|
||||||
artwork: ArtworkColors?,
|
artwork: ArtworkColors?,
|
||||||
|
|||||||
@@ -60,11 +60,9 @@ class ArtworkColorsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun warmArtworkLiftsPlayerSurfaceToTheBrightGradientTone() {
|
fun warmArtworkKeepsThePlayerSurfaceDark() {
|
||||||
val warm = artworkColorsFromSeed(0xFFE6C822.toInt())
|
val warm = artworkColorsFromSeed(0xFFE6C822.toInt())
|
||||||
val cool = artworkColorsFromSeed(0xFF3A7BD5.toInt())
|
assertTrue(playerSurfaceColor(warm).luminance() < 0.1f)
|
||||||
assertEquals(warm.gradientHigh, playerSurfaceColor(warm))
|
|
||||||
assertTrue(playerSurfaceColor(cool) != cool.gradientHigh)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun contrast(
|
private fun contrast(
|
||||||
|
|||||||
Reference in New Issue
Block a user