2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
2022-06-17 15:37:17 +08:00
#nullable disable
2021-07-13 00:34:14 +08:00
using System ;
2020-03-11 09:18:41 +08:00
using osu.Framework.Extensions.Color4Extensions ;
2019-08-17 14:16:24 +08:00
using osu.Game.Beatmaps ;
2022-05-27 22:40:15 +08:00
using osu.Game.Online.Rooms ;
2021-07-14 08:22:00 +08:00
using osu.Game.Overlays ;
2022-02-22 07:02:54 +08:00
using osu.Game.Rulesets.Mods ;
2020-03-18 16:21:36 +08:00
using osu.Game.Rulesets.Scoring ;
2020-03-17 15:25:41 +08:00
using osu.Game.Scoring ;
2021-07-13 00:34:14 +08:00
using osu.Game.Utils ;
2018-11-20 15:51:59 +08:00
using osuTK.Graphics ;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Graphics
{
public class OsuColour
{
public static Color4 Gray ( float amt ) = > new Color4 ( amt , amt , amt , 1f ) ;
public static Color4 Gray ( byte amt ) = > new Color4 ( amt , amt , amt , 255 ) ;
2021-08-04 06:52:26 +08:00
/// <summary>
/// Retrieves the colour for a <see cref="DifficultyRating"/>.
/// </summary>
/// <remarks>
/// Sourced from the @diff-{rating} variables in https://github.com/ppy/osu-web/blob/71fbab8936d79a7929d13854f5e854b4f383b236/resources/assets/less/variables.less.
/// </remarks>
2019-12-06 11:07:16 +08:00
public Color4 ForDifficultyRating ( DifficultyRating difficulty , bool useLighterColour = false )
2021-07-13 00:34:14 +08:00
{
switch ( difficulty )
{
case DifficultyRating . Easy :
return Color4Extensions . FromHex ( "4ebfff" ) ;
case DifficultyRating . Normal :
return Color4Extensions . FromHex ( "66ff91" ) ;
case DifficultyRating . Hard :
2021-08-04 06:52:34 +08:00
return Color4Extensions . FromHex ( "f7e85d" ) ;
2021-07-13 00:34:14 +08:00
case DifficultyRating . Insane :
return Color4Extensions . FromHex ( "ff7e68" ) ;
case DifficultyRating . Expert :
return Color4Extensions . FromHex ( "fe3c71" ) ;
case DifficultyRating . ExpertPlus :
return Color4Extensions . FromHex ( "6662dd" ) ;
default :
throw new ArgumentOutOfRangeException ( nameof ( difficulty ) ) ;
}
}
2021-07-16 04:57:48 +08:00
public Color4 ForStarDifficulty ( double starDifficulty ) = > ColourUtils . SampleFromLinearGradient ( new [ ]
2021-07-13 00:35:03 +08:00
{
2021-11-12 21:58:18 +08:00
( 0.1f , Color4Extensions . FromHex ( "aaaaaa" ) ) ,
( 0.1f , Color4Extensions . FromHex ( "4290fb" ) ) ,
( 1.25f , Color4Extensions . FromHex ( "4fc0ff" ) ) ,
2021-07-16 04:57:48 +08:00
( 2.0f , Color4Extensions . FromHex ( "4fffd5" ) ) ,
( 2.5f , Color4Extensions . FromHex ( "7cff4f" ) ) ,
2021-11-12 21:58:18 +08:00
( 3.3f , Color4Extensions . FromHex ( "f6f05c" ) ) ,
( 4.2f , Color4Extensions . FromHex ( "ff8068" ) ) ,
( 4.9f , Color4Extensions . FromHex ( "ff4e6f" ) ) ,
( 5.8f , Color4Extensions . FromHex ( "c645b8" ) ) ,
( 6.7f , Color4Extensions . FromHex ( "6563de" ) ) ,
( 7.7f , Color4Extensions . FromHex ( "18158e" ) ) ,
( 9.0f , Color4 . Black ) ,
2021-08-04 07:13:19 +08:00
} , ( float ) Math . Round ( starDifficulty , 2 , MidpointRounding . AwayFromZero ) ) ;
2021-07-13 00:35:03 +08:00
2020-03-17 15:25:41 +08:00
/// <summary>
/// Retrieves the colour for a <see cref="ScoreRank"/>.
/// </summary>
public static Color4 ForRank ( ScoreRank rank )
{
switch ( rank )
{
case ScoreRank . XH :
case ScoreRank . X :
2020-03-18 16:37:03 +08:00
return Color4Extensions . FromHex ( @"de31ae" ) ;
2020-03-17 15:25:41 +08:00
case ScoreRank . SH :
case ScoreRank . S :
2020-03-18 16:37:03 +08:00
return Color4Extensions . FromHex ( @"02b5c3" ) ;
2020-03-17 15:25:41 +08:00
case ScoreRank . A :
2020-03-18 16:37:03 +08:00
return Color4Extensions . FromHex ( @"88da20" ) ;
2020-03-17 15:25:41 +08:00
case ScoreRank . B :
return Color4Extensions . FromHex ( @"e3b130" ) ;
case ScoreRank . C :
2020-03-18 16:37:03 +08:00
return Color4Extensions . FromHex ( @"ff8e5d" ) ;
2020-03-17 15:25:41 +08:00
default :
2020-03-18 16:37:03 +08:00
return Color4Extensions . FromHex ( @"ff5a5a" ) ;
2020-03-17 15:25:41 +08:00
}
}
2020-03-18 16:21:36 +08:00
/// <summary>
/// Retrieves the colour for a <see cref="HitResult"/>.
/// </summary>
public Color4 ForHitResult ( HitResult judgement )
{
switch ( judgement )
{
case HitResult . Perfect :
case HitResult . Great :
return Blue ;
case HitResult . Ok :
case HitResult . Good :
return Green ;
case HitResult . Meh :
return Yellow ;
case HitResult . Miss :
return Red ;
default :
return Color4 . White ;
}
}
2021-10-17 20:42:04 +08:00
/// <summary>
2021-11-24 17:42:47 +08:00
/// Retrieves a colour for the given <see cref="BeatmapOnlineStatus"/>.
2021-10-17 20:42:04 +08:00
/// A <see langword="null"/> value indicates that a "background" shade from the local <see cref="OverlayColourProvider"/>
/// (or another fallback colour) should be used.
/// </summary>
/// <remarks>
/// Sourced from web: https://github.com/ppy/osu-web/blob/007eebb1916ed5cb6a7866d82d8011b1060a945e/resources/assets/less/layout.less#L36-L50
/// </remarks>
2021-11-24 17:42:47 +08:00
public static Color4 ? ForBeatmapSetOnlineStatus ( BeatmapOnlineStatus status )
2021-10-17 20:42:04 +08:00
{
switch ( status )
{
2022-08-01 22:57:46 +08:00
case BeatmapOnlineStatus . LocallyModified :
return Color4 . OrangeRed ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . Ranked :
case BeatmapOnlineStatus . Approved :
2021-10-17 20:42:04 +08:00
return Color4Extensions . FromHex ( @"b3ff66" ) ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . Loved :
2021-10-17 20:42:04 +08:00
return Color4Extensions . FromHex ( @"ff66ab" ) ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . Qualified :
2021-10-17 20:42:04 +08:00
return Color4Extensions . FromHex ( @"66ccff" ) ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . Pending :
2021-10-17 20:42:04 +08:00
return Color4Extensions . FromHex ( @"ffd966" ) ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . WIP :
2021-10-17 20:42:04 +08:00
return Color4Extensions . FromHex ( @"ff9966" ) ;
2021-11-24 17:42:47 +08:00
case BeatmapOnlineStatus . Graveyard :
2021-10-17 20:42:04 +08:00
return Color4 . Black ;
default :
return null ;
}
}
2022-02-22 07:02:54 +08:00
/// <summary>
/// Retrieves the main accent colour for a <see cref="ModType"/>.
/// </summary>
public Color4 ForModType ( ModType modType )
{
switch ( modType )
{
case ModType . Automation :
return Blue1 ;
case ModType . DifficultyIncrease :
return Red1 ;
case ModType . DifficultyReduction :
return Lime1 ;
case ModType . Conversion :
return Purple1 ;
case ModType . Fun :
return Pink1 ;
case ModType . System :
return Gray7 ;
default :
throw new ArgumentOutOfRangeException ( nameof ( modType ) , modType , "Unknown mod type" ) ;
}
}
2022-05-27 22:40:15 +08:00
/// <summary>
/// Retrieves the main accent colour for a <see cref="RoomCategory"/>.
/// </summary>
public Color4 ? ForRoomCategory ( RoomCategory roomCategory )
{
switch ( roomCategory )
{
case RoomCategory . Spotlight :
2022-05-28 06:05:07 +08:00
return SpotlightColour ;
2022-05-27 22:40:15 +08:00
case RoomCategory . FeaturedArtist :
2022-05-28 06:05:07 +08:00
return FeaturedArtistColour ;
2022-05-27 22:40:15 +08:00
default :
return null ;
}
}
2021-04-20 00:24:15 +08:00
/// <summary>
/// Returns a foreground text colour that is supposed to contrast well with
/// the supplied <paramref name="backgroundColour"/>.
/// </summary>
public static Color4 ForegroundTextColourFor ( Color4 backgroundColour )
{
// formula taken from the RGB->YIQ conversions: https://en.wikipedia.org/wiki/YIQ
// brightness here is equivalent to the Y component in the above colour model, which is a rough estimate of lightness.
float brightness = 0.299f * backgroundColour . R + 0.587f * backgroundColour . G + 0.114f * backgroundColour . B ;
return Gray ( brightness > 0.5f ? 0.2f : 0.9f ) ;
}
2021-08-05 17:23:39 +08:00
public readonly Color4 TeamColourRed = Color4Extensions . FromHex ( "#AA1414" ) ;
public readonly Color4 TeamColourBlue = Color4Extensions . FromHex ( "#1462AA" ) ;
2018-04-13 17:19:50 +08:00
// See https://github.com/ppy/osu-web/blob/master/resources/assets/less/colors.less
2020-03-11 09:18:41 +08:00
public readonly Color4 PurpleLighter = Color4Extensions . FromHex ( @"eeeeff" ) ;
public readonly Color4 PurpleLight = Color4Extensions . FromHex ( @"aa88ff" ) ;
public readonly Color4 PurpleLightAlternative = Color4Extensions . FromHex ( @"cba4da" ) ;
public readonly Color4 Purple = Color4Extensions . FromHex ( @"8866ee" ) ;
public readonly Color4 PurpleDark = Color4Extensions . FromHex ( @"6644cc" ) ;
public readonly Color4 PurpleDarkAlternative = Color4Extensions . FromHex ( @"312436" ) ;
public readonly Color4 PurpleDarker = Color4Extensions . FromHex ( @"441188" ) ;
public readonly Color4 PinkLighter = Color4Extensions . FromHex ( @"ffddee" ) ;
public readonly Color4 PinkLight = Color4Extensions . FromHex ( @"ff99cc" ) ;
public readonly Color4 Pink = Color4Extensions . FromHex ( @"ff66aa" ) ;
public readonly Color4 PinkDark = Color4Extensions . FromHex ( @"cc5288" ) ;
public readonly Color4 PinkDarker = Color4Extensions . FromHex ( @"bb1177" ) ;
public readonly Color4 BlueLighter = Color4Extensions . FromHex ( @"ddffff" ) ;
public readonly Color4 BlueLight = Color4Extensions . FromHex ( @"99eeff" ) ;
public readonly Color4 Blue = Color4Extensions . FromHex ( @"66ccff" ) ;
public readonly Color4 BlueDark = Color4Extensions . FromHex ( @"44aadd" ) ;
public readonly Color4 BlueDarker = Color4Extensions . FromHex ( @"2299bb" ) ;
public readonly Color4 YellowLighter = Color4Extensions . FromHex ( @"ffffdd" ) ;
public readonly Color4 YellowLight = Color4Extensions . FromHex ( @"ffdd55" ) ;
public readonly Color4 Yellow = Color4Extensions . FromHex ( @"ffcc22" ) ;
public readonly Color4 YellowDark = Color4Extensions . FromHex ( @"eeaa00" ) ;
public readonly Color4 YellowDarker = Color4Extensions . FromHex ( @"cc6600" ) ;
public readonly Color4 GreenLighter = Color4Extensions . FromHex ( @"eeffcc" ) ;
public readonly Color4 GreenLight = Color4Extensions . FromHex ( @"b3d944" ) ;
public readonly Color4 Green = Color4Extensions . FromHex ( @"88b300" ) ;
public readonly Color4 GreenDark = Color4Extensions . FromHex ( @"668800" ) ;
public readonly Color4 GreenDarker = Color4Extensions . FromHex ( @"445500" ) ;
public readonly Color4 Sky = Color4Extensions . FromHex ( @"6bb5ff" ) ;
public readonly Color4 GreySkyLighter = Color4Extensions . FromHex ( @"c6e3f4" ) ;
public readonly Color4 GreySkyLight = Color4Extensions . FromHex ( @"8ab3cc" ) ;
public readonly Color4 GreySky = Color4Extensions . FromHex ( @"405461" ) ;
public readonly Color4 GreySkyDark = Color4Extensions . FromHex ( @"303d47" ) ;
public readonly Color4 GreySkyDarker = Color4Extensions . FromHex ( @"21272c" ) ;
2021-12-10 13:15:00 +08:00
public readonly Color4 SeaFoam = Color4Extensions . FromHex ( @"05ffa2" ) ;
public readonly Color4 GreySeaFoamLighter = Color4Extensions . FromHex ( @"9ebab1" ) ;
public readonly Color4 GreySeaFoamLight = Color4Extensions . FromHex ( @"4d7365" ) ;
public readonly Color4 GreySeaFoam = Color4Extensions . FromHex ( @"33413c" ) ;
public readonly Color4 GreySeaFoamDark = Color4Extensions . FromHex ( @"2c3532" ) ;
public readonly Color4 GreySeaFoamDarker = Color4Extensions . FromHex ( @"1e2422" ) ;
2020-03-11 09:18:41 +08:00
public readonly Color4 Cyan = Color4Extensions . FromHex ( @"05f4fd" ) ;
public readonly Color4 GreyCyanLighter = Color4Extensions . FromHex ( @"77b1b3" ) ;
public readonly Color4 GreyCyanLight = Color4Extensions . FromHex ( @"436d6f" ) ;
public readonly Color4 GreyCyan = Color4Extensions . FromHex ( @"293d3e" ) ;
public readonly Color4 GreyCyanDark = Color4Extensions . FromHex ( @"243536" ) ;
public readonly Color4 GreyCyanDarker = Color4Extensions . FromHex ( @"1e2929" ) ;
public readonly Color4 Lime = Color4Extensions . FromHex ( @"82ff05" ) ;
public readonly Color4 GreyLimeLighter = Color4Extensions . FromHex ( @"deff87" ) ;
public readonly Color4 GreyLimeLight = Color4Extensions . FromHex ( @"657259" ) ;
public readonly Color4 GreyLime = Color4Extensions . FromHex ( @"3f443a" ) ;
public readonly Color4 GreyLimeDark = Color4Extensions . FromHex ( @"32352e" ) ;
public readonly Color4 GreyLimeDarker = Color4Extensions . FromHex ( @"2e302b" ) ;
public readonly Color4 Violet = Color4Extensions . FromHex ( @"bf04ff" ) ;
public readonly Color4 GreyVioletLighter = Color4Extensions . FromHex ( @"ebb8fe" ) ;
public readonly Color4 GreyVioletLight = Color4Extensions . FromHex ( @"685370" ) ;
public readonly Color4 GreyViolet = Color4Extensions . FromHex ( @"46334d" ) ;
public readonly Color4 GreyVioletDark = Color4Extensions . FromHex ( @"2c2230" ) ;
public readonly Color4 GreyVioletDarker = Color4Extensions . FromHex ( @"201823" ) ;
public readonly Color4 Carmine = Color4Extensions . FromHex ( @"ff0542" ) ;
public readonly Color4 GreyCarmineLighter = Color4Extensions . FromHex ( @"deaab4" ) ;
public readonly Color4 GreyCarmineLight = Color4Extensions . FromHex ( @"644f53" ) ;
public readonly Color4 GreyCarmine = Color4Extensions . FromHex ( @"342b2d" ) ;
public readonly Color4 GreyCarmineDark = Color4Extensions . FromHex ( @"302a2b" ) ;
public readonly Color4 GreyCarmineDarker = Color4Extensions . FromHex ( @"241d1e" ) ;
public readonly Color4 Gray0 = Color4Extensions . FromHex ( @"000" ) ;
public readonly Color4 Gray1 = Color4Extensions . FromHex ( @"111" ) ;
public readonly Color4 Gray2 = Color4Extensions . FromHex ( @"222" ) ;
public readonly Color4 Gray3 = Color4Extensions . FromHex ( @"333" ) ;
public readonly Color4 Gray4 = Color4Extensions . FromHex ( @"444" ) ;
public readonly Color4 Gray5 = Color4Extensions . FromHex ( @"555" ) ;
public readonly Color4 Gray6 = Color4Extensions . FromHex ( @"666" ) ;
public readonly Color4 Gray7 = Color4Extensions . FromHex ( @"777" ) ;
public readonly Color4 Gray8 = Color4Extensions . FromHex ( @"888" ) ;
public readonly Color4 Gray9 = Color4Extensions . FromHex ( @"999" ) ;
public readonly Color4 GrayA = Color4Extensions . FromHex ( @"aaa" ) ;
public readonly Color4 GrayB = Color4Extensions . FromHex ( @"bbb" ) ;
public readonly Color4 GrayC = Color4Extensions . FromHex ( @"ccc" ) ;
public readonly Color4 GrayD = Color4Extensions . FromHex ( @"ddd" ) ;
public readonly Color4 GrayE = Color4Extensions . FromHex ( @"eee" ) ;
public readonly Color4 GrayF = Color4Extensions . FromHex ( @"fff" ) ;
2022-02-18 06:54:29 +08:00
#region "Basic" colour theme
// Reference: https://www.figma.com/file/VIkXMYNPMtQem2RJg9k2iQ/Asset%2FColours?node-id=1838%3A3
2022-02-21 03:40:08 +08:00
// Note that the colours in this region are also defined in `OverlayColourProvider` as `Colour{0,1,2,3,4}`.
// The difference as to which should be used where comes down to context.
// If the colour in question is supposed to always match the view in which it is displayed theme-wise, use `OverlayColourProvider`.
// If the colour usage is special and in general differs from the surrounding view in choice of hue, use the `OsuColour` constants.
2022-02-18 06:54:29 +08:00
public readonly Color4 Pink0 = Color4Extensions . FromHex ( @"ff99c7" ) ;
public readonly Color4 Pink1 = Color4Extensions . FromHex ( @"ff66ab" ) ;
public readonly Color4 Pink2 = Color4Extensions . FromHex ( @"eb4791" ) ;
2021-10-11 02:32:56 +08:00
public readonly Color4 Pink3 = Color4Extensions . FromHex ( @"cc3378" ) ;
2022-02-18 06:54:29 +08:00
public readonly Color4 Pink4 = Color4Extensions . FromHex ( @"6b2e49" ) ;
2021-10-11 02:32:56 +08:00
2022-02-18 06:54:29 +08:00
public readonly Color4 Purple0 = Color4Extensions . FromHex ( @"b299ff" ) ;
public readonly Color4 Purple1 = Color4Extensions . FromHex ( @"8c66ff" ) ;
public readonly Color4 Purple2 = Color4Extensions . FromHex ( @"7047eb" ) ;
public readonly Color4 Purple3 = Color4Extensions . FromHex ( @"5933cc" ) ;
public readonly Color4 Purple4 = Color4Extensions . FromHex ( @"3d2e6b" ) ;
public readonly Color4 Blue0 = Color4Extensions . FromHex ( @"99ddff" ) ;
public readonly Color4 Blue1 = Color4Extensions . FromHex ( @"66ccff" ) ;
public readonly Color4 Blue2 = Color4Extensions . FromHex ( @"47b4eb" ) ;
2021-10-11 02:21:41 +08:00
public readonly Color4 Blue3 = Color4Extensions . FromHex ( @"3399cc" ) ;
2022-02-18 06:54:29 +08:00
public readonly Color4 Blue4 = Color4Extensions . FromHex ( @"2e576b" ) ;
2021-10-11 02:21:41 +08:00
2022-02-18 06:54:29 +08:00
public readonly Color4 Green0 = Color4Extensions . FromHex ( @"99ffa2" ) ;
public readonly Color4 Green1 = Color4Extensions . FromHex ( @"66ff73" ) ;
public readonly Color4 Green2 = Color4Extensions . FromHex ( @"47eb55" ) ;
public readonly Color4 Green3 = Color4Extensions . FromHex ( @"33cc40" ) ;
public readonly Color4 Green4 = Color4Extensions . FromHex ( @"2e6b33" ) ;
2021-10-16 03:44:56 +08:00
2022-02-18 06:54:29 +08:00
public readonly Color4 Lime0 = Color4Extensions . FromHex ( @"ccff99" ) ;
2021-07-14 08:18:13 +08:00
public readonly Color4 Lime1 = Color4Extensions . FromHex ( @"b2ff66" ) ;
2022-02-18 06:54:29 +08:00
public readonly Color4 Lime2 = Color4Extensions . FromHex ( @"99eb47" ) ;
2021-10-16 03:44:56 +08:00
public readonly Color4 Lime3 = Color4Extensions . FromHex ( @"7fcc33" ) ;
2022-02-18 06:54:29 +08:00
public readonly Color4 Lime4 = Color4Extensions . FromHex ( @"4c6b2e" ) ;
2021-10-16 03:44:56 +08:00
2022-02-18 06:54:29 +08:00
public readonly Color4 Orange0 = Color4Extensions . FromHex ( @"ffe699" ) ;
2021-07-14 08:18:13 +08:00
public readonly Color4 Orange1 = Color4Extensions . FromHex ( @"ffd966" ) ;
2022-02-18 06:54:29 +08:00
public readonly Color4 Orange2 = Color4Extensions . FromHex ( @"ebc247" ) ;
public readonly Color4 Orange3 = Color4Extensions . FromHex ( @"cca633" ) ;
public readonly Color4 Orange4 = Color4Extensions . FromHex ( @"6b5c2e" ) ;
public readonly Color4 Red0 = Color4Extensions . FromHex ( @"ff9b9b" ) ;
public readonly Color4 Red1 = Color4Extensions . FromHex ( @"ff6666" ) ;
public readonly Color4 Red2 = Color4Extensions . FromHex ( @"eb4747" ) ;
public readonly Color4 Red3 = Color4Extensions . FromHex ( @"cc3333" ) ;
public readonly Color4 Red4 = Color4Extensions . FromHex ( @"6b2e2e" ) ;
#endregion
2021-07-14 08:18:13 +08:00
2021-04-14 18:38:25 +08:00
// Content Background
public readonly Color4 B5 = Color4Extensions . FromHex ( @"222a28" ) ;
2020-03-11 09:18:41 +08:00
public readonly Color4 RedLighter = Color4Extensions . FromHex ( @"ffeded" ) ;
public readonly Color4 RedLight = Color4Extensions . FromHex ( @"ed7787" ) ;
public readonly Color4 Red = Color4Extensions . FromHex ( @"ed1121" ) ;
public readonly Color4 RedDark = Color4Extensions . FromHex ( @"ba0011" ) ;
public readonly Color4 RedDarker = Color4Extensions . FromHex ( @"870000" ) ;
public readonly Color4 ChatBlue = Color4Extensions . FromHex ( @"17292e" ) ;
public readonly Color4 ContextMenuGray = Color4Extensions . FromHex ( @"223034" ) ;
2022-05-28 06:05:07 +08:00
public Color4 SpotlightColour = > Green2 ;
public Color4 FeaturedArtistColour = > Blue2 ;
2018-04-13 17:19:50 +08:00
}
}