Skip to content

Noto Serif Khitan Small Script: unify the layout into one font and rebuild from a packaged UFO - #3

Open
Kushim-Jiang wants to merge 8 commits into
notofonts:mainfrom
Kushim-Jiang:main
Open

Kushim-Jiang wants to merge 8 commits into
notofonts:mainfrom
Kushim-Jiang:main

Conversation

@Kushim-Jiang

@Kushim-Jiang Kushim-Jiang commented Oct 8, 2026 •

Copy link
Copy Markdown

What this does

Replaces the Glyphs sources with a packaged UFO + designspace, collapses the family into a single font that carries both writing directions, renames the family to Noto Serif Khitan Small Script, and bumps the version from 1.000 to 2.200.

Why the design changed

1. The rotated face is no longer needed

The previous design was three faces of the same typeface: a horizontal face, and two faces for vertical text — vertical (upright) and rotated (glyphs turned counter-clockwise).

KSS is an upright script, so a vertical column should be upright too. When the original design was made, Microsoft Office already laid KSS out upright, but web layout did not, so the rotated face existed purely to let a browser produce an upright column out of rotated glyphs. Web layout now supports upright KSS as well, so rotated has no remaining purpose and is dropped.

2. Horizontal and vertical are one font

Vertical KSS is a feature, not a separate design: the vertical case differs only by vert and by the placement GPOS applies. The horizontal and vertical faces therefore merge into one font with both layouts enabled.

Further, the composition is now done with GPOS placement instead of GSUB substitution. The old approach needed some twenty-odd sets of positional glyph forms plus the substitution chains that selected them; positioning the components means the font needs only one glyph per component. That removes the bulk of the glyph set and cuts the file size substantially.

3. Non-stacking "linear" layout as ss01

We also used the BabelStone Khitan Small Script fonts as a reference point (BabelStone Fonts : Khitan Small Script Fonts). Their three faces map onto this font as:

BabelStone This font
Khitan Small Vertical our horizontal mode
Khitan Small Rotated our vertical mode (the old rotated face, merged into this one)
Khitan Small Linear ss01

BabelStone's Linear face performs no cluster composition, which some editions need — for example Daniel Kane, The Kitan Language and Script (Brill, 2009). ss01 reproduces that: composition is switched off and every component is left in its own cell.

Changes

One source, one font

  • sources/NotoSerifKhitanSmallScript.ufo and sources/NotoSerifKhitanSmallScript.designspace replace sources/NotoSerifKhitanSmallScript.glyphspackage. The layout is generated in Python and therefore cannot live in a Glyphs source; the packaging step exports the composed font — including the composed features.fea — as a UFO the notofonts pipeline can build.
  • sources/config-serif.yaml now points at the designspace. The noto recipe provider requires a designspace (a bare UFO crashes instantiateUfo), which is why one is shipped alongside the UFO.
  • The Fangsong families are removed: NotoFangsongKSSRotated.glyphspackage, NotoFangsongKSSVertical.glyphspackage, config-fangsong-rotated.yaml, config-fangsong-vertical.yaml, and their four documentation/ pages.

Naming and credits

  • Noto Khitan Small Script → Noto Serif Khitan Small Script (README and packaged source).
  • Credits updated: The updated font is designed by LIU Zhao and SHAO Lansu, and the OpenType layout is redesigned by Kushim JIANG.

Character set

  • The character set is synchronized with Unicode 18.0.
  • The source ships no Latin — neither glyphs nor Latin features — and takes it from Google Fonts GF Latin Core via includeSubsets in config-serif.yaml. Shipping this design's own Latin would duplicate that subset.

Tests

  • qa/shaping_tests/khitan-small-script.json: 16 shaping regression tests covering horizontal composition, the ss01 linear mode, vertical composition, punctuation, and the ligatures. They are in the fontbakery shaping-test format and are picked up by the existing com.google.fonts/check/shaping configuration. They were generated from the design build and pass both on that build's output and on the font built from this source.

Housekeeping

  • .gitignore: the gftools-builder by-products (sources/build.ninja, sources/.ninja_log, sources/full-designspace/, sources/instance_ufos/).
  • Version bumped to 2.200, a major release.

Companion change

The source is produced by the noto-serif-kss design repository, whose code/package.py (with the new latin=False packaging path and the vertical-metrics work) is the other half of this change.

Only the Serif family is still built, so its two Fangsong siblings and their
configs and documentation go.
The layout is composed in Python, so the Glyphs source cannot carry it: the
UFO holds the composed features.fea and the designspace is what the build
instantiates from. The source has no Latin, because config-serif.yaml adds the
Google Fonts Latin Core subset.
The updated font is designed by LIU Zhao and SHAO Lansu, and the OpenType
layout is redesigned by Kushim JIANG.
Regression tests for the layout in qa/shaping_tests, in the format the
shaping check reads: horizontal and vertical stacking, ss01, the U+16FE4
filler, the vertical punctuation forms and the dlig ligatures.
The source is regenerated from noto-serif-kss, which now declares 2.200.
The design build composes the positioning and GDEF with FeaComposer and the
fontTools feature-file AST now, and declares one lookup per kind of statement so
every language system shares it. The packaged source drops from 87 to 29 GPOS
lookups and the built font shrinks by 2 KB.

The composition is unchanged: 3,864 generated cases and the 16 tests in
qa/shaping_tests shape identically to the previous source.
The build clones the Google Fonts subset repositories into subset-files/ while
resolving includeSubsets. It is a cache, not a source.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant