code wiki / _hdl_build / nx_aa_font_demo.nx

nx_aa_font_demo.nx source

↩ module page · 100 lines · 4250 B

1// nx_aa_font_demo.nx -- R2 start: OUR OWN sovereign vector font (filled glyph outlines), rendered by the 2// AA rasterizer. Designs N/E/O from primitives (rect stems, a 12-gon ring bowl, a parallelogram diagonal) 3// and renders "NEON" anti-aliased -> _offc/nx_aa_neon.png. Proves a hand-designed sovereign font renders 4// SMOOTH text (no bitmap, no GDI). Coords are grid (ss=4) units, y-down. license_tier: ORIGINAL 5import "nx_aa_raster.nx" 6import "nx_png_write.nx" 7const K_MAGIC_1520: i64 = 1520 8 9// append a CW rectangle contour (x0,y0)-(x1,y0)-(x1,y1)-(x0,y1) 10func emit_rect(xs: *i64, ys: *i64, cstart: *i64, clen: *i64, np: *i64, nc: *i64, x0: i64, y0: i64, x1: i64, y1: i64) -> i64 { 11 let p: i64 = np[0] 12 xs[p+0]=x0; ys[p+0]=y0 13 xs[p+1]=x1; ys[p+1]=y0 14 xs[p+2]=x1; ys[p+2]=y1 15 xs[p+3]=x0; ys[p+3]=y1 16 cstart[nc[0]]=p; clen[nc[0]]=4 17 np[0]=p+4; nc[0]=nc[0]+1 18 return 0 19} 20// append a CW quad (a slanted bar / diagonal) 21func emit_quad(xs: *i64, ys: *i64, cstart: *i64, clen: *i64, np: *i64, nc: *i64, ax: i64, ay: i64, bx: i64, by: i64, cx: i64, cy: i64, dx: i64, dy: i64) -> i64 { 22 let p: i64 = np[0] 23 xs[p+0]=ax; ys[p+0]=ay 24 xs[p+1]=bx; ys[p+1]=by 25 xs[p+2]=cx; ys[p+2]=cy 26 xs[p+3]=dx; ys[p+3]=dy 27 cstart[nc[0]]=p; clen[nc[0]]=4 28 np[0]=p+4; nc[0]=nc[0]+1 29 return 0 30} 31// append a 12-gon circle contour at (cx,cy) radius r; rev=1 winds it backwards (a hole) 32func emit_circle(xs: *i64, ys: *i64, cstart: *i64, clen: *i64, np: *i64, nc: *i64, cs: *i64, sn: *i64, cx: i64, cy: i64, r: i64, rev: i64) -> i64 { 33 let p: i64 = np[0] 34 var k: i64 = 0 35 while k < 12 { 36 var kk: i64 = k 37 if rev == 1 { kk = 11 - k } 38 xs[p+k] = cx + (r * cs[kk]) / 1000 39 ys[p+k] = cy + (r * sn[kk]) / 1000 40 k = k + 1 41 } 42 cstart[nc[0]]=p; clen[nc[0]]=12 43 np[0]=p+12; nc[0]=nc[0]+1 44 return 0 45} 46 47func main() -> i64 { 48 let W: i64 = 380 49 let H: i64 = 110 50 let ss: i64 = 4 // grid = K_MAGIC_1520 x 440 51 52 let cs: *i64 = sys_mmap(8*12) as *i64 53 let sn: *i64 = sys_mmap(8*12) as *i64 54 cs[0]=1000; cs[1]=866; cs[2]=500; cs[3]=0; cs[4]=0-500; cs[5]=0-866; cs[6]=0-1000; cs[7]=0-866; cs[8]=0-500; cs[9]=0; cs[10]=500; cs[11]=866 55 sn[0]=0; sn[1]=500; sn[2]=866; sn[3]=1000; sn[4]=866; sn[5]=500; sn[6]=0; sn[7]=0-500; sn[8]=0-866; sn[9]=0-1000; sn[10]=0-866; sn[11]=0-500 56 57 let xs: *i64 = sys_mmap(8*256) as *i64 58 let ys: *i64 = sys_mmap(8*256) as *i64 59 let cstart: *i64 = sys_mmap(8*64) as *i64 60 let clen: *i64 = sys_mmap(8*64) as *i64 61 let np: *i64 = sys_mmap(16) as *i64; np[0]=0 62 let nc: *i64 = sys_mmap(16) as *i64; nc[0]=0 63 64 let TOP: i64 = 60 65 let BOT: i64 = 380 66 let STEM: i64 = 55 67 68 // ---- N at pen=60 ---- 69 var px: i64 = 60 70 emit_rect(xs,ys,cstart,clen,np,nc, px, TOP, px+STEM, BOT) 71 emit_rect(xs,ys,cstart,clen,np,nc, px+165, TOP, px+220, BOT) 72 emit_quad(xs,ys,cstart,clen,np,nc, px+STEM, TOP, px+110, TOP, px+220, BOT, px+165, BOT) 73 // ---- E at pen=340 ---- 74 px = 340 75 emit_rect(xs,ys,cstart,clen,np,nc, px, TOP, px+STEM, BOT) 76 emit_rect(xs,ys,cstart,clen,np,nc, px, TOP, px+205, TOP+55) 77 emit_rect(xs,ys,cstart,clen,np,nc, px, 195, px+175, 250) 78 emit_rect(xs,ys,cstart,clen,np,nc, px, BOT-55, px+205, BOT) 79 // ---- O at pen=620 (center x=620+160) ---- 80 px = 620 81 emit_circle(xs,ys,cstart,clen,np,nc, cs,sn, px+160, 220, 160, 0) // outer (CW) 82 emit_circle(xs,ys,cstart,clen,np,nc, cs,sn, px+160, 220, 95, 1) // inner (CCW -> hole) 83 // ---- N at pen=1000 ---- 84 px = 1000 85 emit_rect(xs,ys,cstart,clen,np,nc, px, TOP, px+STEM, BOT) 86 emit_rect(xs,ys,cstart,clen,np,nc, px+165, TOP, px+220, BOT) 87 emit_quad(xs,ys,cstart,clen,np,nc, px+STEM, TOP, px+110, TOP, px+220, BOT, px+165, BOT) 88 89 let cov: *u8 = sys_mmap(W*H) 90 aa_render(xs, ys, cstart, clen, nc[0], cov, W, H, ss) 91 92 let rgb: *u8 = sys_mmap(W*H*3) 93 var i: i64 = 0 94 while i < W*H*3 { rgb[i]=255 as u8; i=i+1 } 95 aa_blit(rgb, W, H, 0, 0, cov, W, H, 30, 50, 200) // a blue-ish ink, AA over white 96 97 nx_png_write_rgb("_offc/nx_aa_neon.png\x00" as *u8, rgb, W, H) 98 sys_write(1, "aa_font_demo: wrote _offc/nx_aa_neon.png\n\x00" as *u8, 41) 99 return 0 100}