code wiki / _hdl_build / nx_ttf_fontlib_gate.nx

nx_ttf_fontlib_gate.nx source

↩ module page · 288 lines · 18995 B

1// nx_ttf_fontlib_gate.nx -- gate for the sovereign TTF font ENGINE LIBRARY (the browser's text renderer). 2// Proves: real load of our emitted nishi_sans.ttf; glyph rasterization with genuine ANTI-ALIASING 3// (intermediate coverage levels -- the visual difference vs the 1-bit 8x8 bitmap); REAL proportional 4// metrics from hmtx ('i' narrower than 'm'); FULL-ASCII coverage incl the NEW punctuation; the 5// per-(char,size) cache returns the identical record; the RGBA framebuffer alpha-blend puts ink on the 6// canvas. NEG: a missing font file refuses to load; an out-of-range char yields no glyph. 7// expect_exit: 0 license_tier: ORIGINAL 8import "nx_ttf_fontlib.nx" 9import "nx_gate_verdict.nx" 10 11func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12// big-endian u16 writer for the runtime-synthesised cmap fixture (T20) 13func tfg_w16(b: *u8, o: i64, v: i64) -> i64 { b[o] = ((v / 256) % 256) as u8; b[o+1] = (v % 256) as u8; return o + 2 } 14func g_num(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 } 15 16func main() -> i64 { 17 g_puts("TTF-FONTLIB gate: the sovereign font engine library (nishi_sans.ttf full-ASCII -> AA glyphs -> RGBA blend)\n" as *u8) 18 var pass: i64=0 19 var ttl: i64=0 20 let ctr__dry: *i64 = gv_ctr() 21 22 // The house-font half needs our emitted web_assets/nishi_sans.ttf. Where it is absent (the NAS serving 23 // root carries only web_assets/nishi.ttf) that is a PRECONDITION, not a failure of the engine: the old 24 // code exited RED here and so could never reach the professional-face teeth on the one host that 25 // publishes. gv_need makes it SKIP, and the Liberation half below runs on its own fixture. 26 let fh: *i64 = tf_load("web_assets/nishi_sans.ttf\x00" as *u8) 27 var hpresent: i64 = 0 28 if fh != (0 as *i64) { hpresent = 1 } 29 if gv_need("fixture web_assets/nishi_sans.ttf (our emitted house font, 96 glyphs, 1000 upem)" as *u8, hpresent, ctr__dry) == 1 { 30 ttl=ttl+1; g_puts(" T1 loads our emitted nishi_sans.ttf (glyf/loca/head/cmap/hhea/hmtx all found): " as *u8) 31 pass=pass+1; g_puts("PASS\n" as *u8) 32 33 // 'A' at 32px 34 let recA: *i64 = tf_glyph(fh, 65, 32) 35 var solid: i64=0 36 var mid: i64=0 37 if recA != (0 as *i64) { 38 let cov: *u8 = recA[0] as *u8 39 let cw: i64 = recA[1] 40 let chh: i64 = recA[2] 41 var i: i64=0 42 while i < cw*chh { 43 let a: i64 = cov[i] as i64 44 if a >= 240 { solid=solid+1 } 45 if a >= 24 { if a <= 216 { mid=mid+1 } } 46 i=i+1 47 } 48 } 49 ttl=ttl+1; g_puts(" T2 'A'@32px rasterizes (solid pixels " as *u8); g_num(solid); g_puts(" > 60): " as *u8) 50 if solid > 60 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 51 ttl=ttl+1; g_puts(" T3 GENUINE ANTI-ALIASING (intermediate coverage pixels " as *u8); g_num(mid); g_puts(" > 20; the 1-bit bitmap has 0): " as *u8) 52 if mid > 20 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 53 54 // proportional metrics from hmtx 55 let advi: i64 = tf_char_adv(fh, 105, 32) // 'i' 56 let advm: i64 = tf_char_adv(fh, 109, 32) // 'm' 57 ttl=ttl+1; g_puts(" T4 REAL proportional metrics ('i'=" as *u8); g_num(advi); g_puts("px < 'm'=" as *u8); g_num(advm); g_puts("px): " as *u8) 58 if advi > 0 { if advi < advm { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } } else { g_puts("FAIL\n" as *u8) } 59 60 // NEW punctuation present ('.' ',' '(' '?' each rasterize ink) 61 var punct_ok: i64=1 62 let plist: *i64 = sys_mmap(64) as *i64 63 plist[0]=46; plist[1]=44; plist[2]=40; plist[3]=63; plist[4]=58; plist[5]=47 64 var pi: i64=0 65 while pi<6 { 66 let rp: *i64 = tf_glyph(fh, plist[pi], 24) 67 var ink: i64=0 68 if rp != (0 as *i64) { let cv: *u8=rp[0] as *u8; var q: i64=0; while q<rp[1]*rp[2] { if (cv[q] as i64)>128 { ink=ink+1 } q=q+1 } } 69 if ink < 4 { punct_ok=0 } 70 pi=pi+1 71 } 72 ttl=ttl+1; g_puts(" T5 FULL-ASCII punctuation rasterizes (. , ( ? : / all have ink): " as *u8) 73 if punct_ok==1 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 74 75 // cache identity 76 let recA2: *i64 = tf_glyph(fh, 65, 32) 77 ttl=ttl+1; g_puts(" T6 per-(char,size) cache returns the identical record: " as *u8) 78 if (recA2 as i64) == (recA as i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 79 80 // RGBA blend draw 81 let W: i64=220 82 let H: i64=40 83 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer 84 let px: *u8 = sys_mmap(W*H*4+16) 85 nx_framebuffer_init(fb, px, W, H) 86 var wi: i64=0 87 while wi<W*H { px[wi*4]=255 as u8; px[wi*4+1]=255 as u8; px[wi*4+2]=255 as u8; px[wi*4+3]=255 as u8; wi=wi+1 } 88 let adv: i64 = tf_draw_text(fh, fb, 4, 4, "Nishi, s-class! (AA)\x00" as *u8, 20, 24, 20, 20, 40, 0) 89 var dark: i64=0 90 var gray: i64=0 91 var k: i64=0 92 while k<W*H { let r: i64=px[k*4] as i64; if r<80 { dark=dark+1 } if r>=80 { if r<=200 { gray=gray+1 } } k=k+1 } 93 ttl=ttl+1; g_puts(" T7 RGBA alpha-blend draw (advance " as *u8); g_num(adv); g_puts("px, dark " as *u8); g_num(dark); g_puts(" > 150, AA-gray " as *u8); g_num(gray); g_puts(" > 60): " as *u8) 94 if adv > 100 { if dark > 150 { if gray > 60 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } } else { g_puts("FAIL\n" as *u8) } } else { g_puts("FAIL\n" as *u8) } 95 96 // regression guard for the STEM-CLIP bug: 'l' is a pure vertical stem whose ink sits near the RIGHT of 97 // its coverage box; the old draw clipped at natural-advance and dropped it. Render "llll" -> must have ink. 98 let W2: i64=80 99 let H2: i64=30 100 let fb2: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer 101 let px2: *u8 = sys_mmap(W2*H2*4+16) 102 nx_framebuffer_init(fb2, px2, W2, H2) 103 var w2i: i64=0 104 while w2i<W2*H2 { px2[w2i*4]=255 as u8; px2[w2i*4+1]=255 as u8; px2[w2i*4+2]=255 as u8; px2[w2i*4+3]=255 as u8; w2i=w2i+1 } 105 tf_draw_text(fh, fb2, 4, 4, "illi\x00" as *u8, 4, 20, 0, 0, 0, 18) 106 var stemdark: i64=0 107 var k2: i64=0 108 while k2<W2*H2 { if (px2[k2*4] as i64)<100 { stemdark=stemdark+1 } k2=k2+1 } 109 ttl=ttl+1; g_puts(" T8 STEM-CLIP regression: 'illi' stems render (dark " as *u8); g_num(stemdark); g_puts(" > 40): " as *u8) 110 if stemdark > 40 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 111 112 // NEG: missing file 113 let bad: *i64 = tf_load("web_assets/__no_such_font__.ttf\x00" as *u8) 114 ttl=ttl+1; g_puts(" T9 NEG: missing font file refuses to load: " as *u8) 115 if bad == (0 as *i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 116 // NEG: out-of-range char 117 let recX: *i64 = tf_glyph(fh, 9999, 24) 118 ttl=ttl+1; g_puts(" T10 NEG: out-of-range char yields no glyph: " as *u8) 119 if recX == (0 as *i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 120 121 } // end of the house-font half 122 g_puts("TTF-FONTLIB-GATE house-font teeth passed " as *u8); g_num(pass); g_puts("/" as *u8); g_num(ttl); g_puts("\n" as *u8) 123 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 124 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 125 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 126 ctr__dry[0] = ctr__dry[0] + pass 127 ctr__dry[1] = ctr__dry[1] + ttl 128 129 // ---- 2026-09-02, BR4 first half (/compare/browser "Real font files + shaping"): the engine reads a 130 // PROFESSIONAL face and every metric is READ, never assumed. Liberation Sans (SIL-OFL, 2048 upem, 131 // 908 kern pairs, 1,076 composites) is the fixture; absent = SKIP via gv_need, never RED. 132 // TWO candidate paths, one fixture: the laptop tree ships it under web_assets/fonts/, the NAS lands it 133 // under knowledge/fonts/ (the only durable directory the sovereign write boundary admits), via the 134 // pinned mirror knowledge/fetched/cmp_browser_liberation-fonts-ttf-2.1.5.tar.gz and nx_untar. 135 var lf: *i64 = tf_load("web_assets/fonts/LiberationSans-Regular.ttf\x00" as *u8) 136 if lf == (0 as *i64) { lf = tf_load("knowledge/fonts/LiberationSans-Regular.ttf\x00" as *u8) } 137 var lpresent: i64 = 0 138 if lf != (0 as *i64) { lpresent = 1 } 139 if gv_need("fixture LiberationSans-Regular.ttf under web_assets/fonts/ or knowledge/fonts/ (Liberation Sans 2.1.5, SIL-OFL)" as *u8, lpresent, ctr__dry) == 1 { 140 g_puts(" face: upem=" as *u8); g_num(tf_upem(lf)); g_puts(" asc=" as *u8); g_num(tf_asc(lf)); g_puts(" desc=" as *u8); g_num(tf_desc(lf)) 141 g_puts(" kern_pairs=" as *u8); g_num(tf_kern_count(lf)); g_puts(" glyphs=" as *u8); g_num(tf_nglyphs(lf)); g_puts("\n" as *u8) 142 // T11: unitsPerEm is READ from head. The first cut assumed 1000; this face is 2048, so a 143 // 1000-assumption would rasterize at half size and halve every advance -- silently. 144 var t11: i64 = 0 145 if tf_upem(lf) == 2048 { t11 = 1 } 146 gv_check("T11-unitsPerEm-READ-from-head-is-2048-not-the-old-assumed-1000" as *u8, t11, ctr__dry) 147 // T12: ascender/descender READ from hhea (1854 / -434 in this face; the old code hard-coded 760) 148 var t12: i64 = 0 149 if tf_asc(lf) == 1854 { if tf_desc(lf) == (0 - 434) { t12 = 1 } } 150 gv_check("T12-ascender-descender-READ-from-hhea-1854-and-minus-434" as *u8, t12, ctr__dry) 151 // T13: the 1000-em advances reproduce the estate's hand-baked oracle table (font_adv_em_base_oracle, 152 // generated from this very file on 2026-07-29): space 277, i 222, m 833, W 943. Two rulers agreeing 153 // is what licenses retiring the baked one. 154 g_puts(" adv_em1000: space=" as *u8); g_num(tf_adv_em1000(lf, 32)); g_puts(" i=" as *u8); g_num(tf_adv_em1000(lf, 105)) 155 g_puts(" m=" as *u8); g_num(tf_adv_em1000(lf, 109)); g_puts(" W=" as *u8); g_num(tf_adv_em1000(lf, 87)); g_puts("\n" as *u8) 156 var t13: i64 = 0 157 if tf_adv_em1000(lf, 32) == 277 { if tf_adv_em1000(lf, 105) == 222 { if tf_adv_em1000(lf, 109) == 833 { if tf_adv_em1000(lf, 87) == 943 { t13 = 1 } } } } 158 gv_check("T13-hmtx-1000em-advances-reproduce-the-banked-oracle-table-space277-i222-m833-W943" as *u8, t13, ctr__dry) 159 // T14: pair kerning from the kern table: A,V is negative (pulls closer) and equals V,A in this 160 // face; the neg control i,i has no pair and reads exactly 0. 161 let kav: i64 = tf_kern_em1000(lf, 65, 86) 162 let kva: i64 = tf_kern_em1000(lf, 86, 65) 163 let kii: i64 = tf_kern_em1000(lf, 105, 105) 164 g_puts(" kern_em1000: AV=" as *u8); g_num(kav); g_puts(" VA=" as *u8); g_num(kva); g_puts(" ii=" as *u8); g_num(kii); g_puts("\n" as *u8) 165 var t14: i64 = 0 166 if kav < 0 { if kav == kva { t14 = 1 } } 167 gv_check("T14-kern-table-pair-AV-is-negative-and-equals-VA" as *u8, t14, ctr__dry) 168 var t14b: i64 = 0 169 if kii == 0 { t14b = 1 } 170 gv_check("T14b-neg-control-unkerned-pair-ii-reads-exactly-0" as *u8, t14b, ctr__dry) 171 // T15: 'A' at 32px has an ink height of capHeight*32/upem = 1409*32/2048 = 22 rows (+-2). Under 172 // the old 1000-upem assumption the outline sampled at twice the scale and the cap would read ~44 173 // rows clipped by the cell -- this tooth is what the upem fix changes. 174 let recA32: *i64 = tf_glyph(lf, 65, 32) 175 var inkrows: i64 = 0 176 var lm_A: i64 = 0 - 1 177 if recA32 != (0 as *i64) { 178 let cov: *u8 = recA32[TF_R_COV] as *u8 179 let cw: i64 = recA32[TF_R_CW] 180 let chh: i64 = recA32[TF_R_CHH] 181 lm_A = recA32[TF_R_LM] 182 var ry: i64 = 0 183 while ry < chh { 184 var any: i64 = 0 185 var rx: i64 = 0 186 while rx < cw { if (cov[ry*cw+rx] as i64) >= 128 { any = 1 } rx = rx + 1 } 187 inkrows = inkrows + any 188 ry = ry + 1 189 } 190 } 191 let want_cap: i64 = (1409*32)/2048 192 g_puts(" 'A'@32px ink rows=" as *u8); g_num(inkrows); g_puts(" want~" as *u8); g_num(want_cap); g_puts("\n" as *u8) 193 var t15: i64 = 0 194 if inkrows >= want_cap - 2 { if inkrows <= want_cap + 2 { t15 = 1 } } 195 gv_check("T15-A-at-32px-ink-height-is-capHeight-scaled-by-the-READ-upem-22rows" as *u8, t15, ctr__dry) 196 // T16: COMPOSITE glyph decodes: e-acute (U+00E9) is a composite of 'e' + acute in this face, so its 197 // edge count must exceed 'e' alone (which must itself be non-zero). 198 let ex0: *i64 = sys_mmap(8*TF_MAXE) as *i64 199 let ey0: *i64 = sys_mmap(8*TF_MAXE) as *i64 200 let ex1: *i64 = sys_mmap(8*TF_MAXE) as *i64 201 let ey1: *i64 = sys_mmap(8*TF_MAXE) as *i64 202 let lb: *u8 = lf[TF_H_BUF] as *u8 203 let ne_e: i64 = tf_glyph_edges(lb, lf[TF_H_GLYF], lf[TF_H_LOCA], lf[TF_H_LOCFMT], lf[TF_H_NGLYPHS], tf_gid(lf, 101), ex0, ey0, ex1, ey1) 204 let ne_ea: i64 = tf_glyph_edges(lb, lf[TF_H_GLYF], lf[TF_H_LOCA], lf[TF_H_LOCFMT], lf[TF_H_NGLYPHS], tf_gid(lf, 233), ex0, ey0, ex1, ey1) 205 g_puts(" edges: e=" as *u8); g_num(ne_e); g_puts(" e-acute(composite)=" as *u8); g_num(ne_ea); g_puts("\n" as *u8) 206 var t16: i64 = 0 207 if ne_e > 0 { if ne_ea > ne_e { t16 = 1 } } 208 gv_check("T16-composite-glyph-e-acute-decodes-with-more-edges-than-e-alone" as *u8, t16, ctr__dry) 209 // T17: a NEGATIVE left side bearing ('j' xMin=-50 in this face) is carried as a left margin so no 210 // ink is clipped; 'A' (xMin>0) carries none -- both directions of the record. 211 let recJ: *i64 = tf_glyph(lf, 106, 32) 212 var lm_j: i64 = 0 - 1 213 if recJ != (0 as *i64) { lm_j = recJ[TF_R_LM] } 214 g_puts(" left margin px @32: j=" as *u8); g_num(lm_j); g_puts(" A=" as *u8); g_num(lm_A); g_puts("\n" as *u8) 215 var t17: i64 = 0 216 if lm_j > 0 { if lm_A == 0 { t17 = 1 } } 217 gv_check("T17-negative-lsb-j-carries-a-left-margin-and-A-carries-none" as *u8, t17, ctr__dry) 218 // T18: ink wider than the advance ('f' xMax=572 vs aw=569) WIDENS the cell instead of being cut 219 let recF: *i64 = tf_glyph(lf, 102, 64) 220 var t18: i64 = 0 221 if recF != (0 as *i64) { if recF[TF_R_CW] > recF[TF_R_ADV] + 2 { t18 = 1 } } 222 gv_check("T18-f-ink-past-its-advance-widens-the-cell-not-clipped" as *u8, t18, ctr__dry) 223 // T19: the cell height is DERIVED from (ascender - descender) at the READ upem 224 let recW: *i64 = tf_glyph(lf, 87, 32) 225 var t19: i64 = 0 226 if recW != (0 as *i64) { if recW[TF_R_CHH] == tf_content_px(lf, 32) + 1 { t19 = 1 } } 227 gv_check("T19-cell-height-is-ascender-minus-descender-at-the-READ-upem" as *u8, t19, ctr__dry) 228 } 229 // T20: the cmap format-4 glyphIdArray path (idRangeOffset != 0), which the first cut returned 0 for. 230 // Neither fixture uses it, so the subtable is SYNTHESISED at runtime: 2 segments, A..C via a 231 // glyphIdArray of [10, 0, 30] with idDelta 5 -> A=15, B=.notdef (0 is NOT offset), C=35; '@' is 232 // outside every segment -> 0. 233 let syn: *u8 = sys_mmap(64) 234 var so: i64 = 0 235 so = tfg_w16(syn, so, 4) // format 236 so = tfg_w16(syn, so, 38) // length 237 so = tfg_w16(syn, so, 0) // language 238 so = tfg_w16(syn, so, 4) // segCountX2 (2 segments) 239 so = tfg_w16(syn, so, 4) // searchRange (unused by the reader) 240 so = tfg_w16(syn, so, 1) // entrySelector 241 so = tfg_w16(syn, so, 0) // rangeShift 242 so = tfg_w16(syn, so, 67) // endCode[0] = 'C' 243 so = tfg_w16(syn, so, 65535) // endCode[1] 244 so = tfg_w16(syn, so, 0) // reservedPad 245 so = tfg_w16(syn, so, 65) // startCode[0] = 'A' 246 so = tfg_w16(syn, so, 65535) // startCode[1] 247 so = tfg_w16(syn, so, 5) // idDelta[0] 248 so = tfg_w16(syn, so, 1) // idDelta[1] 249 so = tfg_w16(syn, so, 4) // idRangeOffset[0] = distance from &idRangeOffset[0] to glyphIdArray[0] 250 so = tfg_w16(syn, so, 0) // idRangeOffset[1] 251 so = tfg_w16(syn, so, 10) // glyphIdArray[0] -> 'A' 252 so = tfg_w16(syn, so, 0) // glyphIdArray[1] -> 'B' = .notdef 253 so = tfg_w16(syn, so, 30) // glyphIdArray[2] -> 'C' 254 let gA: i64 = tf_cmap_lookup(syn, 0, 65) 255 let gB: i64 = tf_cmap_lookup(syn, 0, 66) 256 let gC: i64 = tf_cmap_lookup(syn, 0, 67) 257 let gAt: i64 = tf_cmap_lookup(syn, 0, 64) 258 g_puts(" synthetic glyphIdArray cmap: A=" as *u8); g_num(gA); g_puts(" B=" as *u8); g_num(gB); g_puts(" C=" as *u8); g_num(gC); g_puts(" @=" as *u8); g_num(gAt); g_puts("\n" as *u8) 259 var t20: i64 = 0 260 if gA == 15 { if gC == 35 { t20 = 1 } } 261 gv_check("T20-cmap-glyphIdArray-path-resolves-A15-C35-with-idDelta-applied" as *u8, t20, ctr__dry) 262 var t20b: i64 = 0 263 if gB == 0 { if gAt == 0 { t20b = 1 } } 264 gv_check("T20b-neg-control-glyphIdArray-zero-is-notdef-unoffset-and-outside-segments-is-0" as *u8, t20b, ctr__dry) 265 // T21: a FOREIGN-VENDOR system face (Microsoft Arial, present on the Windows host under WSL) is metric- 266 // compatible with Liberation Sans by design: our parser must read BOTH and agree on all 95 ASCII 267 // advances. Disagreement on either side means OUR cmap/hmtx read is wrong, not the fonts. 268 // NOT a gv_need: a Windows system face exists on the laptop and never on the NAS, so declaring it a 269 // precondition would make this gate SKIP forever on the one host that publishes (measured 2026-09-02: 270 // 12/12 Liberation teeth PASSED on the NAS and the verdict still read SKIP). An OPTIONAL witness 271 // announces itself either way and only counts where it can run. 272 let arial: *i64 = tf_load("/mnt/c/Windows/Fonts/arial.ttf\x00" as *u8) 273 var apresent: i64 = 0 274 if arial != (0 as *i64) { if lpresent == 1 { apresent = 1 } } 275 if apresent == 0 { g_puts(" T21 optional cross-vendor witness NOT RUN: no /mnt/c/Windows/Fonts/arial.ttf on this host (laptop-only, by design)\n" as *u8) } 276 if apresent == 1 { 277 var agree: i64 = 0 278 var ac: i64 = 32 279 while ac <= 126 { if tf_adv_em1000(arial, ac) == tf_adv_em1000(lf, ac) { agree = agree + 1 } ac = ac + 1 } 280 g_puts(" Arial vs Liberation 1000-em advances agree on " as *u8); g_num(agree); g_puts("/95 ASCII chars (upem " as *u8); g_num(tf_upem(arial)); g_puts(")\n" as *u8) 281 var t21: i64 = 0 282 if agree == 95 { t21 = 1 } 283 gv_check("T21-foreign-vendor-Arial-and-Liberation-agree-on-all-95-ASCII-advances-through-our-parser" as *u8, t21, ctr__dry) 284 } 285 let rc__dry: i64 = gv_verdict("TTF-FONTLIB-GATE" as *u8, ctr__dry, "the engine reads real faces: every metric from the file, none assumed" as *u8) 286 sys_exit(rc__dry) 287 return rc__dry 288}