code wiki / _hdl_build / nx_imgpage.nx
nx_imgpage.nx source
↩ module page · 73 lines · 2902 B
1// nx_imgpage.nx -- prove AUTO <img> in a rendered page: br_layout harvests <img src> per box; this
2// consumer decodes each src (local file here; the GUI will fetch via -B) into page.bimg; br_draw_fb's
3// additive image pass blits them at the laid-out box positions. End-to-end auto-image, headless.
4import "nx_syscalls.nx"
5import "nx_browser_render.nx"
6import "nx_img_to_rgb.nx"
7import "nx_png_write.nx"
8
9func ip(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(2, s, n); return 0 }
10func ipn(v: i64) -> i64 {
11 var m: i64 = v
12 if m < 0 { ip("-\x00" as *u8); m = 0 - m }
13 let t: *u8 = sys_mmap(24); var k: i64 = 0
14 if m == 0 { t[0] = 48 as u8; k = 1 } else { while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } }
15 let o: *u8 = sys_mmap(24); var j: i64 = 0
16 while j < k { o[j] = t[k - 1 - j]; j = j + 1 }
17 sys_write(2, o, k); return 0
18}
19
20func main() -> i64 {
21 let box: *i64 = sys_mmap(16) as *i64
22 let html: *u8 = sys_read_file("_offc/imgpage.html\x00" as *u8, box)
23 if (html as i64) == 0 { ip("read fail\n\x00" as *u8); return 1 }
24 let hlen: i64 = box[0]
25 let page: *Page = sys_mmap(NX_PAGE_BYTES) as *Page
26 page.raw = html; page.raw_len = hlen
27 br_layout(page, 680)
28 let tree: *LayoutTree = page.tree
29
30 // decode pass: for each box carrying an <img src>, decode it (as a local path here) into page.bimg
31 var nfound: i64 = 0
32 var ndec: i64 = 0
33 var i: i64 = 0
34 while i < tree.count {
35 if page.bsrc_off[i] != (0 - 1) {
36 nfound = nfound + 1
37 let so: i64 = page.bsrc_off[i]
38 let sl: i64 = page.bsrc_len[i]
39 let pth: *u8 = sys_mmap(sl + 1)
40 var j: i64 = 0
41 while j < sl { pth[j] = page.buf[so + j]; j = j + 1 }
42 pth[sl] = 0 as u8
43 let wh: *i64 = sys_mmap(16) as *i64
44 let rgb: *u8 = nx_img_to_rgb(pth, wh)
45 if (rgb as i64) != 0 {
46 page.bimg[i] = rgb as i64
47 page.bimg_w[i] = wh[0]
48 page.bimg_h[i] = wh[1]
49 ndec = ndec + 1
50 }
51 }
52 i = i + 1
53 }
54 ip("boxes=\x00" as *u8); ipn(tree.count); ip(" img_src_found=\x00" as *u8); ipn(nfound); ip(" decoded=\x00" as *u8); ipn(ndec); ip("\n\x00" as *u8)
55
56 let SW: i64 = 700
57 let SH: i64 = 640
58 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer
59 let px: *u8 = sys_mmap(SW * SH * 4 + 64)
60 nx_framebuffer_init(fb, px, SW, SH)
61 br_draw_fb(fb, page, SW, "_offc/imgpage.html\x00" as *u8, 18, 1)
62
63 let rgbout: *u8 = sys_mmap(SW * SH * 3)
64 var q: i64 = 0
65 while q < SW * SH {
66 rgbout[q * 3 + 0] = px[q * 4 + 0]
67 rgbout[q * 3 + 1] = px[q * 4 + 1]
68 rgbout[q * 3 + 2] = px[q * 4 + 2]
69 q = q + 1
70 }
71 nx_png_write_rgb("_offc/imgpage_out.png\x00" as *u8, rgbout, SW, SH)
72 return 0
73}