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}