code wiki / _hdl_build / nx_ttf_fontlib_gate.nx

nx_ttf_fontlib_gate.nx source

↩ module page · 113 lines · 6694 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" 9 10func 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 } 11func 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 } 12 13func main() -> i64 { 14 g_puts("TTF-FONTLIB gate: the sovereign font engine library (nishi_sans.ttf full-ASCII -> AA glyphs -> RGBA blend)\n" as *u8) 15 var pass: i64=0 16 var ttl: i64=0 17 18 let fh: *i64 = tf_load("web_assets/nishi_sans.ttf\x00" as *u8) 19 ttl=ttl+1; g_puts(" T1 loads our emitted nishi_sans.ttf (glyf/loca/head/cmap/hhea/hmtx all found): " as *u8) 20 if fh != (0 as *i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8); g_puts("TTF-FONTLIB-GATE passed 0/1 verdict=RED\n" as *u8); sys_exit(1); return 1 } 21 22 // 'A' at 32px 23 let recA: *i64 = tf_glyph(fh, 65, 32) 24 var solid: i64=0 25 var mid: i64=0 26 if recA != (0 as *i64) { 27 let cov: *u8 = recA[0] as *u8 28 let cw: i64 = recA[1] 29 let chh: i64 = recA[2] 30 var i: i64=0 31 while i < cw*chh { 32 let a: i64 = cov[i] as i64 33 if a >= 240 { solid=solid+1 } 34 if a >= 24 { if a <= 216 { mid=mid+1 } } 35 i=i+1 36 } 37 } 38 ttl=ttl+1; g_puts(" T2 'A'@32px rasterizes (solid pixels " as *u8); g_num(solid); g_puts(" > 60): " as *u8) 39 if solid > 60 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 40 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) 41 if mid > 20 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 42 43 // proportional metrics from hmtx 44 let advi: i64 = tf_char_adv(fh, 105, 32) // 'i' 45 let advm: i64 = tf_char_adv(fh, 109, 32) // 'm' 46 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) 47 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) } 48 49 // NEW punctuation present ('.' ',' '(' '?' each rasterize ink) 50 var punct_ok: i64=1 51 let plist: *i64 = sys_mmap(64) as *i64 52 plist[0]=46; plist[1]=44; plist[2]=40; plist[3]=63; plist[4]=58; plist[5]=47 53 var pi: i64=0 54 while pi<6 { 55 let rp: *i64 = tf_glyph(fh, plist[pi], 24) 56 var ink: i64=0 57 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 } } 58 if ink < 4 { punct_ok=0 } 59 pi=pi+1 60 } 61 ttl=ttl+1; g_puts(" T5 FULL-ASCII punctuation rasterizes (. , ( ? : / all have ink): " as *u8) 62 if punct_ok==1 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 63 64 // cache identity 65 let recA2: *i64 = tf_glyph(fh, 65, 32) 66 ttl=ttl+1; g_puts(" T6 per-(char,size) cache returns the identical record: " as *u8) 67 if (recA2 as i64) == (recA as i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 68 69 // RGBA blend draw 70 let W: i64=220 71 let H: i64=40 72 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer 73 let px: *u8 = sys_mmap(W*H*4+16) 74 nx_framebuffer_init(fb, px, W, H) 75 var wi: i64=0 76 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 } 77 let adv: i64 = tf_draw_text(fh, fb, 4, 4, "Nishi, s-class! (AA)\x00" as *u8, 20, 24, 20, 20, 40, 0) 78 var dark: i64=0 79 var gray: i64=0 80 var k: i64=0 81 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 } 82 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) 83 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) } 84 85 // regression guard for the STEM-CLIP bug: 'l' is a pure vertical stem whose ink sits near the RIGHT of 86 // its coverage box; the old draw clipped at natural-advance and dropped it. Render "llll" -> must have ink. 87 let W2: i64=80 88 let H2: i64=30 89 let fb2: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer 90 let px2: *u8 = sys_mmap(W2*H2*4+16) 91 nx_framebuffer_init(fb2, px2, W2, H2) 92 var w2i: i64=0 93 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 } 94 tf_draw_text(fh, fb2, 4, 4, "illi\x00" as *u8, 4, 20, 0, 0, 0, 18) 95 var stemdark: i64=0 96 var k2: i64=0 97 while k2<W2*H2 { if (px2[k2*4] as i64)<100 { stemdark=stemdark+1 } k2=k2+1 } 98 ttl=ttl+1; g_puts(" T8 STEM-CLIP regression: 'illi' stems render (dark " as *u8); g_num(stemdark); g_puts(" > 40): " as *u8) 99 if stemdark > 40 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 100 101 // NEG: missing file 102 let bad: *i64 = tf_load("web_assets/__no_such_font__.ttf\x00" as *u8) 103 ttl=ttl+1; g_puts(" T9 NEG: missing font file refuses to load: " as *u8) 104 if bad == (0 as *i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 105 // NEG: out-of-range char 106 let recX: *i64 = tf_glyph(fh, 9999, 24) 107 ttl=ttl+1; g_puts(" T10 NEG: out-of-range char yields no glyph: " as *u8) 108 if recX == (0 as *i64) { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 109 110 g_puts("TTF-FONTLIB-GATE passed " as *u8); g_num(pass); g_puts("/" as *u8); g_num(ttl) 111 if pass==ttl { g_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 112 g_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1 113}