code wiki / _hdl_build / nx_render_ascii.nx
nx_render_ascii.nx source
↩ module page · 69 lines · 3569 B
1// nx_render_ascii.nx -- END-TO-END visual render: HTML string -> layout tree -> block geometry ->
2// paint into a framebuffer -> ASCII dump to the terminal. Composes the gated browser pipeline organs
3// (no new algorithms): nx_layout_from_dom + nx_layout_block + nx_paint_walk_layout + nx_paint_fb_ascii.
4// This is rung 1 of the render-to-window arc: prove HTML renders to PIXELS, visibly. (rung 2 = an
5// on-screen X11 window; rung 3 = wire nishi fetch -> render -> window.)
6import "nx_syscalls.nx"
7import "nx_css_tokenize.nx"
8import "nx_css_apply.nx"
9import "nx_css_color_decode.nx"
10import "nx_layout_box.nx"
11import "nx_layout_from_dom.nx"
12import "nx_layout_block.nx"
13import "nx_paint_solid_rect.nx"
14import "nx_paint_text.nx"
15import "nx_font_bitmap_5x7.nx"
16import "nx_paint_walk_layout.nx"
17import "nx_paint_fb_ascii_dump.nx"
18
19func r_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
20
21func main() -> i64 {
22 let html: *u8 = "<body><h1>Nishi</h1><p>browser</p></body>\x00"
23 let html_len: i64 = r_slen(html)
24 let VW: i64 = 96 // viewport width (px) == framebuffer width
25 let VH: i64 = 40 // framebuffer height (px)
26
27 // ---- HTML -> layout box tree ----
28 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES * 512 + 16)) as *LayoutBox
29 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree
30 nx_layout_tree_init(tree, boxes, 512)
31 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES + 8)) as *LayoutFromDomStack
32 let stk_idx: *i64 = (sys_mmap(8 * 64)) as *i64
33 nx_layout_from_dom_stack_init(stk, stk_idx, 64)
34 if nx_layout_from_dom(html, html_len, tree, stk) != 0 { sys_write(2, "layout-from-dom FAIL\n" as *u8, 20); return 1 }
35
36 // ---- block layout: compute x/y/w/h geometry (empty CSS cascade -> default block flow) ----
37 let prop_buf: *u8 = sys_mmap(256)
38 let ltable: *LayoutPropTable = (sys_mmap(NX_LAYOUT_PROP_TABLE_BYTES)) as *LayoutPropTable
39 nx_layout_prop_table_init(ltable, prop_buf)
40 let resolve: *CssResolveCtx = (sys_mmap(NX_CSS_RESOLVE_CTX_BYTES)) as *CssResolveCtx
41 resolve.root_font_size_px = 16
42 resolve.parent_font_size_px = 16
43 resolve.parent_dimension_px = VW
44 let lctx: *LayoutCtx = (sys_mmap(NX_LAYOUT_CTX_BYTES)) as *LayoutCtx
45 nx_layout_ctx_init(lctx, tree, 0 as *CssComputedDecl, 0, html, VW, resolve)
46 nx_layout_block_layout(lctx, ltable, 0)
47
48 // ---- framebuffer ----
49 let fb_pixels: *u8 = (sys_mmap((VW * VH * 4) as nx_size)) as *u8
50 let fb: *Framebuffer = (sys_mmap(NX_FRAMEBUFFER_BYTES as nx_size)) as *Framebuffer
51 nx_framebuffer_init(fb, fb_pixels, VW, VH)
52 nx_framebuffer_clear(fb)
53
54 // ---- paint the layout tree into the framebuffer (background + text) ----
55 let ptable_buf: *u8 = (sys_mmap(64)) as *u8
56 let ptable: *PaintPropTable = (sys_mmap(NX_PAINT_PROP_TABLE_BYTES as nx_size)) as *PaintPropTable
57 nx_paint_prop_table_init(ptable, ptable_buf)
58 let pctx: *PaintCtx = (sys_mmap(NX_PAINT_CTX_BYTES as nx_size)) as *PaintCtx
59 nx_paint_ctx_init(pctx, fb, tree, 0 as *CssComputedDecl, 0, html, ptable)
60 let ink: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor
61 ink.r = 0; ink.g = 0; ink.b = 0; ink.a = 255
62 nx_paint_ctx_set_text(pctx, html, ink)
63 nx_paint_walk_layout(pctx, 0)
64
65 // ---- the rendered page, as ASCII (each pixel -> a char; '#'/'.' by intensity) ----
66 sys_write(1, "=== Nishi render: <body><h1>Nishi</h1><p>browser</p></body> -> pixels ===\n" as *u8, 73)
67 nx_paint_fb_ascii_write(fb)
68 return 0
69}