<feed xmlns='http://www.w3.org/2005/Atom'>
<title>vega/Makefile, branch master</title>
<subtitle>Surface runtime projecting Pure views across pixel, terminal, CLI, and web.
</subtitle>
<id>http://git.yeowoo.org/vega/atom?h=master</id>
<link rel='self' href='http://git.yeowoo.org/vega/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/'/>
<updated>2026-09-29T17:12:23Z</updated>
<entry>
<title>Wait for timers on the monotonic clock; events still see the wall clock</title>
<updated>2026-09-29T17:12:23Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-29T17:12:23Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=c919b5f81ad6cad55935fa7a22bfda9539dd584f'/>
<id>urn:sha1:c919b5f81ad6cad55935fa7a22bfda9539dd584f</id>
<content type='text'>
The terminal, the pixel surfaces and the web page reckoned when a timer
was due on the wall clock: set back, a timer waited until the clock came
again to the tick it had waited for (Pure's review 004). vega_clock is
the monotonic clock; timers are due on it, and a tick sets the time its
event sees from the wall clock (vega_now), as before.

check.py's clock_set_back runs a timer of 20 ms in the terminal with the
wall clock set back an hour 0.2 s in (Pure's build/clock-back.so, an
LD_PRELOAD of clock_gettime): 40 ticks in 0.8 s, where Vega before this
stops at 9. make check passes it --clock-back.
</content>
</entry>
<entry>
<title>Find build/upstream's HarfBuzz source of the version the build links</title>
<updated>2026-09-28T15:28:30Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T15:28:30Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=d6974ee04d553b5ad4862cf27340adab4c9e3a02'/>
<id>urn:sha1:d6974ee04d553b5ad4862cf27340adab4c9e3a02</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Follow HarfBuzz and Unicode with one command</title>
<updated>2026-09-28T15:27:28Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T15:27:28Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=96c35e7919e5e25187bd5adedda516a32cfc8639'/>
<id>urn:sha1:96c35e7919e5e25187bd5adedda516a32cfc8639</id>
<content type='text'>
text/upstream.py brings in a HarfBuzz release (default: the one the
build links) and the UCD of the Unicode version its tables came from,
builds that HarfBuzz as one static library from its amalgamated source
(no system package, any version), regenerates the Unicode tables and the
syllabic ones, holds the syllable machines to HarfBuzz's compiled ones,
and runs the text checks built against it: Unicode's conformance tests on
that UCD, random shaping against that HarfBuzz, the layout's promises,
the kern class tests, HarfBuzz's own suite. --corpus adds every installed
font (text/fonts.py, the corpus runner, now in the tree). What a new
version breaks shows as failing checks with the font and the input to
port a fix from; the generated files are left changed for review.

make check-text is those checks alone; UCD and HARFBUZZ_SRC default to
build/upstream's when the tool fetched them. Its first run found that
text/shape-build.c used clock_gettime without asking for POSIX, building
only because the system HarfBuzz's headers did. Against HarfBuzz 10.2.0
built from source and the 16.0.0 UCD, every check passes in about a
minute.
</content>
</entry>
<entry>
<title>Kern with class subtables too (kern formats 2 and 3)</title>
<updated>2026-09-28T15:13:58Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T15:13:58Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=ea6dbcf627e9a440590d0d35ff16ca7ae60d5719'/>
<id>urn:sha1:ea6dbcf627e9a440590d0d35ff16ca7ae60d5719</id>
<content type='text'>
The kern table's class subtables, OpenType's and Apple's, as HarfBuzz
reads them (hb-aat-layout-kerx-table.hh, hb-ot-kern-table.hh): format 2's
class tables give byte offsets into a kerning array, format 3's byte
classes index a value list. Both go through the same pass as pairs
(marks skipped, the kerning split between the pair). Format 2 filters the
glyphs by the class tables' digests, as HarfBuzz's accelerator does, so a
digest's false positive reads class 0 there too; what a subtable reads
must lie within it, the last one's within the table. The build checks the
subtables as HarfBuzz's sanitizer does, and still refuses state machines
(format 1) and cross-stream kerning.

text/test-kern.py makes fonts with format 2 and 3 subtables in every
order, with the edge cases that reading has (value 1, glyphs outside a
table, offsets below the array or odd, values past a subtable's or the
table's end, classes and indexes past their counts): 24 fonts, 96 plans,
the same as HarfBuzz. make check runs it where fontTools is. HarfBuzz's
suite: 5017 of 5199 the same.
</content>
</entry>
<entry>
<title>Hold shaping to HarfBuzz's own test suite, case by case</title>
<updated>2026-09-28T14:58:32Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T14:58:32Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=ddbbc39cc65946f59298eab546c906ad3dea6841'/>
<id>urn:sha1:ddbbc39cc65946f59298eab546c906ad3dea6841</id>
<content type='text'>
text/harfbuzz-suite.py reads a HarfBuzz release's test/shape/data
(in-house, text-rendering-tests, aots: fonts and inputs, many added when a
font or a shaper once went wrong) and shapes every case both ways with the
new vega-symbols shape-cases: it compiles a font's section for the scripts
its cases need (guessed as HarfBuzz guesses them), then compares each run
with HarfBuzz's, glyph for glyph and unit for unit. The oracle is HarfBuzz
run live, not the recorded outputs, which depend on options Vega has no
counterpart for (font functions, sizes, output formats). Cases asking for
what Vega does not do (user features, variations, languages, context,
cluster levels, buffer flags, vertical text) and fonts of other systems are
left out and counted by why.

text/harfbuzz-suite.known lists what differs today, and why: AAT, the
character map built from what HarfBuzz lists rather than how it maps
(format 13, symbol maps into the private use area), variation selectors,
Arabic fallback with shared glyphs, kern format 2, Zawgyi, and one run
without a plan. Any other difference fails the run; a listed case that
agrees is named. make check-harfbuzz HARFBUZZ_SRC=... runs it (make check
too, when given): 5929 cases, 5199 compared, 1355 the same.
</content>
</entry>
<entry>
<title>Set type on the pixel surfaces: the grid lays out, the fonts shape</title>
<updated>2026-09-28T14:52:35Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T14:52:35Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=0b554f2ea62a921e1c8a43ffb24ad75f428af2d6'/>
<id>urn:sha1:0b554f2ea62a921e1c8a43ffb24ad75f428af2d6</id>
<content type='text'>
vega_draw keeps what it wrote as spans (VegaSpan: a row, the columns it
was given, where its cells reached, its text and tone). A span written
where the same pen stopped follows the one before it (a field's name and
value, the help line, the prompt); one written after the pen moved (a
table's column, a list's label, a badge) starts afresh at its column, and
a badge sits flush with its end.

When the first font shapes, the pixels set type: a span and those
following it are one line of text, laid out as one paragraph in the font
stack (bidi and kerning cross the spans; each glyph takes the tone of the
span its character came from), from its column up to the nearest of its
spans' ends and the next span on the row, cut at a grapheme cluster
boundary with an ellipsis if it must be. The prompt gets a text cursor.
--symbols repeats: fonts in order of preference (at most 8); the cells,
when the first font does not shape, also fall back through them.

The check sets a label in one script, alone in its list, and holds it to
what the font that has it sets by itself (vega-symbols paragraph, which
now sizes itself to its text with width 0), pixel for pixel: Latin
kerning, Hangul, Arabic and Devanagari over DejaVu Sans, Noto Sans CJK KR
and FreeSans.
</content>
</entry>
<entry>
<title>Set text in a stack of fonts: each grapheme cluster in the first that has it</title>
<updated>2026-09-28T14:52:13Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T14:52:13Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=a4ca275ad1b5edc15474407e2852f8fe9abaac4e'/>
<id>urn:sha1:a4ca275ad1b5edc15474407e2852f8fe9abaac4e</id>
<content type='text'>
vega_layout takes fonts in order of preference (VegaFonts). A grapheme
cluster goes to the first font that has all its characters (default
ignorables aside: shaping hides them); a cluster of Common and Inherited
characters stays in the font before it when that one has it, so the spaces
between Arabic words stay in the Arabic font; failing that, the first font
with its first character, else the first font. Runs split where the font
changes too. Positions are in the first font's units, a run's pen scaled
as a whole so rounding does not add up. Callers can narrow what a font
has (a symbol file holds only the glyphs its codes reach).

vega_default_ignorable is shape.c's HarfBuzz 10.2 set, now public.
</content>
</entry>
<entry>
<title>Shape the nine Indic scripts as HarfBuzz does</title>
<updated>2026-09-28T13:49:05Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T13:49:05Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=60a3c0232bbca8d5d8c1107ab8197d272212ef42'/>
<id>urn:sha1:60a3c0232bbca8d5d8c1107ab8197d272212ef42</id>
<content type='text'>
The Indic shaper, from HarfBuzz 10.2's source: syllables found by the
Indic machine; each syllable's base consonant, its pre-base matras and
reph moved around it and masked for the basic features, applied one at
a time within the syllable; then matras, reph and pre-base-reordering
consonants placed again by what the features made. Vowel constraints,
Indic decompositions and compositions, dotted circles for broken
syllables, and per-syllable matching come with it.

Plans carry GSUB pauses (steps where the shaper does its part) and the
stages of the features the shaper asks whether they would substitute;
the runtime answers with each subtable's would_apply, as HarfBuzz does.
Masks are now the common ones and each shaper's own.

text/syllabic.py reads HarfBuzz's Ragel grammars (Indic, Khmer,
Myanmar) and compiles each to a minimal DFA with Ragel's scanner
semantics; beside the machines Ragel generated from the same grammars,
100,000 random runs each find no syllable that differs. It also reads
HarfBuzz's Indic table (Unicode 16) cell for cell.

Every installed font shapes as HarfBuzz does (213 fonts, 1,688 plans);
the Indic ones at 20,000 runs a plan (FreeSerif's eight scripts,
FreeSans, Unifont's nine without GSUB), and nine new-spec Noto Sans
fonts at 5,000.
</content>
</entry>
<entry>
<title>Speak AT-SPI2 on the accessibility bus from the display, over Vega's own D-Bus</title>
<updated>2026-09-28T12:25:21Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T12:25:21Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=6052b048467f392f4eb9fb5b268cae15e94691d5'/>
<id>urn:sha1:6052b048467f392f4eb9fb5b268cae15e94691d5</id>
<content type='text'>
vega display --access joins the accessibility bus as AT-SPI2 objects for
screen readers such as Orca, with no toolkit, ATK or libdbus: dbus.c
speaks the D-Bus wire format (EXTERNAL authentication, headers, aligned
bodies, calls, replies, signals). The tree follows what the say surface
says: a heading, a label per field, a list box per list whose items know
their place and which is selected and focused, tables, the entry, the
keys as buttons; answers come from the app when asked, one object has the
focus, and focus moves are said as events. Assistive technology can act
too: Selection focuses a row, Action presses a key. The live loop now
draws only when something changed, so a screen reader's questions no
longer cost frames. The check walks the tree with gdbus on a private
session bus with at-spi-bus-launcher, and follows the focus through keys,
Selection, Action and the events.
</content>
</entry>
<entry>
<title>Set paragraphs into lines: bidi, script runs, shaping, line breaking, visual order</title>
<updated>2026-09-28T12:03:50Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T12:03:50Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/vega/commit/?id=202e6bf4677565c0cfbef5340119d0f9674bf17d'/>
<id>urn:sha1:202e6bf4677565c0cfbef5340119d0f9674bf17d</id>
<content type='text'>
text/layout.c puts the checked parts together: a paragraph's levels,
scripts resolved for Common and Inherited characters, break
opportunities, one shaping to measure, lines broken at the last
opportunity that fits (trailing spaces hang, and a line that shapes
wider than measured backs off), then per line L1, runs of one level and
one script shaped again, the runs in L2's order and their glyphs placed.
test-layout checks 30,000 random mixed-script paragraphs: lines cover
the text, mandatory breaks end lines, lines fit when they can, and
glyphs come in the order UAX #9 gives the characters. vega-symbols
paragraph draws a layout through the symbol file's glyphs.
</content>
</entry>
</feed>
