• v2.11.10 11d346cacb

    Emily released this 2026-11-07 18:08:53 +01:00 | 7 commits to main since this release

    Universal Gaming 2.11.10

    The chess figures were cut off. This release fixes how they are drawn.

    What was wrong

    Two separate defects, both visible on the board:

    1. The figures came from different fonts. White pieces use the hollow
      Unicode set (U+2654-U+2659) and black pieces the filled one (U+265A-U+265F).
      On macOS the two sets resolved to different fonts with different metrics, so
      the white figures were drawn larger and lower than the black ones - and got
      shaved flat by the edge of their square.
    2. Every figure sat on a dark rectangle. The board drew a box shadow behind
      the glyph's layout box instead of behind the figure, so a blurred dark
      square appeared behind every piece.

    What changed

    • The figures now ship with the app: a 6 KB subset of Noto Sans Symbols 2
      containing exactly the twelve chess glyphs (OFL 1.1, licence included). One
      font for both colours means identical metrics on Android, iOS, macOS, Linux
      and the web - no fallback fonts, no colour emoji, no platform surprises.
    • tools/build_chess_font.py rebuilds that subset from the upstream font and
      centres the outlines on the baseline with symmetric ascent and descent, so no
      text engine can place the figures off-centre. Measured on the real renderers,
      the figures now sit within 1.5 px of the middle of their square.
    • The shadow follows the figure's outline instead of a rectangle.
    • Nothing clips a figure any more: Clip.none on the glyph stacks and on the
      board squares, visible text overflow everywhere.
    • Figures are drawn at 92% of a square; the small glyphs in the header, the
      move history, the captured-pieces row and the promotion dialog were scaled to
      match.
    • The VS15 presentation selector and the hollow-glyph workaround for white
      pawns are gone: with a bundled font that has no emoji, neither is needed.

    Checks

    • flutter analyze: clean
    • flutter test --concurrency=1: 304 tests pass
    • Verified on the real renderers, not just in tests: a headless Chrome capture
      of the web build and a screenshot of the macOS build, plus pixel measurements
      of the figure bounds inside a square.

    Downloads

    Platform File
    Android UniversalGaming-2.11.10-android.apk
    Android (Play) UniversalGaming-2.11.10-android.aab
    iOS (unsigned) UniversalGaming-2.11.10-ios-unsigned.ipa
    macOS UniversalGaming-2.11.10-macos.dmg
    Linux x86_64 UniversalGaming-2.11.10-linux-x86_64.AppImage
    Web UniversalGaming-2.11.10-web.zip

    SHA256SUMS-2.11.10.txt lists the checksums of every asset.

    Downloads