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}