Liberation Sans is a free font from Red Hat, metric-compatible with Arial. See https://github.com/liberationfonts/liberation-fonts Version 2.1.5, taken from the upstream liberation-fonts-ttf-2.1.5.tar.gz release archive (sha256 7191c669bf38899f73a2094ed00f7b800553364f90e2637010a69c0e268f25d0). The Regular, Bold, Italic and Bold Italic weights are vendored, packed in LiberationSans-ttf.7z. The Mono family is in ..\LiberationMono, and the Serif family isn't vendored. The .ttf files are the archive's, byte for byte: LiberationSans-Regular.ttf sha256 76d04c18ea243f426b7de1f3ad208e927008f961dc5945e5aad352d0dfde8ee8 LiberationSans-Bold.ttf sha256 788abee4c806d660e8aee46689dd8540cd4bb98da03dcc9d171ce3efd99a9173 LiberationSans-Italic.ttf sha256 e5bae5c4cde31f22142753855f4f8fb86da6ff39955ed3c0a11248b0d16948b0 LiberationSans-BoldItalic.ttf sha256 698da70fc191cc5f33ad4d6d3fe830fe4624b898ea2e3169955928b7c491f1ee They are packed to keep the tree small. ..\MakeFonts.py unpacks them under Junk\Fonts when it regenerates a sheet, and `MakeFonts.py --unpack LiberationSans` leaves them there for opening a .bmfc in the BMFont window. Licensed under the SIL Open Font License 1.1 (see OFL.txt), which permits bundling the font, or a sprite sheet baked from it, with a game. Note "Liberation" is a Reserved Font Name: an unmodified copy like this one keeps the name, but a modified derivative must not use it. Sprite sheets are produced with BMFont 64, version 1.14b_beta. See https://www.angelcode.com/products/bmfont/ Each .bmfc generates one sheet, one face at one size, and BMFont cannot pack several together. Glass only loads single-page fonts, so ..\MakeFonts.py stacks the sheets of one size into one page, the smallest power of two they fit on, and points each face's .fnt into it. Glass uploads a page once however many fonts name it, so mixed regular and bold text draws from one texture. A page is named for its family and size, with no face: LiberationSans-16px_0.png 128x256 LiberationSans-Regular-16px body text; smallest size without visible artifacts LiberationSans-Bold-16px bold body text LiberationSans-Italic-16px italic body text LiberationSans-BoldItalic-16px bold italic body text LiberationSans-32px_0.png 256x256 LiberationSans-Regular-32px LiberationSans-Bold-32px headings LiberationSans-64px_0.png 256x256 LiberationSans-Regular-64px display Bold, Italic and Bold Italic are the real faces, not GDI's synthesized ones. A .bmfc names the face's file in fontFile and sets isBold and isItalic to match, which makes GDI choose that face from the file. The same flags on the Regular file give a different, artificially emboldened sheet. Their .bmfc files are the 16px and 32px Regular ones with only those three lines changed and an icon= line for that face's own angle mark. Each face's own sheet is the smallest power-of-two page BMFont fits it on: 64x128 at 16px, 128x256 at 32px and 256x256 at 64px. `MakeFonts.py --fit` finds these, by trying sizes smallest first, and writes them into the .bmfc files. Rerun it when a character range changes, and `MakeFonts.py --check --fit` reports any sheet whose page could be smaller. A page needs more than 4096 pixels at 16px, so 64x64 is out of reach. The faces' pages are laid out in a grid, the one with the smallest power-of-two page and then the squarest. Sizes double so they land on each other's pixel grid exactly, which keeps a sheet scaled to another size sharp instead of resampling between them. Regenerate them with ..\MakeFonts.py, which runs ..\BMFont\bmfont64.exe on each .bmfc: python ..\MakeFonts.py LiberationSans every size of this family python ..\MakeFonts.py LiberationSans-32px one size, with all its faces python ..\MakeFonts.py --check LiberationSans report which sizes would change, and change nothing The faces of a size always rebuild together, since they share a page. On the machine that made them, everything here regenerates exactly. Every run also fails, and names the codepoints, if a sheet is missing a glyph its .bmfc asks for, which is what happens when the font lacks a character in a chars= range. Sheets below 20px turn useSmoothing and useClearType off and useRenderFromOutline on, because GDI's rasterizer stops serving us at that scale. Its smoothing spreads every sub-pixel stem across two pixels at partial coverage so none reaches full opacity, which reads as grey mush; and its hinting rounds some stems up to 2px while their neighbours round down, so 'f' came out visibly bolder than the rest of the alphabet. Rendering from the outline instead gives uniform 1px stems. Above 20px GDI is fine and these stay at the settings the 32px sheet was tuned with. The outline setting belongs to the face, not the size: Philosopher needs GDI's hinting at small sizes for exactly the reason Liberation Sans needs to escape it, so its sheets leave it off. Sizes are in pixels, not points -- an editor set to "10" usually means 10pt, which is 13.3px at 96 DPI. Each sheet also packs a U+2220 ANGLE mark from its own *-angle.png, since Liberation Sans has no such glyph and the phasor labels need one. Each is drawn to its face, with the face's stem weight, and the italic marks lean as the letters do. Those .png files are generated -- see ..\AngleGlyph\README -- and are checked in so a sheet rebuilds from its .bmfc alone. BMFont gives an imported icon all four channels, so it reads back as chnl 15, which Glass maps to a null channel and samples as a plain sprite.