nx_xfade_demo.nx source
↩ module page · 80 lines · 3531 B
1// nx_xfade_demo.nx -- VISIBLE proof of R4: crossfade two REAL gallery photos
2// with the SMOOTHSTEP curve and write 5 BMPs (0/25/50/75/100%) you can open on
3// Windows to SEE the smooth dissolve. Decodes real PNGs, blends via
4// nx_xfade_frame, writes via nx_bmp. Sovereign throughout.
5// Output: knowledge/staging/media/xfade_0.bmp .. xfade_4.bmp
6// license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_image.nx"
9import "nx_png_decoder.nx"
10import "nx_gradient_blend.nx"
11import "nx_transition.nx"
12import "nx_bmp.nx"
13
14func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15func gn(v: i64) -> i64 {
16 let bb: *u8 = sys_mmap(28)
17 var m: i64 = v
18 if m < 0 { sys_write(1, "-\x00" as *u8, 1); m = 0 - m }
19 let t: *u8 = sys_mmap(28)
20 var k: i64 = 0
21 if m == 0 { t[0] = 48 as u8; k = 1 }
22 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
23 var i: i64 = 0
24 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
25 sys_write(1, bb, k)
26 return 0
27}
28
29func png2img(path: *u8) -> *Image {
30 let szp: *i64 = sys_mmap(16) as *i64
31 let buf: *u8 = sys_read_file(path, szp)
32 if (buf as i64) == 0 { return 0 as *Image }
33 let r: *NxPngResult = nx_png_decode(buf, szp[0])
34 if (r as i64) == 0 { return 0 as *Image }
35 if r.error_code != NX_PNG_OK { return 0 as *Image }
36 let raw: *u8 = sys_mmap(40)
37 let img: *Image = raw as *Image
38 img.pixels = r.pixels
39 img.width = r.header.width
40 img.height = r.header.height
41 img.channels = r.n_channels
42 img.stride = r.header.width * r.n_channels
43 return img
44}
45
46func main() -> i64 {
47 let a: *Image = png2img("knowledge/staging/media/gallery/20260612_000008_c21f8b7c_3860894667_laptop.png\x00" as *u8)
48 let b: *Image = png2img("knowledge/staging/media/gallery/20260612_000130_287bd5eb_2221482208_laptop.png\x00" as *u8)
49 if (a as i64) == 0 { gp("xfade_demo: A decode failed\n\x00" as *u8); return 1 }
50 if (b as i64) == 0 { gp("xfade_demo: B decode failed\n\x00" as *u8); return 2 }
51 gp("xfade_demo A=\x00" as *u8); gn(a.width); gp("x\x00" as *u8); gn(a.height)
52 gp(" B=\x00" as *u8); gn(b.width); gp("x\x00" as *u8); gn(b.height); gp("\n\x00" as *u8)
53
54 let w: i64 = a.width
55 let h: i64 = a.height
56 let out: *Image = nx_image_alloc(w, h, 3)
57 let Q: i64 = NX_GB_Q
58
59 let paths: *i64 = sys_mmap(64) as *i64
60 // 5 fixed output paths
61 let p0: *u8 = "knowledge/staging/media/xfade_0.bmp\x00" as *u8
62 let p1: *u8 = "knowledge/staging/media/xfade_1.bmp\x00" as *u8
63 let p2: *u8 = "knowledge/staging/media/xfade_2.bmp\x00" as *u8
64 let p3: *u8 = "knowledge/staging/media/xfade_3.bmp\x00" as *u8
65 let p4: *u8 = "knowledge/staging/media/xfade_4.bmp\x00" as *u8
66
67 nx_xfade_frame(a, b, 0, NX_GB_CURVE_SMOOTHSTEP, out); bmp_write(out, p0)
68 gp(" wrote xfade_0.bmp (0%)\n\x00" as *u8)
69 nx_xfade_frame(a, b, Q / 4, NX_GB_CURVE_SMOOTHSTEP, out); bmp_write(out, p1)
70 gp(" wrote xfade_1.bmp (25%)\n\x00" as *u8)
71 nx_xfade_frame(a, b, Q / 2, NX_GB_CURVE_SMOOTHSTEP, out); bmp_write(out, p2)
72 gp(" wrote xfade_2.bmp (50%)\n\x00" as *u8)
73 nx_xfade_frame(a, b, (Q * 3) / 4, NX_GB_CURVE_SMOOTHSTEP, out); bmp_write(out, p3)
74 gp(" wrote xfade_3.bmp (75%)\n\x00" as *u8)
75 nx_xfade_frame(a, b, Q, NX_GB_CURVE_SMOOTHSTEP, out); bmp_write(out, p4)
76 gp(" wrote xfade_4.bmp (100%)\n\x00" as *u8)
77
78 gp("xfade_demo done -> knowledge/staging/media/xfade_0..4.bmp (open to SEE the dissolve)\n\x00" as *u8)
79 return 0
80}