code wiki / _hdl_build / nx_live_xlate_call_gate.nx
nx_live_xlate_call_gate.nx source
↩ module page · 111 lines · 5929 B
1// nx_live_xlate_call_gate.nx -- proves the live-translated call for "a girl in Belarus (RU) talking to a boy in
2// Texas (EN)", NO fake green. (1) the boy says "hello friend" -> the GIRL's screen shows it in RUSSIAN
3// "привет друг" (byte-exact) rendered in NATIVE Cyrillic; (2) the girl says "спасибо любовь" -> the BOY's screen
4// shows "thanks love" in Latin; (3) neg-control: same-locale = NO translation (verbatim). Eyeball ->
5// knowledge/nx_live_xlate_call.png (girl's screen top, boy's screen bottom). expect_exit: 0 license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_css_color_decode.nx"
8import "nx_paint_solid_rect.nx"
9import "nx_font8x8.nx"
10import "nx_font_cyrillic8.nx"
11import "nx_utf8.nx"
12import "nx_caption_render_uni.nx"
13import "nx_mt_ruen.nx"
14import "nx_live_xlate_call.nx"
15import "nx_png_write.nx"
16
17func rg(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
18func rgn(v: i64) -> i64 {
19 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
20 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
21 let d: *u8 = sys_mmap(24); var k: i64 = 0
22 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
23 var j: i64 = k - 1
24 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
25 return 0
26}
27func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
28// a (alen bytes) equals nul-terminated expected b ?
29func bcmp(a: *u8, alen: i64, b: *u8) -> i64 {
30 var i: i64 = 0
31 while i < alen { if b[i]==(0 as u8) { return 0 } if a[i]!=b[i] { return 0 } i=i+1 }
32 if b[alen]!=(0 as u8) { return 0 }
33 return 1
34}
35func mkfb(w: i64, h: i64) -> *Framebuffer {
36 let px: *u8 = sys_mmap(w * h * 4)
37 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer
38 nx_framebuffer_init(fb, px, w, h)
39 nx_framebuffer_clear(fb)
40 return fb
41}
42
43func main() -> i64 {
44 rg("=== nx_live_xlate_call_gate: Belarus girl (RU) <-> Texas boy (EN) live-translated call ===\n" as *u8)
45 let w: i64 = 320
46 let h: i64 = 120
47 var pass: i64 = 0
48 var fail: i64 = 0
49
50 let bar: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
51 bar.r=0; bar.g=0; bar.b=0; bar.a=255
52 let fg: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
53 fg.r=255; fg.g=235; fg.b=60; fg.a=255
54 let vidG: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
55 vidG.r=64; vidG.g=40; vidG.b=44; vidG.a=255
56 let vidB: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
57 vidB.r=28; vidB.g=44; vidB.b=70; vidB.a=255
58
59 // (1) boy (EN) -> girl (RU): "hello friend" -> "привет друг"
60 let boy_utt: *u8 = "hello friend" as *u8
61 let gcap: *u8 = sys_mmap(256)
62 let gn: i64 = lx_caption_for_listener(boy_utt, slen(boy_utt), LX_EN, LX_RU, gcap, 256)
63 rg(" boy(EN) '" as *u8); sys_write(1, boy_utt, slen(boy_utt)); rg("' -> girl(RU) '" as *u8); sys_write(1, gcap, gn); rg("'\n" as *u8)
64 if bcmp(gcap, gn, "привет друг" as *u8) == 1 { pass=pass+1; rg(" ROW EN->RU correct: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW EN->RU correct: RED\n" as *u8) }
65
66 // (2) girl (RU) -> boy (EN): "спасибо любовь" -> "thanks love"
67 let girl_utt: *u8 = "спасибо любовь" as *u8
68 let bcap: *u8 = sys_mmap(256)
69 let bn: i64 = lx_caption_for_listener(girl_utt, slen(girl_utt), LX_RU, LX_EN, bcap, 256)
70 rg(" girl(RU) '" as *u8); sys_write(1, girl_utt, slen(girl_utt)); rg("' -> boy(EN) '" as *u8); sys_write(1, bcap, bn); rg("'\n" as *u8)
71 if bcmp(bcap, bn, "thanks love" as *u8) == 1 { pass=pass+1; rg(" ROW RU->EN correct: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW RU->EN correct: RED\n" as *u8) }
72
73 // (3) neg-control: same locale -> NO translation (verbatim)
74 let same: *u8 = sys_mmap(64)
75 let sn: i64 = lx_caption_for_listener("hello" as *u8, 5, LX_EN, LX_EN, same, 64)
76 if bcmp(same, sn, "hello" as *u8) == 1 { pass=pass+1; rg(" ROW same-locale-no-translate: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW same-locale-no-translate: RED\n" as *u8) }
77
78 // render the GIRL's screen (native Cyrillic) and the BOY's screen (Latin)
79 let fbG: *Framebuffer = mkfb(w, h)
80 nx_paint_solid_rect(fbG, 0, 0, w, h, vidG)
81 let setG: i64 = nx_caption_render_uni(fbG, gcap, gn, 2, bar, fg)
82 if setG > 0 { pass=pass+1; rg(" ROW girl-screen-cyrillic-renders: GREEN (" as *u8); rgn(setG); rg("px)\n" as *u8) } else { fail=fail+1; rg(" ROW girl-screen: RED\n" as *u8) }
83
84 let fbB: *Framebuffer = mkfb(w, h)
85 nx_paint_solid_rect(fbB, 0, 0, w, h, vidB)
86 let setB: i64 = nx_caption_render_uni(fbB, bcap, bn, 2, bar, fg)
87 if setB > 0 { pass=pass+1; rg(" ROW boy-screen-latin-renders: GREEN (" as *u8); rgn(setB); rg("px)\n" as *u8) } else { fail=fail+1; rg(" ROW boy-screen: RED\n" as *u8) }
88
89 // eyeball: girl's screen (top) + boy's screen (bottom)
90 let H2: i64 = h * 2
91 let rgb: *u8 = sys_mmap(w * H2 * 3)
92 var y: i64 = 0
93 while y < h {
94 var x: i64 = 0
95 while x < w {
96 let s: i64 = (y * w + x) * 4
97 let d1: i64 = (y * w + x) * 3
98 rgb[d1+0]=fbG.pixels[s+0]; rgb[d1+1]=fbG.pixels[s+1]; rgb[d1+2]=fbG.pixels[s+2]
99 let d2: i64 = ((h + y) * w + x) * 3
100 rgb[d2+0]=fbB.pixels[s+0]; rgb[d2+1]=fbB.pixels[s+1]; rgb[d2+2]=fbB.pixels[s+2]
101 x = x + 1
102 }
103 y = y + 1
104 }
105 nx_png_write_rgb("knowledge/nx_live_xlate_call.png" as *u8, rgb, w, H2)
106 rg(" eyeball -> knowledge/nx_live_xlate_call.png (girl's screen top, boy's screen bottom)\n" as *u8)
107
108 rg("LIVE-XLATE-CALL-GATE pass=" as *u8); rgn(pass); rg(" fail=" as *u8); rgn(fail)
109 if fail == 0 { rg(" verdict=GREEN -- bidirectional RU<->EN translated call; girl reads native Cyrillic, boy reads Latin; same-locale verbatim\n" as *u8); sys_exit(0); return 0 }
110 rg(" verdict=RED\n" as *u8); sys_exit(1); return 1
111}