Font

From Minecraft Wiki
Jump to navigation Jump to search
Specimen of the 1.20.2 JE font.

The font is the typeface that Minecraft uses. It was first added in Java Edition Classic 0.0.2a and has seen many revisions and additions since. Its design has been present in all ports of the game.

In Java Edition, the font’s name is Minecraft Seven. It contains 2,426 characters. Multiple fonts can be defined and referenced with resource packs.


Fonts available[edit | edit source]

Java Edition[edit | edit source]

By default, Java Edition includes 4 fonts.

default

This is the default font used in almost every scenario. It references 4 files

  • ascii.png
  • accented.png
  • nonlatin_european.png
  • unifont.zip
alt

This is the font used in the Enchanting Table's GUI when an item is able to be enchanted. When mapped to the ASCII layout, only the characters A-Z are textured. Lowercase a-z is an exact copy of the uppercase.

It references ascii_sga.png.

uniform

This is the font used when the "Force Unicode Font" option in Language is ON.

It references unifont.zip.

illageralt

This is a "secret" font not used anywhere in the game. It is a reference to Illageralt, a Minecraft Dungeons rune-line alphabet. It can be used only with the "font" JSON text key.[a]

It references asciillager.png.

Bedrock Edition[edit | edit source]

In Bedrock Edition, there are 2 default fonts. Many other font resources are used regardless of the font setting. Unlike in Java Edition, the font can be swapped out with a built-in setting. The font can be changed in for touchscreens, or D-pad right for controllers, and then the gear icon.

Mojangles

The official name of the font used in Bedrock. It is used almost everywhere. Metadata indicates it was first made by 4J Studios around 2011.

Noto Sans

This is the Noto Sans font. It is used in some text boxes, and is the default fallback font.

Resources[edit | edit source]

Java Edition[edit | edit source]

ascii.png

This contains the most-used characters and some other symbols. Its filename is a misnomer: it does not contain solely ASCII characters. In particular:

  • Glyphs U+0020 SPACE through U+007E ~ TILDE display the Wikipedia: Basic Latin Unicode block characters; this mirrors ASCII.
  • Glyphs U+007F DELETE through U+00FF ÿ LATIN SMALL LETTER Y WITH DIAERESIS display the Code page 437 characters.
accented.png

This contains mostly versions of letters with accents, diacritics, or ligatures. However, it also contains some exceptions such as circled numbers and letters.

nonlatin_european.png

This contains many accented characters and most of the miscellaneous symbols. Contrary to its name, it also includes characters that are non-European,[1] and some obscure Latin script characters.

unifont.zip

This contains the "unihex" characters. Inside of it are 2 files: a copy of the GNU General Public License version 2, and unifont_all_no_pua-15.0.06.hex. The latter file is a copy of GNU Unifont 15.0.06 and contains glyph definitions for 112,990 characters.

ascii_sga.png

This is the Standard Galactic Alphabet mapped to the ASCII layout. Only uppercase and lowercase A-Z are mapped, and the uppercase and lowercase are identical.

asciillager.png

This is a near-exact mirror of the rune-like font used in Minecraft Dungeons.

Bedrock Edition[edit | edit source]

default8.png (and related)

A modified copy of the Java Edition 1.12.2 font. The U+00A9 © COPYRIGHT SIGN has been changed. The file ascii_sga.png also reflects Java Edition; it is the SGA minecraft:alt font used when enchanting.

Characters U+00C0 À LATIN CAPITAL LETTER A WITH GRAVE through U+00A9 © COPYRIGHT SIGN are actually mapped to the C0 control codes (U+0000..U+001F). The U+007F DELETE character is mapped to the U+U+2302 ⌂ HOUSE character instead. Despite the upper two rows and ⌂ appearances, they are mapped to the characters U+0000..U+001F and U+007F. This means that typing a control character instead shows a character that is unlike the expected representation. Most fonts either show nothing, or a box with the abbreviation inside, as does GNU Unifont. The glyph_##.png files reflect Java Edition's Legacy Unicode provider. They cover characters U+0000..U+D7AF, some of U+E000..U+E1FF, and U+F900..U+FFFF.

There exist 2 Private Use Area sheets: glyph_E0.png glyph_E1.png. E0 contains glyphs for control icons, such as A button and +Control Pad right. E1 contains glyphs for miscellaneous icons, including the minecoin and Agent icon. E0 characters are categorized in emoticons.json.[2]

minecraft-ten.ttf

A TrueType font, named "Minecraft Ten". Metadata indicates it was made by Canada Type in 2018. Likely to be a commission from Mojang, as Canada Type does not list it for purchase/licensing on their website.

smooth/

Appears to be a version of Roboto generated with msdfgen. Contains only Unicode codepoints U+0000..U+04FF and U+2000..U+20FF. It is unknown what parameters were used to generate it. Unknown where this is used, if at all.

Providers[edit | edit source]

This feature is exclusive to Java Edition. 

A font is constructed from a list of providers, sources that provide characters to use. Different providers use different formats and methods of constructing characters. The default font uses all except for 1, ttf.

Bitmap provider[edit | edit source]

The bitmap provider defines simple bitmap glyphs – glyphs from textures. It references a single PNG file, a list of the characters it applies to, an optional height, and an ascent.

Textures may be any size, and glyphs may be any color. White glyphs can be colored any other color in-game. Other colors retain that tint when re-colored. Black glyphs always appear black. The glyph's widths are automatically determined based on the last right-most column of pixels containing any alpha value above 0. Glyphs themselves must not be larger than 512×512 pixels. The chars field is a list of strings. The characters inside each string entry inside this list are mapped to the corresponding positions in the referenced file. The texture is divided evenly according to the number of strings in the list, and the length of the longest string in that list.

Since Java Edition 1.16 Pre-release 7, UTF-16 codepoints encoded in UTF-8 sequences can be used by use of surrogate pairs. To convert a character into a surrogate pair, one can use the following equations, where C is the codepoint in decimal:

  • High Surrogate (first codepoint): ((C - 65536) - (C % 1024)) ÷ 1024 + 55296
  • Low Surrogate (second codepoint): (C % 1024) + 56320

When the length of either the list or the strings is not a divisor of the resource's dimensions, it can result in an unexpected division of glyphs. The Unicode escape \u0000 can be used to add padding in the list. Padding acts as a "dummy character", so that the glyph data at that corresponding position in the file is not assigned a character.

The height field is the scale of the resulting glyph. This scale should generally match the a glyph's individual height, or be a power of it. While heights outside of this recommended range are allowed and are valid, the resulting glyphs declared inside the provider appears warped when rendered in-game. The height field is optional. When not defined, it defaults to 8, regardless of the underlying texture resolution.

The ascent field is the amount of vertical shifting is applied to the glyph. In typography, the ascent is the distance above the baseline to the cap height (top of glyph). The baseline in a glyph is the line where the descender begins. For example, in the lowercase letter y, the bottom end of the y extends past the baseline. In Vanilla, when the height is 8, the ascent is most often 7, as the descender is 1.

Space provider[edit | edit source]

The space provider defines the width of a character's glyph. It is the most simple provider: it contains only the character widths.

The keys of the advances are the characters, and the values are the widths. The keys must be only 1 grapheme long (multi-byte character still count as one character, like U+1F525 🔥 FIRE, which is encoded as 0xF0 0x9F 0x94 0xA5). Values must be an integer whose absolute value is less than or equal to 256. Negative values are forced to 0 when typed in chat. Although it is intended to be used for whitespace characters (characters that have "WSpace=Y" in Unicode), it can be used for any character, as long as there is no prior definition of that character's glyph.

By default, the game has two widths defined:

  • U+0020 <SPACE> SPACE is 4
  • U+200C <ZWNJ> ZERO WIDTH NON-JOINER is 0

TTF provider[edit | edit source]

The ttf provider embeds already-compiled TrueType and OpenType fonts.[b] It contains 5 fields.

The file field is a resource location to a file ending in .ttf. Path is relative from /assets/minecraft/font/.

The shift field is an array of two integers. It defines how much each glyph contained in this TrueType font is to be moved horizontally and vertically, respectively. The first element controls the horizontal shifting (positive is leftward, negative is rightward). The second element controls the vertical shifting (positive is downward, negative is upward).

The size field is similar to a bitmap provider's height field. This is a divisor by which the em-size of the font's glyphs are to be divided and then fitted into the bitmap grid. This value can vary greatly across different fonts.

The oversample field is the resolution to render at. Values that don't match the glyph's native em sizing division or DPI cause it to be anti-aliased.

The skip field is either a list of strings, or a string of the characters to which this font has no assignment. If it is a list of strings, the strings are concatenated together and then act as if it were originally a string. This allows the same input as a bitmap provider's chars.

Legacy Unicode provider[edit | edit source]

LegacyBlockSprite paeonia.png: Sprite image for paeonia in Minecraft
This section describes content that exists only in outdated versions of Minecraft. 
This feature used to be in the game but has since been removed.

The legacy_unicode provider is similar to the bitmap provider in that it loads glyphs from only textures. This format is deprecated, and is prioritized only when the "Force Unicode Font" option is turned on. It acts as a "fallback" for glyphs that no other provider has defined a texture for.

It uses a system of templates to create and add high amounts of characters. Templates are name-based, and are all PNG files. Each template file must have equal width and height. The template numbering scheme works based off of the Unicode BMP. The number used is equal to a BMP codepoint's high byte.[c][d] These template textures are called "pages". Template page "22" must cover characters U+2200 to U+22FF. Page numbers go from 00 to FF. Characters beyond U+FFFF cannot be changed through this provider. By default, each glyph is 16×16 pixels wide, so each individual template page is 256×256 pixels (16 glyphs on each line, 16 lines). Its default textures are an outdated version of GNU Unifont.[3]

The template field is a string that references a set of files. The string %s must be included in this field. %s is replaced with every valid page number, in hexadecimal.

The sizes field references a binary resource that contains the widths of each glyph. Most often, this file is called glyph_sizes.bin; this is its default name. Each character width is one byte large. The high nibble[e] records the starting position, while the lower nibble records the ending position in the 16×16 glyph grid. For this reason, the file must be 0xFFFF bytes long (65535 in decimal). A specific character's width is determined by finding its codepoints byte. The character 'A' has a codepoint of U+0041, so byte offset 0x41 (65 in decimal) would be addressed. A square character occupying the entire grid (pixel width #1 [0, 0x0] through #16 [15, 0xF]) would have a value of 0x0F (15 in decimal). Widths cannot extend past 16 pixels, and characters whose codepoints are greater than U+FFFF are not handled.

Some codepoints are invalid on their own. These are the surrogate pairs; they are used to encode codepoints higher than U+FFFF in UTF-8. This means that the template pages D8 D9 DA DB DC DD DE DF are invalid and cannot be used.

It was removed in 23w17a.

Unihex provider[edit | edit source]

The unihex provider is a replacement for the Legacy Unicode provider, introduced in 23w17a. It uses the GNU Unifont .hex format. It references a ZIP archive that contains a number of .hex files.

The hex_file field is a resource location to a .ZIP archive file. It must be openable by Java's ZipFile. Inside, there must be at least 1 .hex file at the root of the archive. Subdirectories are not walked through and filenames with an extension different from ".hex" are ignored. Filenames must follow normal file resource name rules. In each .hex file is 1 or more glyph definitions. A glyph definitions is 1 line only, and follows the format codepoint:data. The codepoint is the Unicode codepoint, without the U+ or 0x. It must have 4, 5, or 6 digits. The data is a hexadecimal number that encodes the glyph data. Glyphs are always 16 pixels high. Glyphs can be 8, 16, 24, or 32 pixels wide.[f]

The size_overrides field is a list of compounds that define custom widths for a range of characters. Each element in this list must be a compound. Inside of each compound are 4 fields. from is the starting character for the range at which this size override applies to. to is the ending character for this range. Both from and to must be 1 character. left is the position of the left-most column of glyphs in range. right is the position of the right-most column of glyphs in range. Both left and right cannot be less than 0 or greater than 32.

Reference provider[edit | edit source]

The reference provider serves one purpose: to include another provider only once. It can be used to include providers from other fonts in other resource packs.

Referenced providers are guaranteed to be loaded only once, no matter how many times they are included.

The id field is a resource location to another font file.

Filters[edit | edit source]

This section describes content that may be included in Java Edition. 
This content has appeared in Java Edition 1.20.5 development versions, but the full update containing it has not been released yet.

All font providers can be selectively included depending upon toggle-able buttons in-game.

Right now, these buttons are hardcoded, preventing the extension of these font filtering capabilities beyond the preset options provided. Two buttons exist, located in Language -> Font Settings. They are "Force Uniform" and "Japanese Glyph Variants".

Emoji support[edit | edit source]

Emoji and their associated items.

Minecraft has included textures for a number of emojis. The earliest emoji textures were for ☺☻.

Since 1.15, this support has expanded. Emojis are monochromatic and behave just as any other character. The game does not support modifiers, such as skin tone, joining, or emoji presentation. The skin tone modifiers U+1F3FB..U+1F3FF 🏻 🏼 🏽 🏾 🏿 do not apply colored skin tones to their applicable emojis, and instead show tones as their Unifont glyphs. Joining multiple emojis via U+200D ‍ ZERO WIDTH JOINER to create 1 single emoji is not supported; multi-sequence emoji such as 👨‍👩‍👧 instead show as 👨‌👩‌👧 with dotted boxes showing ZWJ between them. Variation selectors, which control presentation, are displayed as dotted boxes with VSnumber.

As of 1.20.2, Minecraft has support for 43 emoji.

Bedrock Edition does not support any character above U+FFFF, which includes many modern emoji. It does not include any textures for emojis below that either; only those provided by GNU Unifont below U+FFFF are included and visible.

Special characters[edit | edit source]

In Java Edition, there are 2 characters that are accessible only through technical means. The first is U+FFFD � REPLACEMENT CHARACTER, which appears when either the U+FFFD character is typed, or there is an invalid UTF-8 multi-byte sequence. The second is the "notdef" character,[g] seen when a character that has no texture in the currently-used font is typed. It is hardcoded and cannot be modified through resource packs. It is sometimes called "tofu" in the typographical community because of its similarity in shape to a block of tofu.

In Bedrock Edition, a character with no texture data appears as a blank space. The U+FFFD � REPLACEMENT CHARACTER shown belongs to GNU Unifont.

Bold text[edit | edit source]

This section of the article is empty. 
You can help by adding to it.

Experience bar text[edit | edit source]

This section of the article is empty. 
You can help by adding to it.

Shadow[edit | edit source]

In most places text is rendered, a shadow appears beneath every character. This shadow is a copy of the character's glyph, with the red, green, and blue values divided by 4 and positioned 12.5% south-east of the character, relative to its spacing. Regardless of the resolution of the character's texture, the shadow is always moved by 12.5%. In the default font (assets/minecraft/textures/font/ascii.png), the shadow position is moved 1 pixel down and to the right.

For pixels where the glyph overlaps with the shadow, the above glyph's channels have 1 subtracted from them. For example, in areas where a white (#FFFFFF) glyph's pixel overlaps a shadow's, the white pixel becomes #FEFEFE.

Glowing text[edit | edit source]

Comparison of all the dyed glowing texts.

Glow Ink Sac applied on a sign causes a character to create eight copies of itself in all eight directions. This results in the font appearing to have a thick outline. Glowing text always renders with an emissive texture, so it appears bright in darkness. The text takes priority over the outline; outlines appear below a character's pixels if they conflict. However, it is a rendering effect that does not actually emit any light. The player can use a black ink sac on the sign to remove the glow.

In a sign's block data,  front_text or  back_text's  has_glowing_text controls whether the text glows.

See also[edit | edit source]

History[edit | edit source]

Java Edition Classic
0.0.2aAdded the default ASCII font called default.gif.
0.0.17aThe characters 0 and O now display differently.
Java Edition
1.111w49aAdded Unifont to fully support multi-languages.
1.513w09aThe font texture is now able to be changed in a resource pack.
Added support for glyph resolutions above 16×16.
1.6.2reuploadFixed distorted font when HD font is used.[4]
1.13pre6The ASCII font has changed and new characters have been added.
Characters such as .,()*|{}ªº"' are thinner.
The U+00A9 © COPYRIGHT SIGN has changed.
Some math symbols (±≥≤÷≈°ⁿ²) have changed.
accented.png and nonlatin_european.png has been added.
Fonts are now saved as TrueType font files.
pre7 Reverted TrueType font.
Retroactively removed TrueType font file from pre-6.
1.14.2Pre-Release 2Added a default Vietnamese font.
Changed a character in default Armenian font.
Added missing glyphs in default Hebrew and Armenian fonts.
Added Runic alphabet to the default font.
Pre-Release 2Added a default Vietnamese font.
Changed a character in default Armenian font.
Added missing glyphs in default Hebrew and Armenian fonts.
Added Runic alphabet to the default font.
Pre-Release 4Added more characters to the default font.
Corrected several glyphs.
1.15Pre-release 6Changed the textures of ßβ.
1.15 accented.png and nonlatin_european.png have more characters.
1.1620w17aRaw JSON text format now has a font key, which defines the font to use for that component. Default is minecraft:default.
Added the unihex provider.
The full range of Unicode is now supported in font definitions.
Pre-release 7
1.1821w37aAdded the illageralt font, from Minecraft Dungeons.
1.1922w11aAdded the space provider.
Rendering of the space glyph is no longer hardcoded; it needs to be declared manually in the font.
1.2023w17aRemoved the legacy_unicode provider.
Added the unihex provider.
Added the reference provider.
Updated GNU Unifont to 15.0.01.
Pre-release 5Updated GNU Unifont to 15.0.03.
releaseUpdated GNU Unifont to 15.0.06.
1.20.323w45aUpdated GNU Unifont to 15.1.04.
1.20.524w06aAdded font variant filters to font providers.
Pocket Edition Alpha
v0.1.0Added the default ASCII font called default8.png.
v0.11.0build 1Added Unifont to fully support multi-languages.

Trivia[edit | edit source]

  • The general typographic design has been present in many previous games by Markus Persson, such as Legend of the Chambered.
  • According to the Bedrock Edition Chat Settings and the Bedrock Edition game files, the name of the font used by Bedrock Edition is called "Mojangles".
  • According to Java Edition 1.13-pre6, the name of the font used by Java Edition is called "Minecraft Seven".
  • The copyright symbol © was often misinterpreted in other resource packs because of a texture error. This was fixed in 1.13.
  • The characters U+00B8 CEDILLA ¸ and U+0327 COMBINING CEDILLA ◌̧ used to be swapped.
  • Although not in the changelog or specification, the default copy of the unihex provider also includes a  __ranges field in the entries of  size_overrides. It is a list of strings, being the Unicode block names of the applying range.
  • The New Nintendo 3DS Edition's font is a combination of the pre-1.12 JE font and some select characters from GNU Unifont. In addition, the ® sign was changed.

Gallery[edit | edit source]

References[edit | edit source]

  1. MC-199249
  2. https://github.com/TwistedAsylumMC/bedrock-unicode-characters
  3. MC-197772
  4. MC-17673 — Distorted fonts when using a converted texturepack on startup — resolved as "Fixed".
  1. For example, {"text": "Here and there", "font": "illageralt"}
  2. Despite its name, the TTF provider accepts OpenType ("otf") fonts.
  3. "High byte" refers to the first byte in a multi-byte sequence. For example, the high byte of 0xABCD is 0xAB.
  4. For codepoints with digits less than 4, they are padded with 0. For example, 0xF3 would be padded to 0x00F3: page 00. Likewise, 0xFAE is 0x0FAE: page 0F.
  5. A nibble is "half" of a byte. For example, in the byte 0xAB, A is the high nibble and B is the low nibble.
  6. Because the height is always 16, the width can be calculated. It is always equal to len(data) // 4.
  7. Is not an actual Unicode character. "notdef" refers to the name given to it in font formats.

External links[edit | edit source]