Skip to main content

Three-family Broad-Latin deterministic italicification benchmark

Purpose

This clean-room benchmark evaluates the experimental Glyphs MCP italic first-pass workflow in Inter, Noto Sans, and IBM Plex Sans. It compares three deterministic candidates generated from the same Roman outlines:

  • Raw is a pure shear.
  • Partial compensation is the legacy cursivy result key in this headless benchmark. It applies the repository's pure-Python stem correction at strength 0.35; it does not invoke the Glyphs Cursivy filter.
  • Balanced uses curve interpolation strength 0.75 followed by the same deterministic correction engine at full strength.

The generated outlines are design-assistance evidence, not finished italics. The official italics are qualitative references containing deliberate drawing, rhythm, spacing, component, and character-form decisions that a mechanical first pass should not attempt to reproduce automatically.

Fixed coverage

The committed manifest fixes 543 Unicode values and the Inter/Noto Sans source glyph names. IBM Plex Sans is resolved by Unicode from its pinned Regular and Italic UFOs; 391 of the 543 values are present in both. The JSON evidence records all 152 unavailable Plex entries rather than silently dropping them.

GroupFixed manifestInterNoto SansIBM Plex Sans
Basic Latin95959595
Latin-191919191
Latin Extended through U+024F259259259158
General Punctuation48484816
Currency Symbols23232314
Letterlike Symbols1010103
Number Forms through U+218F17171714
Benchmarked total543543543391

Two historical Inter/Noto Sans source-name differences are mapped by Unicode: Tcommaaccent/Tcedilla at U+0162 and Iota/Iota-latin at U+0196.

Result: deterministic Balanced promoted

Balanced is the deterministic geometry winner in every family. It restores the measured source width of accepted conservative stem pairs and has the lowest equal-family mean error. It passes every safety gate and is promoted as the recommended experimental mode. The omitted slant_mode default remains Cursivy for backward compatibility.

FamilyTopologySource unchangedCompensated pairsRaw errorPartial errorBalanced errorAnchor error
Inter v4.1543/543543/5431352.78121.8078<0.000000000000040
Noto Sans543/543543/5431021.29120.8393<0.000000000000020
IBM Plex Sans391/391391/3911021.26070.8194<0.000000000000020
Equal-family mean3391.77771.1555<0.00000000000002

Balanced reduced mean source-width error by more than 99.99% versus both alternatives in each family. This near-zero result applies only to confidently accepted straight-side pairs. It does not measure optical completion or similarity to a deliberately drawn italic.

The review also found component transforms for which slanting a component locally and then applying its component matrix (L × S) differs from shearing the complete Roman construction (S × L). Deterministic Balanced now blocks those glyphs before generation:

FamilyAffected glyphsReflected casesOther non-commuting casesBlockedUnsafe applicationsSafety gate
Inter v4.123176 vertically scaled marks230Pass
Noto Sans22020Pass
IBM Plex Sans00000Pass

This explains the earlier d/q observation. Inter constructs d from a horizontally reflected b and q from a reflected p; local slant followed by reflection reverses their apparent direction. IBM Plex Sans draws d, p, and q directly, so those glyphs lean in the expected direction. The problem is construction-dependent, not a negative angle being supplied to selected glyphs.

The affected Inter rows are d, q, dcaron, dcroat, Ohungarumlaut, ohungarumlaut, Uhungarumlaut, uhungarumlaut, dtopbar, Tonetwo, dzcaron, Udieresismacron, udieresismacron, Adieresismacron, adieresismacron, Adotmacron, adotmacron, dz, dcurl, quotereversed, paragraphreversed, reversedsemicolon, and dong. Noto Sans is affected at paragraphreversed and reversedsemicolon.

This construction issue can also affect any method that slants component sources before applying a non-commuting transform. Balanced does not silently omit the glyphs: the reviewed batch is blocked, and the designer may explicitly rerun with skip_glyphs after deciding how to rebuild or draw those forms.

Raster review and mode separation

The 543 Inter glyphs, 543 Noto Sans glyphs, and 391 Plex glyphs were rendered at 2× scale in pages of at most 64 glyphs. The full paginated evidence and per-glyph JSON remain in the ignored .cache/italic-benchmark/results-broad-deterministic directory.

The combined 144-DPI story sheet is a deterministic 4800 × 6424 PNG. It shows capacity examples, forms that need deliberate italic redrawing, blocked component constructions, Balanced-versus-Raw overlays, and Balanced-versus-official overlays with magnified insets. Click it for the full-resolution image.

Deterministic Balanced three-family story sheet

The committed 144-DPI audit sheets prioritize component-direction risks, accepted-pair glyphs, representative categories, and the largest qualitative official-italic differences. Click an image for the full 4300 × 23800 contact sheet or 4380 × 23844 difference sheet.

Inter v4.1

Inter Broad-Latin audit contact sheet

Inter Broad-Latin audit difference sheet

Noto Sans

Noto Sans Broad-Latin audit contact sheet

Noto Sans Broad-Latin audit difference sheet

IBM Plex Sans

IBM Plex Sans Broad-Latin audit contact sheet

IBM Plex Sans Broad-Latin audit difference sheet

Dark pixels overlap, blue pixels occur only in the candidate, and coral pixels occur only in the reference. Thin blue and coral lines show the respective advance widths.

FamilyPartial vs RawBalanced vs RawBalanced vs PartialBalanced vs official
Inter v4.10.123% (64/543)0.269% (86/543)0.151% (59/543)7.237%
Noto Sans0.121% (46/543)0.205% (51/543)0.088% (40/543)29.219%
IBM Plex Sans0.106% (27/391)0.213% (50/391)0.114% (36/391)19.798%

Values are mean silhouette differences; parentheses give the count of glyphs with at least one different raster pixel. The median generated-mode difference is zero in all families because the conservative correction engine changes only accepted stem pairs. This is why Raw, partial compensation, and Balanced look identical for most glyphs, including many curved forms. With stem_compensation=1.0, the final correction restores accepted stems to their Roman perpendicular width, so it can also neutralize part of the visible intermediate difference controlled by curve_strength.

The deterministic Partial column is the pure-Python correction engine at strength 0.35. It is not the live Glyphs Cursivy filter. Real Cursivy remains host-specific and can vary with the installed Glyphs and Transformations filter version.

Official-italic differences remain qualitative and are not an optimization target. They show where a designer deliberately redrew forms beyond a mechanical emphasis companion.

Reproduction

Keep the pinned source checkouts beneath the ignored .cache/italic-benchmark directory, then run:

python3.12 scripts/benchmark_italic_sans_broad.py \
--render-scale 2 \
--page-size 64 \
--audit-limit 64

The script exits zero when every family passes. Its JSON records coverage, topology, source immutability, anchors, components and transform risks, blocked constructions, bounds, advance widths, detected and skipped stem pairs, width measurements, all four raster comparisons, failures, and runtime.

Sources are pinned at:

IBM Plex's upstream project and all three pinned benchmark sources use the SIL Open Font License 1.1. No font source or binary is committed.

Clean-room provenance

The benchmark exercises the repository's original interpolation and straight-stem correction engine. It does not call, inspect, decompile, or copy Italify or another proprietary implementation. The same conservative detector, correction limits, and promotion rules apply without family-specific optical tuning.