2019-02-12 04:04:46 +00: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.
2022-06-17 07:37:17 +00:00
#nullable disable
2022-12-03 20:42:16 +00:00
using System.ComponentModel ;
2019-02-12 04:04:46 +00:00
using osu.Framework.Graphics.Sprites ;
namespace osu.Game.Graphics
{
2019-03-27 10:29:27 +00:00
public static class OsuFont
2019-02-12 04:04:46 +00:00
{
2019-02-20 12:04:18 +00:00
/// <summary>
/// The default font size.
/// </summary>
2019-02-12 04:04:46 +00:00
public const float DEFAULT_FONT_SIZE = 16 ;
2019-02-20 12:04:18 +00:00
/// <summary>
/// The default font.
/// </summary>
2019-02-12 04:04:46 +00:00
public static FontUsage Default = > GetFont ( ) ;
2020-03-04 02:21:37 +00:00
public static FontUsage Numeric = > GetFont ( Typeface . Venera , weight : FontWeight . Bold ) ;
2019-02-22 10:42:09 +00:00
2020-03-03 09:04:12 +00:00
public static FontUsage Torus = > GetFont ( Typeface . Torus , weight : FontWeight . Regular ) ;
2021-10-03 21:36:39 +00:00
public static FontUsage TorusAlternate = > GetFont ( Typeface . TorusAlternate , weight : FontWeight . Regular ) ;
2021-08-03 15:10:33 +00:00
public static FontUsage Inter = > GetFont ( Typeface . Inter , weight : FontWeight . Regular ) ;
2019-02-20 12:04:18 +00:00
/// <summary>
/// Retrieves a <see cref="FontUsage"/>.
/// </summary>
/// <param name="typeface">The font typeface.</param>
/// <param name="size">The size of the text in local space. For a value of 16, a single line will have a height of 16px.</param>
/// <param name="weight">The font weight.</param>
/// <param name="italics">Whether the font is italic.</param>
/// <param name="fixedWidth">Whether all characters should be spaced the same distance apart.</param>
/// <returns>The <see cref="FontUsage"/>.</returns>
2020-03-13 04:32:16 +00:00
public static FontUsage GetFont ( Typeface typeface = Typeface . Torus , float size = DEFAULT_FONT_SIZE , FontWeight weight = FontWeight . Medium , bool italics = false , bool fixedWidth = false )
2022-06-13 01:44:28 +00:00
{
string familyString = GetFamilyString ( typeface ) ;
return new FontUsage ( familyString , size , GetWeightString ( familyString , weight ) , getItalics ( italics ) , fixedWidth ) ;
}
2020-03-14 15:38:27 +00:00
private static bool getItalics ( in bool italicsRequested )
{
// right now none of our fonts support italics.
// should add exceptions to this rule if they come up.
return false ;
}
2019-02-12 04:04:46 +00:00
2019-02-20 12:04:18 +00:00
/// <summary>
/// Retrieves the string representation of a <see cref="Typeface"/>.
/// </summary>
/// <param name="typeface">The <see cref="Typeface"/>.</param>
/// <returns>The string representation.</returns>
2019-02-20 10:32:30 +00:00
public static string GetFamilyString ( Typeface typeface )
2019-02-12 04:04:46 +00:00
{
switch ( typeface )
{
case Typeface . Venera :
2022-06-13 01:43:14 +00:00
return @"Venera" ;
2020-03-03 09:04:12 +00:00
case Typeface . Torus :
2022-06-13 01:43:14 +00:00
return @"Torus" ;
2021-08-03 15:10:33 +00:00
2021-10-03 21:36:39 +00:00
case Typeface . TorusAlternate :
2022-06-13 01:43:14 +00:00
return @"Torus-Alternate" ;
2021-10-03 21:36:39 +00:00
2021-08-03 15:10:33 +00:00
case Typeface . Inter :
2022-06-13 01:43:14 +00:00
return @"Inter" ;
2019-02-12 04:04:46 +00:00
}
return null ;
}
2019-02-20 12:04:18 +00:00
/// <summary>
/// Retrieves the string representation of a <see cref="FontWeight"/>.
/// </summary>
2022-06-13 01:44:28 +00:00
/// <param name="family">The font family.</param>
/// <param name="weight">The font weight.</param>
/// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="family"/>.</returns>
public static string GetWeightString ( string family , FontWeight weight )
2020-03-13 04:33:55 +00:00
{
2022-06-13 03:35:09 +00:00
if ( ( family = = GetFamilyString ( Typeface . Torus ) | | family = = GetFamilyString ( Typeface . TorusAlternate ) ) & & weight = = FontWeight . Medium )
2020-03-13 04:33:55 +00:00
// torus doesn't have a medium; fallback to regular.
weight = FontWeight . Regular ;
2022-06-13 01:44:28 +00:00
return weight . ToString ( ) ;
2020-03-13 04:33:55 +00:00
}
2019-02-12 04:04:46 +00:00
}
2019-02-20 10:32:30 +00:00
public static class OsuFontExtensions
{
2019-02-20 12:04:18 +00:00
/// <summary>
/// Creates a new <see cref="FontUsage"/> by applying adjustments to this <see cref="FontUsage"/>.
/// </summary>
2019-04-25 08:36:17 +00:00
/// <param name="usage">The base <see cref="FontUsage"/>.</param>
2019-02-20 12:04:18 +00:00
/// <param name="typeface">The font typeface. If null, the value is copied from this <see cref="FontUsage"/>.</param>
/// <param name="size">The text size. If null, the value is copied from this <see cref="FontUsage"/>.</param>
/// <param name="weight">The font weight. If null, the value is copied from this <see cref="FontUsage"/>.</param>
/// <param name="italics">Whether the font is italic. If null, the value is copied from this <see cref="FontUsage"/>.</param>
/// <param name="fixedWidth">Whether all characters should be spaced apart the same distance. If null, the value is copied from this <see cref="FontUsage"/>.</param>
/// <returns>The resulting <see cref="FontUsage"/>.</returns>
2019-02-20 10:32:30 +00:00
public static FontUsage With ( this FontUsage usage , Typeface ? typeface = null , float? size = null , FontWeight ? weight = null , bool? italics = null , bool? fixedWidth = null )
{
string familyString = typeface ! = null ? OsuFont . GetFamilyString ( typeface . Value ) : usage . Family ;
string weightString = weight ! = null ? OsuFont . GetWeightString ( familyString , weight . Value ) : usage . Weight ;
return usage . With ( familyString , size , weightString , italics , fixedWidth ) ;
}
}
2019-02-12 04:04:46 +00:00
public enum Typeface
{
Venera ,
2021-08-03 15:10:33 +00:00
Torus ,
2022-12-03 20:42:16 +00:00
[Description("Torus (alternate)")]
2021-10-03 21:36:39 +00:00
TorusAlternate ,
2021-08-03 15:10:33 +00:00
Inter ,
2019-02-12 04:04:46 +00:00
}
public enum FontWeight
{
2020-03-04 02:21:37 +00:00
/// <summary>
2020-03-04 03:47:01 +00:00
/// Equivalent to weight 300.
2020-03-04 02:21:37 +00:00
/// </summary>
Light = 300 ,
/// <summary>
2020-03-04 03:44:44 +00:00
/// Equivalent to weight 400.
2020-03-04 02:21:37 +00:00
/// </summary>
Regular = 400 ,
/// <summary>
2020-03-04 03:44:44 +00:00
/// Equivalent to weight 500.
2020-03-04 02:21:37 +00:00
/// </summary>
Medium = 500 ,
/// <summary>
2020-03-04 03:44:44 +00:00
/// Equivalent to weight 600.
2020-03-04 02:21:37 +00:00
/// </summary>
SemiBold = 600 ,
/// <summary>
2020-03-04 03:44:44 +00:00
/// Equivalent to weight 700.
2020-03-04 02:21:37 +00:00
/// </summary>
Bold = 700 ,
2020-03-17 08:16:10 +00:00
/// <summary>
/// Equivalent to weight 900.
/// </summary>
Black = 900
2019-02-12 04:04:46 +00:00
}
}