code wiki / _hdl_build / nx_drawfb_probe.nx
nx_drawfb_probe.nx source
↩ module page · 73 lines · 3823 B
1// nx_drawfb_probe.nx -- DIAGNOSTIC probe for the REAL painter (br_draw_fb, the one the browser window and
2// NishiOS use): reads _offc/nxhtml.html, lays it out, paints via br_draw_fb (cascade colors path), exports
3// _offc/nxdrawfb.bmp for palette measurement. NOT shipped -- a render-core measurement instrument.
4// license_tier: ORIGINAL
5import "nx_browser_render.nx"
6import "nx_fb.nx"
7const DP_MAGIC_262144: i64 = 262144
8
9func dp_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func dp_num(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
11
12const DP_W: i64 = 960
13const DP_H: i64 = 900
14
15func main() -> i64 {
16 let lp: *i64 = sys_mmap(16) as *i64
17 let html: *u8 = sys_read_file("_offc/nxhtml.html\x00" as *u8, lp)
18 if lp[0] <= 0 { dp_puts("drawfb_probe: no _offc/nxhtml.html\n" as *u8); return 1 }
19 // DIAG: how much author <style> is extracted + survives the media filter?
20 let dsty: *u8 = sys_mmap(DP_MAGIC_262144)
21 let dext: i64 = rh_extract_styles(html, lp[0], dsty, DP_MAGIC_262144)
22 let dfil: *u8 = sys_mmap(DP_MAGIC_262144)
23 let dfl: i64 = rh_filter_media(dsty, 0, dext, dfil, DP_MAGIC_262144, 1000)
24 dp_puts("author_style: extracted=" as *u8); dp_num(dext); dp_puts(" filtered=" as *u8); dp_num(dfl); dp_puts("\n" as *u8)
25 let page: *Page = sys_mmap(NX_PAGE_BYTES) as *Page
26 page.raw = html
27 page.raw_len = lp[0]
28 br_layout(page, DP_W/2)
29 if page.ok != 1 { dp_puts("drawfb_probe: layout failed\n" as *u8); return 2 }
30 dp_puts("boxes=" as *u8); dp_num(page.tree.count); dp_puts(" page_h=" as *u8); dp_num(page.page_h); dp_puts("\n" as *u8)
31 // DIAG: dump computed `color` decls (prop=="color") -- proves whether author colors reach the cascade
32 var ci2: i64 = 0
33 var ncol: i64 = 0
34 while ci2 < page.ncomp {
35 let cdp: *CssComputedDecl = ((page.computed as i64) + ci2 * NX_CSS_COMPUTED_DECL_BYTES) as *CssComputedDecl
36 if cdp.prop_len == 5 {
37 let sB: *u8 = page.buf
38 if sB[cdp.prop_off]==(99 as u8) { if sB[cdp.prop_off+1]==(111 as u8) { if sB[cdp.prop_off+2]==(108 as u8) { if sB[cdp.prop_off+3]==(111 as u8) { if sB[cdp.prop_off+4]==(114 as u8) {
39 ncol = ncol + 1
40 if ncol <= 10 {
41 dp_puts(" colordecl el=" as *u8); dp_num(cdp.element_idx)
42 dp_puts(" kind=" as *u8); dp_num(cdp.val_kind)
43 dp_puts(" val=" as *u8); sys_write(1, ((sB as i64)+cdp.val_off) as *u8, cdp.val_len)
44 dp_puts("\n" as *u8)
45 }
46 } } } } }
47 }
48 ci2 = ci2 + 1
49 }
50 dp_puts("computed_total=" as *u8); dp_num(page.ncomp); dp_puts(" color_decls=" as *u8); dp_num(ncol); dp_puts("\n" as *u8)
51 let bfb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer
52 let bpx: *u8 = sys_mmap(DP_W*DP_H*4 + 64)
53 nx_framebuffer_init(bfb, bpx, DP_W, DP_H)
54 br_draw_fb(bfb, page, DP_W/2, "probe://drawfb\x00" as *u8, 0, 2)
55 // RGBA -> RGB
56 let desk: *u8 = sys_mmap(DP_W*DP_H*3 + 16)
57 var y: i64 = 0
58 while y < DP_H {
59 var x: i64 = 0
60 while x < DP_W {
61 let so: i64 = (y*DP_W + x)*4
62 let dofs: i64 = (y*DP_W + x)*3
63 desk[dofs] = bpx[so]
64 desk[dofs+1] = bpx[so+1]
65 desk[dofs+2] = bpx[so+2]
66 x = x + 1
67 }
68 y = y + 1
69 }
70 let sz: i64 = fb_bmp_save(desk, DP_W, DP_H, "_offc/nxdrawfb.bmp\x00" as *u8)
71 dp_puts("drawfb_probe: wrote _offc/nxdrawfb.bmp bytes=" as *u8); dp_num(sz); dp_puts("\n" as *u8)
72 return 0
73}