nx_media_gallery.nx source
↩ module page · 131 lines · 6621 B
1// nx_media_gallery.nx -- EXPOSURE rung X2 (visible/usable, not just numbers).
2// Reads the media path list, tags each via nx_mindex_tag_path, and EMITS an
3// openable HTML page (knowledge/staging/media/detect_gallery.html) showing each
4// REAL image with the detected skin bounding box drawn as a CSS overlay (real
5// coords, percentage-scaled so it stays correct at any display size) + tag
6// badges (skin/conc/present) + a "show only person-present" filter.
7//
8// Open the file in a browser to VERIFY the detections land on the real photos.
9// Sovereign: syscalls + nx_media_index (+ its decode/presence deps).
10// license_tier: ORIGINAL
11import "nx_syscalls.nx"
12import "nx_media_index.nx"
13const K_MAGIC_4096: i64 = 4096
14const K_MAGIC_4095: i64 = 4095
15
16func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
17func gnum(v: i64) -> i64 {
18 let bb: *u8 = sys_mmap(28)
19 var m: i64 = v
20 if m < 0 { sys_write(1, "-\x00" as *u8, 1); m = 0 - m }
21 let t: *u8 = sys_mmap(28)
22 var k: i64 = 0
23 if m == 0 { t[0] = 48 as u8; k = 1 }
24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
25 var i: i64 = 0
26 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
27 sys_write(1, bb, k)
28 return 0
29}
30func fps(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
31func fnum(fd: i64, v: i64) -> i64 {
32 let bb: *u8 = sys_mmap(28)
33 var m: i64 = v
34 if m < 0 { sys_write(fd, "-\x00" as *u8, 1); m = 0 - m }
35 let t: *u8 = sys_mmap(28)
36 var k: i64 = 0
37 if m == 0 { t[0] = 48 as u8; k = 1 }
38 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
39 var i: i64 = 0
40 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
41 sys_write(fd, bb, k)
42 return 0
43}
44// returns prefix length if s starts with pre, else 0
45func strip_prefix(s: *u8, pre: *u8) -> i64 {
46 var i: i64 = 0
47 while pre[i] != (0 as u8) {
48 if s[i] != pre[i] { return 0 }
49 i = i + 1
50 }
51 return i
52}
53
54func main() -> i64 {
55 let szp: *i64 = sys_mmap(16) as *i64
56 let buf: *u8 = sys_read_file("knowledge/staging/media/idx_in.txt\x00" as *u8, szp)
57 if (buf as i64) == 0 { gp("nx_media_gallery: no idx_in.txt\n\x00" as *u8); return 1 }
58 let len: i64 = szp[0]
59 let fd: i64 = sys_openat_wr("knowledge/staging/media/detect_gallery.html\x00" as *u8, 420)
60 if fd < 0 { gp("nx_media_gallery: cannot write html\n\x00" as *u8); return 2 }
61
62 fps(fd, "<!doctype html><html><head><meta charset=utf-8><title>Nishi Media Studio</title><style>\x00" as *u8)
63 fps(fd, "body{background:#111;color:#eee;font-family:sans-serif;margin:16px}\x00" as *u8)
64 fps(fd, ".grid{display:flex;flex-wrap:wrap;gap:12px}\x00" as *u8)
65 fps(fd, ".card{background:#1c1c1c;border:1px solid #333;border-radius:8px;padding:8px;width:320px}\x00" as *u8)
66 fps(fd, ".imgwrap{position:relative;width:320px}.imgwrap img{width:100%;display:block;border-radius:4px}\x00" as *u8)
67 fps(fd, ".box{position:absolute;border:3px solid #39ff14;box-sizing:border-box}\x00" as *u8)
68 fps(fd, ".badge{margin-top:6px;font-size:13px}.present{color:#39ff14;font-weight:bold}.absent{color:#888}\x00" as *u8)
69 fps(fd, ".path{font-size:10px;color:#666;word-break:break-all;margin-top:4px}</style><script>\x00" as *u8)
70 fps(fd, "function flt(){var o=document.getElementById('onlyp').checked;var c=document.getElementsByClassName('card');\x00" as *u8)
71 fps(fd, "for(var i=0;i<c.length;i++){var p=c[i].getAttribute('data-present')=='1';c[i].style.display=(o&&!p)?'none':''}}\x00" as *u8)
72 fps(fd, "</script></head><body><h2>Nishi Media Studio — person-presence detections</h2>\x00" as *u8)
73 fps(fd, "<label><input type=checkbox id=onlyp onclick=flt()> show only person-present</label><div class=grid>\x00" as *u8)
74
75 let pbuf: *u8 = sys_mmap(K_MAGIC_4096)
76 let out: *i64 = sys_mmap(128) as *i64
77 var total: i64 = 0
78 var shown: i64 = 0
79 var present: i64 = 0
80 var i: i64 = 0
81 while i < len {
82 var j: i64 = i
83 while j < len && (buf[j] as i64) != 10 { j = j + 1 }
84 var end: i64 = j
85 if end > i && (buf[end - 1] as i64) == 13 { end = end - 1 }
86 let ll: i64 = end - i
87 if ll > 0 {
88 var k: i64 = 0
89 while k < ll && k < K_MAGIC_4095 { pbuf[k] = buf[i + k]; k = k + 1 }
90 pbuf[k] = 0 as u8
91 nx_mindex_tag_path(pbuf, out)
92 total = total + 1
93 if out[0] == NX_MIDX_OK {
94 shown = shown + 1
95 if out[5] == 1 { present = present + 1 }
96 let off: i64 = strip_prefix(pbuf, "knowledge/staging/media/\x00" as *u8)
97 let src: *u8 = (pbuf as i64 + off) as *u8
98 fps(fd, "<div class=card data-present=\x00" as *u8); fnum(fd, out[5]); fps(fd, "><div class=imgwrap><img src=\"\x00" as *u8)
99 fps(fd, src); fps(fd, "\">\x00" as *u8)
100 if out[6] > 0 {
101 // bbox as percentages of natural w/h
102 let lx: i64 = out[7] * 100 / out[1]
103 let ly: i64 = out[8] * 100 / out[2]
104 let bw: i64 = (out[9] - out[7] + 1) * 100 / out[1]
105 let bh: i64 = (out[10] - out[8] + 1) * 100 / out[2]
106 fps(fd, "<div class=box style=\"left:\x00" as *u8); fnum(fd, lx)
107 fps(fd, "%;top:\x00" as *u8); fnum(fd, ly)
108 fps(fd, "%;width:\x00" as *u8); fnum(fd, bw)
109 fps(fd, "%;height:\x00" as *u8); fnum(fd, bh)
110 fps(fd, "%\"></div>\x00" as *u8)
111 }
112 fps(fd, "</div><div class=badge>\x00" as *u8)
113 if out[5] == 1 { fps(fd, "<span class=present>PERSON</span>\x00" as *u8) }
114 if out[5] != 1 { fps(fd, "<span class=absent>no person</span>\x00" as *u8) }
115 fps(fd, " · skin \x00" as *u8); fnum(fd, out[3])
116 fps(fd, "‰ · conc \x00" as *u8); fnum(fd, out[4])
117 fps(fd, "‰ · \x00" as *u8); fnum(fd, out[1]); fps(fd, "x\x00" as *u8); fnum(fd, out[2])
118 fps(fd, "</div><div class=path>\x00" as *u8); fps(fd, src); fps(fd, "</div></div>\x00" as *u8)
119 }
120 }
121 i = j + 1
122 }
123 fps(fd, "</div></body></html>\n\x00" as *u8)
124 sys_close(fd)
125
126 gp("nx_media_gallery total=\x00" as *u8); gnum(total)
127 gp(" shown=\x00" as *u8); gnum(shown)
128 gp(" present=\x00" as *u8); gnum(present)
129 gp(" -> knowledge/staging/media/detect_gallery.html\n\x00" as *u8)
130 return 0
131}