nx_gif_consumer_gate_t139.nx source
↩ module page · 56 lines · 6455 B
1import "nx_browser_render_gif_t139.nx"
2import "nx_img_bytes_to_rgb_gif_t139.nx"
3import "nx_gate_verdict.nx"
4func gb_pages() -> i64 {
5 let buf: *u8=gif_own(512);if buf==(0 as *u8) { return 0-1 }
6 let fd: i64=sys_openat_rd("/proc/self/statm");if fd<0 { gif_release(buf,512);return 0-1 }
7 let n: i64=sys_read(fd,buf,511);let rc: i64=sys_close(fd);var value: i64=0;var i: i64=0
8 if n<=0 || rc!=0 { gif_release(buf,512);return 0-1 }
9 while i<n {let c: i64=buf[i] as i64;if c<48 || c>57 {break}value=value*10+c-48;i=i+1}
10 if gif_release(buf,512)!=0 {return 0-1}return value
11}
12
13func gc_image(page: *Page) -> i64 {var i: i64=0;while i<page.tree.count{if page.bsrc_off[i]>=0{return i}i=i+1}return 0-1}
14func gc_canvas(page: *Page) -> i64 {var i: i64=0;while i<page.tree.count{if page.bcanvas[i]==1{return i}i=i+1}return 0-1}
15func main(argc: i64,argv: *i64) -> i64 {
16 if argc!=2{gv_puts("usage: private gate <exclusive visual output path>\n");return 2}
17 let ctr: *i64=gv_ctr();let result: *i64=gif_own(NX_IMAGE_RESULT_WORDS*8) as *i64
18 let raw: *u8=gif_own(49);raw[0]=71 as u8;raw[1]=73 as u8;raw[2]=70 as u8;raw[3]=56 as u8;raw[4]=57 as u8;raw[5]=97 as u8;raw[6]=2 as u8;raw[7]=0 as u8;raw[8]=2 as u8;raw[9]=0 as u8;raw[10]=129 as u8;raw[11]=0 as u8;raw[12]=0 as u8;raw[13]=0 as u8;raw[14]=0 as u8;raw[15]=0 as u8;raw[16]=255 as u8;raw[17]=0 as u8;raw[18]=0 as u8;raw[19]=0 as u8;raw[20]=255 as u8;raw[21]=0 as u8;raw[22]=0 as u8;raw[23]=0 as u8;raw[24]=255 as u8;raw[25]=33 as u8;raw[26]=249 as u8;raw[27]=4 as u8;raw[28]=5 as u8;raw[29]=5 as u8;raw[30]=0 as u8;raw[31]=0 as u8;raw[32]=0 as u8;raw[33]=44 as u8;raw[34]=1 as u8;raw[35]=0 as u8;raw[36]=1 as u8;raw[37]=0 as u8;raw[38]=1 as u8;raw[39]=0 as u8;raw[40]=1 as u8;raw[41]=0 as u8;raw[42]=0 as u8;raw[43]=2 as u8;raw[44]=2 as u8;raw[45]=76 as u8;raw[46]=1 as u8;raw[47]=0 as u8;raw[48]=59 as u8;
19 var rc: i64=nx_img_bytes_decode_result(raw,49,result)
20 gv_check("existing chokepoint preserves offset GIF as owned full-canvas RGBA",rc==1 && result[1]==2 && result[2]==2 && result[3]==4 && result[4]==16 && result[5]==gif_own_size(16),ctr)
21 let rp: *u8=result[0] as *u8;var exact: i64=1
22 if rp[0]!=(0 as u8){exact=0}if rp[1]!=(0 as u8){exact=0}if rp[2]!=(0 as u8){exact=0}if rp[3]!=(0 as u8){exact=0}if rp[4]!=(0 as u8){exact=0}if rp[5]!=(0 as u8){exact=0}if rp[6]!=(0 as u8){exact=0}if rp[7]!=(0 as u8){exact=0}if rp[8]!=(0 as u8){exact=0}if rp[9]!=(0 as u8){exact=0}if rp[10]!=(0 as u8){exact=0}if rp[11]!=(0 as u8){exact=0}if rp[12]!=(255 as u8){exact=0}if rp[13]!=(0 as u8){exact=0}if rp[14]!=(0 as u8){exact=0}if rp[15]!=(255 as u8){exact=0}
23 gv_check("composited RGBA equals independent libvips pixels",exact,ctr)
24 let page: *Page=sys_mmap(NX_PAGE_BYTES) as *Page
25 let html: *u8="<html><body><img src='fixture.gif'><canvas width='2' height='2'></canvas></body></html>" as *u8
26 page.raw=html;page.raw_len=br_slen(html);rc=br_layout(page,400)
27 var image: i64=gc_image(page);var canvas: i64=gc_canvas(page)
28 gv_check("actual shared layout produces image and borrowed canvas boxes",rc==0 && page.ok==1 && image>=0 && canvas>=0,ctr)
29 if image<0 || canvas<0{return 1}
30 gv_check("typed page transfer consumes result ownership",br_image_take_result(page,image,result)==0 && result[0]==0 && page.bimg_channels[image]==4 && page.bimg_owned_bytes[image]>0,ctr)
31 gv_check("releasing moved result cannot release page pixels",nx_img_result_release(result)==0 && page.bimg[image]!=0,ctr)
32 let borrowed: *u8=gif_own(12);var i: i64=0;while i<12{borrowed[i]=77 as u8;i=i+1}
33 page.bimg[canvas]=borrowed as i64;page.bimg_w[canvas]=2;page.bimg_h[canvas]=2
34 let pixels: *u8=gif_own(32*32*4);i=0;while i<32*32*4{pixels[i]=255 as u8;i=i+1}
35 let fb: *Framebuffer=sys_mmap(64) as *Framebuffer;nx_framebuffer_init(fb,pixels,32,32)
36 br_blit_rgba(fb,0,0,32,32,page.bimg[image] as *u8,2,2)
37 gv_check("alpha leaves white backdrop and offset red lands bottom-right",pixels[0]==(255 as u8) && pixels[1]==(255 as u8) && pixels[(24*32+24)*4]==(255 as u8) && pixels[(24*32+24)*4+1]==(0 as u8),ctr)
38 let hex: *u8=gif_own(32*32*8);let digits: *u8="0123456789abcdef";i=0;while i<32*32*4{let v: i64=pixels[i] as i64;hex[i*2]=digits[v>>4];hex[i*2+1]=digits[v&15];i=i+1}
39 let fd: i64=sys_openat_exclusive(argv[1] as *u8,420);var written: i64=0;if fd>=0{written=sys_write(fd,hex,32*32*8);if sys_fsync(fd)!=0{written=0}if sys_close(fd)!=0{written=0}}
40 gv_check("native alpha visual artifact written exclusively",written==32*32*8,ctr)
41 let semi: *u8=gif_own(4);semi[0]=255 as u8;semi[1]=0 as u8;semi[2]=0 as u8;semi[3]=128 as u8
42 br_blit_rgba(fb,0,0,1,1,semi,1,1);gv_check("straight-alpha painter preserves partial alpha blend",pixels[0]==(255 as u8) && pixels[1]==(127 as u8) && pixels[2]==(127 as u8) && pixels[3]==(255 as u8),ctr)
43 rc=br_layout(page,600);gv_check("actual resize layout reclaims tagged image but preserves borrowed buffer",rc==0 && borrowed[0]==(77 as u8) && borrowed[11]==(77 as u8),ctr)
44 image=gc_image(page);canvas=gc_canvas(page);rc=nx_img_bytes_decode_result(raw,49,result);if rc==1{rc=br_image_take_result(page,image,result)}
45 gv_check("resized page accepts fresh owned result",rc==0 && page.bimg_channels[image]==4,ctr)
46 let next: *u8="<html><body><p>navigation target</p><canvas width='2' height='2'></canvas></body></html>" as *u8;page.raw=next;page.raw_len=br_slen(next);rc=br_layout(page,600)
47 gv_check("actual navigation layout releases prior owned image without freeing canvas storage",rc==0 && page.ok==1 && gc_image(page)<0 && borrowed[0]==(77 as u8),ctr)
48 page.raw=html;page.raw_len=br_slen(html);br_layout(page,400);image=gc_image(page)
49 let before: i64=gb_pages();i=0;var good: i64=1;while i<100{
50 rc=nx_img_bytes_decode_result(raw,49,result);if rc!=1{good=0}else{if br_image_take_result(page,image,result)!=0{good=0}}if br_release_owned_images(page)!=0{good=0}i=i+1
51 }let after: i64=gb_pages();gv_kv("owned-loop-pages-before",before);gv_kv("owned-loop-pages-after",after)
52 gv_check("100 actual chokepoint-to-page release cycles reclaim owned output",good==1 && before==after,ctr)
53 gv_check("page image metadata release succeeds and is idempotent",br_release_image_metadata(page)==0 && br_release_image_metadata(page)==0,ctr)
54 gif_release(raw,49);gif_release(result as *u8,NX_IMAGE_RESULT_WORDS*8);gif_release(borrowed,12);gif_release(pixels,32*32*4);gif_release(hex,32*32*8);gif_release(semi,4)
55 return gv_verdict("GIF-CONSUMER",ctr,"native shared-owner qualification; Windows interactive GUI not yet run")
56}