wai: graphics-vector, the extension text of wai.graphics.vector, §1–§3 (Draft, D7-1) #215
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/d7-1-graphics-text"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adds
wai/extensions/graphics-vector.md, the extension text ofwai.graphics.vector: titles, credits and other authored graphics carried as integer drawing instructions, which the sink rasterises into an overlay layer. This is phase D7-1 of D7.This is Draft text. §1–§3 are written in full. §4–§6 and Annexes A and B are headings, each saying what it will hold; later revisions of the Draft fill them. D7-2 onward follow: the formats crate and corpus (D7-2), the raster (D7-3), the independent checker written from this text alone (D7-4), the stroke sets with Annexes A and B (D7-5), the text layer and §5 (D7-7), the sidecar (D7-9), and packages and §6 (D7-13). Nothing is registered. The capability string, SPEC §3 and §5, the registry and the codecs wait for D7-12.
What lands
wai/extensions/graphics-vector.md(new), Status Draft.wai/README.md: theextensions/row names vector graphics. This file is the only place the tree lists extensions; there is no extensions index.wai/CHANGELOG.md: one entry, newest first.No code, no SPEC edit, no registry or codec change, and no workflow change.
Section outline
WOS1· 2.2WVG1header · 2.3WVG1tables · 2.4ITEMand the scene · 2.5 Canonical rules · 2.6 Caps and bounds · 2.7 Refusals and their order · 2.8 Versioning · 2.9 The canonical buffers · 2.10 The digest sidecar · 2.11 Text digests · 2.12 The JSON authoring form (informative)WSF1), Annex B (the stroke set's digest): headings only.Ambiguities resolved in the text
Each was a place where an implementer reading only the design's §1–§3 would have had to guess. The text now decides it.
too_large) and names no step fortb,t0,dur, the design sides, orn_sizes,n_ratesandn_itemsof 0. Step 2 now lists the count and length fields it caps, theninline_len + held_len, then the exact length. Every other header range isfield_range, at the head of the record pass (step 4), in field order.paint,textand matrix slots, and a run'srulemust hold a fixed 0 or0xFFFF. These arefield_range, notpayload_malformed: only fields namedzeroare zero fields.field_range, overKEYSand then the slot-kind check overITEMS.ruby_len ≥ 1whenruby ≠ 0. The design listed this under canonical rule 4 (payload_malformed), but it reads only an earlier field of its own record, which is the record pass's rule. It is now in theTEXTrow (field_range). Rule 4 keeps "names an earlier block" and the byte range.WOS1counts below their minimum (n_glyphs = 0,notes_len = 0) areoutline_malformedat step 2, in field order withtoo_large. The design's step 2 named only caps.WOS1glyph with points and no contours. "The last contour end equalsn_points − 1" is undefined with no ends, so step 4 now refusesn_contours = 0withn_points ≥ 1.RW·RHin the cost. The design said "the hull of its glyph records' boxes (0 if every box is empty)". The hull is now taken over the clipped pixel boxes of the glyph records whose box is not empty, where a box is empty whenbw = 0orbh = 0.τ.bw·bh, which is 0 or 1.clipsmay be[].xatowardxb. The column crossing is stated equivalently as the floor of the exact y on the row piece's line, so it is the same from either end.decorative) are stated in §2.3, since the vocabulary lands with §5.RATEorder is compared by cross-multiplication,num_a·den_b < num_b·den_a.Where the wording departs from the design, and why (no rule changes)
div255is defined by its own closed form,⌊(2x + 255)/510⌋.Reviews recorded
§3.6–§3.8, line by line, against review A's independent implementation of §3.3–§3.8.
X(y)as a floor; the row range;y_top/y_bot; the direction kept; row-local y.xa = xb; boundaries strictly between, ordered fromxa; the unsigned crossing with floor and ceiling, which that implementation asserts equal to the signed form; the cell from the smaller x;fa,fb,coverandarea; zero-cover sub-pieces skipped.[0, h)dropped; the left fold; thec + 1 < wguard; columns ≥wdropped; the prefix scan.L, the origin and the point), flattening (the levels and both closed forms), and the contour grammar's closing cases.No disagreement. With that procedure, §3.8's worked triangle gives
|v|= 1280 and 512, clipped and unclipped, as the text states.§2.7's order, walked against A-F6's examples.
kind = 4withref = 0→field_rangeat step 4.kindis the record's first field; the first-reference rule is step 5(g).interp = 2 + jwithj ≥ n_tables→field_rangeat step 4.carriageoutside {0, 1} →field_rangeat step 4, before 5(a)'s inline sum.kindout of range →field_rangeat step 4.interp ≠ 0→payload_malformedat 5(b).payload_malformedat 5(a).field_rangeat 5(c).§3.4(b), walked against RC1–RC3.
c(f)and the box clamp match the script's cost and box functions.w·hterms the text defines.Checks
scripts/check-wai-section-refs.py: clean.[a, b), followed later by a§Nand then a Markdown link with no]between, lets its link pattern run across lines. Those intervals are now written inclusively, or without the bracket. The D7-5 and D7-7 text should avoid the same shape.scripts/check-public-names.shwith the private list exported: clean on each changed file, one per invocation. Also clean at CI scope, over every tracked file.scripts/check-comparative-prose.sh: clean ongraphics-vector.mdandREADME.md, and at CI scope.CHANGELOG.mdas an argument, it reports 7 historical lines, identical onorigin/main; its default scope exempts the CHANGELOG. The added entry alone is clean.scripts/check-no-vanity-metrics.sh: clean.Merge notes
wai/README.md: a one-line change, whichgit merge-treemerges cleanly against both heads (4e7155b9ande1acae78).wai/CHANGELOG.md: it conflicts at the top of the file, as expected. Keep both entries.wai-section-refs.yml;no-vanity-metrics.yml(comparative prose and vanity; the names check runs on the push to main).🤖 Generated with Claude Code