akarisub 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +388 -0
- package/dist/COPYRIGHT +951 -0
- package/dist/akarisub-worker.js +39 -0
- package/dist/akarisub-worker.wasm +0 -0
- package/dist/akarisub.umd.js +159 -0
- package/dist/default.woff2 +0 -0
- package/dist/index.js +147 -0
- package/package.json +63 -0
- package/src/ts/akarisub.ts +1159 -0
- package/src/ts/types.ts +391 -0
- package/src/ts/utils.ts +512 -0
- package/src/ts/webgl2-renderer.ts +415 -0
- package/src/ts/webgpu-renderer.ts +728 -0
- package/src/ts/worker.ts +1866 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
(()=>{async function n1(G={}){var O,j=G,U=(...J)=>console.log(...J),N=(...J)=>console.error(...J);function P(){v?.(j)}var Y=!!globalThis.WorkerGlobalScope;(function(){var J=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;if(!J)return;WebAssembly.instantiateStreaming=function(Z,Q){var K=null,X=Promise.resolve(Z).then(function(z){return K=z.clone(),z});return J.call(WebAssembly,X,Q).catch(function(z){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",z&&z.message||z),!K)throw z;return K.arrayBuffer().then(function(W){return WebAssembly.instantiate(W,Q)})})}})(),U=(J)=>{if(J==="AkariSub: No usable fontconfig configuration file found, using fallback."||J.startsWith("Unable to revert mtime:")||J.trim()==="")console.debug(J);else console.log(J)},N=(J)=>{if(J==="Fontconfig error: Cannot load default config file: No such file: (null)"||J==="Fontconfig error: Cannot load default config file: File not found"||J==="Fontconfig error: No writable cache directories"||J.includes("/var/cache/fontconfig")||J.includes("/.cache/fontconfig")||J.includes("/.local/share/fonts"))console.debug(J);else console.error(J)};function w(J){throw J}var v,a,l=!1;function x(){var J=g.buffer;k=new Int8Array(J),D=new Int16Array(J),b=new Uint8Array(J),h=new Uint16Array(J),L=new Int32Array(J),B=new Uint32Array(J),S=new Float32Array(J),M=new Float64Array(J),H=new BigInt64Array(J),o=new BigUint64Array(J)}function n(){{var J=16777216;g=new WebAssembly.Memory({initial:J/65536,maximum:32768})}x()}n();var D,L,H,k,S,M,h,B,o,b,T=(J)=>v0(J),s=()=>C0(),g,OJ=new TextDecoder,GJ=(J,Z,Q,K)=>{var X=Z+Q;if(K)return X;while(J[Z]&&!(Z>=X))++Z;return Z},zJ=(J,Z,Q)=>{if(!J)return"";var K=GJ(b,J,Z,Q);return OJ.decode(b.subarray(J,K))},pJ=(J,Z,Q,K)=>w(`Assertion failed: ${zJ(J)}, at: `+[Z?zJ(Z):"unknown filename",Q,K?zJ(K):"unknown function"]),p={isAbs:(J)=>J.charAt(0)==="/",splitPath:(J)=>{var Z=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return Z.exec(J).slice(1)},normalizeArray:(J,Z)=>{var Q=0;for(var K=J.length-1;K>=0;K--){var X=J[K];if(X===".")J.splice(K,1);else if(X==="..")J.splice(K,1),Q++;else if(Q)J.splice(K,1),Q--}if(Z)for(;Q;Q--)J.unshift("..");return J},normalize:(J)=>{var Z=p.isAbs(J),Q=J.slice(-1)==="/";if(J=p.normalizeArray(J.split("/").filter((K)=>!!K),!Z).join("/"),!J&&!Z)J=".";if(J&&Q)J+="/";return(Z?"/":"")+J},dirname:(J)=>{var Z=p.splitPath(J),Q=Z[0],K=Z[1];if(!Q&&!K)return".";if(K)K=K.slice(0,-1);return Q+K},basename:(J)=>J&&J.match(/([^\/]+|\/)\/*$/)[1],join:(...J)=>p.normalize(J.join("/")),join2:(J,Z)=>p.normalize(J+"/"+Z)},e0=()=>(J)=>crypto.getRandomValues(J),ZZ=(J)=>{(ZZ=e0())(J)},yJ={resolve:(...J)=>{var Z="",Q=!1;for(var K=J.length-1;K>=-1&&!Q;K--){var X=K>=0?J[K]:$.cwd();if(typeof X!="string")throw TypeError("Arguments to path.resolve must be strings");else if(!X)return"";Z=X+"/"+Z,Q=p.isAbs(X)}return Z=p.normalizeArray(Z.split("/").filter((z)=>!!z),!Q).join("/"),(Q?"/":"")+Z||"."},relative:(J,Z)=>{J=yJ.resolve(J).slice(1),Z=yJ.resolve(Z).slice(1);function Q(R){var m=0;for(;m<R.length;m++)if(R[m]!=="")break;var I=R.length-1;for(;I>=0;I--)if(R[I]!=="")break;if(m>I)return[];return R.slice(m,I-m+1)}var K=Q(J.split("/")),X=Q(Z.split("/")),z=Math.min(K.length,X.length),W=z;for(var V=0;V<z;V++)if(K[V]!==X[V]){W=V;break}var q=[];for(var V=W;V<K.length;V++)q.push("..");return q=q.concat(X.slice(W)),q.join("/")}},RJ=(J,Z=0,Q,K)=>{var X=GJ(J,Z,Q,K);return OJ.decode(J.buffer?J.subarray(Z,X):new Uint8Array(J.slice(Z,X)))},$Z=[],fJ=(J)=>{var Z=0;for(var Q=0;Q<J.length;++Q){var K=J.charCodeAt(Q);if(K<=127)Z++;else if(K<=2047)Z+=2;else if(K>=55296&&K<=57343)Z+=4,++Q;else Z+=3}return Z},FZ=(J,Z,Q,K)=>{if(!(K>0))return 0;var X=Q,z=Q+K-1;for(var W=0;W<J.length;++W){var V=J.codePointAt(W);if(V<=127){if(Q>=z)break;Z[Q++]=V}else if(V<=2047){if(Q+1>=z)break;Z[Q++]=192|V>>6,Z[Q++]=128|V&63}else if(V<=65535){if(Q+2>=z)break;Z[Q++]=224|V>>12,Z[Q++]=128|V>>6&63,Z[Q++]=128|V&63}else{if(Q+3>=z)break;Z[Q++]=240|V>>18,Z[Q++]=128|V>>12&63,Z[Q++]=128|V>>6&63,Z[Q++]=128|V&63,W++}}return Z[Q]=0,Q-X},QZ=(J,Z,Q)=>{var K=Q>0?Q:fJ(J)+1,X=Array(K),z=FZ(J,X,0,X.length);if(Z)X.length=z;return X},J1=()=>{if(!$Z.length){var J=null;if(!J)return null;$Z=QZ(J,!0)}return $Z.shift()},NJ={ttys:[],init(){},shutdown(){},register(J,Z){NJ.ttys[J]={input:[],output:[],ops:Z},$.registerDevice(J,NJ.stream_ops)},stream_ops:{open(J){var Z=NJ.ttys[J.node.rdev];if(!Z)throw new $.ErrnoError(43);J.tty=Z,J.seekable=!1},close(J){J.tty.ops.fsync(J.tty)},fsync(J){J.tty.ops.fsync(J.tty)},read(J,Z,Q,K,X){if(!J.tty||!J.tty.ops.get_char)throw new $.ErrnoError(60);var z=0;for(var W=0;W<K;W++){var V;try{V=J.tty.ops.get_char(J.tty)}catch(q){throw new $.ErrnoError(29)}if(V===void 0&&z===0)throw new $.ErrnoError(6);if(V===null||V===void 0)break;z++,Z[Q+W]=V}if(z)J.node.atime=Date.now();return z},write(J,Z,Q,K,X){if(!J.tty||!J.tty.ops.put_char)throw new $.ErrnoError(60);try{for(var z=0;z<K;z++)J.tty.ops.put_char(J.tty,Z[Q+z])}catch(W){throw new $.ErrnoError(29)}if(K)J.node.mtime=J.node.ctime=Date.now();return z}},default_tty_ops:{get_char(J){return J1()},put_char(J,Z){if(Z===null||Z===10)U(RJ(J.output)),J.output=[];else if(Z!=0)J.output.push(Z)},fsync(J){if(J.output?.length>0)U(RJ(J.output)),J.output=[]},ioctl_tcgets(J){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(J,Z,Q){return 0},ioctl_tiocgwinsz(J){return[24,80]}},default_tty1_ops:{put_char(J,Z){if(Z===null||Z===10)N(RJ(J.output)),J.output=[];else if(Z!=0)J.output.push(Z)},fsync(J){if(J.output?.length>0)N(RJ(J.output)),J.output=[]}}},Z1=(J,Z)=>b.fill(0,J,J+Z),TZ=(J,Z)=>Math.ceil(J/Z)*Z,bZ=(J)=>{J=TZ(J,65536);var Z=R0(65536,J);if(Z)Z1(Z,J);return Z},A={ops_table:null,mount(J){return A.createNode(null,"/",16895,0)},createNode(J,Z,Q,K){if($.isBlkdev(Q)||$.isFIFO(Q))throw new $.ErrnoError(63);A.ops_table||={dir:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr,lookup:A.node_ops.lookup,mknod:A.node_ops.mknod,rename:A.node_ops.rename,unlink:A.node_ops.unlink,rmdir:A.node_ops.rmdir,readdir:A.node_ops.readdir,symlink:A.node_ops.symlink},stream:{llseek:A.stream_ops.llseek}},file:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr},stream:{llseek:A.stream_ops.llseek,read:A.stream_ops.read,write:A.stream_ops.write,mmap:A.stream_ops.mmap,msync:A.stream_ops.msync}},link:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr,readlink:A.node_ops.readlink},stream:{}},chrdev:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr},stream:$.chrdev_stream_ops}};var X=$.createNode(J,Z,Q,K);if($.isDir(X.mode))X.node_ops=A.ops_table.dir.node,X.stream_ops=A.ops_table.dir.stream,X.contents={};else if($.isFile(X.mode))X.node_ops=A.ops_table.file.node,X.stream_ops=A.ops_table.file.stream,X.usedBytes=0,X.contents=A.emptyFileContents??=new Uint8Array(0);else if($.isLink(X.mode))X.node_ops=A.ops_table.link.node,X.stream_ops=A.ops_table.link.stream;else if($.isChrdev(X.mode))X.node_ops=A.ops_table.chrdev.node,X.stream_ops=A.ops_table.chrdev.stream;if(X.atime=X.mtime=X.ctime=Date.now(),J)J.contents[Z]=X,J.atime=J.mtime=J.ctime=X.atime;return X},getFileDataAsTypedArray(J){return J.contents.subarray(0,J.usedBytes)},expandFileStorage(J,Z){var Q=J.contents.length;if(Q>=Z)return;var K=1048576;if(Z=Math.max(Z,Q*(Q<K?2:1.125)>>>0),Q)Z=Math.max(Z,256);var X=A.getFileDataAsTypedArray(J);J.contents=new Uint8Array(Z),J.contents.set(X)},resizeFileStorage(J,Z){if(J.usedBytes==Z)return;var Q=J.contents;J.contents=new Uint8Array(Z),J.contents.set(Q.subarray(0,Math.min(Z,J.usedBytes))),J.usedBytes=Z},node_ops:{getattr(J){var Z={};if(Z.dev=$.isChrdev(J.mode)?J.id:1,Z.ino=J.id,Z.mode=J.mode,Z.nlink=1,Z.uid=0,Z.gid=0,Z.rdev=J.rdev,$.isDir(J.mode))Z.size=4096;else if($.isFile(J.mode))Z.size=J.usedBytes;else if($.isLink(J.mode))Z.size=J.link.length;else Z.size=0;return Z.atime=new Date(J.atime),Z.mtime=new Date(J.mtime),Z.ctime=new Date(J.ctime),Z.blksize=4096,Z.blocks=Math.ceil(Z.size/Z.blksize),Z},setattr(J,Z){for(let Q of["mode","atime","mtime","ctime"])if(Z[Q]!=null)J[Q]=Z[Q];if(Z.size!==void 0)A.resizeFileStorage(J,Z.size)},lookup(J,Z){if(!A.doesNotExistError)A.doesNotExistError=new $.ErrnoError(44),A.doesNotExistError.stack="<generic error, no stack>";throw A.doesNotExistError},mknod(J,Z,Q,K){return A.createNode(J,Z,Q,K)},rename(J,Z,Q){var K;try{K=$.lookupNode(Z,Q)}catch(z){}if(K){if($.isDir(J.mode))for(var X in K.contents)throw new $.ErrnoError(55);$.hashRemoveNode(K)}delete J.parent.contents[J.name],Z.contents[Q]=J,J.name=Q,Z.ctime=Z.mtime=J.parent.ctime=J.parent.mtime=Date.now()},unlink(J,Z){delete J.contents[Z],J.ctime=J.mtime=Date.now()},rmdir(J,Z){var Q=$.lookupNode(J,Z);for(var K in Q.contents)throw new $.ErrnoError(55);delete J.contents[Z],J.ctime=J.mtime=Date.now()},readdir(J){return[".","..",...Object.keys(J.contents)]},symlink(J,Z,Q){var K=A.createNode(J,Z,41471,0);return K.link=Q,K},readlink(J){if(!$.isLink(J.mode))throw new $.ErrnoError(28);return J.link}},stream_ops:{read(J,Z,Q,K,X){var z=J.node.contents;if(X>=J.node.usedBytes)return 0;var W=Math.min(J.node.usedBytes-X,K);return Z.set(z.subarray(X,X+W),Q),W},write(J,Z,Q,K,X,z){if(Z.buffer===k.buffer)z=!1;if(!K)return 0;var W=J.node;if(W.mtime=W.ctime=Date.now(),z)W.contents=Z.subarray(Q,Q+K),W.usedBytes=K;else if(W.usedBytes===0&&X===0)W.contents=Z.slice(Q,Q+K),W.usedBytes=K;else A.expandFileStorage(W,X+K),W.contents.set(Z.subarray(Q,Q+K),X),W.usedBytes=Math.max(W.usedBytes,X+K);return K},llseek(J,Z,Q){var K=Z;if(Q===1)K+=J.position;else if(Q===2){if($.isFile(J.node.mode))K+=J.node.usedBytes}if(K<0)throw new $.ErrnoError(28);return K},mmap(J,Z,Q,K,X){if(!$.isFile(J.node.mode))throw new $.ErrnoError(43);var z,W,V=J.node.contents;if(!(X&2)&&V.buffer===k.buffer)W=!1,z=V.byteOffset;else{if(W=!0,z=bZ(Z),!z)throw new $.ErrnoError(48);if(V){if(Q>0||Q+Z<V.length)if(V.subarray)V=V.subarray(Q,Q+Z);else V=Array.prototype.slice.call(V,Q,Q+Z);k.set(V,z)}}return{ptr:z,allocated:W}},msync(J,Z,Q,K,X){return A.stream_ops.write(J,Z,0,K,Q,!1),0}}},$1=(J)=>{if(typeof J!="string")return J;var Z={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},Q=Z[J];if(typeof Q>"u")throw Error(`Unknown file open mode: ${J}`);return Q},_Z=(J)=>{if(typeof J=="string")J=QZ(J,!0);if(!J.subarray)J=new Uint8Array(J);return J},KZ=(J,Z)=>{var Q=0;if(J)Q|=365;if(Z)Q|=146;return Q},$={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(J){this.errno=J}},FSStream:class{shared={};get object(){return this.node}set object(J){this.node=J}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(J){this.shared.flags=J}get position(){return this.shared.position}set position(J){this.shared.position=J}},FSNode:class{node_ops={};stream_ops={};readMode=365;writeMode=146;mounted=null;constructor(J,Z,Q,K){if(!J)J=this;this.parent=J,this.mount=J.mount,this.id=$.nextInode++,this.name=Z,this.mode=Q,this.rdev=K,this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(J){J?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(J){J?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return $.isDir(this.mode)}get isDevice(){return $.isChrdev(this.mode)}},lookupPath(J,Z={}){if(!J)throw new $.ErrnoError(44);if(Z.follow_mount??=!0,!p.isAbs(J))J=$.cwd()+"/"+J;J:for(var Q=0;Q<40;Q++){var K=J.split("/").filter((R)=>!!R),X=$.root,z="/";for(var W=0;W<K.length;W++){var V=W===K.length-1;if(V&&Z.parent)break;if(K[W]===".")continue;if(K[W]===".."){if(z=p.dirname(z),$.isRoot(X)){J=z+"/"+K.slice(W+1).join("/"),Q--;continue J}else X=X.parent;continue}z=p.join2(z,K[W]);try{X=$.lookupNode(X,K[W])}catch(R){if(R?.errno===44&&V&&Z.noent_okay)return{path:z};throw R}if($.isMountpoint(X)&&(!V||Z.follow_mount))X=X.mounted.root;if($.isLink(X.mode)&&(!V||Z.follow)){if(!X.node_ops.readlink)throw new $.ErrnoError(52);var q=X.node_ops.readlink(X);if(!p.isAbs(q))q=p.dirname(z)+"/"+q;J=q+"/"+K.slice(W+1).join("/");continue J}}return{path:z,node:X}}throw new $.ErrnoError(32)},getPath(J){var Z;while(!0){if($.isRoot(J)){var Q=J.mount.mountpoint;if(!Z)return Q;return Q[Q.length-1]!=="/"?`${Q}/${Z}`:Q+Z}Z=Z?`${J.name}/${Z}`:J.name,J=J.parent}},hashName(J,Z){var Q=0;for(var K=0;K<Z.length;K++)Q=(Q<<5)-Q+Z.charCodeAt(K)|0;return(J+Q>>>0)%$.nameTable.length},hashAddNode(J){var Z=$.hashName(J.parent.id,J.name);J.name_next=$.nameTable[Z],$.nameTable[Z]=J},hashRemoveNode(J){var Z=$.hashName(J.parent.id,J.name);if($.nameTable[Z]===J)$.nameTable[Z]=J.name_next;else{var Q=$.nameTable[Z];while(Q){if(Q.name_next===J){Q.name_next=J.name_next;break}Q=Q.name_next}}},lookupNode(J,Z){var Q=$.mayLookup(J);if(Q)throw new $.ErrnoError(Q);var K=$.hashName(J.id,Z);for(var X=$.nameTable[K];X;X=X.name_next){var z=X.name;if(X.parent.id===J.id&&z===Z)return X}return $.lookup(J,Z)},createNode(J,Z,Q,K){var X=new $.FSNode(J,Z,Q,K);return $.hashAddNode(X),X},destroyNode(J){$.hashRemoveNode(J)},isRoot(J){return J===J.parent},isMountpoint(J){return!!J.mounted},isFile(J){return(J&61440)===32768},isDir(J){return(J&61440)===16384},isLink(J){return(J&61440)===40960},isChrdev(J){return(J&61440)===8192},isBlkdev(J){return(J&61440)===24576},isFIFO(J){return(J&61440)===4096},isSocket(J){return(J&49152)===49152},flagsToPermissionString(J){var Z=["r","w","rw"][J&3];if(J&512)Z+="w";return Z},nodePermissions(J,Z){if($.ignorePermissions)return 0;if(Z.includes("r")&&!(J.mode&292))return 2;if(Z.includes("w")&&!(J.mode&146))return 2;if(Z.includes("x")&&!(J.mode&73))return 2;return 0},mayLookup(J){if(!$.isDir(J.mode))return 54;var Z=$.nodePermissions(J,"x");if(Z)return Z;if(!J.node_ops.lookup)return 2;return 0},mayCreate(J,Z){if(!$.isDir(J.mode))return 54;try{var Q=$.lookupNode(J,Z);return 20}catch(K){}return $.nodePermissions(J,"wx")},mayDelete(J,Z,Q){var K;try{K=$.lookupNode(J,Z)}catch(z){return z.errno}var X=$.nodePermissions(J,"wx");if(X)return X;if(Q){if(!$.isDir(K.mode))return 54;if($.isRoot(K)||$.getPath(K)===$.cwd())return 10}else if($.isDir(K.mode))return 31;return 0},mayOpen(J,Z){if(!J)return 44;if($.isLink(J.mode))return 32;var Q=$.flagsToPermissionString(Z);if($.isDir(J.mode)){if(Q!=="r"||Z&576)return 31}return $.nodePermissions(J,Q)},checkOpExists(J,Z){if(!J)throw new $.ErrnoError(Z);return J},MAX_OPEN_FDS:4096,nextfd(){for(var J=0;J<=$.MAX_OPEN_FDS;J++)if(!$.streams[J])return J;throw new $.ErrnoError(33)},getStreamChecked(J){var Z=$.getStream(J);if(!Z)throw new $.ErrnoError(8);return Z},getStream:(J)=>$.streams[J],createStream(J,Z=-1){if(J=Object.assign(new $.FSStream,J),Z==-1)Z=$.nextfd();return J.fd=Z,$.streams[Z]=J,J},closeStream(J){$.streams[J]=null},dupStream(J,Z=-1){var Q=$.createStream(J,Z);return Q.stream_ops?.dup?.(Q),Q},doSetAttr(J,Z,Q){var K=J?.stream_ops.setattr,X=K?J:Z;K??=Z.node_ops.setattr,$.checkOpExists(K,63),K(X,Q)},chrdev_stream_ops:{open(J){var Z=$.getDevice(J.node.rdev);J.stream_ops=Z.stream_ops,J.stream_ops.open?.(J)},llseek(){throw new $.ErrnoError(70)}},major:(J)=>J>>8,minor:(J)=>J&255,makedev:(J,Z)=>J<<8|Z,registerDevice(J,Z){$.devices[J]={stream_ops:Z}},getDevice:(J)=>$.devices[J],getMounts(J){var Z=[],Q=[J];while(Q.length){var K=Q.pop();Z.push(K),Q.push(...K.mounts)}return Z},syncfs(J,Z){if(typeof J=="function")Z=J,J=!1;if($.syncFSRequests++,$.syncFSRequests>1)N(`warning: ${$.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var Q=$.getMounts($.root.mount),K=0;function X(V){return $.syncFSRequests--,Z(V)}function z(V){if(V){if(!z.errored)return z.errored=!0,X(V);return}if(++K>=Q.length)X(null)}for(var W of Q)if(W.type.syncfs)W.type.syncfs(W,J,z);else z(null)},mount(J,Z,Q){var K=Q==="/",X=!Q,z;if(K&&$.root)throw new $.ErrnoError(10);else if(!K&&!X){var W=$.lookupPath(Q,{follow_mount:!1});if(Q=W.path,z=W.node,$.isMountpoint(z))throw new $.ErrnoError(10);if(!$.isDir(z.mode))throw new $.ErrnoError(54)}var V={type:J,opts:Z,mountpoint:Q,mounts:[]},q=J.mount(V);if(q.mount=V,V.root=q,K)$.root=q;else if(z){if(z.mounted=V,z.mount)z.mount.mounts.push(V)}return q},unmount(J){var Z=$.lookupPath(J,{follow_mount:!1});if(!$.isMountpoint(Z.node))throw new $.ErrnoError(28);var Q=Z.node,K=Q.mounted,X=$.getMounts(K);for(var[z,W]of Object.entries($.nameTable))while(W){var V=W.name_next;if(X.includes(W.mount))$.destroyNode(W);W=V}Q.mounted=null;var q=Q.mount.mounts.indexOf(K);Q.mount.mounts.splice(q,1)},lookup(J,Z){return J.node_ops.lookup(J,Z)},mknod(J,Z,Q){var K=$.lookupPath(J,{parent:!0}),X=K.node,z=p.basename(J);if(!z)throw new $.ErrnoError(28);if(z==="."||z==="..")throw new $.ErrnoError(20);var W=$.mayCreate(X,z);if(W)throw new $.ErrnoError(W);if(!X.node_ops.mknod)throw new $.ErrnoError(63);return X.node_ops.mknod(X,z,Z,Q)},statfs(J){return $.statfsNode($.lookupPath(J,{follow:!0}).node)},statfsStream(J){return $.statfsNode(J.node)},statfsNode(J){var Z={bsize:4096,frsize:4096,blocks:1e6,bfree:500000,bavail:500000,files:$.nextInode,ffree:$.nextInode-1,fsid:42,flags:2,namelen:255};if(J.node_ops.statfs)Object.assign(Z,J.node_ops.statfs(J.mount.opts.root));return Z},create(J,Z=438){return Z&=4095,Z|=32768,$.mknod(J,Z,0)},mkdir(J,Z=511){return Z&=1023,Z|=16384,$.mknod(J,Z,0)},mkdirTree(J,Z){var Q=J.split("/"),K="";for(var X of Q){if(!X)continue;if(K||p.isAbs(J))K+="/";K+=X;try{$.mkdir(K,Z)}catch(z){if(z.errno!=20)throw z}}},mkdev(J,Z,Q){if(typeof Q>"u")Q=Z,Z=438;return Z|=8192,$.mknod(J,Z,Q)},symlink(J,Z){if(!yJ.resolve(J))throw new $.ErrnoError(44);var Q=$.lookupPath(Z,{parent:!0}),K=Q.node;if(!K)throw new $.ErrnoError(44);var X=p.basename(Z),z=$.mayCreate(K,X);if(z)throw new $.ErrnoError(z);if(!K.node_ops.symlink)throw new $.ErrnoError(63);return K.node_ops.symlink(K,X,J)},rename(J,Z){var Q=p.dirname(J),K=p.dirname(Z),X=p.basename(J),z=p.basename(Z),W,V,q;if(W=$.lookupPath(J,{parent:!0}),V=W.node,W=$.lookupPath(Z,{parent:!0}),q=W.node,!V||!q)throw new $.ErrnoError(44);if(V.mount!==q.mount)throw new $.ErrnoError(75);var R=$.lookupNode(V,X),m=yJ.relative(J,K);if(m.charAt(0)!==".")throw new $.ErrnoError(28);if(m=yJ.relative(Z,Q),m.charAt(0)!==".")throw new $.ErrnoError(55);var I;try{I=$.lookupNode(q,z)}catch(d){}if(R===I)return;var y=$.isDir(R.mode),_=$.mayDelete(V,X,y);if(_)throw new $.ErrnoError(_);if(_=I?$.mayDelete(q,z,y):$.mayCreate(q,z),_)throw new $.ErrnoError(_);if(!V.node_ops.rename)throw new $.ErrnoError(63);if($.isMountpoint(R)||I&&$.isMountpoint(I))throw new $.ErrnoError(10);if(q!==V){if(_=$.nodePermissions(V,"w"),_)throw new $.ErrnoError(_)}$.hashRemoveNode(R);try{V.node_ops.rename(R,q,z),R.parent=q}catch(d){throw d}finally{$.hashAddNode(R)}},rmdir(J){var Z=$.lookupPath(J,{parent:!0}),Q=Z.node,K=p.basename(J),X=$.lookupNode(Q,K),z=$.mayDelete(Q,K,!0);if(z)throw new $.ErrnoError(z);if(!Q.node_ops.rmdir)throw new $.ErrnoError(63);if($.isMountpoint(X))throw new $.ErrnoError(10);Q.node_ops.rmdir(Q,K),$.destroyNode(X)},readdir(J){var Z=$.lookupPath(J,{follow:!0}),Q=Z.node,K=$.checkOpExists(Q.node_ops.readdir,54);return K(Q)},unlink(J){var Z=$.lookupPath(J,{parent:!0}),Q=Z.node;if(!Q)throw new $.ErrnoError(44);var K=p.basename(J),X=$.lookupNode(Q,K),z=$.mayDelete(Q,K,!1);if(z)throw new $.ErrnoError(z);if(!Q.node_ops.unlink)throw new $.ErrnoError(63);if($.isMountpoint(X))throw new $.ErrnoError(10);Q.node_ops.unlink(Q,K),$.destroyNode(X)},readlink(J){var Z=$.lookupPath(J),Q=Z.node;if(!Q)throw new $.ErrnoError(44);if(!Q.node_ops.readlink)throw new $.ErrnoError(28);return Q.node_ops.readlink(Q)},stat(J,Z){var Q=$.lookupPath(J,{follow:!Z}),K=Q.node,X=$.checkOpExists(K.node_ops.getattr,63);return X(K)},fstat(J){var Z=$.getStreamChecked(J),Q=Z.node,K=Z.stream_ops.getattr,X=K?Z:Q;return K??=Q.node_ops.getattr,$.checkOpExists(K,63),K(X)},lstat(J){return $.stat(J,!0)},doChmod(J,Z,Q,K){$.doSetAttr(J,Z,{mode:Q&4095|Z.mode&-4096,ctime:Date.now(),dontFollow:K})},chmod(J,Z,Q){var K;if(typeof J=="string"){var X=$.lookupPath(J,{follow:!Q});K=X.node}else K=J;$.doChmod(null,K,Z,Q)},lchmod(J,Z){$.chmod(J,Z,!0)},fchmod(J,Z){var Q=$.getStreamChecked(J);$.doChmod(Q,Q.node,Z,!1)},doChown(J,Z,Q){$.doSetAttr(J,Z,{timestamp:Date.now(),dontFollow:Q})},chown(J,Z,Q,K){var X;if(typeof J=="string"){var z=$.lookupPath(J,{follow:!K});X=z.node}else X=J;$.doChown(null,X,K)},lchown(J,Z,Q){$.chown(J,Z,Q,!0)},fchown(J,Z,Q){var K=$.getStreamChecked(J);$.doChown(K,K.node,!1)},doTruncate(J,Z,Q){if($.isDir(Z.mode))throw new $.ErrnoError(31);if(!$.isFile(Z.mode))throw new $.ErrnoError(28);var K=$.nodePermissions(Z,"w");if(K)throw new $.ErrnoError(K);$.doSetAttr(J,Z,{size:Q,timestamp:Date.now()})},truncate(J,Z){if(Z<0)throw new $.ErrnoError(28);var Q;if(typeof J=="string"){var K=$.lookupPath(J,{follow:!0});Q=K.node}else Q=J;$.doTruncate(null,Q,Z)},ftruncate(J,Z){var Q=$.getStreamChecked(J);if(Z<0||(Q.flags&2097155)===0)throw new $.ErrnoError(28);$.doTruncate(Q,Q.node,Z)},utime(J,Z,Q){var K=$.lookupPath(J,{follow:!0}),X=K.node,z=$.checkOpExists(X.node_ops.setattr,63);z(X,{atime:Z,mtime:Q})},open(J,Z,Q=438){if(J==="")throw new $.ErrnoError(44);if(Z=$1(Z),Z&64)Q=Q&4095|32768;else Q=0;var K,X;if(typeof J=="object")K=J;else{X=J.endsWith("/");var z=$.lookupPath(J,{follow:!(Z&131072),noent_okay:!0});K=z.node,J=z.path}var W=!1;if(Z&64)if(K){if(Z&128)throw new $.ErrnoError(20)}else if(X)throw new $.ErrnoError(31);else K=$.mknod(J,Q|511,0),W=!0;if(!K)throw new $.ErrnoError(44);if($.isChrdev(K.mode))Z&=-513;if(Z&65536&&!$.isDir(K.mode))throw new $.ErrnoError(54);if(!W){var V=$.mayOpen(K,Z);if(V)throw new $.ErrnoError(V)}if(Z&512&&!W)$.truncate(K,0);Z&=-131713;var q=$.createStream({node:K,path:$.getPath(K),flags:Z,seekable:!0,position:0,stream_ops:K.stream_ops,ungotten:[],error:!1});if(q.stream_ops.open)q.stream_ops.open(q);if(W)$.chmod(K,Q&511);return q},close(J){if($.isClosed(J))throw new $.ErrnoError(8);if(J.getdents)J.getdents=null;try{if(J.stream_ops.close)J.stream_ops.close(J)}catch(Z){throw Z}finally{$.closeStream(J.fd)}J.fd=null},isClosed(J){return J.fd===null},llseek(J,Z,Q){if($.isClosed(J))throw new $.ErrnoError(8);if(!J.seekable||!J.stream_ops.llseek)throw new $.ErrnoError(70);if(Q!=0&&Q!=1&&Q!=2)throw new $.ErrnoError(28);return J.position=J.stream_ops.llseek(J,Z,Q),J.ungotten=[],J.position},read(J,Z,Q,K,X){if(K<0||X<0)throw new $.ErrnoError(28);if($.isClosed(J))throw new $.ErrnoError(8);if((J.flags&2097155)===1)throw new $.ErrnoError(8);if($.isDir(J.node.mode))throw new $.ErrnoError(31);if(!J.stream_ops.read)throw new $.ErrnoError(28);var z=typeof X<"u";if(!z)X=J.position;else if(!J.seekable)throw new $.ErrnoError(70);var W=J.stream_ops.read(J,Z,Q,K,X);if(!z)J.position+=W;return W},write(J,Z,Q,K,X,z){if(K<0||X<0)throw new $.ErrnoError(28);if($.isClosed(J))throw new $.ErrnoError(8);if((J.flags&2097155)===0)throw new $.ErrnoError(8);if($.isDir(J.node.mode))throw new $.ErrnoError(31);if(!J.stream_ops.write)throw new $.ErrnoError(28);if(J.seekable&&J.flags&1024)$.llseek(J,0,2);var W=typeof X<"u";if(!W)X=J.position;else if(!J.seekable)throw new $.ErrnoError(70);var V=J.stream_ops.write(J,Z,Q,K,X,z);if(!W)J.position+=V;return V},mmap(J,Z,Q,K,X){if((K&2)!==0&&(X&2)===0&&(J.flags&2097155)!==2)throw new $.ErrnoError(2);if((J.flags&2097155)===1)throw new $.ErrnoError(2);if(!J.stream_ops.mmap)throw new $.ErrnoError(43);if(!Z)throw new $.ErrnoError(28);return J.stream_ops.mmap(J,Z,Q,K,X)},msync(J,Z,Q,K,X){if(!J.stream_ops.msync)return 0;return J.stream_ops.msync(J,Z,Q,K,X)},ioctl(J,Z,Q){if(!J.stream_ops.ioctl)throw new $.ErrnoError(59);return J.stream_ops.ioctl(J,Z,Q)},readFile(J,Z={}){if(Z.flags=Z.flags||0,Z.encoding=Z.encoding||"binary",Z.encoding!=="utf8"&&Z.encoding!=="binary")w(`Invalid encoding type "${Z.encoding}"`);var Q=$.open(J,Z.flags),K=$.stat(J),X=K.size,z=new Uint8Array(X);if($.read(Q,z,0,X,0),Z.encoding==="utf8")z=RJ(z);return $.close(Q),z},writeFile(J,Z,Q={}){Q.flags=Q.flags||577;var K=$.open(J,Q.flags,Q.mode);Z=_Z(Z),$.write(K,Z,0,Z.byteLength,void 0,Q.canOwn),$.close(K)},cwd:()=>$.currentPath,chdir(J){var Z=$.lookupPath(J,{follow:!0});if(Z.node===null)throw new $.ErrnoError(44);if(!$.isDir(Z.node.mode))throw new $.ErrnoError(54);var Q=$.nodePermissions(Z.node,"x");if(Q)throw new $.ErrnoError(Q);$.currentPath=Z.path},createDefaultDirectories(){$.mkdir("/tmp"),$.mkdir("/home"),$.mkdir("/home/web_user")},createDefaultDevices(){$.mkdir("/dev"),$.registerDevice($.makedev(1,3),{read:()=>0,write:(K,X,z,W,V)=>W,llseek:()=>0}),$.mkdev("/dev/null",$.makedev(1,3)),NJ.register($.makedev(5,0),NJ.default_tty_ops),NJ.register($.makedev(6,0),NJ.default_tty1_ops),$.mkdev("/dev/tty",$.makedev(5,0)),$.mkdev("/dev/tty1",$.makedev(6,0));var J=new Uint8Array(1024),Z=0,Q=()=>{if(Z===0)ZZ(J),Z=J.byteLength;return J[--Z]};$.createDevice("/dev","random",Q),$.createDevice("/dev","urandom",Q),$.mkdir("/dev/shm"),$.mkdir("/dev/shm/tmp")},createSpecialDirectories(){$.mkdir("/proc");var J=$.mkdir("/proc/self");$.mkdir("/proc/self/fd"),$.mount({mount(){var Z=$.createNode(J,"fd",16895,73);return Z.stream_ops={llseek:A.stream_ops.llseek},Z.node_ops={lookup(Q,K){var X=+K,z=$.getStreamChecked(X),W={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>z.path},id:X+1};return W.parent=W,W},readdir(){return Array.from($.streams.entries()).filter(([Q,K])=>K).map(([Q,K])=>Q.toString())}},Z}},{},"/proc/self/fd")},createStandardStreams(J,Z,Q){if(J)$.createDevice("/dev","stdin",J);else $.symlink("/dev/tty","/dev/stdin");if(Z)$.createDevice("/dev","stdout",null,Z);else $.symlink("/dev/tty","/dev/stdout");if(Q)$.createDevice("/dev","stderr",null,Q);else $.symlink("/dev/tty1","/dev/stderr");var K=$.open("/dev/stdin",0),X=$.open("/dev/stdout",1),z=$.open("/dev/stderr",1)},staticInit(){$.nameTable=Array(4096),$.mount(A,{},"/"),$.createDefaultDirectories(),$.createDefaultDevices(),$.createSpecialDirectories(),$.filesystems={MEMFS:A}},init(J,Z,Q){$.initialized=!0,$.createStandardStreams(J,Z,Q)},quit(){$.initialized=!1;for(var J of $.streams)if(J)$.close(J)},findObject(J,Z){var Q=$.analyzePath(J,Z);if(!Q.exists)return null;return Q.object},analyzePath(J,Z){try{var Q=$.lookupPath(J,{follow:!Z});J=Q.path}catch(X){}var K={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var Q=$.lookupPath(J,{parent:!0});K.parentExists=!0,K.parentPath=Q.path,K.parentObject=Q.node,K.name=p.basename(J),Q=$.lookupPath(J,{follow:!Z}),K.exists=!0,K.path=Q.path,K.object=Q.node,K.name=Q.node.name,K.isRoot=Q.path==="/"}catch(X){K.error=X.errno}return K},createPath(J,Z,Q,K){J=typeof J=="string"?J:$.getPath(J);var X=Z.split("/").reverse();while(X.length){var z=X.pop();if(!z)continue;var W=p.join2(J,z);try{$.mkdir(W)}catch(V){if(V.errno!=20)throw V}J=W}return W},createFile(J,Z,Q,K,X){var z=p.join2(typeof J=="string"?J:$.getPath(J),Z),W=KZ(K,X);return $.create(z,W)},createDataFile(J,Z,Q,K,X,z){var W=Z;if(J)J=typeof J=="string"?J:$.getPath(J),W=Z?p.join2(J,Z):J;var V=KZ(K,X),q=$.create(W,V);if(Q){Q=_Z(Q),$.chmod(q,V|146);var R=$.open(q,577);$.write(R,Q,0,Q.length,0,z),$.close(R),$.chmod(q,V)}},createDevice(J,Z,Q,K){var X=p.join2(typeof J=="string"?J:$.getPath(J),Z),z=KZ(!!Q,!!K);$.createDevice.major??=64;var W=$.makedev($.createDevice.major++,0);return $.registerDevice(W,{open(V){V.seekable=!1},close(V){if(K?.buffer?.length)K(10)},read(V,q,R,m,I){var y=0;for(var _=0;_<m;_++){var d;try{d=Q()}catch(t){throw new $.ErrnoError(29)}if(d===void 0&&y===0)throw new $.ErrnoError(6);if(d===null||d===void 0)break;y++,q[R+_]=d}if(y)V.node.atime=Date.now();return y},write(V,q,R,m,I){for(var y=0;y<m;y++)try{K(q[R+y])}catch(_){throw new $.ErrnoError(29)}if(m)V.node.mtime=V.node.ctime=Date.now();return y}}),$.mkdev(X,z,W)},forceLoadFile(J){if(J.isDevice||J.isFolder||J.link||J.contents)return!0;if(globalThis.XMLHttpRequest)w("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");else try{J.contents=readBinary(J.url)}catch(Z){throw new $.ErrnoError(29)}},createLazyFile(J,Z,Q,K,X){class z{lengthKnown=!1;chunks=[];get(I){if(I>this.length-1||I<0)return;var y=I%this.chunkSize,_=I/this.chunkSize|0;return this.getter(_)[y]}setDataGetter(I){this.getter=I}cacheLength(){var I=new XMLHttpRequest;if(I.open("HEAD",Q,!1),I.send(null),!(I.status>=200&&I.status<300||I.status===304))w("Couldn't load "+Q+". Status: "+I.status);var y=Number(I.getResponseHeader("Content-length")),_,d=(_=I.getResponseHeader("Accept-Ranges"))&&_==="bytes",t=(_=I.getResponseHeader("Content-Encoding"))&&_==="gzip",e=1048576;if(!d)e=y;var CJ=(WJ,kJ)=>{if(WJ>kJ)w("invalid range ("+WJ+", "+kJ+") or no bytes requested!");if(kJ>y-1)w("only "+y+" bytes available! programmer error!");var JJ=new XMLHttpRequest;if(JJ.open("GET",Q,!1),y!==e)JJ.setRequestHeader("Range","bytes="+WJ+"-"+kJ);if(JJ.responseType="arraybuffer",JJ.overrideMimeType)JJ.overrideMimeType("text/plain; charset=x-user-defined");if(JJ.send(null),!(JJ.status>=200&&JJ.status<300||JJ.status===304))w("Couldn't load "+Q+". Status: "+JJ.status);if(JJ.response!==void 0)return new Uint8Array(JJ.response||[]);return QZ(JJ.responseText||"",!0)},QJ=this;if(QJ.setDataGetter((WJ)=>{var kJ=WJ*e,JJ=(WJ+1)*e-1;if(JJ=Math.min(JJ,y-1),typeof QJ.chunks[WJ]>"u")QJ.chunks[WJ]=CJ(kJ,JJ);if(typeof QJ.chunks[WJ]>"u")w("doXHR failed!");return QJ.chunks[WJ]}),t||!y)e=y=1,y=this.getter(0).length,e=y,U("LazyFiles on gzip forces download of the whole file when length is accessed");this._length=y,this._chunkSize=e,this.lengthKnown=!0}get length(){if(!this.lengthKnown)this.cacheLength();return this._length}get chunkSize(){if(!this.lengthKnown)this.cacheLength();return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!Y)w("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var W=new z,V={isDevice:!1,contents:W}}else var V={isDevice:!1,url:Q};var q=$.createFile(J,Z,V,K,X);if(V.contents)q.contents=V.contents;else if(V.url)q.contents=null,q.url=V.url;Object.defineProperties(q,{usedBytes:{get:function(){return this.contents.length}}});var R={};for(let[I,y]of Object.entries(q.stream_ops))R[I]=(..._)=>{return $.forceLoadFile(q),y(..._)};function m(I,y,_,d,t){var e=I.node.contents;if(t>=e.length)return 0;var CJ=Math.min(e.length-t,d);if(e.slice)for(var QJ=0;QJ<CJ;QJ++)y[_+QJ]=e[t+QJ];else for(var QJ=0;QJ<CJ;QJ++)y[_+QJ]=e.get(t+QJ);return CJ}return R.read=(I,y,_,d,t)=>{return $.forceLoadFile(q),m(I,y,_,d,t)},R.mmap=(I,y,_,d,t)=>{$.forceLoadFile(q);var e=bZ(y);if(!e)throw new $.ErrnoError(48);return m(I,k,e,y,_),{ptr:e,allocated:!0}},q.stream_ops=R,q}},F={calculateAt(J,Z,Q){if(p.isAbs(Z))return Z;var K;if(J===-100)K=$.cwd();else{var X=F.getStreamFromFD(J);K=X.path}if(Z.length==0){if(!Q)throw new $.ErrnoError(44);return K}return K+"/"+Z},writeStat(J,Z){B[J>>2]=Z.dev,B[J+4>>2]=Z.mode,B[J+8>>2]=Z.nlink,B[J+12>>2]=Z.uid,B[J+16>>2]=Z.gid,B[J+20>>2]=Z.rdev,H[J+24>>3]=BigInt(Z.size),L[J+32>>2]=4096,L[J+36>>2]=Z.blocks;var Q=Z.atime.getTime(),K=Z.mtime.getTime(),X=Z.ctime.getTime();return H[J+40>>3]=BigInt(Math.floor(Q/1000)),B[J+48>>2]=Q%1000*1000*1000,H[J+56>>3]=BigInt(Math.floor(K/1000)),B[J+64>>2]=K%1000*1000*1000,H[J+72>>3]=BigInt(Math.floor(X/1000)),B[J+80>>2]=X%1000*1000*1000,H[J+88>>3]=BigInt(Z.ino),0},writeStatFs(J,Z){B[J+4>>2]=Z.bsize,B[J+60>>2]=Z.bsize,H[J+8>>3]=BigInt(Z.blocks),H[J+16>>3]=BigInt(Z.bfree),H[J+24>>3]=BigInt(Z.bavail),H[J+32>>3]=BigInt(Z.files),H[J+40>>3]=BigInt(Z.ffree),B[J+48>>2]=Z.fsid,B[J+64>>2]=Z.flags,B[J+56>>2]=Z.namelen},doMsync(J,Z,Q,K,X){if(!$.isFile(Z.node.mode))throw new $.ErrnoError(43);if(K&2)return 0;var z=b.slice(J,J+Q);$.msync(Z,z,X,Q,K)},getStreamFromFD(J){var Z=$.getStreamChecked(J);return Z},varargs:void 0,getStr(J){var Z=zJ(J);return Z}};function Q1(J,Z){try{return J=F.getStr(J),$.chmod(J,Z),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function K1(J,Z,Q,K){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),Q&-8)return-28;var X=$.lookupPath(Z,{follow:!0}),z=X.node;if(!z)return-44;var W="";if(Q&4)W+="r";if(Q&2)W+="w";if(Q&1)W+="x";if(W&&$.nodePermissions(z,W))return-2;return 0}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}var cJ=()=>{var J=L[+F.varargs>>2];return F.varargs+=4,J},DJ=cJ;function G1(J,Z,Q){F.varargs=Q;try{var K=F.getStreamFromFD(J);switch(Z){case 0:{var X=cJ();if(X<0)return-28;while($.streams[X])X++;var z=$.dupStream(K,X);return z.fd}case 1:case 2:return 0;case 3:return K.flags;case 4:{var X=cJ();return K.flags|=X,0}case 12:{var X=DJ(),W=0;return D[X+W>>1]=2,0}case 13:case 14:return 0}return-28}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function X1(J,Z){try{return F.writeStat(Z,$.fstat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}var mJ=(J,Z,Q)=>FZ(J,b,Z,Q);function z1(J,Z){try{if(Z===0)return-28;var Q=$.cwd(),K=fJ(Q)+1;if(Z<K)return-68;return mJ(Q,J,Z),K}catch(X){if(typeof $>"u"||X.name!=="ErrnoError")throw X;return-X.errno}}function j1(J,Z,Q){try{var K=F.getStreamFromFD(J);K.getdents||=$.readdir(K.path);var X=280,z=0,W=$.llseek(K,0,1),V=Math.floor(W/X),q=Math.min(K.getdents.length,V+Math.floor(Q/X));for(var R=V;R<q;R++){var m,I,y=K.getdents[R];if(y===".")m=K.node.id,I=4;else if(y===".."){var _=$.lookupPath(K.path,{parent:!0});m=_.node.id,I=4}else{var d;try{d=$.lookupNode(K.node,y)}catch(t){if(t?.errno===28)continue;throw t}m=d.id,I=$.isChrdev(d.mode)?2:$.isDir(d.mode)?4:$.isLink(d.mode)?10:8}H[Z+z>>3]=BigInt(m),H[Z+z+8>>3]=BigInt((R+1)*X),D[Z+z+16>>1]=280,k[Z+z+18]=I,mJ(y,Z+z+19,256),z+=X}return $.llseek(K,R*X,0),z}catch(t){if(typeof $>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}function O1(J,Z,Q){F.varargs=Q;try{var K=F.getStreamFromFD(J);switch(Z){case 21509:{if(!K.tty)return-59;return 0}case 21505:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tcgets){var X=K.tty.ops.ioctl_tcgets(K),z=DJ();L[z>>2]=X.c_iflag||0,L[z+4>>2]=X.c_oflag||0,L[z+8>>2]=X.c_cflag||0,L[z+12>>2]=X.c_lflag||0;for(var W=0;W<32;W++)k[z+W+17]=X.c_cc[W]||0;return 0}return 0}case 21510:case 21511:case 21512:{if(!K.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tcsets){var z=DJ(),V=L[z>>2],q=L[z+4>>2],R=L[z+8>>2],m=L[z+12>>2],I=[];for(var W=0;W<32;W++)I.push(k[z+W+17]);return K.tty.ops.ioctl_tcsets(K.tty,Z,{c_iflag:V,c_oflag:q,c_cflag:R,c_lflag:m,c_cc:I})}return 0}case 21519:{if(!K.tty)return-59;var z=DJ();return L[z>>2]=0,0}case 21520:{if(!K.tty)return-59;return-28}case 21537:case 21531:{var z=DJ();return $.ioctl(K,Z,z)}case 21523:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tiocgwinsz){var y=K.tty.ops.ioctl_tiocgwinsz(K.tty),z=DJ();D[z>>1]=y[0],D[z+2>>1]=y[1]}return 0}case 21524:{if(!K.tty)return-59;return 0}case 21515:{if(!K.tty)return-59;return 0}default:return-28}}catch(_){if(typeof $>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}function W1(J,Z){try{return J=F.getStr(J),F.writeStat(Z,$.lstat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function V1(J,Z,Q){try{return Z=F.getStr(Z),Z=F.calculateAt(J,Z),$.mkdir(Z,Q,0),0}catch(K){if(typeof $>"u"||K.name!=="ErrnoError")throw K;return-K.errno}}function Y1(J,Z,Q,K){try{Z=F.getStr(Z);var X=K&256,z=K&4096;return K=K&-6401,Z=F.calculateAt(J,Z,z),F.writeStat(Q,X?$.lstat(Z):$.stat(Z))}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return-W.errno}}function U1(J,Z,Q,K){F.varargs=K;try{Z=F.getStr(Z),Z=F.calculateAt(J,Z);var X=K?cJ():0;return $.open(Z,Q,X).fd}catch(z){if(typeof $>"u"||z.name!=="ErrnoError")throw z;return-z.errno}}function B1(J,Z,Q,K){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),K<=0)return-28;var X=$.readlink(Z),z=Math.min(K,fJ(X)),W=k[Q+z];return mJ(X,Q,K+1),k[Q+z]=W,z}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function q1(J,Z,Q,K){try{return Z=F.getStr(Z),K=F.getStr(K),Z=F.calculateAt(J,Z),K=F.calculateAt(Q,K),$.rename(Z,K),0}catch(X){if(typeof $>"u"||X.name!=="ErrnoError")throw X;return-X.errno}}function N1(J){try{return J=F.getStr(J),$.rmdir(J),0}catch(Z){if(typeof $>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}function H1(J,Z){try{return J=F.getStr(J),F.writeStat(Z,$.stat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function P1(J,Z,Q){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),!Q)$.unlink(Z);else if(Q===512)$.rmdir(Z);else return-28;return 0}catch(K){if(typeof $>"u"||K.name!=="ErrnoError")throw K;return-K.errno}}var EZ=(J)=>B[J>>2]+L[J+4>>2]*4294967296;function w1(J,Z,Q,K){try{Z=F.getStr(Z),Z=F.calculateAt(J,Z,!0);var X=Date.now(),z,W;if(!Q)z=X,W=X;else{var V=EZ(Q),q=L[Q+8>>2];if(q==1073741823)z=X;else if(q==1073741822)z=null;else z=V*1000+q/1e6;if(Q+=16,V=EZ(Q),q=L[Q+8>>2],q==1073741823)W=X;else if(q==1073741822)W=null;else W=V*1000+q/1e6}if((W??z)!==null)$.utime(Z,z,W);return 0}catch(R){if(typeof $>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var D1=()=>w(""),k1=()=>{throw 1/0},L1=()=>Date.now(),A1=()=>performance.now(),I1=()=>2147483648,y1=(J)=>{var Z=g.buffer.byteLength,Q=(J-Z+65535)/65536|0;try{return g.grow(Q),x(),1}catch(K){}},R1=(J)=>{var Z=b.length;J>>>=0;var Q=I1();if(J>Q)return!1;for(var K=1;K<=4;K*=2){var X=Z*(1+0.2/K);X=Math.min(X,J+100663296);var z=Math.min(Q,TZ(Math.max(J,X),65536)),W=y1(z);if(W)return!0}return!1},GZ={},v1=()=>"./this.program",vJ=()=>{if(!vJ.strings){var J=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",Z={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:J,_:v1()};for(var Q in GZ)if(GZ[Q]===void 0)delete Z[Q];else Z[Q]=GZ[Q];var K=[];for(var Q in Z)K.push(`${Q}=${Z[Q]}`);vJ.strings=K}return vJ.strings},C1=(J,Z)=>{var Q=0,K=0;for(var X of vJ()){var z=Z+Q;B[J+K>>2]=z,Q+=mJ(X,z,1/0)+1,K+=4}return 0},F1=(J,Z)=>{var Q=vJ();B[J>>2]=Q.length;var K=0;for(var X of Q)K+=fJ(X)+1;return B[Z>>2]=K,0},T1=(J)=>{throw`exit(${J})`},b1=T1;function _1(J){try{var Z=F.getStreamFromFD(J);return $.close(Z),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return Q.errno}}var E1=(J,Z,Q,K)=>{var X=0;for(var z=0;z<Q;z++){var W=B[Z>>2],V=B[Z+4>>2];Z+=8;var q=$.read(J,k,W,V,K);if(q<0)return-1;if(X+=q,q<V)break;if(typeof K<"u")K+=q}return X};function g1(J,Z,Q,K){try{var X=F.getStreamFromFD(J),z=E1(X,Z,Q);return B[K>>2]=z,0}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return W.errno}}var M1=9007199254740992,x1=-9007199254740992,S1=(J)=>J<x1||J>M1?NaN:Number(J);function h1(J,Z,Q,K){Z=S1(Z);try{if(isNaN(Z))return 61;var X=F.getStreamFromFD(J);if($.llseek(X,Z,Q),H[K>>3]=BigInt(X.position),X.getdents&&Z===0&&Q===0)X.getdents=null;return 0}catch(z){if(typeof $>"u"||z.name!=="ErrnoError")throw z;return z.errno}}var p1=(J,Z,Q,K)=>{var X=0;for(var z=0;z<Q;z++){var W=B[Z>>2],V=B[Z+4>>2];Z+=8;var q=$.write(J,k,W,V,K);if(q<0)return-1;if(X+=q,q<V)break;if(typeof K<"u")K+=q}return X};function f1(J,Z,Q,K){try{var X=F.getStreamFromFD(J),z=p1(X,Z,Q);return B[K>>2]=z,0}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return W.errno}}function c1(J,Z){try{return ZZ(b.subarray(J,J+Z)),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return Q.errno}}var gZ=[],MZ=(J)=>{var Z=gZ[J];if(!Z)gZ[J]=Z=F0.get(J);return Z};$.staticInit();var xZ,SZ,hZ,pZ,fZ,cZ,mZ,uZ,lZ,sZ,oZ,dZ,rZ,nZ,iZ,aZ,tZ,eZ,J0,Z0,$0,Q0,K0,G0,X0,z0,j0,O0,W0,V0,Y0,U0,B0,q0,N0,H0,P0,w0,D0,k0,L0,A0,I0,y0,R0,XZ,v0,C0,m1,F0;function u1(J){xZ=J.J,SZ=J.K,hZ=J.L,pZ=J.M,fZ=J.N,cZ=J.O,mZ=J.P,uZ=J.Q,lZ=J.R,sZ=J.S,oZ=J.T,dZ=J.U,rZ=J.V,nZ=J.W,iZ=J.X,aZ=J.Y,tZ=J.Z,eZ=J._,J0=J.$,Z0=J.aa,$0=J.ba,Q0=J.ca,K0=J.da,G0=J.ea,X0=J.fa,z0=J.ga,j0=J.ha,O0=J.ia,W0=J.ja,V0=J.ka,Y0=J.la,U0=J.ma,B0=J.na,q0=J.oa,N0=J.pa,H0=J.qa,P0=J.ra,w0=J.sa,D0=J.ta,k0=J.ua,L0=J.va,A0=J.wa,I0=J.xa,y0=J.ya,R0=J.Aa,XZ=J.Ba,v0=J.Ca,C0=J.Da,m1=F0=J.za}var l1={b:pJ,H:Q1,k:K1,c:G1,G:X1,C:z1,w:j1,m:O1,D:W1,x:V1,E:Y1,i:U1,v:B1,u:q1,t:N1,F:H1,s:P1,r:w1,l:D1,p:k1,j:L1,f:A1,q:R1,z:C1,A:F1,g:b1,d:_1,h:g1,y:h1,e:f1,o:s1,n:o1,a:g,B:c1};function s1(J,Z,Q){var K=s();try{return MZ(J)(Z,Q)}catch(X){if(T(K),X!==X+0)throw X;XZ(1,0)}}function o1(J,Z,Q,K,X){var z=s();try{return MZ(J)(Z,Q,K,X)}catch(W){if(T(z),W!==W+0)throw W;XZ(1,0)}}function d1(J){if(l=!0,!j.noFSInit&&!$.initialized)$.init();J.I(),$.ignorePermissions=!1}var r1={a:l1};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),r1).then((J)=>{var Z=J.instance.exports;u1(Z),d1(Z),P()});let zZ=()=>{try{if(typeof g<"u"){if(self.wasmMemory=g,self.HEAPU8C=new Uint8ClampedArray(g.buffer),typeof BigInt64Array<"u")self.HEAP64=new BigInt64Array(g.buffer),self.HEAPU64=new BigUint64Array(g.buffer)}if(typeof b<"u")self.HEAPU8=b;if(typeof H<"u")self.HEAP64=H;if(typeof o<"u")self.HEAPU64=o}catch(J){}};if(typeof updateGlobalBufferAndViews==="function"){let J=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(Z)=>{J(Z),zZ()}}if(typeof x==="function"){let J=x;x=()=>{J(),zZ()}}let T0=typeof P==="function"?P:null;if(T0)P=()=>{if(j._malloc=SZ,j._free=hZ,j._akarisub_create=xZ,j._akarisub_destroy=pZ,j._akarisub_set_drop_animations=fZ,j._akarisub_create_track_mem=cZ,j._akarisub_remove_track=mZ,j._akarisub_resize_canvas=uZ,j._akarisub_add_font=lZ,j._akarisub_reload_fonts=sZ,j._akarisub_set_default_font=oZ,j._akarisub_set_fallback_fonts=dZ,j._akarisub_set_memory_limits=rZ,j._akarisub_get_event_count=nZ,j._akarisub_alloc_event=iZ,j._akarisub_remove_event=aZ,j._akarisub_get_style_count=tZ,j._akarisub_alloc_style=eZ,j._akarisub_remove_style=J0,j._akarisub_style_override_index=Z0,j._akarisub_disable_style_override=$0,j._akarisub_render_blend=Q0,j._akarisub_render_image=K0,j._akarisub_get_changed=G0,j._akarisub_get_count=X0,j._akarisub_get_time=z0,j._akarisub_get_track_color_space=j0,j._akarisub_event_get_int=O0,j._akarisub_event_set_int=W0,j._akarisub_event_get_str=V0,j._akarisub_event_set_str=Y0,j._akarisub_style_get_num=U0,j._akarisub_style_set_num=B0,j._akarisub_style_get_str=q0,j._akarisub_style_set_str=N0,j._akarisub_render_result_x=H0,j._akarisub_render_result_y=P0,j._akarisub_render_result_w=w0,j._akarisub_render_result_h=D0,j._akarisub_render_result_image=k0,j._akarisub_render_result_next=L0,j._akarisub_render_result_collect=A0,j._akarisub_render_blend_collect=I0,j._akarisub_render_image_collect=y0,typeof $<"u")j.FS_createPath=$.createPath,j.FS_createDataFile=$.createDataFile;return zZ(),T0()};if(l)O=j;else O=new Promise((J,Z)=>{v=J,a=Z});return O}var b0=n1;var jZ=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function _0(G,O=!1){let j=[],U=G.split(/[\r\n]+/g),N=U.length,P=null,Y=null;for(let w=0;w<N;w++){let v=U[w];if(!v||/^\s*$/.test(v))continue;let a=v[0];if(a==="["){let l=v.match(/^\[(.*)\]$/);if(l){if(O&&l[1].toLowerCase()==="events")break;P=null,Y={name:l[1],body:[]},j.push(Y);continue}}if(!Y)continue;if(a===";")Y.body.push({type:"comment",value:v.substring(1)});else{let l=v.indexOf(":");if(l===-1)continue;let x=v.substring(0,l),n=v.substring(l+1).trim();if(P||x==="Format"){let D=n.split(",");if(P&&D.length>P.length){let H=D.slice(P.length-1).join(",");D=D.slice(0,P.length-1),D.push(H)}let L=D.length;for(let H=0;H<L;H++)D[H]=D[H].trim();if(P){let H={},k=Math.min(P.length,L);for(let S=0;S<k;S++)H[P[S]]=D[S];n=H}else n=D}if(x==="Format")P=n;Y.body.push({key:x,value:n})}}return j}var i1=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function OZ(G){return G.replace(i1,"")}var a1=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function t1(G,O){let j=[...a1].sort((U,N)=>U.w-N.w);for(let U of j)if(G<=U.w&&O<=U.h)return U;return{w:Math.ceil(G/100)*100,h:Math.ceil(O/100)*100}}function r(G,O){return O&&O.includes(".")?G.toFixed(2).replace(/\.?0+$/,""):Math.round(G)}function WZ(G){let O=G.match(/PlayResX:\s*(\d+)/i),j=G.match(/PlayResY:\s*(\d+)/i),U=O?parseInt(O[1],10):1920,N=j?parseInt(j[1],10):1080,P=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,Y=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,w=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,v=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,a=0,l=0,x=(b,T,s)=>{let g,OJ=new RegExp(b.source,"g");while((g=OJ.exec(G))!==null){for(let GJ of T)if(g[GJ]){let zJ=Math.abs(parseFloat(g[GJ]));if(zJ>a)a=zJ}for(let GJ of s)if(g[GJ]){let zJ=Math.abs(parseFloat(g[GJ]));if(zJ>l)l=zJ}}};if(x(P,[1],[2]),x(Y,[1,3],[2,4]),x(w,[1],[2]),x(v,[1,3],[2,4]),a<=U&&l<=N)return G;let n=t1(a,l),D=U/n.w,L=N/n.h,H=Math.min(D,L),k=Math.max(D,L),S=1,M=G,h=M.match(/(\[Events\][\s\S]*)/i);if(!h)return M;let B=h[1];return B=B.replace(P,(b,T,s)=>`\\pos(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)})`),B=B.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(b,T,s,g,OJ,GJ,zJ)=>{let pJ=`\\move(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)},${r(parseFloat(g)*D,g)},${r(parseFloat(OJ)*L,OJ)}`;return GJ?`${pJ},${GJ},${zJ})`:`${pJ})`}),B=B.replace(w,(b,T,s)=>`\\org(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)})`),B=B.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(b,T,s,g,OJ,GJ)=>`\\${T}(${r(parseFloat(s)*D,s)},${r(parseFloat(g)*L,g)},${r(parseFloat(OJ)*D,OJ)},${r(parseFloat(GJ)*L,GJ)})`),B=B.replace(/\\fs([\d.]+)/g,(b,T)=>`\\fs${r(parseFloat(T)*k,T)}`),B=B.replace(/\\fscx([\d.]+)/g,(b,T)=>`\\fscx${r(parseFloat(T)*S,T)}`),B=B.replace(/\\xbord([\d.]+)/g,(b,T)=>`\\xbord${r(parseFloat(T)*D,T)}`),B=B.replace(/\\ybord([\d.]+)/g,(b,T)=>`\\ybord${r(parseFloat(T)*L,T)}`),B=B.replace(/\\xshad(-?[\d.]+)/g,(b,T)=>`\\xshad${r(parseFloat(T)*D,T)}`),B=B.replace(/\\yshad(-?[\d.]+)/g,(b,T)=>`\\yshad${r(parseFloat(T)*L,T)}`),["fsp","bord","shad","be","blur"].forEach((b)=>{let T=new RegExp(`\\\\${b}(-?[\\d.]+)`,"g");B=B.replace(T,(s,g)=>`\\${b}${r(parseFloat(g)*H,g)}`)}),B=B.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(b)=>{return b.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(T,s,g)=>{return`${r(parseFloat(s)*D,s)} ${r(parseFloat(g)*L,g)}`})}),M.substring(0,h.index)+B}var wJ=0,S0=1,jJ=null,VZ=!1,tJ=Date.now(),oJ=24,gJ=!1,h0=!1,yZ="wasm",PJ={},dJ={},p0=0,f0=0,FJ=[],i=!1,NZ=!1,MJ=!1,e1=3,$J=[];self.width=0;self.height=0;var C={framesRendered:0,framesDropped:0,totalRenderTime:0,maxRenderTime:0,minRenderTime:1/0,lastRenderTime:0,renderStartTime:0,pendingRenders:0,totalEvents:0,currentEventIndex:0,cacheHits:0,cacheMisses:0},J4=()=>{C.framesRendered=0,C.framesDropped=0,C.totalRenderTime=0,C.maxRenderTime=0,C.minRenderTime=1/0,C.lastRenderTime=0,C.cacheHits=0,C.cacheMisses=0},UJ=!1,TJ=!0,YJ=null,LJ=null,xJ=!1,HJ=null,c0=null,c=0,IJ=null,HZ=!1,Z4=!1,ZJ=null,rJ=!1,m0=new TextEncoder,$4=new TextDecoder,PZ=null,eJ=128,u0=Math.max(eJ,4096),l0=u0;var Q4=30,K4=1,G4=24,wZ=1000,s0=Array(eJ),E0=!1;var DZ=3,sJ=5,YZ=0,X4=0,KJ=0,VJ=0,z4=[],j4=[],O4=[],UZ=null;var W4=!1,JZ=null,AJ=null,kZ=(G)=>new Promise((O)=>setTimeout(O,G)),o0=()=>{if(E0)return;for(let G=0;G<eJ;G++)s0[G]={w:0,h:0,x:0,y:0,image:0};E0=!0},g0=(G)=>{if(G<eJ)return s0[G];return{w:0,h:0,x:0,y:0,image:0}};var RZ=(G)=>{if(!ZJ||G<=0)return;let O=DZ+sJ*G;if(VJ>=O&&KJ)return;let j=Math.max(O,(VJ||64)*2),U=j*Int32Array.BYTES_PER_ELEMENT;if(KJ)ZJ._free(KJ),KJ=0,VJ=0;if(KJ=ZJ._malloc(U),!KJ)throw VJ=0,Error("Failed to allocate render-collect buffer");VJ=j},nJ=(G)=>{if(!c)return;let O=E(),j=u();if(RZ(l0),yZ==="wasm")O.renderBlendCollect(j,G,0,KJ,VJ);else O.renderImageCollect(j,G,0,KJ,VJ)},d0=()=>{if(!c)return null;let G=E(),O=u(),j=G.getEventCount(O);if(j<=0)return null;let U=Number.POSITIVE_INFINITY;for(let N=0;N<j;N++){let P=G.eventGetInt(O,N,XJ.Start)/wZ;if(Number.isFinite(P)&&P<U)U=P}if(!Number.isFinite(U))return null;return Math.max(0,U)},V4=()=>{if(!c)return null;let G=E(),O=u(),j=G.getEventCount(O);if(j<=0)return null;let U=Number.POSITIVE_INFINITY,N=0;for(let P=0;P<j;P++){let Y=G.eventGetInt(O,P,XJ.Start)/wZ,w=Math.max(0,G.eventGetInt(O,P,XJ.Duration)/wZ);if(!Number.isFinite(Y))continue;let v=Y+w;if(Y<U)U=Y;if(v>N)N=v}if(!Number.isFinite(U))return null;if(N<U)N=U;return{start:Math.max(0,U),end:Math.max(0,N)}},Y4=async()=>{if(!c)return;let G=V4();if(!G)return;let O=Math.min(G.end,G.start+Q4),j=0;for(let U=G.start;U<=O;U+=K4){if(!c)return;if(gJ&&(MJ||$J.length>0||C.pendingRenders>0)){await kZ(0);continue}if(nJ(U),j++,gJ||j%G4===0)await kZ(0)}nJ(O)};var vZ=()=>{if(W4=!1,UZ)clearTimeout(UZ),UZ=null},U4=()=>{if(AJ||!c)return;AJ=(async()=>{await kZ(0);try{await Y4()}catch(G){if(i)console.warn("[AkariSub] Full track warmup failed, continuing:",G)}try{if(c)nJ(n0())}catch(G){if(i)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",G)}})().finally(()=>{AJ=null})};var XJ={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},bJ={Name:0,Effect:1,Text:2},f={FontSize:0,PrimaryColour:1,SecondaryColour:2,OutlineColour:3,BackColour:4,Bold:5,Italic:6,Underline:7,StrikeOut:8,ScaleX:9,ScaleY:10,Spacing:11,Angle:12,BorderStyle:13,Outline:14,Shadow:15,Alignment:16,MarginL:17,MarginR:18,MarginV:19,Encoding:20,treat_fontname_as_pattern:21,Blur:22,Justify:23},iJ={Name:0,FontName:1},B4=(G)=>{return m0.encode(G)},q4=(G)=>{if(!ZJ)return 0;let O=B4(G),j=ZJ._malloc(O.length+1);if(!j)return 0;return self.HEAPU8.set(O,j),self.HEAPU8[j+O.length]=0,j},_J=(G)=>{if(!G)return"";let O=G,j=self.HEAPU8;while(j[O]!==0)O++;return $4.decode(j.subarray(G,O))},qJ=(G,O)=>{let j=q4(G);try{return O(j)}finally{if(j&&ZJ)ZJ._free(j)}},E=()=>{if(!PZ)throw Error("AkariSub API is not initialized");return PZ},u=()=>{if(!c)throw Error("AkariSub instance is not initialized");return c};self.addFont=({font:G})=>r0(G,!1);var uJ=(G)=>{if(G=G.trim().toLowerCase(),G.startsWith("@"))G=G.substring(1);if(dJ[G])return;if(dJ[G]=!0,!PJ[G]){if(h0)postMessage({target:"getLocalFont",font:G})}else r0(PJ[G])},r0=(G,O=!0)=>{if(typeof G==="string")IZ(G,(j)=>{M0(new Uint8Array(j),O)},console.error);else M0(G,O)};var BZ=null,N4=()=>{if(BZ)return;BZ=setTimeout(()=>{if(BZ=null,c)E().reloadFonts(c)},16)},SJ=(G,O)=>{if(!ZJ||!c){if(i)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",O);return}try{let j=E(),U=ZJ._malloc(G.length);if(!U){console.warn("[AkariSub] Failed to allocate memory for embedded font:",O);return}if(self.HEAPU8.set(G,U),qJ(O,(N)=>{j.addFont(c,N,U,G.length)}),i)console.log("[AkariSub] Added embedded font:",O,"size:",G.length)}catch(j){console.warn("[AkariSub] Failed to add embedded font:",O,j)}},M0=(G,O=!0)=>{let j=O?"/fonts/fallback":"/fonts/attached",U=O?"fallback-"+f0++:"attached-"+p0++;if(ZJ){try{ZJ.FS_createDataFile(j,U,G,!0,!0,!0)}catch(N){console.warn("Failed to write font to filesystem:",j+"/"+U,N)}if(!O)SJ(G,U);else if(c)SJ(G,U);else FJ.push({data:G,name:U})}N4()},lJ=(G,O=!0)=>{let j=O?"/fonts/fallback":"/fonts/attached",U=O?"fallback-"+f0++:"attached-"+p0++;if(ZJ){try{if(ZJ.FS_createDataFile(j,U,G,!0,!0,!0),i)console.log("[AkariSub] Wrote font to FS:",j+"/"+U,"size:",G.length)}catch(N){console.warn("Failed to write font to filesystem:",j+"/"+U,N)}if(!O)SJ(G,U);else if(c)SJ(G,U);else FJ.push({data:G,name:U})}},LZ=(G)=>{if(!PJ)return;if(G.length>500000){let j=G.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(j){let P=j[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let Y of P)uJ(Y[1].trim())}let U=G.match(/\[Events\][\s\S]*/i);if(U){let P=U[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),Y=0;for(let w of P)if(uJ(w[1]),++Y>=1000)break}}else{let j=_0(G,!0);for(let N=0;N<j.length;N++)for(let P=0;P<j[N].body.length;P++){let Y=j[N].body[P];if(Y.key==="Style"&&typeof Y.value==="object"&&!Array.isArray(Y.value))uJ(Y.value.Fontname)}let U=G.match(/\[Events\][\s\S]*/i);if(U){let P=U[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let Y of P)uJ(Y[1])}}},AZ=(G,O)=>{let j=new XMLHttpRequest;return j.open("GET",G,!1),j.responseType=O?"arraybuffer":"text",j.send(null),j.response},IZ=(G,O,j)=>{let U=new XMLHttpRequest;U.open("GET",G,!0),U.responseType="arraybuffer",U.onload=()=>{if((U.status===200||U.status===0)&&U.response)return O(U.response)},U.onerror=j,U.send(null)};self.setTrack=({content:G})=>{if(vZ(),AJ=null,LZ(G),NZ)G=WZ(G);if(HZ)G=OZ(G);let O=E(),j=u();qJ(G,(U)=>{O.createTrackMem(j,U)}),JZ=d0(),IJ=jZ[O.getTrackColorSpace(j)],rJ=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ})};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ})};self.freeTrack=()=>{vZ(),AJ=null,JZ=null;let G=E(),O=u();G.removeTrack(O)};self.setTrackByUrl=({url:G})=>{self.setTrack({content:AZ(G)})};var EJ=!0,n0=()=>{let G=(Date.now()-tJ)/1000;if(EJ)return wJ;else{if(G>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),i0(!0);return wJ+G*S0}},H4=(G)=>{if(wJ=G,tJ=Date.now(),gJ)return;if(!jJ)if(VZ)jJ=CZ(aJ);else aJ(),VZ=!0,setTimeout(()=>{VZ=!1},20)},i0=(G)=>{if(gJ){if(EJ=G,jJ)x0(jJ),jJ=null;return}if(G!==EJ)if(EJ=G,G){if(jJ)x0(jJ),jJ=null}else tJ=Date.now(),jJ=CZ(aJ)},P4=()=>{if(MJ||$J.length===0)return;if($J.length>1){let O=$J.length-1;C.framesDropped+=O;let j=$J[$J.length-1];$J.length=0,$J.push(j)}let G=$J.shift();if(!G)return;hJ(G.time,G.force)},BJ=()=>{MJ=!1,P4()},hJ=(G,O)=>{if(MJ){let D={time:G,force:O?1:0};if(D.force)$J.length=0;else{let L=$J[$J.length-1];if(L&&Math.abs(L.time-D.time)>0.25)$J.length=0}if($J.length>=e1)$J.shift(),C.framesDropped++;$J.push(D);return}MJ=!0,o0();let j={},U=performance.now();C.renderStartTime=U,C.pendingRenders++;let N=E(),P=u(),Y=O?1:0;RZ(u0);let w=yZ==="wasm"?N.renderBlendCollect(P,G,Y,KJ,VJ):N.renderImageCollect(P,G,Y,KJ,VJ),v=new Int32Array(self.wasmMemory.buffer,KJ,DZ),a=v[0],l=v[1],n=performance.now()-U;if(C.lastRenderTime=n,C.totalRenderTime+=n,C.maxRenderTime=Math.max(C.maxRenderTime,n),n>0)C.minRenderTime=Math.min(C.minRenderTime,n);if(a!==0||O)C.framesRendered++,C.cacheMisses++;else C.cacheHits++;if(C.totalEvents=N.getEventCount(P),i){let D=performance.now(),L=v[2];j.WASMRenderTime=L-U,j.WASMBitmapDecodeTime=D-L,j.JSRenderTime=Date.now()}if(a!==0||O){let D=z4,L=j4;if(D.length=0,L.length=0,w===0)return qZ({images:D,buffers:L,times:j});let H=KJ+DZ*Int32Array.BYTES_PER_ELEMENT,k=new Int32Array(self.wasmMemory.buffer,H,w*sJ);if(UJ&&xJ!==!0){let M=O4;M.length=w;for(let h=0;h<w;++h){let B=h*sJ,o=g0(h);o.x=k[B],o.y=k[B+1],o.w=k[B+2],o.h=k[B+3],o.image=0;let b=k[B+4],T=o.w*o.h*4,s=self.HEAPU8C.slice(b,b+T),g=new ImageData(s,o.w,o.h);M[h]=TJ?createImageBitmap(g,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(g),D[h]=o}Promise.all(M).then((h)=>{for(let B=0;B<w;B++)D[B].image=h[B];if(i)j.JSBitmapGenerationTime=Date.now()-(j.JSRenderTime||0);qZ({images:D,buffers:h,times:j})}).catch(()=>{if(TJ)TJ=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),C.pendingRenders--,BJ(),hJ(G,O);else C.pendingRenders--,postMessage({target:"unbusy"}),BJ()})}else{for(let M=0;M<w;++M){let h=M*sJ,B=g0(M);if(B.x=k[h],B.y=k[h+1],B.w=k[h+2],B.h=k[h+3],B.image=k[h+4],!LJ){let o=B.image,b=self.wasmMemory.buffer.slice(o,o+B.w*B.h*4);L.push(b),B.image=b}D[M]=B}qZ({images:D,buffers:L,times:j})}}else C.pendingRenders--,postMessage({target:"unbusy"}),BJ()};self.demand=({time:G})=>{wJ=G,tJ=Date.now();let O=rJ?1:0;rJ=!1,hJ(G,O)};var aJ=(G)=>{if(jJ=null,hJ(n0(),G),!EJ)jJ=CZ(aJ)},qZ=({times:G,images:O,buffers:j})=>{C.pendingRenders--;let{width:U,height:N}=self,P=O.length,Y={target:"render",asyncRender:UJ,images:O,times:G,width:U,height:N,colorSpace:IJ};if(xJ){if(YJ.height!==N||YJ.width!==U)YJ.width=U,YJ.height=N;if(LJ.clearRect(0,0,U,N),UJ)for(let w=0;w<P;w++){let v=O[w];if(v.image)LJ.drawImage(v.image,v.x,v.y),v.image.close()}else for(let w=0;w<P;w++){let v=O[w];if(v.image){let{w:a,h:l}=v;if(HJ.width!==a||HJ.height!==l)HJ.width=a,HJ.height=l;let x=v.image,n=a*l*4,D=self.HEAPU8C.subarray(x,x+n);c0.putImageData(new ImageData(new Uint8ClampedArray(D.buffer,D.byteOffset,D.byteLength),a,l),0,0),LJ.drawImage(HJ,v.x,v.y)}}if(xJ==="hybrid"){if(!P){postMessage(Y),BJ();return}if(i)G.bitmaps=P;try{let w=YJ.transferToImageBitmap(),v={...Y,images:[{image:w,x:0,y:0}],asyncRender:!0};postMessage(v,[w]),BJ()}catch{postMessage({target:"unbusy"}),BJ()}}else{if(i){G.JSRenderTime=Date.now()-(G.JSRenderTime||0)-(G.JSBitmapGenerationTime||0);let w=0;for(let v in G)w+=G[v]||0;console.log("Bitmaps: "+P+" Total: "+(w|0)+"ms",G)}postMessage({target:"unbusy"}),BJ()}}else postMessage(Y,j),BJ()},CZ=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let G=0;return(O)=>{let j=Date.now();if(G===0)G=j+1000/oJ;else while(j+2>=G)G+=1000/oJ;let U=Math.max(G-j,0);return setTimeout(O,U)}})(),x0=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async(G)=>{if(Z4=G.hasBitmapBug,typeof G.initialTime==="number"&&Number.isFinite(G.initialTime))wJ=G.initialTime;let O=self.fetch,j=(Y)=>{if(WebAssembly.instantiateStreaming)self.fetch=(w)=>O(Y)},U=()=>{self.fetch=O},N=(Y)=>{return j(Y),b0({wasm:!WebAssembly.instantiateStreaming?AZ(Y,!0):void 0}).finally(U)},P=async(Y)=>{ZJ=Y,PZ={create:Y._akarisub_create,destroy:Y._akarisub_destroy,setDropAnimations:Y._akarisub_set_drop_animations,createTrackMem:Y._akarisub_create_track_mem,removeTrack:Y._akarisub_remove_track,resizeCanvas:Y._akarisub_resize_canvas,addFont:Y._akarisub_add_font,reloadFonts:Y._akarisub_reload_fonts,setDefaultFont:Y._akarisub_set_default_font,setFallbackFonts:Y._akarisub_set_fallback_fonts,setMemoryLimits:Y._akarisub_set_memory_limits,getEventCount:Y._akarisub_get_event_count,allocEvent:Y._akarisub_alloc_event,removeEvent:Y._akarisub_remove_event,getStyleCount:Y._akarisub_get_style_count,allocStyle:Y._akarisub_alloc_style,removeStyle:Y._akarisub_remove_style,styleOverrideIndex:Y._akarisub_style_override_index,disableStyleOverride:Y._akarisub_disable_style_override,renderBlend:Y._akarisub_render_blend,renderImage:Y._akarisub_render_image,getChanged:Y._akarisub_get_changed,getCount:Y._akarisub_get_count,getTime:Y._akarisub_get_time,getTrackColorSpace:Y._akarisub_get_track_color_space,eventGetInt:Y._akarisub_event_get_int,eventSetInt:Y._akarisub_event_set_int,eventGetStr:Y._akarisub_event_get_str,eventSetStr:Y._akarisub_event_set_str,styleGetNum:Y._akarisub_style_get_num,styleSetNum:Y._akarisub_style_set_num,styleGetStr:Y._akarisub_style_get_str,styleSetStr:Y._akarisub_style_set_str,rrX:Y._akarisub_render_result_x,rrY:Y._akarisub_render_result_y,rrW:Y._akarisub_render_result_w,rrH:Y._akarisub_render_result_h,rrImage:Y._akarisub_render_result_image,rrNext:Y._akarisub_render_result_next,rrCollect:Y._akarisub_render_result_collect,renderBlendCollect:Y._akarisub_render_blend_collect,renderImageCollect:Y._akarisub_render_image_collect};let w=[],v=new Set;if(G.fallbackFonts&&G.fallbackFonts.length>0)for(let H of G.fallbackFonts){let k=H.trim(),S=k.toLowerCase();if(S&&!v.has(S))v.add(S),w.push(k)}try{Y.FS_createPath("/","fonts",!0,!0),Y.FS_createPath("/fonts","attached",!0,!0),Y.FS_createPath("/fonts","fallback",!0,!0),Y.FS_createPath("/","fontconfig",!0,!0),Y.FS_createPath("/","assets",!0,!0),Y.FS_createPath("/","etc",!0,!0),Y.FS_createPath("/etc","fonts",!0,!0);let H=`<?xml version="1.0"?>
|
|
2
|
+
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
|
3
|
+
<fontconfig>
|
|
4
|
+
<!-- Font directories listed in priority order -->
|
|
5
|
+
<dir>/fonts/attached</dir>
|
|
6
|
+
<dir>/fonts</dir>
|
|
7
|
+
<dir>/fonts/fallback</dir>
|
|
8
|
+
<match target="pattern">
|
|
9
|
+
<test qual="any" name="family">
|
|
10
|
+
<string>mono</string>
|
|
11
|
+
</test>
|
|
12
|
+
<edit name="family" mode="assign" binding="same">
|
|
13
|
+
<string>monospace</string>
|
|
14
|
+
</edit>
|
|
15
|
+
</match>
|
|
16
|
+
<match target="pattern">
|
|
17
|
+
<test qual="any" name="family">
|
|
18
|
+
<string>sans serif</string>
|
|
19
|
+
</test>
|
|
20
|
+
<edit name="family" mode="assign" binding="same">
|
|
21
|
+
<string>sans-serif</string>
|
|
22
|
+
</edit>
|
|
23
|
+
</match>
|
|
24
|
+
<match target="pattern">
|
|
25
|
+
<test qual="any" name="family">
|
|
26
|
+
<string>sans</string>
|
|
27
|
+
</test>
|
|
28
|
+
<edit name="family" mode="assign" binding="same">
|
|
29
|
+
<string>sans-serif</string>
|
|
30
|
+
</edit>
|
|
31
|
+
</match>
|
|
32
|
+
<cachedir>/fontconfig</cachedir>
|
|
33
|
+
<config>
|
|
34
|
+
<rescan>
|
|
35
|
+
<int>0</int>
|
|
36
|
+
</rescan>
|
|
37
|
+
</config>
|
|
38
|
+
</fontconfig>
|
|
39
|
+
`,k=m0.encode(H);Y.FS_createDataFile("/assets","fonts.conf",k,!0,!1,!1),Y.FS_createDataFile("/etc/fonts","fonts.conf",k,!0,!1,!1)}catch(H){console.warn("Failed to create font directories or fonts.conf:",H)}if(self.width=G.width,self.height=G.height,gJ=!!G.onDemandRender,yZ=G.blendMode,UJ=G.asyncRender,UJ&&typeof createImageBitmap>"u")UJ=!1,console.error("'createImageBitmap' needed for 'asyncRender' unsupported!");if(UJ)try{let k=new OffscreenCanvas(1,1).getContext("2d");if(k){let S=k.getImageData(0,0,1,1);await createImageBitmap(S,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).catch(()=>{TJ=!1,console.warn("[AkariSub] createImageBitmap options not supported (Safari?), rendering without options")})}}catch{TJ=!1}PJ=G.availableFonts,i=G.debug,oJ=G.targetFps||oJ,h0=G.useLocalFonts,HZ=G.dropAllBlur,NZ=G.clampPos,await(async()=>{let H=[];for(let k of w){let S=k.trim().toLowerCase(),M=S.startsWith("@")?S.substring(1):S;if(PJ&&PJ[M]){let h=PJ[M];if(typeof h==="string"){let B=new Promise((o)=>{IZ(h,(b)=>{if(lJ(new Uint8Array(b),!0),dJ[M]=!0,i)console.log("[AkariSub] Loaded fallback font async:",M);o()},(b)=>{console.error("Failed to load fallback font:",M,b),o()})});H.push(B)}else lJ(h,!0),dJ[M]=!0}}if(H.length>0){let k=null,S=!1,M=new Promise((h)=>{k=setTimeout(()=>{S=!0,console.warn("[AkariSub] Fallback font loading timeout, continuing with available fonts"),h()},30000)});if(await Promise.race([Promise.all(H).then(()=>{if(k!==null)clearTimeout(k)}),M]),!S&&i)console.log("[AkariSub] All fallback fonts loaded successfully")}})();let l=w.length>0?w[0]:null;if(c=qJ(l||"",(H)=>{return E().create(self.width,self.height,H,i?1:0)}),FJ.length>0){for(let{data:H,name:k}of FJ)SJ(H,k);FJ.length=0,E().reloadFonts(c)}if(w.length>0)qJ(w.join(","),(H)=>{E().setFallbackFonts(u(),H)});let x=G.subContent;if(!x)x=AZ(G.subUrl);if(x.length>500000){if(postMessage({target:"partial_ready"}),i)console.log("[AkariSub] Large subtitle detected, emitting partial_ready early")}if(LZ(x),NZ)x=WZ(x);if(HZ)x=OZ(x);let D=!1,L=[];for(let H of G.fonts||[])if(typeof H==="string"){let k=new Promise((S)=>{IZ(H,(M)=>{if(lJ(new Uint8Array(M),!1),D=!0,i)console.log("[AkariSub] Loaded attached font async:",H);S()},(M)=>{console.error("Failed to load attached font:",H,M),S()})});L.push(k)}else lJ(H,!1),D=!0;if(L.length>0){let H=null,k=!1,S=new Promise((M)=>{H=setTimeout(()=>{k=!0,console.warn("[AkariSub] Attached font loading timeout, continuing with available fonts"),M()},30000)});if(await Promise.race([Promise.all(L).then(()=>{if(H!==null)clearTimeout(H)}),S]),!k&&i)console.log("[AkariSub] Attached font loading complete")}if(D){if(i)console.log("[AkariSub] Reloading fonts after writing attached fonts to FS");if(E().reloadFonts(u()),i)console.log("[AkariSub] Font reload complete")}if(LZ(x),qJ(x,(H)=>{E().createTrackMem(u(),H)}),JZ=d0(),IJ=jZ[E().getTrackColorSpace(u())],E().setDropAnimations(u(),G.dropAllAnimations||0),G.libassMemoryLimit>0||G.libassGlyphLimit>0)E().setMemoryLimits(u(),G.libassGlyphLimit||0,G.libassMemoryLimit||0);o0(),RZ(l0);try{nJ(wJ)}catch(H){if(i)console.warn("[AkariSub] Prewarm render failed, continuing:",H)}rJ=!0,postMessage({target:"ready"}),postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ}),U4()};N(G.wasmUrl).then(P).catch((Y)=>{console.error("[AkariSub] WASM loading failed:",Y),postMessage({target:"error",error:"WASM loading failed: "+(Y&&Y.message?Y.message:String(Y))})})};self.offscreenCanvas=({transferable:G})=>{if(YJ=G[0],LJ=YJ.getContext("2d"),!UJ)HJ=new OffscreenCanvas(self.height,self.width),c0=HJ.getContext("2d",{desynchronized:!0});xJ=!0};self.detachOffscreen=()=>{YJ=new OffscreenCanvas(self.height,self.width),LJ=YJ.getContext("2d",{desynchronized:!0}),xJ="hybrid"};self.canvas=({width:G,height:O,videoWidth:j,videoHeight:U,force:N})=>{if(G==null)throw Error("Invalid canvas size specified");if(self.width=G,self.height=O,c)E().resizeCanvas(c,G,O,j,U);if(N)hJ(wJ,!0)};self.video=({currentTime:G,isPaused:O,rate:j})=>{if(G!=null)H4(G);if(O!=null)i0(O);if(j!=null)S0=j};self.destroy=()=>{if(vZ(),AJ=null,JZ=null,ZJ){if(YZ)ZJ._free(YZ),YZ=0,X4=0;if(KJ)ZJ._free(KJ),KJ=0,VJ=0}if(c)E().destroy(c),c=0};self.setAsyncRender=({value:G})=>{UJ=G&&typeof createImageBitmap<"u"};var a0=(G,O)=>{let j=E(),U=u();for(let N of Object.keys(O)){let P=O[N];if(P==null||N==="_index")continue;if(N in XJ){j.eventSetInt(U,G,XJ[N],Number(P));continue}if(N in bJ)qJ(String(P),(Y)=>{j.eventSetStr(U,G,bJ[N],Y)})}},w4=(G)=>{let O=E(),j=u();return{Start:O.eventGetInt(j,G,XJ.Start),Duration:O.eventGetInt(j,G,XJ.Duration),ReadOrder:O.eventGetInt(j,G,XJ.ReadOrder),Layer:O.eventGetInt(j,G,XJ.Layer),Style:String(O.eventGetInt(j,G,XJ.Style)),MarginL:O.eventGetInt(j,G,XJ.MarginL),MarginR:O.eventGetInt(j,G,XJ.MarginR),MarginV:O.eventGetInt(j,G,XJ.MarginV),Name:_J(O.eventGetStr(j,G,bJ.Name)),Text:_J(O.eventGetStr(j,G,bJ.Text)),Effect:_J(O.eventGetStr(j,G,bJ.Effect))}},t0=(G,O)=>{let j=E(),U=u();for(let N of Object.keys(O)){let P=O[N];if(P==null)continue;if(N in f){j.styleSetNum(U,G,f[N],Number(P));continue}if(N in iJ)qJ(String(P),(Y)=>{j.styleSetStr(U,G,iJ[N],Y)})}},D4=(G)=>{let O=E(),j=u();return{Name:_J(O.styleGetStr(j,G,iJ.Name)),FontName:_J(O.styleGetStr(j,G,iJ.FontName)),FontSize:O.styleGetNum(j,G,f.FontSize),PrimaryColour:O.styleGetNum(j,G,f.PrimaryColour),SecondaryColour:O.styleGetNum(j,G,f.SecondaryColour),OutlineColour:O.styleGetNum(j,G,f.OutlineColour),BackColour:O.styleGetNum(j,G,f.BackColour),Bold:O.styleGetNum(j,G,f.Bold),Italic:O.styleGetNum(j,G,f.Italic),Underline:O.styleGetNum(j,G,f.Underline),StrikeOut:O.styleGetNum(j,G,f.StrikeOut),ScaleX:O.styleGetNum(j,G,f.ScaleX),ScaleY:O.styleGetNum(j,G,f.ScaleY),Spacing:O.styleGetNum(j,G,f.Spacing),Angle:O.styleGetNum(j,G,f.Angle),BorderStyle:O.styleGetNum(j,G,f.BorderStyle),Outline:O.styleGetNum(j,G,f.Outline),Shadow:O.styleGetNum(j,G,f.Shadow),Alignment:O.styleGetNum(j,G,f.Alignment),MarginL:O.styleGetNum(j,G,f.MarginL),MarginR:O.styleGetNum(j,G,f.MarginR),MarginV:O.styleGetNum(j,G,f.MarginV),Encoding:O.styleGetNum(j,G,f.Encoding),treat_fontname_as_pattern:O.styleGetNum(j,G,f.treat_fontname_as_pattern),Blur:O.styleGetNum(j,G,f.Blur),Justify:O.styleGetNum(j,G,f.Justify)}};self.createEvent=({event:G})=>{let O=E().allocEvent(u());if(O>=0)a0(O,G)};self.getEvents=()=>{let G=[],j=E().getEventCount(u());for(let U=0;U<j;U++)G.push({...w4(U),_index:U});postMessage({target:"getEvents",events:G})};self.setEvent=({event:G,index:O})=>{a0(O,G)};self.removeEvent=({index:G})=>{E().removeEvent(u(),G)};self.createStyle=({style:G})=>{let O=E().allocStyle(u());if(O>=0)t0(O,G);return O};self.getStyles=()=>{let G=[],j=E().getStyleCount(u());for(let U=0;U<j;U++)G.push(D4(U));postMessage({target:"getStyles",time:Date.now(),styles:G})};self.setStyle=({style:G,index:O})=>{t0(O,G)};self.removeStyle=({index:G})=>{E().removeStyle(u(),G)};self.styleOverride=(G)=>{let O=self.createStyle(G);if(typeof O==="number"&&O>=0)E().styleOverrideIndex(u(),O)};self.disableStyleOverride=()=>{E().disableStyleOverride(u())};self.defaultFont=({font:G})=>{qJ(G,(O)=>{E().setDefaultFont(u(),O)})};self.getStats=()=>{let G=C.framesRendered>0?C.totalRenderTime/C.framesRendered:0;postMessage({target:"getStats",stats:{framesRendered:C.framesRendered,framesDropped:C.framesDropped,avgRenderTime:Math.round(G*100)/100,maxRenderTime:Math.round(C.maxRenderTime*100)/100,minRenderTime:C.minRenderTime===1/0?0:Math.round(C.minRenderTime*100)/100,lastRenderTime:Math.round(C.lastRenderTime*100)/100,pendingRenders:Math.max(0,C.pendingRenders),totalEvents:C.totalEvents,cacheHits:C.cacheHits,cacheMisses:C.cacheMisses}})};self.resetStats=()=>{J4(),postMessage({target:"resetStats",success:!0})};self.getEventCount=()=>{let G=c?E().getEventCount(c):0;postMessage({target:"getEventCount",count:G})};self.getStyleCount=()=>{let G=c?E().getStyleCount(c):0;postMessage({target:"getStyleCount",count:G})};onmessage=({data:G})=>{if(self[G.target])self[G.target](G);else throw Error("Unknown event target "+G.target)};})();
|
|
Binary file
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
(function(root, factory) {
|
|
2
|
+
if (typeof define === 'function' && define.amd) {
|
|
3
|
+
define([], factory);
|
|
4
|
+
} else if (typeof module === 'object' && module.exports) {
|
|
5
|
+
module.exports = factory();
|
|
6
|
+
} else {
|
|
7
|
+
root.AkariSub = factory();
|
|
8
|
+
}
|
|
9
|
+
}(typeof self !== 'undefined' ? self : this, function() {
|
|
10
|
+
(()=>{var{defineProperty:h,getOwnPropertyNames:KJ,getOwnPropertyDescriptor:NJ}=Object,ZJ=Object.prototype.hasOwnProperty;function $J(J){return this[J]}var QJ=(J)=>{var K=(g??=new WeakMap).get(J),Z;if(K)return K;if(K=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var N of KJ(J))if(!ZJ.call(K,N))h(K,N,{get:$J.bind(J,N),enumerable:!(Z=NJ(J,N))||Z.enumerable})}return g.set(J,K),K},g;var OJ=(J)=>J;function FJ(J,K){this[J]=OJ.bind(null,K)}var UJ=(J,K)=>{for(var Z in K)h(J,Z,{get:K[Z],enumerable:!0,configurable:!0,set:FJ.bind(K,Z)})};var YJ={};UJ(YJ,{webYCbCrMap:()=>u,testImageBugs:()=>l,runFeatureTests:()=>a,parseAss:()=>r,libassYCbCrMap:()=>s,isWebGPUSupported:()=>f,isWebGL2Supported:()=>p,getVideoPosition:()=>c,getColorSpaceFilterUrl:()=>o,getBitmapBug:()=>e,getAlphaBug:()=>t,fixPlayRes:()=>i,fixAlpha:()=>m,dropBlur:()=>n,default:()=>R,computeCanvasSize:()=>w,colorMatrixConversionMap:()=>y,WebGPURenderer:()=>v,WebGL2Renderer:()=>x,AkariSub:()=>R});var u={bt709:"BT709",bt470bg:"BT601",smpte170m:"BT601"},y={BT601:{BT709:"1.0863 -0.0723 -0.014 0 0 0.0965 0.8451 0.0584 0 0 -0.0141 -0.0277 1.0418"},BT709:{BT601:"0.9137 0.0784 0.0079 0 0 -0.1049 1.1722 -0.0671 0 0 0.0096 0.0322 0.9582"},FCC:{BT709:"1.0873 -0.0736 -0.0137 0 0 0.0974 0.8494 0.0531 0 0 -0.0127 -0.0251 1.0378",BT601:"1.001 -0.0008 -0.0002 0 0 0.0009 1.005 -0.006 0 0 0.0013 0.0027 0.996"},SMPTE240M:{BT709:"0.9993 0.0006 0.0001 0 0 -0.0004 0.9812 0.0192 0 0 -0.0034 -0.0114 1.0148",BT601:"0.913 0.0774 0.0096 0 0 -0.1051 1.1508 -0.0456 0 0 0.0063 0.0207 0.973"}},s=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function o(J,K){if(!J||!K)return null;if(J===K)return null;let Z=y[J]?.[K];if(!Z)return null;return`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${Z} 0 0 0 0 0 1 0'/></filter></svg>#f")`}function w(J,K,Z,N,Q){let F=Z<=0?1:Z,$=globalThis.devicePixelRatio||1;if(K<=0||J<=0)return{width:0,height:0};let U=F<1?-1:1,O=K*$;if(U*O*F<=U*N)O*=F;else if(U*O<U*N)O=N;if(Q>0&&O>Q)O=Q;return J*=O/K,K=O,{width:J,height:K}}function c(J,K=J.videoWidth,Z=J.videoHeight){let N=K/Z,{offsetWidth:Q,offsetHeight:F}=J,$=Q/F,U=Q,O=F;if($>N)U=Math.floor(F*N);else O=Math.floor(Q/N);let E=(Q-U)/2,q=(F-O)/2;return{width:U,height:O,x:E,y:q}}function m(J,K){if(!K)return J;let Z=J.length,N=Z-Z%16,Q=3;for(;Q<N;Q+=16){if(J[Q]<2)J[Q]=1;if(J[Q+4]<2)J[Q+4]=1;if(J[Q+8]<2)J[Q+8]=1;if(J[Q+12]<2)J[Q+12]=1}for(;Q<Z;Q+=4)if(J[Q]<2)J[Q]=1;return J}function r(J,K=!1){let Z=[],N=J.split(/[\r\n]+/g),Q=N.length,F=null,$=null;for(let U=0;U<Q;U++){let O=N[U];if(!O||/^\s*$/.test(O))continue;let E=O[0];if(E==="["){let q=O.match(/^\[(.*)\]$/);if(q){if(K&&q[1].toLowerCase()==="events")break;F=null,$={name:q[1],body:[]},Z.push($);continue}}if(!$)continue;if(E===";")$.body.push({type:"comment",value:O.substring(1)});else{let q=O.indexOf(":");if(q===-1)continue;let L=O.substring(0,q),_=O.substring(q+1).trim();if(F||L==="Format"){let Y=_.split(",");if(F&&Y.length>F.length){let z=Y.slice(F.length-1).join(",");Y=Y.slice(0,F.length-1),Y.push(z)}let T=Y.length;for(let z=0;z<T;z++)Y[z]=Y[z].trim();if(F){let z={},j=Math.min(F.length,T);for(let P=0;P<j;P++)z[F[P]]=Y[P];_=z}else _=Y}if(L==="Format")F=_;$.body.push({key:L,value:_})}}return Z}var EJ=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function n(J){return J.replace(EJ,"")}var XJ=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function qJ(J,K){let Z=[...XJ].sort((N,Q)=>N.w-Q.w);for(let N of Z)if(J<=N.w&&K<=N.h)return N;return{w:Math.ceil(J/100)*100,h:Math.ceil(K/100)*100}}function k(J,K){return K&&K.includes(".")?J.toFixed(2).replace(/\.?0+$/,""):Math.round(J)}function i(J){let K=J.match(/PlayResX:\s*(\d+)/i),Z=J.match(/PlayResY:\s*(\d+)/i),N=K?parseInt(K[1],10):1920,Q=Z?parseInt(Z[1],10):1080,F=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,$=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,U=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,O=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,E=0,q=0,L=(M,X,V)=>{let I,D=new RegExp(M.source,"g");while((I=D.exec(J))!==null){for(let C of X)if(I[C]){let A=Math.abs(parseFloat(I[C]));if(A>E)E=A}for(let C of V)if(I[C]){let A=Math.abs(parseFloat(I[C]));if(A>q)q=A}}};if(L(F,[1],[2]),L($,[1,3],[2,4]),L(U,[1],[2]),L(O,[1,3],[2,4]),E<=N&&q<=Q)return J;let _=qJ(E,q),Y=N/_.w,T=Q/_.h,z=Math.min(Y,T),j=Math.max(Y,T),P=1,W=J,B=W.match(/(\[Events\][\s\S]*)/i);if(!B)return W;let G=B[1];return G=G.replace(F,(M,X,V)=>`\\pos(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)})`),G=G.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(M,X,V,I,D,C,A)=>{let d=`\\move(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)},${k(parseFloat(I)*Y,I)},${k(parseFloat(D)*T,D)}`;return C?`${d},${C},${A})`:`${d})`}),G=G.replace(U,(M,X,V)=>`\\org(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)})`),G=G.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(M,X,V,I,D,C)=>`\\${X}(${k(parseFloat(V)*Y,V)},${k(parseFloat(I)*T,I)},${k(parseFloat(D)*Y,D)},${k(parseFloat(C)*T,C)})`),G=G.replace(/\\fs([\d.]+)/g,(M,X)=>`\\fs${k(parseFloat(X)*j,X)}`),G=G.replace(/\\fscx([\d.]+)/g,(M,X)=>`\\fscx${k(parseFloat(X)*P,X)}`),G=G.replace(/\\xbord([\d.]+)/g,(M,X)=>`\\xbord${k(parseFloat(X)*Y,X)}`),G=G.replace(/\\ybord([\d.]+)/g,(M,X)=>`\\ybord${k(parseFloat(X)*T,X)}`),G=G.replace(/\\xshad(-?[\d.]+)/g,(M,X)=>`\\xshad${k(parseFloat(X)*Y,X)}`),G=G.replace(/\\yshad(-?[\d.]+)/g,(M,X)=>`\\yshad${k(parseFloat(X)*T,X)}`),["fsp","bord","shad","be","blur"].forEach((M)=>{let X=new RegExp(`\\\\${M}(-?[\\d.]+)`,"g");G=G.replace(X,(V,I)=>`\\${M}${k(parseFloat(I)*z,I)}`)}),G=G.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(M)=>{return M.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(X,V,I)=>{return`${k(parseFloat(V)*Y,V)} ${k(parseFloat(I)*T,I)}`})}),W.substring(0,B.index)+G}var b=null,S=null;async function l(){if(b!==null&&S!==null)return{hasAlphaBug:b,hasBitmapBug:S};let J=document.createElement("canvas"),K=J.getContext("2d",{willReadFrequently:!0});if(!K)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Z=document.createElement("canvas"),N=Z.getContext("2d",{willReadFrequently:!0});if(!N)throw Error("Canvas rendering not supported");J.width=Z.width=1,J.height=Z.height=1,K.clearRect(0,0,1,1),N.clearRect(0,0,1,1);let Q=N.getImageData(0,0,1,1).data;K.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),N.drawImage(J,0,0);let F=N.getImageData(0,0,1,1).data;if(b=Q[1]!==F[1],b)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let $=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);N.drawImage(await createImageBitmap(new ImageData($,1)),0,0);let{data:U}=N.getImageData(0,0,1,1);S=!1;for(let O=0;O<U.length;O++)if(Math.abs($[O]-U[O])>15){S=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else S=!1;return J.remove(),Z.remove(),{hasAlphaBug:b,hasBitmapBug:S}}async function a(){return l()}function t(){return b}function e(){return S}function f(){return typeof navigator<"u"&&"gpu"in navigator}class v{device=null;context=null;pipeline=null;bindGroupLayout=null;uniformBuffer=null;imageDataBuffer=null;textureArray=null;textureArrayView=null;textureArraySize=0;textureArrayWidth=0;textureArrayHeight=0;pendingDestroyTextures=[];imageDataArray;resolutionArray=new Float32Array(2);conversionBuffer=null;conversionBufferSize=0;bindGroup=null;bindGroupDirty=!0;lastCanvasWidth=0;lastCanvasHeight=0;format="bgra8unorm";_canvas=null;_initPromise=null;_initialized=!1;constructor(){this.imageDataArray=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._initDevice(),this._initPromise}async _initDevice(){if(!navigator.gpu)throw Error("WebGPU not supported");let J=await navigator.gpu.requestAdapter({powerPreference:"high-performance"});if(!J)throw Error("No WebGPU adapter found");this.device=await J.requestDevice(),this.format=navigator.gpu.getPreferredCanvasFormat();let K=this.device.createShaderModule({code:`
|
|
11
|
+
struct VertexOutput {
|
|
12
|
+
@builtin(position) position: vec4f,
|
|
13
|
+
@location(0) @interpolate(flat) instanceIndex: u32,
|
|
14
|
+
@location(1) @interpolate(flat) destXY: vec2f,
|
|
15
|
+
@location(2) @interpolate(flat) texSize: vec2f,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
struct Uniforms {
|
|
19
|
+
resolution: vec2f,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
struct ImageData {
|
|
23
|
+
destRect: vec4f, // x, y, w, h
|
|
24
|
+
texInfo: vec4f, // texW, texH, texIndex, 0
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@group(0) @binding(0) var<uniform> uniforms: Uniforms;
|
|
28
|
+
@group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
|
|
29
|
+
|
|
30
|
+
// Quad vertices (two triangles)
|
|
31
|
+
const QUAD_POSITIONS = array<vec2f, 6>(
|
|
32
|
+
vec2f(0.0, 0.0),
|
|
33
|
+
vec2f(1.0, 0.0),
|
|
34
|
+
vec2f(0.0, 1.0),
|
|
35
|
+
vec2f(1.0, 0.0),
|
|
36
|
+
vec2f(1.0, 1.0),
|
|
37
|
+
vec2f(0.0, 1.0)
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
@vertex
|
|
41
|
+
fn vertexMain(
|
|
42
|
+
@builtin(vertex_index) vertexIndex: u32,
|
|
43
|
+
@builtin(instance_index) instanceIndex: u32
|
|
44
|
+
) -> VertexOutput {
|
|
45
|
+
var output: VertexOutput;
|
|
46
|
+
|
|
47
|
+
let data = imageData[instanceIndex];
|
|
48
|
+
let quadPos = QUAD_POSITIONS[vertexIndex];
|
|
49
|
+
let wh = data.destRect.zw;
|
|
50
|
+
|
|
51
|
+
// Calculate pixel position
|
|
52
|
+
let pixelPos = data.destRect.xy + quadPos * wh;
|
|
53
|
+
|
|
54
|
+
// Convert to clip space (-1 to 1)
|
|
55
|
+
var clipPos = (pixelPos / uniforms.resolution) * 2.0 - 1.0;
|
|
56
|
+
clipPos.y = -clipPos.y;
|
|
57
|
+
|
|
58
|
+
output.position = vec4f(clipPos, 0.0, 1.0);
|
|
59
|
+
output.instanceIndex = instanceIndex;
|
|
60
|
+
output.destXY = data.destRect.xy;
|
|
61
|
+
output.texSize = data.texInfo.xy;
|
|
62
|
+
|
|
63
|
+
return output;
|
|
64
|
+
}
|
|
65
|
+
`}),Z=this.device.createShaderModule({code:`
|
|
66
|
+
@group(0) @binding(2) var texArray: texture_2d_array<f32>;
|
|
67
|
+
|
|
68
|
+
struct ImageData {
|
|
69
|
+
destRect: vec4f,
|
|
70
|
+
texInfo: vec4f,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
|
|
74
|
+
|
|
75
|
+
struct FragmentInput {
|
|
76
|
+
@builtin(position) fragCoord: vec4f,
|
|
77
|
+
@location(0) @interpolate(flat) instanceIndex: u32,
|
|
78
|
+
@location(1) @interpolate(flat) destXY: vec2f,
|
|
79
|
+
@location(2) @interpolate(flat) texSize: vec2f,
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@fragment
|
|
83
|
+
fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
|
|
84
|
+
let data = imageData[input.instanceIndex];
|
|
85
|
+
let texIndex = u32(data.texInfo.z);
|
|
86
|
+
|
|
87
|
+
// Calculate texel coordinates
|
|
88
|
+
let texCoordF = floor(input.fragCoord.xy - input.destXY);
|
|
89
|
+
let texCoord = vec2i(texCoordF);
|
|
90
|
+
|
|
91
|
+
// Bounds check
|
|
92
|
+
let texSizeI = vec2i(input.texSize);
|
|
93
|
+
if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
|
|
94
|
+
discard;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Load from texture array
|
|
98
|
+
let color = textureLoad(texArray, texCoord, texIndex, 0);
|
|
99
|
+
|
|
100
|
+
// Premultiplied alpha output
|
|
101
|
+
return vec4f(color.rgb * color.a, color.a);
|
|
102
|
+
}
|
|
103
|
+
`});this.uniformBuffer=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.imageDataBuffer=this.device.createBuffer({size:8192,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.createTextureArray(256,256,32),this.bindGroupLayout=this.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",viewDimension:"2d-array"}}]});let N=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:N,vertex:{module:K,entryPoint:"vertexMain"},fragment:{module:Z,entryPoint:"fragmentMain",targets:[{format:this.format,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-list"}}),this._initialized=!0}nextPowerOf2(J){return J--,J|=J>>1,J|=J>>2,J|=J>>4,J|=J>>8,J|=J>>16,J+1}createTextureArray(J,K,Z){if(this.textureArray)this.pendingDestroyTextures.push(this.textureArray);let N=this.nextPowerOf2(Math.max(J,64)),Q=this.nextPowerOf2(Math.max(K,64)),F=Math.min(this.nextPowerOf2(Math.max(Z,16)),256);this.textureArray=this.device.createTexture({size:[N,Q,F],format:this.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),this.textureArrayView=this.textureArray.createView({dimension:"2d-array"}),this.textureArrayWidth=N,this.textureArrayHeight=Q,this.textureArraySize=F,this.bindGroupDirty=!0;let $=this.device.createCommandEncoder();for(let U=0;U<F;U++){let O=this.textureArray.createView({dimension:"2d",baseArrayLayer:U,arrayLayerCount:1});$.beginRenderPass({colorAttachments:[{view:O,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end()}this.device.queue.submit([$.finish()])}ensureTextureArray(J,K,Z){let N=Math.min(Z,256);if(J<=this.textureArrayWidth&&K<=this.textureArrayHeight&&N<=this.textureArraySize)return!1;let Q=this.nextPowerOf2(Math.max(this.textureArrayWidth,J)),F=this.nextPowerOf2(Math.max(this.textureArrayHeight,K)),$=Math.min(this.nextPowerOf2(Math.max(this.textureArraySize,N,N+16)),256);return this.createTextureArray(Q,F,$),!0}updateBindGroup(){if(!this.bindGroupDirty||!this.device||!this.bindGroupLayout)return;this.bindGroup=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:this.uniformBuffer}},{binding:1,resource:{buffer:this.imageDataBuffer}},{binding:2,resource:this.textureArrayView}]}),this.bindGroupDirty=!1}ensureConversionBuffer(J){if(this.conversionBufferSize<J)this.conversionBufferSize=Math.max(J,this.conversionBufferSize*1.5|0,65536),this.conversionBuffer=new Uint8Array(this.conversionBufferSize);return this.conversionBuffer}async setCanvas(J,K,Z){if(await this.init(),!this.device)throw Error("WebGPU device not initialized");if(K<=0||Z<=0)return;if(this._canvas=J,J.width=K,J.height=Z,!this.context){if(this.context=J.getContext("webgpu"),!this.context)throw Error("Could not get WebGPU context");this.context.configure({device:this.device,format:this.format,alphaMode:"premultiplied"})}this.resolutionArray[0]=K,this.resolutionArray[1]=Z,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=K,this.lastCanvasHeight=Z}updateSize(J,K){if(!this.device||!this._canvas||J<=0||K<=0)return;if(J===this.lastCanvasWidth&&K===this.lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=K,this.resolutionArray[0]=J,this.resolutionArray[1]=K,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=J,this.lastCanvasHeight=K}renderBitmaps(J,K,Z){if(!this.device||!this.context||!this.pipeline)return;let N=J.length;if(N===0){this.clear();return}let Q=this.context.getCurrentTexture();if(Q.width===0||Q.height===0)return;let F=0,$=0,U=0;for(let j=0;j<N;j++){let{image:P}=J[j],W=P.width,B=P.height;if(W>0&&B>0){if(W>F)F=W;if(B>$)$=B;U++}}if(U===0){this.clear();return}let O=Math.min(U,256);this.ensureTextureArray(F,$,O),this.updateBindGroup();let E=this.device,q=E.queue,L=this.textureArray,_=this.imageDataArray,Y=Q.createView(),T=0,z=!0;while(T<N){let j=0;while(T<N&&j<256){let B=J[T++],G=B.image,H=G.width,M=G.height;if(H<=0||M<=0)continue;q.copyExternalImageToTexture({source:G,flipY:!1},{texture:L,origin:[0,0,j],premultipliedAlpha:!1},{width:H,height:M});let X=j<<3;_[X]=B.x,_[X+1]=B.y,_[X+2]=H,_[X+3]=M,_[X+4]=H,_[X+5]=M,_[X+6]=j,_[X+7]=0,j++}if(j===0)continue;q.writeBuffer(this.imageDataBuffer,0,_.buffer,0,j<<5);let P=E.createCommandEncoder(),W=P.beginRenderPass({colorAttachments:[{view:Y,clearValue:{r:0,g:0,b:0,a:0},loadOp:z?"clear":"load",storeOp:"store"}]});W.setPipeline(this.pipeline),W.setBindGroup(0,this.bindGroup),W.draw(6,j),W.end(),q.submit([P.finish()]),z=!1}this.cleanupPendingTextures()}render(J,K,Z){if(!this.device||!this.context||!this.pipeline)return;let N=J.length;if(N===0){this.clear();return}let Q=this.context.getCurrentTexture();if(Q.width===0||Q.height===0)return;let F=0,$=0,U=0;for(let P=0;P<N;P++){let{w:W,h:B}=J[P];if(W>0&&B>0){if(W>F)F=W;if(B>$)$=B;U++}}if(U===0){this.clear();return}let O=Math.min(U,256);this.ensureTextureArray(F,$,O),this.updateBindGroup();let E=this.device,q=E.queue,L=this.textureArray,_=this.imageDataArray,Y=this.format==="bgra8unorm",T=Q.createView(),z=0,j=!0;while(z<N){let P=0;while(z<N&&P<256){let G=J[z++],H=G.w,M=G.h;if(H<=0||M<=0)continue;let X=G.image;if(X instanceof ImageBitmap)q.copyExternalImageToTexture({source:X,flipY:!1},{texture:L,origin:[0,0,P],premultipliedAlpha:!1},{width:H,height:M});else if(X instanceof ArrayBuffer)this.uploadTextureData(P,X,H,M,Y);let V=P<<3;_[V]=G.x,_[V+1]=G.y,_[V+2]=H,_[V+3]=M,_[V+4]=H,_[V+5]=M,_[V+6]=P,_[V+7]=0,P++}if(P===0)continue;q.writeBuffer(this.imageDataBuffer,0,_.buffer,0,P<<5);let W=E.createCommandEncoder(),B=W.beginRenderPass({colorAttachments:[{view:T,clearValue:{r:0,g:0,b:0,a:0},loadOp:j?"clear":"load",storeOp:"store"}]});B.setPipeline(this.pipeline),B.setBindGroup(0,this.bindGroup),B.draw(6,P),B.end(),q.submit([W.finish()]),j=!1}this.cleanupPendingTextures()}uploadTextureData(J,K,Z,N,Q){let F=Z*N*4;if(Q){let $=this.ensureConversionBuffer(F),U=new Uint8Array(K);for(let O=0;O<F;O+=4)$[O]=U[O+2],$[O+1]=U[O+1],$[O+2]=U[O],$[O+3]=U[O+3];this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},$.buffer,{bytesPerRow:Z*4},{width:Z,height:N})}else this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},K,{bytesPerRow:Z*4},{width:Z,height:N})}cleanupPendingTextures(){let J=this.pendingDestroyTextures,K=J.length;if(K===0)return;for(let Z=0;Z<K;Z++)J[Z].destroy();J.length=0}clear(){if(!this.device||!this.context)return;try{let J=this.context.getCurrentTexture();if(J.width===0||J.height===0)return;let K=this.device.createCommandEncoder();K.beginRenderPass({colorAttachments:[{view:J.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([K.finish()])}catch{}}get initialized(){return this._initialized}destroy(){this.cleanupPendingTextures(),this.textureArray?.destroy(),this.textureArray=null,this.textureArrayView=null,this.uniformBuffer?.destroy(),this.uniformBuffer=null,this.imageDataBuffer?.destroy(),this.imageDataBuffer=null,this.bindGroup=null,this.conversionBuffer=null,this.conversionBufferSize=0,this.device?.destroy(),this.device=null,this.context=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}function p(){if(typeof document>"u")return!1;try{return document.createElement("canvas").getContext("webgl2")!==null}catch{return!1}}function JJ(J,K,Z){let N=J.createShader(K);if(J.shaderSource(N,Z),J.compileShader(N),!J.getShaderParameter(N,J.COMPILE_STATUS)){let Q=J.getShaderInfoLog(N);throw J.deleteShader(N),Error(`WebGL2 shader compilation failed: ${Q}`)}return N}class x{_gl=null;_canvas=null;_program=null;_vao=null;_instanceBuffer=null;_texArray=null;_texWidth=0;_texHeight=0;_texLayers=0;_resolutionLoc=null;_texArraySizeLoc=null;_instanceData;_lastCanvasWidth=0;_lastCanvasHeight=0;_initialized=!1;_initPromise=null;constructor(){this._instanceData=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._checkSupport(),this._initPromise}async _checkSupport(){if(typeof document>"u")throw Error("WebGL2 requires a DOM environment");if(!document.createElement("canvas").getContext("webgl2"))throw Error("WebGL2 not supported")}_initGL(){if(!this._canvas)throw Error("Canvas not set before _initGL");if(this._gl)return;let J=this._canvas.getContext("webgl2",{alpha:!0,premultipliedAlpha:!0,antialias:!1});if(!J)throw Error("Failed to create WebGL2 context");this._gl=J;let K=JJ(J,J.VERTEX_SHADER,`#version 300 es
|
|
104
|
+
precision highp float;
|
|
105
|
+
|
|
106
|
+
in vec4 a_destRect;
|
|
107
|
+
in vec4 a_texInfo;
|
|
108
|
+
|
|
109
|
+
uniform vec2 u_resolution;
|
|
110
|
+
|
|
111
|
+
out vec2 v_uv;
|
|
112
|
+
flat out int v_texIndex;
|
|
113
|
+
flat out vec2 v_texSize;
|
|
114
|
+
|
|
115
|
+
vec2 quadPos(int id) {
|
|
116
|
+
if (id == 0) return vec2(0.0, 0.0);
|
|
117
|
+
if (id == 1) return vec2(1.0, 0.0);
|
|
118
|
+
if (id == 2) return vec2(0.0, 1.0);
|
|
119
|
+
if (id == 3) return vec2(1.0, 0.0);
|
|
120
|
+
if (id == 4) return vec2(1.0, 1.0);
|
|
121
|
+
return vec2(0.0, 1.0);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
void main() {
|
|
125
|
+
vec2 qp = quadPos(gl_VertexID);
|
|
126
|
+
vec2 pixelPos = a_destRect.xy + qp * a_destRect.zw;
|
|
127
|
+
|
|
128
|
+
// Convert CSS pixel coords (y=0 top) to GL clip space (y=1 top)
|
|
129
|
+
vec2 clip = (pixelPos / u_resolution) * 2.0 - 1.0;
|
|
130
|
+
clip.y = -clip.y;
|
|
131
|
+
|
|
132
|
+
gl_Position = vec4(clip, 0.0, 1.0);
|
|
133
|
+
v_uv = qp;
|
|
134
|
+
v_texIndex = int(a_texInfo.z);
|
|
135
|
+
v_texSize = a_texInfo.xy;
|
|
136
|
+
}
|
|
137
|
+
`),Z=JJ(J,J.FRAGMENT_SHADER,`#version 300 es
|
|
138
|
+
precision highp float;
|
|
139
|
+
precision highp sampler2DArray;
|
|
140
|
+
|
|
141
|
+
uniform sampler2DArray u_texArray;
|
|
142
|
+
uniform ivec2 u_texArraySize;
|
|
143
|
+
|
|
144
|
+
in vec2 v_uv;
|
|
145
|
+
flat in int v_texIndex;
|
|
146
|
+
flat in vec2 v_texSize;
|
|
147
|
+
|
|
148
|
+
out vec4 fragColor;
|
|
149
|
+
|
|
150
|
+
void main() {
|
|
151
|
+
vec2 normalizedCoord = v_uv * v_texSize / vec2(u_texArraySize);
|
|
152
|
+
vec4 color = texture(u_texArray, vec3(normalizedCoord, float(v_texIndex)));
|
|
153
|
+
// Premultiplied alpha output (matches WebGPU renderer behaviour)
|
|
154
|
+
fragColor = vec4(color.rgb * color.a, color.a);
|
|
155
|
+
}
|
|
156
|
+
`),N=J.createProgram();if(J.attachShader(N,K),J.attachShader(N,Z),J.linkProgram(N),!J.getProgramParameter(N,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog(N)}`);J.deleteShader(K),J.deleteShader(Z),this._program=N,this._resolutionLoc=J.getUniformLocation(N,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation(N,"u_texArraySize"),this._vao=J.createVertexArray(),J.bindVertexArray(this._vao),this._instanceBuffer=J.createBuffer(),J.bindBuffer(J.ARRAY_BUFFER,this._instanceBuffer),J.bufferData(J.ARRAY_BUFFER,8192,J.DYNAMIC_DRAW);let Q=J.getAttribLocation(N,"a_destRect");J.enableVertexAttribArray(Q),J.vertexAttribPointer(Q,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(Q,1);let F=J.getAttribLocation(N,"a_texInfo");J.enableVertexAttribArray(F),J.vertexAttribPointer(F,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(F,1),J.bindVertexArray(null),this._texArray=J.createTexture(),this._allocateTextureArray(256,256,32),J.enable(J.BLEND),J.blendEquation(J.FUNC_ADD),J.blendFunc(J.ONE,J.ONE_MINUS_SRC_ALPHA),this._initialized=!0}_nextPow2(J){return J--,J|=J>>1,J|=J>>2,J|=J>>4,J|=J>>8,J|=J>>16,J+1}_allocateTextureArray(J,K,Z){let N=this._gl,Q=this._nextPow2(Math.max(J,64)),F=this._nextPow2(Math.max(K,64)),$=Math.min(this._nextPow2(Math.max(Z,16)),256);N.bindTexture(N.TEXTURE_2D_ARRAY,this._texArray),N.texImage3D(N.TEXTURE_2D_ARRAY,0,N.RGBA8,Q,F,$,0,N.RGBA,N.UNSIGNED_BYTE,null),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_MIN_FILTER,N.NEAREST),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_MAG_FILTER,N.NEAREST),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_WRAP_S,N.CLAMP_TO_EDGE),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_WRAP_T,N.CLAMP_TO_EDGE),this._texWidth=Q,this._texHeight=F,this._texLayers=$}_ensureTextureArray(J,K,Z){let N=Math.min(Z,256);if(J<=this._texWidth&&K<=this._texHeight&&N<=this._texLayers)return;let Q=this._nextPow2(Math.max(this._texWidth,J)),F=this._nextPow2(Math.max(this._texHeight,K)),$=Math.min(this._nextPow2(Math.max(this._texLayers,N,N+16)),256);this._allocateTextureArray(Q,F,$)}async setCanvas(J,K,Z){if(await this.init(),K<=0||Z<=0)return;this._canvas=J,J.width=K,J.height=Z,this._initGL(),this._gl.viewport(0,0,K,Z),this._lastCanvasWidth=K,this._lastCanvasHeight=Z}updateSize(J,K){if(!this._gl||!this._canvas||J<=0||K<=0)return;if(J===this._lastCanvasWidth&&K===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=K,this._gl.viewport(0,0,J,K),this._lastCanvasWidth=J,this._lastCanvasHeight=K}renderBitmaps(J,K,Z){if(!this._gl||!this._initialized)return;let N=J.length;if(N===0){this.clear();return}let Q=0,F=0;for(let E=0;E<N;E++){let{image:q}=J[E];if(q.width>Q)Q=q.width;if(q.height>F)F=q.height}this._ensureTextureArray(Q,F,Math.min(N,256));let $=this._gl;$.clearColor(0,0,0,0),$.clear($.COLOR_BUFFER_BIT),$.useProgram(this._program),$.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),$.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),$.activeTexture($.TEXTURE0),$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.pixelStorei($.UNPACK_FLIP_Y_WEBGL,!1);let U=this._instanceData,O=0;while(O<N){let E=0;while(O<N&&E<256){let q=J[O++],L=q.image.width,_=q.image.height;if(L<=0||_<=0)continue;$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,q.image);let Y=E<<3;U[Y]=q.x,U[Y+1]=q.y,U[Y+2]=L,U[Y+3]=_,U[Y+4]=L,U[Y+5]=_,U[Y+6]=E,U[Y+7]=0,E++}if(E===0)continue;$.bindBuffer($.ARRAY_BUFFER,this._instanceBuffer),$.bufferSubData($.ARRAY_BUFFER,0,U,0,E<<3),$.bindVertexArray(this._vao),$.drawArraysInstanced($.TRIANGLES,0,6,E),$.bindVertexArray(null)}}render(J,K,Z){if(!this._gl||!this._initialized)return;let N=J.length;if(N===0){this.clear();return}let Q=0,F=0;for(let E=0;E<N;E++){let{w:q,h:L}=J[E];if(q>Q)Q=q;if(L>F)F=L}this._ensureTextureArray(Q,F,Math.min(N,256));let $=this._gl;$.clearColor(0,0,0,0),$.clear($.COLOR_BUFFER_BIT),$.useProgram(this._program),$.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),$.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),$.activeTexture($.TEXTURE0),$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.pixelStorei($.UNPACK_FLIP_Y_WEBGL,!1);let U=this._instanceData,O=0;while(O<N){let E=0;while(O<N&&E<256){let q=J[O++],L=q.w,_=q.h;if(L<=0||_<=0)continue;let Y=q.image;if(Y instanceof ImageBitmap)$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,Y);else if(Y instanceof ArrayBuffer)$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,new Uint8Array(Y));let T=E<<3;U[T]=q.x,U[T+1]=q.y,U[T+2]=L,U[T+3]=_,U[T+4]=L,U[T+5]=_,U[T+6]=E,U[T+7]=0,E++}if(E===0)continue;$.bindBuffer($.ARRAY_BUFFER,this._instanceBuffer),$.bufferSubData($.ARRAY_BUFFER,0,U,0,E<<3),$.bindVertexArray(this._vao),$.drawArraysInstanced($.TRIANGLES,0,6,E),$.bindVertexArray(null)}}clear(){if(!this._gl)return;this._gl.clearColor(0,0,0,0),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}get initialized(){return this._initialized}destroy(){let J=this._gl;if(J)J.deleteProgram(this._program),J.deleteVertexArray(this._vao),J.deleteBuffer(this._instanceBuffer),J.deleteTexture(this._texArray);this._gl=null,this._program=null,this._vao=null,this._instanceBuffer=null,this._texArray=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}class R extends EventTarget{static MAX_PENDING_DEMANDS=3;static _hasAlphaBug=null;static _hasBitmapBug=null;_loaded;_init;_onDemandRender;_offscreenRender;_video;_videoWidth=0;_videoHeight=0;_videoColorSpace=null;_canvas;_canvasParent;_bufferCanvas;_bufferCtx;_canvasctrl;_ctx=null;_lastRenderTime=0;_playstate=!0;_destroyed=!1;_workerReady=!1;_ro;_worker;_pendingDemandTimes=[];_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;timeOffset;debug;prescaleFactor;prescaleHeightLimit;maxRenderHeight;busy=!1;renderAhead;constructor(J){super();if(!globalThis.Worker)throw this.destroy(Error("Worker not supported"));if(!J)throw this.destroy(Error("No options provided"));this._loaded=new Promise((Q)=>{this._init=Q});let K=R._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Z=!J.canvas&&(f()||p());if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Z&&(J.offscreenRender??!0),this.timeOffset=J.timeOffset||0,this._video=J.video,this._canvas=J.canvas,this._video&&!this._canvas)this._canvasParent=document.createElement("div"),this._canvasParent.className="AkariSub",this._canvasParent.style.position="relative",this._canvas=this._createCanvas(),this._video.insertAdjacentElement("afterend",this._canvasParent);else if(!this._canvas)throw this.destroy(Error("Don't know where to render: you should give video or canvas in options."));this._bufferCanvas=document.createElement("canvas");let N=this._bufferCanvas.getContext("2d");if(!N)throw this.destroy(Error("Canvas rendering not supported"));if(this._bufferCtx=N,Z)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d");if(this._canvasctrl=this._offscreenRender?this._canvas.transferControlToOffscreen():this._canvas,this._lastRenderTime=0,this.debug=!!J.debug,this.prescaleFactor=J.prescaleFactor||1,this.prescaleHeightLimit=J.prescaleHeightLimit||1080,this.maxRenderHeight=J.maxRenderHeight||0,this.renderAhead=J.renderAhead??0,this._boundResize=this.resize.bind(this),this._boundTimeUpdate=this._timeupdate.bind(this),this._boundSetRate=()=>this.setRate(this._video.playbackRate),this._boundUpdateColorSpace=this._updateColorSpace.bind(this),this._boundHandleRVFC=this._handleRVFC.bind(this),this._video)this.setVideo(this._video);if(this._onDemandRender)this.busy=!1,this._pendingDemandTimes.length=0;this._worker=new Worker(J.workerUrl||"akarisub-worker.js"),this._worker.onmessage=(Q)=>this._onmessage(Q),this._worker.onerror=(Q)=>this._error(Q),K.then(()=>{if(this._worker.postMessage({target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:typeof createImageBitmap<"u"&&(J.asyncRender??!0),onDemandRender:this._onDemandRender,initialTime:(this._video?.currentTime??0)+this.timeOffset,width:this._canvasctrl.width||0,height:this._canvasctrl.height||0,blendMode:J.blendMode??"wasm",subUrl:J.subUrl,subContent:J.subContent||null,fonts:J.fonts||[],availableFonts:J.availableFonts||{"liberation sans":"./default.woff2"},fallbackFonts:J.fallbackFonts||["liberation sans"],debug:this.debug,targetFps:J.targetFps||24,dropAllAnimations:J.dropAllAnimations,dropAllBlur:J.dropAllBlur,clampPos:J.clampPos,libassMemoryLimit:J.libassMemoryLimit??128,libassGlyphLimit:J.libassGlyphLimit??2048,useLocalFonts:typeof globalThis.queryLocalFonts<"u"&&(J.useLocalFonts??!0),hasBitmapBug:R._hasBitmapBug}),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(R._hasBitmapBug!==null)return;let J=document.createElement("canvas"),K=J.getContext("2d",{willReadFrequently:!0});if(!K)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Z=document.createElement("canvas"),N=Z.getContext("2d",{willReadFrequently:!0});if(!N)throw Error("Canvas rendering not supported");J.width=Z.width=1,J.height=Z.height=1,K.clearRect(0,0,1,1),N.clearRect(0,0,1,1);let Q=N.getImageData(0,0,1,1).data;K.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),N.drawImage(J,0,0);let F=N.getImageData(0,0,1,1).data;if(R._hasAlphaBug=Q[1]!==F[1],R._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let $=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);N.drawImage(await createImageBitmap(new ImageData($,1)),0,0);let{data:U}=N.getImageData(0,0,1,1);R._hasBitmapBug=!1;for(let O=0;O<U.length;O++)if(Math.abs($[O]-U[O])>15){R._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else R._hasBitmapBug=!1;J.remove(),Z.remove()}static async _test(){await R._testImageBugs()}async _initGPURenderer(){if(f())try{let J=new v;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgpu",console.log("[AkariSub] Using WebGPU renderer");return}catch(J){console.warn("[AkariSub] WebGPU init failed, trying WebGL2:",J)}if(p())try{let J=new x;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgl2",console.log("[AkariSub] Using WebGL2 renderer");return}catch(J){console.warn("[AkariSub] WebGL2 init failed, falling back to Canvas2D:",J)}if(this._rendererType="canvas2d",!this._offscreenRender&&!this._ctx)this._ctx=this._canvas.getContext("2d");this.sendMessage("setAsyncRender",{value:!1}),this._onCanvasFallback?.()}get rendererType(){return this._rendererType}get isUsingWebGPU(){return this._rendererType==="webgpu"}get isUsingGPURenderer(){return this._gpuRenderer!==null}_createCanvas(){return this._canvas=document.createElement("canvas"),this._canvas.style.display="block",this._canvas.style.position="absolute",this._canvas.style.pointerEvents="none",this._canvasParent.appendChild(this._canvas),this._canvas}resize(J=0,K=0,Z=0,N=0,Q=this._video?.paused??!1){if((!J||!K)&&this._video){let F=c(this._video),$;if(this._videoWidth){let U=this._video.videoWidth/this._videoWidth,O=this._video.videoHeight/this._videoHeight;$=w((F.width||0)/U,(F.height||0)/O,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else $=w(F.width||0,F.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=$.width,K=$.height,this._canvasParent)Z=F.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),N=F.x;this._canvas.style.width=F.width+"px",this._canvas.style.height=F.height+"px"}if(this._canvas.style.top=Z+"px",this._canvas.style.left=N+"px",J>0&&K>0)this._canvasctrl.width=J,this._canvasctrl.height=K;if(this._gpuRenderer&&J>0&&K>0)this._gpuRenderer.updateSize(J,K);if(Q&&this.busy===!1)this.busy=!0;else Q=!1;this.sendMessage("canvas",{width:J,height:K,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:Q})}_timeupdate(J){let Z={seeking:!0,waiting:!0,playing:!1}[J.type];if(Z!=null)this._playstate=Z;this.setCurrentTime(this._video.paused||this._playstate,this._video.currentTime+this.timeOffset)}setVideo(J){if(J instanceof HTMLVideoElement){if(this._removeListeners(),this._video=J,this._onDemandRender){if(!this._destroyed&&this._video===J)J.requestVideoFrameCallback(this._boundHandleRVFC)}else this._playstate=J.paused,J.addEventListener("timeupdate",this._boundTimeUpdate,!1),J.addEventListener("progress",this._boundTimeUpdate,!1),J.addEventListener("waiting",this._boundTimeUpdate,!1),J.addEventListener("seeking",this._boundTimeUpdate,!1),J.addEventListener("playing",this._boundTimeUpdate,!1),J.addEventListener("ratechange",this._boundSetRate,!1),J.addEventListener("resize",this._boundResize,!1);if("VideoFrame"in window){if(J.addEventListener("loadedmetadata",this._boundUpdateColorSpace,!1),J.readyState>2)this._updateColorSpace()}if(J.videoWidth>0)this.resize();if(typeof ResizeObserver<"u"){if(!this._ro)this._ro=new ResizeObserver(()=>this.resize());this._ro.observe(J)}}else this._error(Error("Video element invalid!"))}runBenchmark(){this.sendMessage("runBenchmark")}setTrackByUrl(J){if(this.sendMessage("setTrackByUrl",{url:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setTrack(J){if(this.sendMessage("setTrack",{content:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}freeTrack(){this.sendMessage("freeTrack")}setIsPaused(J){this.sendMessage("video",{isPaused:J})}setRate(J){this.sendMessage("video",{rate:J})}setCurrentTime(J,K,Z){this.sendMessage("video",{isPaused:J,currentTime:K,rate:Z,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,K){this.sendMessage("setEvent",{event:J,index:K})}removeEvent(J){this.sendMessage("removeEvent",{index:J})}async getEvents(){return(await this._fetchFromWorker({target:"getEvents"})).events??[]}styleOverride(J){this.sendMessage("styleOverride",{style:J})}disableStyleOverride(){this.sendMessage("disableStyleOverride")}createStyle(J){this.sendMessage("createStyle",{style:J})}setStyle(J,K){this.sendMessage("setStyle",{style:J,index:K})}removeStyle(J){this.sendMessage("removeStyle",{index:J})}async getStyles(){return(await this._fetchFromWorker({target:"getStyles"})).styles??[]}addFont(J){this.sendMessage("addFont",{font:J})}setDefaultFont(J){this.sendMessage("defaultFont",{font:J})}async getStats(){let K=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:K.framesRendered??0,framesDropped:K.framesDropped??0,avgRenderTime:K.avgRenderTime??0,maxRenderTime:K.maxRenderTime??0,minRenderTime:K.minRenderTime??0,lastRenderTime:K.lastRenderTime??0,pendingRenders:K.pendingRenders??0,totalEvents:K.totalEvents??0,cacheHits:K.cacheHits??0,cacheMisses:K.cacheMisses??0,renderFps:K.avgRenderTime&&K.avgRenderTime>0?Math.round(1000/K.avgRenderTime):0,usingWorker:!0,offscreenRender:this._offscreenRender,onDemandRender:this._onDemandRender}}async resetStats(){await this._fetchFromWorker({target:"resetStats"})}async getEventCount(){return(await this._fetchFromWorker({target:"getEventCount"})).count}async getStyleCount(){return(await this._fetchFromWorker({target:"getStyleCount"})).count}_sendLocalFont(J){try{globalThis.queryLocalFonts().then((K)=>{let Z=K?.find((N)=>N.fullName.toLowerCase()===J);if(Z)Z.blob().then((N)=>{N.arrayBuffer().then((Q)=>{this.addFont(new Uint8Array(Q))})})})}catch(K){console.warn("Local fonts API:",K)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((K)=>{if(K.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(K){console.warn("Local fonts API:",K)}}_unbusy(){if(this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let K=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(K)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_enqueueDemand(J){let K=this._pendingDemandTimes;if(K.length>0){let Z=K[K.length-1];if(Math.abs(Z.mediaTime-J.mediaTime)>0.25)K.length=0}if(K.length>=R.MAX_PENDING_DEMANDS)K.shift();K.push(J)}_handleRVFC(J,K){if(this._destroyed)return;let Z=this._video?.playbackRate??1,Q={mediaTime:K.mediaTime+this.renderAhead*Z,width:K.width,height:K.height};if(!this._workerReady){this._enqueueDemand(Q),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(Q);else this.busy=!0,this._demandRender(Q);this._video.requestVideoFrameCallback(this._boundHandleRVFC)}_demandRender(J){if(J.width!==this._videoWidth||J.height!==this._videoHeight)this._videoWidth=J.width,this._videoHeight=J.height,this.resize();this.sendMessage("demand",{time:J.mediaTime+this.timeOffset})}_detachOffscreen(){if(!this._offscreenRender||this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas,this._ctx=this._canvasctrl.getContext("2d"),this.sendMessage("detachOffscreen"),this.busy=!1,this._pendingDemandTimes.length=0,this.resize(0,0,0,0,!0)}_reAttachOffscreen(){if(!this._offscreenRender||!this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas.transferControlToOffscreen(),this._ctx=!1,this.sendMessage("offscreenCanvas",{},[this._canvasctrl]),this.resize(0,0,0,0,!0)}_updateColorSpace(){this._video.requestVideoFrameCallback(()=>{try{let J=new globalThis.VideoFrame(this._video);this._videoColorSpace=u[J.colorSpace.matrix]??null,J.close(),this.sendMessage("getColorSpace")}catch(J){console.warn(J)}})}_verifyColorSpace(J){let{subtitleColorSpace:K,videoColorSpace:Z=this._videoColorSpace}=J;if(!K||!Z)return;if(K===Z)return;this._detachOffscreen();let N=y[K]?.[Z];if(N&&this._ctx)this._ctx.filter=`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${N} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){this._unbusy();let{width:K,height:Z}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==K||this._canvasctrl.height!==Z){if(this._canvasctrl.width=K,this._canvasctrl.height=Z,this._lastRenderWidth=K,this._lastRenderHeight=Z,this._gpuRenderer)this._gpuRenderer.updateSize(K,Z);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let Q=this._ctx,F=J.images,$=F.length;if(Q.clearRect(0,0,K,Z),J.asyncRender)for(let U=0;U<$;U++){let O=F[U];if(O.image)Q.drawImage(O.image,O.x,O.y),O.image.close()}else{let U=R._hasAlphaBug??!1;for(let O=0;O<$;O++){let E=F[O];if(E.image){let{w:q,h:L}=E,_=new Uint8ClampedArray(E.image),Y=m(_,U);Q.putImageData(new ImageData(Y,q,L),E.x,E.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let U=0,O=J.times.bitmaps||$;delete J.times.bitmaps;for(let E in J.times)U+=J.times[E]||0;console.log("Bitmaps: "+O+" Total: "+(U|0)+"ms",J.times)}}_renderGPU(J){let K=this._gpuRenderer;if(!K)return;if(J.images.length===0){K.clear();return}if(J.asyncRender){let Z=J.images.filter((N)=>N.image instanceof ImageBitmap).map((N)=>({image:N.image,x:N.x,y:N.y}));K.renderBitmaps(Z,this._canvasctrl.width,this._canvasctrl.height);for(let N of J.images)if(N.image instanceof ImageBitmap)N.image.close()}else K.render(J.images,this._canvasctrl.width,this._canvasctrl.height);if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let Z=0,N=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let Q in J.times)Z+=J.times[Q]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+N+" Total: "+(Z|0)+"ms",J.times)}}_ready(){if(this._workerReady=!0,this._init(),this._onDemandRender&&this._video){this.setCurrentTime(this._video.paused,this._video.currentTime+this.timeOffset,this._video.playbackRate);let J=this._pendingDemandTimes.length>0?this._pendingDemandTimes[this._pendingDemandTimes.length-1]:{mediaTime:this._video.currentTime+this.renderAhead*(this._video.playbackRate||1),width:this._video.videoWidth,height:this._video.videoHeight};this._pendingDemandTimes.length=0,this.busy=!0,this._demandRender(J)}this.dispatchEvent(new CustomEvent("ready"))}_partial_ready(){this.dispatchEvent(new CustomEvent("partial_ready"))}async sendMessage(J,K={},Z){if(await this._loaded,Z)this._worker.postMessage({target:J,transferable:Z,...K},[...Z]);else this._worker.postMessage({target:J,...K})}_fetchFromWorker(J){return new Promise((K,Z)=>{try{let N=J.target,Q=setTimeout(()=>{U(),Z(Error("Error: Timeout while trying to fetch "+N))},5000),F=(O)=>{if(O.data.target===N)U(),K(O.data)},$=(O)=>{U(),Z(O instanceof Error?O:O.error||Error("Worker error"))},U=()=>{this._worker.removeEventListener("message",F),this._worker.removeEventListener("error",$),clearTimeout(Q)};this._worker.addEventListener("message",F),this._worker.addEventListener("error",$),this._worker.postMessage(J)}catch(N){Z(N)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let K=J.data.target;if(K==="error"){this._error(J.data.error||"Unknown worker error");return}let Z=this["_"+K];if(Z)Z.call(this,J.data)}_error(J){let K=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Z=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:K});return this.dispatchEvent(Z),console.error(K),K}_removeListeners(){if(this._video){if(this._ro)this._ro.unobserve(this._video);if(this._ctx)this._ctx.filter="none";this._video.removeEventListener("timeupdate",this._boundTimeUpdate),this._video.removeEventListener("progress",this._boundTimeUpdate),this._video.removeEventListener("waiting",this._boundTimeUpdate),this._video.removeEventListener("seeking",this._boundTimeUpdate),this._video.removeEventListener("playing",this._boundTimeUpdate),this._video.removeEventListener("ratechange",this._boundSetRate),this._video.removeEventListener("resize",this._boundResize),this._video.removeEventListener("loadedmetadata",this._boundUpdateColorSpace)}}destroy(J){let K=J?this._error(J):void 0;if(this._video&&this._canvasParent)this._video.parentNode?.removeChild(this._canvasParent);if(this._gpuRenderer)this._gpuRenderer.destroy(),this._gpuRenderer=null,this._rendererType="canvas2d";return this._destroyed=!0,this._removeListeners(),this.sendMessage("destroy"),this._worker?.terminate(),K}}})();
|
|
157
|
+
|
|
158
|
+
return AkariSub;
|
|
159
|
+
}));
|
|
Binary file
|