code wiki / (root) / nx_browser_demo_html_nishi.nx

nx_browser_demo_html_nishi.nx source

↩ module page · 99 lines · 3852 B

1// nx_browser_demo_html_nishi.nx -- end-to-end demo rendering 2// "<body>NISHI</body>" through the full bits-up substrate pipeline. 3// Composes the same stack as nx_browser_demo_html (HTML tokenize -> 4// layout_from_dom -> paint walk with text -> ASCII dump) but with 5// the expanded font subset that supports N-I-S-H letters. 6 7import "nx_syscalls.nx" 8import "nx_css_tokenize.nx" 9import "nx_css_apply.nx" 10import "nx_css_color_decode.nx" 11import "nx_html_tokenizer.nx" 12import "nx_layout_box.nx" 13import "nx_layout_default_display.nx" 14import "nx_layout_from_dom.nx" 15import "nx_paint_solid_rect.nx" 16import "nx_paint_text.nx" 17import "nx_paint_walk_layout.nx" 18import "nx_paint_fb_ascii_dump.nx" 19const K_MAGIC_1024: i64 = 1024 20 21func _put_byte(buf: *u8, i: i64, v: i64) -> i64 { 22 buf[i] = v as u8 23 return 0 24} 25 26func main() -> i64 { 27 // HTML: "<body>NISHI</body>" (18 bytes) 28 let html: *u8 = (sys_mmap(32)) as *u8 29 var p: i64 = 0 30 _put_byte(html, p, 60) p = p + 1 // '<' 31 _put_byte(html, p, 98) p = p + 1 // 'b' 32 _put_byte(html, p, 111) p = p + 1 // 'o' 33 _put_byte(html, p, 100) p = p + 1 // 'd' 34 _put_byte(html, p, 121) p = p + 1 // 'y' 35 _put_byte(html, p, 62) p = p + 1 // '>' 36 _put_byte(html, p, 78) p = p + 1 // 'N' 37 _put_byte(html, p, 73) p = p + 1 // 'I' 38 _put_byte(html, p, 83) p = p + 1 // 'S' 39 _put_byte(html, p, 72) p = p + 1 // 'H' 40 _put_byte(html, p, 73) p = p + 1 // 'I' 41 _put_byte(html, p, 60) p = p + 1 // '<' 42 _put_byte(html, p, 47) p = p + 1 // '/' 43 _put_byte(html, p, 98) p = p + 1 // 'b' 44 _put_byte(html, p, 111) p = p + 1 // 'o' 45 _put_byte(html, p, 100) p = p + 1 // 'd' 46 _put_byte(html, p, 121) p = p + 1 // 'y' 47 _put_byte(html, p, 62) p = p + 1 // '>' 48 let html_len: i64 = p 49 50 // Build LayoutBox tree from HTML. 51 let max_boxes: i64 = 16 52 let boxes: *LayoutBox = (sys_mmap((max_boxes * NX_LAYOUT_BOX_BYTES) as nx_size)) as *LayoutBox 53 let tree: *LayoutTree = (sys_mmap(NX_LAYOUT_TREE_BYTES as nx_size)) as *LayoutTree 54 nx_layout_tree_init(tree, boxes, max_boxes) 55 56 let stk_idx: *i64 = (sys_mmap(64)) as *i64 57 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES as nx_size)) as *LayoutFromDomStack 58 nx_layout_from_dom_stack_init(stk, stk_idx, 8) 59 60 let root: i64 = nx_layout_from_dom(html, html_len, tree, stk) 61 if root != 0 { return 1 } 62 63 // Tree: root(0) -> body(1) -> text(2). Position text at (2, 2). 64 let text_box: *LayoutBox = (boxes as *u8 + (2 as nx_size) * (NX_LAYOUT_BOX_BYTES as nx_size)) as *LayoutBox 65 text_box.x = 2 66 text_box.y = 2 67 68 // Framebuffer. 69 let w: i64 = 48 70 let h: i64 = 10 71 let pixels: *u8 = (sys_mmap((w * h * 4) as nx_size)) as *u8 72 let fb: *Framebuffer = (sys_mmap(NX_FRAMEBUFFER_BYTES as nx_size)) as *Framebuffer 73 nx_framebuffer_init(fb, pixels, w, h) 74 nx_framebuffer_clear(fb) 75 76 // Paint context. 77 let computed: *CssComputedDecl = (sys_mmap(NX_CSS_COMPUTED_DECL_BYTES as nx_size)) as *CssComputedDecl 78 let table_buf: *u8 = (sys_mmap(64)) as *u8 79 let table: *PaintPropTable = (sys_mmap(NX_PAINT_PROP_TABLE_BYTES as nx_size)) as *PaintPropTable 80 nx_paint_prop_table_init(table, table_buf) 81 82 let ctx: *PaintCtx = (sys_mmap(NX_PAINT_CTX_BYTES as nx_size)) as *PaintCtx 83 nx_paint_ctx_init(ctx, fb, tree, computed, 0, html, table) 84 85 let white: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor 86 white.r = 255 87 white.g = 255 88 white.b = 255 89 white.a = 255 90 nx_paint_ctx_set_text(ctx, html, white) 91 92 nx_paint_walk_layout(ctx, root) 93 94 let out_buf: *u8 = (sys_mmap(K_MAGIC_1024)) as *u8 95 let n: i64 = nx_paint_fb_ascii_dump(fb, out_buf, K_MAGIC_1024) 96 if n < 0 { return 2 } 97 sys_write(1, out_buf, n) 98 return 0 99}