Re-take the two measurements that were about the old bundled face
Both were stated as measured facts about IosevkaTerm and went stale with the
swap, which is what the task asked for rather than an edit that keeps the
sentence and changes the name.
`.notdef` is a filled cell with four triangular counters in Quasi Mono, 102..530
by 0..700 units, where it was a hollow box in IosevkaTerm. It is the base's own
drawing either way: the pipeline patches gaps and does not replace what a base
draws.
The precomposed-glyph case holds. Quasi Mono maps U+00E9 to a glyph of its own,
so a shaper that composes `e` + acute into one glyph still has nothing after the
base to place, and the comment's third case is still reachable.
4 files changed,
+40 insertions,
-23 deletions
| 2383 |
2383 |
|
]
|
| 2384 |
2384 |
|
|
| 2385 |
2385 |
|
[[patch.unused]]
|
| 2386 |
|
- |
name = "synckit-client"
|
| 2387 |
|
- |
version = "0.8.0"
|
|
2386 |
+ |
name = "kberg"
|
|
2387 |
+ |
version = "0.1.0"
|
| 2388 |
2388 |
|
|
| 2389 |
2389 |
|
[[patch.unused]]
|
| 2390 |
|
- |
name = "synckit-config"
|
| 2391 |
|
- |
version = "0.2.0"
|
|
2390 |
+ |
name = "ops-status"
|
|
2391 |
+ |
version = "0.1.0"
|
|
2392 |
+ |
|
|
2393 |
+ |
[[patch.unused]]
|
|
2394 |
+ |
name = "painhours"
|
|
2395 |
+ |
version = "0.1.0"
|
|
2396 |
+ |
|
|
2397 |
+ |
[[patch.unused]]
|
|
2398 |
+ |
name = "tagtree"
|
|
2399 |
+ |
version = "0.4.0"
|
|
2400 |
+ |
|
|
2401 |
+ |
[[patch.unused]]
|
|
2402 |
+ |
name = "docengine"
|
|
2403 |
+ |
version = "0.7.0"
|
| 2392 |
2404 |
|
|
| 2393 |
2405 |
|
[[patch.unused]]
|
| 2394 |
2406 |
|
name = "quasi-axum"
|
| 2423 |
2435 |
|
version = "0.18.0"
|
| 2424 |
2436 |
|
|
| 2425 |
2437 |
|
[[patch.unused]]
|
| 2426 |
|
- |
name = "docengine"
|
| 2427 |
|
- |
version = "0.7.0"
|
|
2438 |
+ |
name = "synckit-client"
|
|
2439 |
+ |
version = "0.8.0"
|
| 2428 |
2440 |
|
|
| 2429 |
2441 |
|
[[patch.unused]]
|
| 2430 |
|
- |
name = "kberg"
|
| 2431 |
|
- |
version = "0.1.0"
|
| 2432 |
|
- |
|
| 2433 |
|
- |
[[patch.unused]]
|
| 2434 |
|
- |
name = "ops-status"
|
| 2435 |
|
- |
version = "0.1.0"
|
| 2436 |
|
- |
|
| 2437 |
|
- |
[[patch.unused]]
|
| 2438 |
|
- |
name = "painhours"
|
| 2439 |
|
- |
version = "0.1.0"
|
| 2440 |
|
- |
|
| 2441 |
|
- |
[[patch.unused]]
|
| 2442 |
|
- |
name = "tagtree"
|
| 2443 |
|
- |
version = "0.4.0"
|
|
2442 |
+ |
name = "synckit-config"
|
|
2443 |
+ |
version = "0.2.0"
|
| 18 |
18 |
|
# The house font pipeline. A git dependency rather than a vendored binary: the
|
| 19 |
19 |
|
# face rebuilds from a checkout, which is the rule that keeps the glyph set and
|
| 20 |
20 |
|
# the face from becoming two sources of truth.
|
| 21 |
|
- |
quasi-type = { git = "https://makenot.work/git/max/quasi-type.git", version = "0.1" }
|
|
21 |
+ |
#
|
|
22 |
+ |
# PINNED BY REVISION, which nothing else in the tree does and which this one
|
|
23 |
+ |
# needs. A git dep here decides what a shipped binary *draws*, and Alloy asserts
|
|
24 |
+ |
# that the face shop bundles is the face the image installs — its Containerfile
|
|
25 |
+ |
# cuts the same two faces from a `QUASI_TYPE_REV` of its own. Resolving this at
|
|
26 |
+ |
# branch head would let one image ship a terminal drawing an older glyph set
|
|
27 |
+ |
# than everything around it, and nothing would say so.
|
|
28 |
+ |
#
|
|
29 |
+ |
# Under `~/Code/.cargo/config.toml`'s `[patch]` the working copy wins and this
|
|
30 |
+ |
# rev is ignored, which is the point of that block; off the tree it is what a
|
|
31 |
+ |
# build resolves. Bump it in the same pass as a glyph-set change, alongside
|
|
32 |
+ |
# Alloy's `QUASI_TYPE_REV`.
|
|
33 |
+ |
quasi-type = { git = "https://makenot.work/git/max/quasi-type.git", version = "0.1", rev = "6d076b7f85268381f6cd34dd0d28e84c574929cc" }
|
| 431 |
431 |
|
//
|
| 432 |
432 |
|
// The two other shapes this can take are handled by the
|
| 433 |
433 |
|
// same line: where the shaper composes the pair into one
|
| 434 |
|
- |
// precomposed glyph (both faces do for e + acute) there is
|
|
434 |
+ |
// precomposed glyph (Quasi Mono maps U+00E9 to a glyph of
|
|
435 |
+ |
// its own, measured 2026-08-17, as IosevkaTerm did) there is
|
| 435 |
436 |
|
// nothing after the base to place, and where a font
|
| 436 |
437 |
|
// positions marks by GPOS the mark's advance is zero and
|
| 437 |
438 |
|
// its offsets do the work.
|
| 161 |
161 |
|
/// Char → the font that has it and its glyph id there.
|
| 162 |
162 |
|
///
|
| 163 |
163 |
|
/// Falls back to `(PRIMARY, 0)` when nothing has it, which draws whatever
|
| 164 |
|
- |
/// the bundled font puts at `.notdef` — a hollow box in most faces. The
|
|
164 |
+ |
/// the bundled font puts at `.notdef`. Measured on Quasi Mono 2026-08-17:
|
|
165 |
+ |
/// a filled cell with four triangular counters, 102..530 by 0..700 units —
|
|
166 |
+ |
/// the base's own drawing, not the house set's, since the pipeline patches
|
|
167 |
+ |
/// gaps rather than replacing what a base draws. It was a hollow box under
|
|
168 |
+ |
/// IosevkaTerm. Either reads as "this is not a character". The
|
| 165 |
169 |
|
/// cell still holds its columns either way, so a missing glyph costs the
|
| 166 |
170 |
|
/// look of the line and never its layout.
|
| 167 |
171 |
|
pub(crate) fn glyph_id_for(&mut self, c: char) -> (FontId, GlyphId) {
|