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}