diff --git a/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt b/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt index c724f87c..6cb6d7b3 100644 --- a/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt +++ b/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt @@ -34,6 +34,9 @@ private const val DARKEN_END_SCREENS = 1.5f private const val DARKEN_KNEE = 0.2f private const val PLAYER_SURFACE_SATURATION_FACTOR = 1.6f 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 data class ArtworkColors( @@ -209,17 +212,19 @@ fun ArtworkTheme( fun playerSurfaceColor(artwork: ArtworkColors): Color { val (hue, saturation, lightness) = artwork.scheme.surfaceContainerHigh.toHsl() - if (isWarmHue(hue)) return artwork.gradientHigh - return Color.hsl(hue, (saturation * PLAYER_SURFACE_SATURATION_FACTOR).coerceIn(0f, 1f), lightness) + val factor = PLAYER_SURFACE_SATURATION_FACTOR * surfaceSaturationFactor(hue) + return Color.hsl(hue, (saturation * factor).coerceIn(0f, 1f), lightness) } fun librarySurfaceColor(artwork: ArtworkColors): Color { val (hue, saturation, _) = artwork.scheme.surfaceContainerHigh.toHsl() - if (isWarmHue(hue)) return lerp(artwork.gradientHigh, artwork.scheme.surfaceContainerHigh, 0.5f) - return Color.hsl(hue, saturation, LIBRARY_SURFACE_LIGHTNESS) + return Color.hsl(hue, (saturation * surfaceSaturationFactor(hue)).coerceIn(0f, 1f), 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( artwork: ArtworkColors?, diff --git a/app/src/test/kotlin/com/subtracks/ui/theme/ArtworkColorsTest.kt b/app/src/test/kotlin/com/subtracks/ui/theme/ArtworkColorsTest.kt index 9305b4a6..e3931245 100644 --- a/app/src/test/kotlin/com/subtracks/ui/theme/ArtworkColorsTest.kt +++ b/app/src/test/kotlin/com/subtracks/ui/theme/ArtworkColorsTest.kt @@ -60,11 +60,9 @@ class ArtworkColorsTest { } @Test - fun warmArtworkLiftsPlayerSurfaceToTheBrightGradientTone() { + fun warmArtworkKeepsThePlayerSurfaceDark() { val warm = artworkColorsFromSeed(0xFFE6C822.toInt()) - val cool = artworkColorsFromSeed(0xFF3A7BD5.toInt()) - assertEquals(warm.gradientHigh, playerSurfaceColor(warm)) - assertTrue(playerSurfaceColor(cool) != cool.gradientHigh) + assertTrue(playerSurfaceColor(warm).luminance() < 0.1f) } private fun contrast(