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}