Bundled fonts

Warning: This document is old & has moved. Please update any links:
https://chromium.googlesource.com/apps/libapps/+/HEAD/nassh/docs/fonts.md

The following fonts are loaded automatically as web fonts with Secure Shell.

In addition, Powerline symbol fonts are bundled and loaded as web fonts for:

  • Powerline For Cousine
  • Powerline For Inconsolata
  • Powerline For Noto Sans Mono
  • Powerline For Roboto Mono
  • Powerline For Source Code Pro

The fonts are stored in the gs://chromeos-localmirror/secureshell/distfiles/ bucket and downloaded as part of the mkdeps build script. See nassh/bin/fonts and nassh/bin/fonts_create_bundle.

Powerline fonts

Powerline glyphs are included for the fonts listed above. The fonts were created using Nerd Fonts which uses FontForge python scripting.

Powerline uses 6 or so symbol glyphs such as anchor, pencil, arrows, and 7 glyphs in the unicode Private Use Area starting at U+E0A0. Another 30 or so ‘Powerline Extra Smbols’ have been defined in the same PUA block which have been included.

The typical way of using Powerline fonts, is to patch glyphs into an existing font file (e.g. NotoSansMono-Regular.ttf). This seems to also be the common way they are used for the web. Our approach is different, to only generate the Powerline glyphs in a separate *.woff2 web font, and then list both fonts in the css font list.

@font-face {
  font-family: 'Noto Sans Mono';
  src: url('../fonts/NotoSansMono-Regular.woff2') format('woff2');
}

@font-face {
  font-family: 'Powerline For Noto Sans Mono';
  src: url('../fonts/PowerlineForNotoSansMono.woff2') format('woff2');
  unicode-range: U+2693,U+270E,U+2714,U+273C,U+2B06-2B07,U+E0A0-E0D4;
}

body {
  font-family: 'Noto Sans Mono', 'Powerline for Noto Sans Mono';
}

While the same Powerline glyphs are used for each web font, they must be sized to match the height and width of the corresponding monospaced font they are being used with.

Steps to create font

  1. Download the font to match - e.g. NotoSansMono-Regular.ttf from https://github.com/googlefonts/noto-fonts/blob/HEAD/hinted/NotoSansMono.
  2. Install FontForge - sudo apt install fontforge.
  3. Get Nerd Fonts - git clone https://github.com/ryanoasis/nerd-fonts.git.
  4. Apply Nerd Fonts patch - git apply 0001-Generate-Powerline-fonts-for-nassh.patch.
  5. Get woff2_compress - git clone https://github.com/google/woff2.git. Follow instructions to build. It may also require https://github.com/google/brotli.git.
  6. Using FontForge, create a new empty font file, e.g. PowerlineForNotoSansMono.sfd. Values for width and height must be copied from the actual font into this file before we use nerd fonts to patch it. Set font name fields in Element > Font Info > PS Names.
  7. Open the full font to match in FontForge and find the following information. The values for NotoSansMono-Regular.ttf are shown below for example.
    • Element > Font Info > General Copy values across.
    • Element > Font Info > OS/2 > Metrics Copy values across. You might need to experiment with the different values to get Powerline glyphs which match the correct height.
    • Open one of the glyphs in the full font file and find its width (e.g. 600). Create a single glyph in the empty file at position 0 by clicking on it to select it, then choosing Metrics > Set Width and enter the width. This glyph is empty, which is fine. The nerd-fonts patching script will use this information to patch the empty font file and produce glyphs of the correct width and height.
    • The files created in this way for the current set of fonts used by terminal are checked into terminal/fonts.
  8. Run for f in PowerlineFor*.sfd; do fontforge -script ~/work/nerd-fonts/font-patcher --powerline --powerlineextra -ext ttf $f; done.
  9. This will generate a file such as PowerlineForNotoSansMono.ttf.
  10. Compress to woff2 - for f in PowerlineFor*.ttf; do ~/work/woff2/out/woff2_compress $f; done.
  11. This final PowerlineForNotoSansMono.woff2 file is used.