2019-02-12 12:04:46 +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.
using osu.Framework.Graphics.Sprites ;
namespace osu.Game.Graphics
{
2019-03-27 18:29:27 +08:00
public static class OsuFont
2019-02-12 12:04:46 +08:00
{
2019-02-20 20:04:18 +08:00
/// <summary>
/// The default font size.
/// </summary>
2019-02-12 12:04:46 +08:00
public const float DEFAULT_FONT_SIZE = 16 ;
2019-02-20 20:04:18 +08:00
/// <summary>
/// The default font.
/// </summary>
2019-02-12 12:04:46 +08:00
public static FontUsage Default = > GetFont ( ) ;
2020-03-04 10:21:37 +08:00
public static FontUsage Numeric = > GetFont ( Typeface . Venera , weight : FontWeight . Bold ) ;
2019-02-22 18:42:09 +08:00
2020-03-03 17:04:12 +08:00
public static FontUsage Torus = > GetFont ( Typeface . Torus , weight : FontWeight . Regular ) ;
2019-02-20 20:04:18 +08: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 12:32:16 +08:00
public static FontUsage GetFont ( Typeface typeface = Typeface . Torus , float size = DEFAULT_FONT_SIZE , FontWeight weight = FontWeight . Medium , bool italics = false , bool fixedWidth = false )
2020-03-14 23:38:27 +08:00
= > new FontUsage ( GetFamilyString ( typeface ) , size , GetWeightString ( typeface , weight ) , getItalics ( italics ) , fixedWidth ) ;
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 12:04:46 +08:00
2019-02-20 20:04:18 +08: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 18:32:30 +08:00
public static string GetFamilyString ( Typeface typeface )
2019-02-12 12:04:46 +08:00
{
switch ( typeface )
{
case Typeface . Venera :
return "Venera" ;
2020-03-03 17:04:12 +08:00
case Typeface . Torus :
return "Torus" ;
2019-02-12 12:04:46 +08:00
}
return null ;
}
2019-02-20 20:04:18 +08:00
/// <summary>
/// Retrieves the string representation of a <see cref="FontWeight"/>.
/// </summary>
/// <param name="typeface">The <see cref="Typeface"/>.</param>
/// <param name="weight">The <see cref="FontWeight"/>.</param>
/// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="typeface"/>.</returns>
2019-02-20 18:32:30 +08:00
public static string GetWeightString ( Typeface typeface , FontWeight weight )
2020-03-13 12:33:55 +08:00
{
if ( typeface = = Typeface . Torus & & weight = = FontWeight . Medium )
// torus doesn't have a medium; fallback to regular.
weight = FontWeight . Regular ;
return GetWeightString ( GetFamilyString ( typeface ) , weight ) ;
}
2019-02-12 12:04:46 +08:00
2019-02-20 20:04:18 +08:00
/// <summary>
/// Retrieves the string representation of a <see cref="FontWeight"/>.
/// </summary>
2019-04-25 16:36:17 +08:00
/// <param name="family">The family string.</param>
2019-02-20 20:04:18 +08:00
/// <param name="weight">The <see cref="FontWeight"/>.</param>
2019-04-25 16:36:17 +08:00
/// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="family"/>.</returns>
2020-03-03 17:04:12 +08:00
public static string GetWeightString ( string family , FontWeight weight ) = > weight . ToString ( ) ;
2019-02-12 12:04:46 +08:00
}
2019-02-20 18:32:30 +08:00
public static class OsuFontExtensions
{
2019-02-20 20:04:18 +08:00
/// <summary>
/// Creates a new <see cref="FontUsage"/> by applying adjustments to this <see cref="FontUsage"/>.
/// </summary>
2019-04-25 16:36:17 +08:00
/// <param name="usage">The base <see cref="FontUsage"/>.</param>
2019-02-20 20:04:18 +08: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 18:32:30 +08: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 12:04:46 +08:00
public enum Typeface
{
Venera ,
2020-03-03 17:04:12 +08:00
Torus
2019-02-12 12:04:46 +08:00
}
public enum FontWeight
{
2020-03-04 10:21:37 +08:00
/// <summary>
2020-03-04 11:47:01 +08:00
/// Equivalent to weight 300.
2020-03-04 10:21:37 +08:00
/// </summary>
Light = 300 ,
/// <summary>
2020-03-04 11:44:44 +08:00
/// Equivalent to weight 400.
2020-03-04 10:21:37 +08:00
/// </summary>
Regular = 400 ,
/// <summary>
2020-03-04 11:44:44 +08:00
/// Equivalent to weight 500.
2020-03-04 10:21:37 +08:00
/// </summary>
Medium = 500 ,
/// <summary>
2020-03-04 11:44:44 +08:00
/// Equivalent to weight 600.
2020-03-04 10:21:37 +08:00
/// </summary>
SemiBold = 600 ,
/// <summary>
2020-03-04 11:44:44 +08:00
/// Equivalent to weight 700.
2020-03-04 10:21:37 +08:00
/// </summary>
Bold = 700 ,
/// <summary>
2020-03-04 11:44:44 +08:00
/// Equivalent to weight 900.
2020-03-04 10:21:37 +08:00
/// </summary>
Black = 900
2019-02-12 12:04:46 +08:00
}
}