rapier-jxl 2.1.0 → 2.2.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/photo.min.mjs CHANGED
@@ -1,2 +1,2 @@
1
- /*! Rapier JXL 2.1.0 | MIT License Copyright (c) 2026 rapier.website Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2
- function*t(t,n,o){let r,e;for(;!(r=t.next(e)).done;)e=yield(n+r.value)/o;return r.value}function n(t){return t>=0?2*t:2*-t-1}function o(t){return 31-Math.clz32(t)}function r(t){return t<=1?0:32-Math.clz32(t-1)}function e(t){if(0===t)return 0;const n=t<0?32768:0;if(!((t=Math.abs(t))<65520))throw new Error("half float out of range: "+t);let o=0,r=t;for(;r>=2;)r/=2,o++;for(;r<1;)r*=2,o--;o<-14?(r=16384*t,o=-15):r-=1;let e=Math.round(1024*r);return 1024===e&&(e=0,o++),n|o+15<<10|e}function s(t){if(t>Q.bytes)throw W("JXL_SIZE","The encoded picture exceeds 16 MiB.")}function i(t){try{return t()}catch(t){if(t instanceof RangeError&&!t.code)throw W("JXL_MEMORY","Not enough memory for this picture.");throw t}}function c(t,n){t.t([[9,1],[13,1],[18,1],[30,1]],n)}function f(t,n,o,r,e,{xyb:s=!1,orientation:i=1,colorSpace:f}={}){t.write(16,2815),t.write(1,0),c(t,o),t.write(3,0),c(t,n),t.write(1,0);const l=1!==i;t.write(1,l?1:0),l&&t.write(6,i-1),t.write(4,8),e?t.write(3,5):t.write(2,0),t.write(1,s?1:0),3===r&&"display-p3"===f?t.write(21,903568):3===r?t.write(1,1):t.write(15,14100),l&&t.write(1,1),t.write(2,0),t.write(1,1),t.o()}function l(t,n){t.write(n?7:5,0),t.write(11,1)}function a(t,n){const o=n.map(t=>t.length);!function(t,n){t.write(1,0),t.o();for(const o of n)t.t([[10,0],[14,1024],[22,17408],[30,4211712]],o);t.o()}(t,o);const r=t.finish(),e=r.length+o.reduce((t,n)=>t+n,0);s(e);const i=new Uint8Array(e);i.set(r);let c=r.length;for(const t of n)i.set(t,c),c+=t.length;return i}function u(t,n){const o=new Uint8Array(t.length),r=[];for(let n=0;n<t.length;n++)t[n]>0&&r.push(n);if(!r.length)return o;if(1===r.length)return o[r[0]]=1,o;for(let e=1;;e*=2){const s=r.map(n=>({w:Math.max(t[n],e),i:n,l:null,r:null})).sort((t,n)=>t.w-n.w||t.i-n.i),i=[];let c=0,f=0;const l=()=>c<s.length&&(f>=i.length||s[c].w<=i[f].w)?s[c++]:i[f++];for(;s.length-c+(i.length-f)>1;){const t=l(),n=l();i.push({w:t.w+n.w,i:-1,l:t,r:n})}const a=[[l(),0]];let u=0;for(;a.length;){const[t,n]=a.pop();t.i>=0?(o[t.i]=n,n>u&&(u=n)):a.push([t.l,n+1],[t.r,n+1])}if(u<=n)return o}}function h(t,n,o,r,e,s){const i=[];for(;i.push(r&e),r>>=s;)r--;for(let r=i.length-1;r>=0;r--)t.push(o),n.push(i[r])}function y(t,n){let o=0;for(let r=0;r<n;r++)o=o<<1|1&t,t>>=1;return o}function w(t){const n=new Uint32Array(17),o=new Uint32Array(17),r=new Uint16Array(t.length);for(const o of t)n[o]++;n[0]=0;for(let t=1,r=0;t<=16;t++)r=r+n[t-1]<<1,o[t]=r;for(let n=0;n<t.length;n++)t[n]&&(r[n]=y(o[t[n]]++,t[n]));return r}function d(t){const n=[];for(let o=0;o<t.length;o++)t[o]>0&&n.push(o);const o=n.length,r=n[o-1]+1||1,e=o<=4?new Uint8Array(r):u(t,15).subarray(0,r);let s=0;if(o<=4){n.sort((n,o)=>t[o]-t[n]||n-o),s=4===o&&t[n[0]]>t[n[2]]+t[n[3]]?1:0;const r=o<2?[0]:2===o?[1,1]:3===o?[1,2,2]:s?[1,2,3,3]:[2,2,2,2];n.forEach((t,n)=>{e[t]=r[n]}),n.sort((t,n)=>e[t]-e[n]||t-n)}return{u:r,M:e,p:w(e),A:o&&o<=4?n:null,m:s}}function M(t,n){if(n.u<=1)return;if(n.A){const r=o(n.u-1)+1;t.write(2,1),t.write(2,n.A.length-1);for(const o of n.A)t.write(r,o);return void(4===n.A.length&&t.write(1,n.m))}const r=n.M,e=[],s=[];let i=r.length-1;for(;i>0&&!r[i];)i--;let c=8;for(let t=0;t<=i;){const n=r[t];let o=1;for(;t+o<=i&&r[t+o]===n;)o++;let f=o;if(n&&n!==c&&(e.push(n),s.push(0),f--,c=n),f<3)for(let t=0;t<f;t++)e.push(n),s.push(0);else h(e,s,n?16:17,f-3,n?3:7,n?2:3);t+=o}const f=new Uint32Array(18);for(const t of e)f[t]++;let l=0;for(const t of f)t&&l++;1===l&&(f[e[0]?0:1]=f[e[0]]);const a=u(f,5),y=w(a);let d=18;for(;d>0&&!a[tt[d-1]];)d--;t.write(2,0);for(let n=0;n<d;n++){const o=a[tt[n]];t.write(nt[o],ot[o])}for(let n=0;n<e.length;n++){const o=e[n];t.write(a[o],y[o]),16===o?t.write(2,s[n]):17===o&&t.write(3,s[n])}}function p(t,n=0,o=0){return{split:t,U:n,I:o,S:1<<t}}function A(t,n,o=15){t.write(r(o+1),n.split),n.split!==o&&(t.write(r(n.split+1),n.U),t.write(r(n.split-n.U+1),n.I))}function g(t,n,r){if(n<t.S)return r[0]=n,r[1]=0,void(r[2]=0);const e=o(n),s=n-(1<<e),i=e-t.U-t.I;r[0]=t.S+(e-t.split<<t.U+t.I|s>>e-t.U<<t.I|s&(1<<t.I)-1),r[1]=i,r[2]=n>>t.I&(1<<i)-1}function b(t,n,o,r=0){g(t,n,rt),o[r+rt[0]]++}function m(t,n,o,r,e=0){g(o,r,rt);const s=e+rt[0];t.write(n.M[s],n.p[s]),rt[1]&&t.write(rt[1],rt[2])}function U(t,n){let o=0;for(const t of n)o=Math.max(o,t);const e=o?r(o+1):0;if(e<=3){if(t.write(1,1),t.write(2,e),e)for(const o of n)t.write(e,o);return}t.write(1,0),t.write(1,0);const s=p(8),i=p(4),c=n.length>=64,f=new Uint32Array(c?257:o+1),l=[];for(let t=0;t<n.length;){let o=1;for(;c&&t+o<n.length&&n[t+o]===n[t];)o++;if(o>=8)l.push([n[t],o-1]),f[n[t]]++,b(i,o-1-7,f,224),t+=o;else{for(let r=0;r<o;r++)l.push([n[t],0]),f[n[t]]++;t+=o}}const a=d(f);if(!c){I(t,{L:new Uint8Array(1),J:[{config:s,code:a}]});for(const[n]of l)m(t,a,s,n);return}const u=new Uint32Array(1);u[0]=1,I(t,{T:{X:224,minLength:7,N:i},L:new Uint8Array([1,0]),J:[{config:p(0),code:d(u)},{config:s,code:a}]});for(const[n,o]of l)m(t,a,s,n),o&&m(t,a,i,o-7,224)}function I(t,{T:n=null,L:r,J:e}){t.write(1,n?1:0),n&&(t.t([[0,224],[0,512],[0,4096],[15,8]],n.X),t.t([[0,3],[0,4],[2,5],[8,9]],n.minLength),A(t,n.N,8)),r.length>1&&U(t,r),t.write(1,1);for(const n of e)A(t,n.config,15);for(const n of e){const r=n.code.u-1;if(r){const n=o(r);t.write(1,1),t.write(4,n),t.write(n,r-(1<<n))}else t.write(1,0)}for(const n of e)M(t,n.code)}function x(t,n=0,o=1){return{_:t,offset:n,C:o,context:-1}}function S(t){return function(t,n){const o=(r,e)=>{if(r===e)return n?t[r].O:t[r];const s=r+e>>1;return function(t,n,o,r){return{P:t,F:n,left:o,right:r}}(n,n?t[s].q:s,o(s+1,e),o(r,s))};return o(0,t.length-1)}(t,0)}function E(t,o){const r=[o],e=[],s=[];for(const t of r){if(t.left){e.push(t.P+1,n(t.F)),r.push(t.left,t.right);continue}t.context=s.length,s.push(t);const o=1===t.C?0:31-Math.clz32(t.C&-t.C);e.push(0,t._,n(t.offset),o,(t.C>>o)-1)}const i=new Uint32Array(64);for(const t of e)b(ft,t,i);const c=d(i);I(t,{L:new Uint8Array(6),J:[{config:ft,code:c}]});for(const n of e)m(t,c,ft,n);return s}function L(t,n){const o=[[3,0],[6,8],[10,72],[13,1096]];if("rct"===n.type)t.write(2,0),t.t(o,n.G),t.t([[0,6],[2,0],[4,2],[6,10]],n.j??6);else if("palette"===n.type)t.write(2,1),t.t(o,n.G),t.t([[0,1],[0,3],[0,4],[13,1]],n.k),t.t([[8,0],[10,256],[12,1280],[16,5376]],n.B),t.t([[0,0],[8,1],[10,257],[16,1281]],n.R??0),t.write(4,n._??0);else{if("squeeze"!==n.type)throw new Error("unknown transform "+n.type);{t.write(2,2);const r=n.Z??[];t.t([[0,0],[4,1],[6,9],[8,41]],r.length);for(const n of r)t.write(1,n.D?1:0),t.write(1,n.Y?1:0),t.t(o,n.G),t.t([[0,1],[0,2],[0,3],[4,4]],n.k)}}}function J(t,{H:n=!0,K:o=[]}={}){t.write(1,n?1:0),t.write(1,1),t.t([[0,0],[0,1],[4,2],[8,18]],o.length);for(const n of o)L(t,n)}function T(t,n,o,r=t=>t.context){const e=new Uint8Array(n.length+1);for(const t of n)e[t.context]=r(t)+1;const s=new Uint32Array(2);s[1]=1;const i=[{config:ft,code:d(s)}],c=Math.max(...e);for(let t=0;t<c;t++)i.push({config:ft,code:d(o[t])});return I(t,{T:ct,L:e,J:i}),i}function X(t,o,r,e,s,i){const c=i._,f=i.offset,l=i.C,a=ft,u=it;let h=0;const y=(n,r=a,e=0)=>{t?m(t,o,r,n,e):b(r,n,o,e)},w=()=>{if(h){if(h>=8)y(0),y(h-7-1,u,224);else for(let t=0;t<h;t++)y(0);h=0}},d=(t,o)=>{const e=r[t];let s;1===l?s=e-o-f:(s=Math.round((e-o-f)/l),r[t]=o+f+s*l),0!==s?(w(),y(n(s))):h++};for(let t=0,n=0;t<s;t++)for(let o=0;o<e;o++,n++){let s;if(0===c)s=0;else{const i=o?r[n-1]:t?r[n-e]:0,f=t?r[n-e]:i;if(1===c)s=i;else if(2===c)s=f;else if(3===c)s=(i+f)/2|0;else{const l=i+f-(o&&t?r[n-e-1]:i);if(5===c){const t=i<f?i:f,n=i<f?f:i;s=l<t?t:l>n?n:l}else{if(4!==c)throw new Error("predictor "+c+" is not coded here");s=Math.abs(l-i)<Math.abs(l-f)?i:f}}}d(n,s)}w()}function N(t,n,o,{palette:r=!0}={}){const e=n*o;let s=!0,i=!0;for(let n=0,o=0;o<e&&(255===t[n+3]||(s=!1,i))&&(t[n]===t[n+1]&&t[n]===t[n+2]||(i=!1,s));o++,n+=4);const c=i?1:3,f=!s,l=c+(f?1:0),a=n=>i?f?t[n]+256*t[n+3]:t[n]:t[n]+256*t[n+1]+65536*t[n+2]+(f?16777216*t[n+3]:0),u=new Map;let h=null;for(let t=0,n=0;r&&n<e;n++,t+=4){const n=a(t);if(0!==n&&!u.has(n)&&(u.set(n,1),u.size>=2048))break}if(r&&u.size<2048){const t=[...u.keys()],n=(t,n)=>t>>>8*n&255,o=t=>(.299*n(t,0)+.587*n(t,1)+.114*n(t,2)+.01)*(4===l?n(t,3):1);t.sort((t,n)=>o(t)-o(n));const r=new Map([[0,0]]);t.forEach((t,n)=>r.set(t,n+1)),h={colours:[0,...t],index:r,key:a,byte:n}}return{colour:c,alpha:f,channels:l,palette:h}}function*_(t,n,o,r,e){const{channels:s,palette:i}=r,c=function(t,n,o=256){const r=Math.ceil(t/o),e=Math.ceil(n/o);return{V:r,W:e,$:Math.ceil(t/(8*o)),tt:Math.ceil(n/(8*o)),nt:1===r&&1===e}}(n,o),u=i?2:s,h=Array.from({length:u},()=>x(st)),y=S(h),w=Array.from({length:u},()=>new Int16Array(65536)),p=(o,r,e,c)=>{for(let f=0;f<c;f++){let c=4*((r+f)*n+o),l=f*e;for(let n=0;n<e;n++,c+=4,l++)if(i)w[0][l]=i.index.get(i.key(c));else if(s>=3){const n=t[c],o=t[c+1],r=t[c+2],e=n-r,i=r+(e>>1),f=o-i;w[0][l]=i+(f>>1),w[1][l]=e,w[2][l]=f,4===s&&(w[3][l]=t[c+3])}else w[0][l]=t[c],2===s&&(w[1][l]=t[c+3])}};let A=null;if(i){const t=i.colours.length;A=new Int16Array(t*s),i.colours.forEach((n,o)=>{for(let r=0;r<s;r++)A[r*t+o]=i.byte(n,r)})}const g=t=>h[i?c.nt?1:0:t],b=i?1:s,m=c.V*c.W,U=2*m,I=(t,r)=>{const e=t%c.V*$,s=(t/c.V|0)*$,i=Math.min($,n-e),f=Math.min($,o-s);p(e,s,i,f),r(i,f)};let L=0;if(!i){const t=t=>{const n=d(t),o=new V(128);M(o,n);let r=o.ot;for(let o=0;o<t.length;o++)t[o]&&(r+=t[o]*(n.M[o]+Math.max(0,o<224?o-1:o-236)));return r},r=Math.min(n,32),e=Math.min(o,32),i=[st,et].map(t=>({_:t,rt:h.map(()=>new Uint32Array(257))}));for(const t of[0,.5,1]){p(Math.floor((n-r)*t),Math.floor((o-e)*t),r,e);for(const t of i)for(let n=0;n<s;n++)X(null,t.rt[n],w[n],r,e,x(t._))}h.forEach((n,o)=>{const r=i.map(n=>t(n.rt[o])),e=r[1]<r[0]?1:0;n._=i[e]._})}const N=i?[{type:"palette",G:0,k:s,B:i.colours.length}]:s>=3?[{type:"rct",G:0,j:6}]:[],_=h.map(()=>new Uint32Array(257)),C=t=>_[h.indexOf(t)];A&&X(null,C(h[0]),A,i.colours.length,s,h[0]);for(let t=0;t<m;t++)I(t,(t,n)=>{for(let o=0;o<b;o++)X(null,C(g(o)),w[o],t,n,g(o))}),yield++L/U;const O=new V(256);f(O,n,o,r.colour,r.alpha,{colorSpace:e}),function(t,{alpha:n,shift:o=1}){t.write(9,8),n&&t.write(2,0),t.write(2,o),l(t,n)}(O,{alpha:r.alpha});const P=new V(4096);P.write(1,1),P.write(1,1);const F=E(P,y),q=T(P,F,_,t=>h.indexOf(t)),G=t=>q[h.indexOf(t)+1].code;J(P,{H:!0,K:N}),A&&X(P,G(h[0]),A,i.colours.length,s,h[0]);const v=[];if(c.nt)I(0,(t,n)=>{for(let o=0;o<b;o++)X(P,G(g(o)),w[o],t,n,g(o))}),yield 1,v.push(P.finish());else{v.push(P.finish());for(let t=0;t<c.$*c.tt+1;t++)v.push(new Uint8Array(0));for(let t=0;t<m;t++)I(t,(t,n)=>{const o=new V(t*n*b+64);J(o,{H:!0,K:[]});for(let r=0;r<b;r++)X(o,G(g(r)),w[r],t,n,g(r));v.push(o.finish())}),yield++L/U}return a(O,v)}function C(t,n,o,r){let e=0;return e+=t[n]*lt[r],e+=t[n+o]*lt[r+1],e+=t[n+2*o]*lt[r+2],e+=t[n+3*o]*lt[r+3],e+=t[n+4*o]*lt[r+4],e+=t[n+5*o]*lt[r+5],e+=t[n+6*o]*lt[r+6],e+=t[n+7*o]*lt[r+7],e}function O(t,n,o){const r=new Float64Array(192),e=new Float64Array(64),s=new Float64Array(192);return(i,c)=>{for(let e=0;e<8;e++)for(let s=0;s<8;s++){const f=4*(Math.min(o-1,8*c+e)*n+Math.min(n-1,8*i+s)),l=t[f],a=t[f+1],u=t[f+2],h=8*e+s;r[h]=.299*l+.587*a+.114*u-128,r[64+h]=-.168735892*l-.331264108*a+.5*u,r[128+h]=.5*l-.418687589*a-.081312411*u}for(let t=0;t<3;t++){for(let n=0;n<8;n++)for(let o=0;o<8;o++)e[8*n+o]=C(r,64*t+8*n,1,8*o);for(let n=0;n<8;n++)for(let o=0;o<8;o++)s[64*t+8*n+o]=C(e,o,8,8*n)}return s}}function*P(t,n,o,r,e){const s=Math.ceil(n/8),i=Math.ceil(o/8),c=r>=30?.1+.09*(100-r):53/3e3*r*r-1.15*r+25,f=[0,1,2].map(t=>({h:1,v:1,stride:s,rows:i,quant:Int32Array.from(at,(n,o)=>Math.max(1,Math.round(16*c*(t?18:10)*(o?n:.25)))),coeffs:new Int16Array(s*i*64)})),l=O(t,n,o),a=(t,n)=>{for(let o=t;o<n;o++)for(let t=0;t<s;t++){const n=l(t,o),r=64*(o*s+t);for(let t=0;t<3;t++)for(let o=0;o<64;o++)f[t].coeffs[r+o]=Math.round(16*n[64*t+o]/f[t].quant[o])}};for(let t=0;t<i;t+=32)a(t,Math.min(i,t+32)),yield Math.min(i,t+32)/i;let u=null;for(let n=3;n<t.length;n+=4)if(255!==t[n]){u=t;break}return{width:n,height:o,components:f,quantScale:16,ycbcr:!0,orientation:1,alpha:u,colorSpace:e}}function F(n,o,r,c,f){const{quality:l,colorSpace:a}=function(t={},n=100){if(null===t||"object"!=typeof t)throw W("JXL_INPUT","Options are an object: {quality, colorSpace}.");if(void 0!==t.quality&&(n=t.quality),"number"!=typeof n||!Number.isFinite(n)||n<1||n>100)throw W("JXL_INPUT","Quality is a number from 1 to 100.");const o=void 0===t.colorSpace?"srgb":t.colorSpace;if("srgb"!==o&&"display-p3"!==o)throw W("JXL_INPUT","The colour space is srgb or display-p3.");return{quality:n,colorSpace:o}}(c,90),u=function(t={}){if(null===t||"object"!=typeof t)throw W("JXL_INPUT","Options are an object.");const n=void 0===t.effort?1:t.effort;if(!Number.isInteger(n)||n<1||n>9)throw W("JXL_INPUT","Effort is a whole number from 1 to 9.");return n}(c);return function(t,n,o,r){if(function(t,n,o=Q){if(!Number.isInteger(t)||!Number.isInteger(n)||t<1||n<1)throw W("JXL_INPUT","A picture is at least one pixel wide and high, in whole pixels.");if(t>o.edge||n>o.edge)throw W("JXL_DIMENSIONS","A picture is at most "+o.edge+" pixels on a side.");if(t*n>o.pixels)throw W("JXL_DIMENSIONS","A picture is at most "+o.pixels.toLocaleString("en-US")+" pixels.")}(n,o,r),!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw W("JXL_INPUT","Pixels are a Uint8Array or Uint8ClampedArray of RGBA bytes.");if(t.length!==n*o*4)throw W("JXL_INPUT","Pixels are width * height * 4 bytes: straight (not premultiplied) RGBA, row by row.")}(n,o,r,H),function(t){const n=function*(){let o,r;for(;!(o=i(()=>t.next(n.hurry))).done;)yield r=o.value;return r<1&&(yield 1),n.bytes=(s((e=o.value).length),e);var e}();return n.bytes=null,n.hurry=!1,n}(function*(n,o,r,s,i,c,f){if(s>=100)return yield*function*(n,o,r,{shape:e=N(n,o,r),colorSpace:s}={}){let i,c;const f=e.palette?[e,{...e,palette:null}]:[e];for(let e=0;e<f.length;e++)try{const c=yield*t(_(n,o,r,f[e],s),e,f.length);(!i||c.length<i.length)&&(i=c)}catch(t){if("JXL_SIZE"!==t.code)throw t;c=t}if(!i)throw c;return i}(n,o,r,{colorSpace:i});if(c<5)return yield*t(f(yield*t(P(n,o,r,s,i),0,2),c),1,2);const l=yield*t(P(n,o,r,s,i),0,4);let a=yield*t(f(l,4),1,4);if(yield.5)return a;try{const o=yield*t(function*(t,n,o=0){const{width:r,height:s,components:i,quantScale:c}=n,f=i[0].stride,l=i[0].rows,a=f*l,u=ut.length;if(t.byteLength+i.reduce((t,n)=>t+n.coeffs.byteLength,0)+Math.max(a*(10*u+2)+o,7*H.bytes)>wt)return null;const h=new Float64Array(a*u),y=new Uint16Array(a*u),w=O(t,r,s),d=i.map(t=>t.quant),M=i.map(t=>t.coeffs),p=ut.map(t=>d.map(n=>Float64Array.from(n,n=>n*function(t){const n=e(t);let o=1+(1023&n)/1024,r=(n>>10)-15;for(;r<0;)o/=2,r++;for(;r>0;)o*=2,r--;return o}(4/(2040*c))*8*255/t))),A=new Int16Array(192),g=new Float64Array(3),b=new Int32Array(6),m=new Float64Array(6),U=new Float64Array(6);let I=0,x=0;const S=(t,n,o)=>{let r=0,e=0;const s=ht[o]*d[0][1]*d[0][1]/(c*c);for(let i=1;i<64;i++){if(!o){for(let r=0;r<3;r++){const s=M[r][64*n+i];g[r]=dt(s,r)*p[o][r][i]-t[64*r+i],s&&(e+=2+2*(32-Math.clz32(Math.abs(s))))}r+=Mt(g[0],g[1],g[2]);continue}for(let n=0;n<3;n++){const r=t[64*n+i],e=p[o][n][i],s=Math.floor(r/e);for(let t=0;t<2;t++){const o=s+t;b[2*n+t]=o,U[2*n+t]=o?2+2*(32-Math.clz32(Math.abs(o))):0,m[2*n+t]=o<-32768||o>32767?1/0:dt(o,n)*e-r}}let c=0,f=1/0,l=0;for(let t=0;t<8;t++){const n=Mt(m[1&t],m[2+(t>>1&1)],m[4+(t>>2)]),o=n+s*(U[1&t]+U[2+(t>>1&1)]+U[4+(t>>2)]);o<f&&(f=o,c=t,l=n)}if(f===1/0)return{error:1/0,rate:65535};r+=l;for(let t=0;t<3;t++){const n=b[2*t+(c>>t&1)];A[64*t+i]=n,n&&(e+=2+2*(32-Math.clz32(Math.abs(n))))}}return{error:r,rate:e}};for(let t=0;t<l;t++)for(let n=0;n<f;n++){const o=t*f+n,r=w(n,t);for(let t=0;t<u;t++){const n=S(r,o,t),e=o*u+t;h[e]=n.error,y[e]=n.rate,t||(I+=n.error,x+=n.rate)}if(((o+1)%1024==0||o+1===a)&&(yield(o+1)/(3*a)))return null}const E=new Uint8Array(a);let L=0;const J=function*(t,n){let o=0,r=0;for(let e=0;e<a;e++){const s=e*u;let i=0,c=h[s]+t*y[s];for(let n=1;n<u;n++){const o=h[s+n]+t*y[s+n];o<c&&(c=o,i=n)}if(o+=h[s+i],r+=y[s+i],n&&(E[e]=i),((e+1)%1024==0||e+1===a)&&(yield 1/3+(L+(e+1)/a)/147))return null}return L++,{error:o,rate:r}};let T=0,X=Math.max(1,I/Math.max(1,x));for(let t=0;t<24;t++){const t=yield*J(X,!1);if(!t)return null;if(t.error>I)break;X*=2}for(let t=0;t<24;t++){const t=(T+X)/2,n=yield*J(t,!1);if(!n)return null;n.error<=I?T=t:X=t}const N=yield*J(T,!0);if(!N||N.error>I||N.rate>=x||!E.some(t=>t))return null;const _=new Uint8Array(a);for(let t=0;t<l;t++)for(let n=0;n<f;n++){const o=t*f+n,r=E[o];if(_[o]=ut[r],r){S(w(n,t),o,r);for(let t=0;t<3;t++)for(let n=1;n<64;n++)M[t][64*o+n]=A[64*t+n]}if(((o+1)%1024==0||o+1===a)&&(yield 2/3+(o+1)/(3*a)))return null}return{...n,quantFieldBase:4,quantFields:_,reconstructionError:{baseline:I,candidate:N.error}}}(n,l,a.byteLength),2,4);o&&(a=yield*t(f(o,4,a),3,4))}catch(t){if((!(t instanceof RangeError)||t.code)&&"JXL_SIZE"!==t.code)throw t}return a}(n,o,r,l,a,u,f))}function q(t,n){return g(t,n,bt),bt[0]}function G(t){let n=0;for(t>=2&&t<4294967296&&(n=31-Math.clz32(t),t*=mt[n]);t>=1.4142135623730951;)t/=2,n++;for(;t<.7071067811865476;)t*=2,n--;const o=(t-1)/(t+1),r=o*o;let e=o,s=o;for(let t=3;t<30;t+=2)s+=(e*=r)/t;return n+2.885390081777927*s}function v(t){let n=0,o=0;for(const o of t)n+=o;for(const r of t)r&&(o+=r*G(n/r));return o}function j(t,{maxClusters:n=48,newClusterCost:o=320}={}){const r=[];for(let n=0;n<t.et;n++)t.st[n]>0&&r.push(n);r.sort((n,o)=>t.st[o]-t.st[n]);const e=[];for(const s of r){const r=t.it([s],At),i=v(r);let c=-1,f=1/0;for(let t=0;t<e.length;t++){const n=e[t],o=new Uint32Array(64);for(let t=0;t<64;t++)o[t]=n.rt[t]+r[t];const s=v(o)-n.ct-i;s<f&&(f=s,c=t)}if(c<0||e.length<n&&f>o)e.push({et:[s],rt:r,ct:i});else{const t=e[c];t.et.push(s);for(let n=0;n<64;n++)t.rt[n]+=r[n];t.ct=v(t.rt)}}e.length||e.push({et:[],rt:new Uint32Array(64),ct:0});const s=new Uint8Array(t.et);let i=2*t.et;const c=e.map((n,o)=>{for(const t of n.et)s[t]=o;let r=pt[0],e=1/0;for(const o of pt){const s=t.ft(n.et,o);s<e&&(e=s,r=o)}const c=d(t.it(n.et,r,128));return i+=e+3*c.u+40,{config:r,code:c}});return{L:s,J:c,write:(t,n,o)=>{const r=c[s[n]];m(t,r.code,r.config,o)},ct:i}}function k(t,n="JXL_JPEG"){return Object.assign(new Error("JPEG: "+t),{code:n})}function z(t,n,o){const r=[];if(n>0){const o=new Uint32Array(2048);let e=0;for(const n of t)o[Math.min(2047,Math.max(0,n+1024))]++,e++;let s=0,i=e/(n+1);for(let t=0;t<2048&&r.length<n;t++)s+=o[t],s>i&&(r.push(t-1025),i=e*(r.length+1)/(n+1))}const e=r.length+1,s=new Uint8Array(39*e);for(let t=0;t<e;t++)for(let n=0;n<It;n++)s[(0+n)*e+t]=t,s[(13+n)*e+t]=o?e:e+(t>>1),s[(26+n)*e+t]=o?e:e+(e-1>>1)+1+(t>>1);let i=0;for(const t of s)i=Math.max(i,t+1);return{thresholds:r,lt:e,map:s,ut:i,ht:t=>{let n=0;for(const o of r)t>o&&n++;return n},yt:(t,n)=>s[(t<2?1^t:2)*It*e+n],wt:(t,n)=>(Math.min(t,64)<8?Math.min(t,64):4+(Math.min(t,64)>>1))*i+n,dt:t=>37*i+458*t,et:495*i}}function B(t,n,o){const r=n.map(()=>x(o)),e=r.map(()=>new Uint32Array(257));n.forEach((t,n)=>X(null,e[n],t.data,t.w,t.h,r[n])),J(t,{H:!1,K:[]});const s=E(t,S(r)),i=T(t,s,e,t=>r.indexOf(t));n.forEach((n,o)=>X(t,i[o+1].code,n.data,n.w,n.h,r[o]))}function*R(t,o={}){const{width:i,height:c,components:u,alpha:h}=t,y=1===u.length,w=t.quantScale||1;let M=t.quantFieldBase||1;for(;M/(2040*w)<1/16384;)M*=2;const A=t.ycbcr||y,g=y?[0,0,0]:A?[1,0,2]:[0,1,2],x=g.map(t=>u[t]),S=o.orders?g.map(t=>o.orders[t].map(t=>Et[t])):[Et,Et,Et],E=t=>1===t?0:2===t?1:-1,L=x.map(t=>E(t.h)),J=x.map(t=>E(t.v));if(L.includes(-1)||J.includes(-1))throw k("sampling factors other than one or two");const T=Math.max(...L),X=Math.max(...J),N=t=>T-L[t],_=t=>X-J[t];if(!A&&(T||X))throw k("an RGB JPEG with subsampling");const C=Math.ceil(i/(8<<T))<<T,O=Math.ceil(c/(8<<X))<<X,P=Math.ceil(i/$),F=Math.ceil(c/$),q=P*F,G=Math.ceil(C/256),v=G*Math.ceil(O/256),R=1===q,Z=(t,n,o)=>{const r=x[t];return y&&1!==t?-1:64*(o*r.stride+n)},D=t=>{let n=1024;for(;t%n;)n>>=1;return n},Y=x.map(t=>A?1:t.quant[0]/D(t.quant[0])),Q=x.map(t=>A?0:1024/D(t.quant[0])),H=new Int32Array(C*O);for(let t=0;t<O;t++)for(let n=0;n<C;n++)H[t*C+n]=x[1].coeffs[Z(1,n,t)]*Y[1]+Q[1];const K=x[1].quant,W=(K[8]+K[16]+K[24]+K[32]+K[40])/w,tt=C*O,nt=tt<256?0:Math.max(1,Math.min(7,r(tt)-r(W)-7));let ot=z(H,nt,y);const rt=new V(256);if(f(rt,i,c,y?1:3,!!h,{orientation:t.orientation,colorSpace:t.colorSpace}),rt.write(1,0),rt.write(2,0),rt.write(1,0),rt.write(2,2),rt.write(8,111),rt.write(1,A?1:0),A)for(let t=0;t<3;t++)rt.write(2,0===L[t]&&0===J[t]?0:1===L[t]&&1===J[t]?1:1===L[t]?2:3);rt.write(2,0),h&&rt.write(2,0),l(rt,h);const et=[0,1,2].map(()=>new Int32Array(1024)),it=(t,o)=>{const r=t%P*32,e=32*(t/P|0),s=Math.min(32,C-r),i=Math.min(32,O-e);for(let t=0;t<i;t++)for(let i=0;i<s;i++)for(const s of[1,0,2]){const c=N(s),f=_(s),l=i>>c,a=t>>f;if(l<<c!==i||a<<f!==t)continue;const u=Z(s,(r>>c)+l,(e>>f)+a),h=x[s].coeffs;let y=0;if(u>=0)for(let t=1;t<64;t++)h[u+t]&&y++;const w=et[s],d=0===l?0===a?32:w[32*(a-1)]:0===a?w[32*a+l-1]:w[32*(a-1)+l]+w[32*a+l-1]+1>>1;w[32*a+l]=y;const M=ot.yt(s,ot.ht(H[(e+t)*C+r+i]));o(ot.wt(d,M),y);const p=ot.dt(M);let A=y>4?0:1,g=y;for(let t=1;t<64&&g;t++){const r=h[u+S[s][t]];o(p+Lt(g,t,A),n(r)),A=r?1:0,g-=A}}},ct=(nt>0?3:2)*q+v;let ft=0;const lt=function*(t){ot=t;const n=new gt(t.et);for(let t=0;t<q;t++)it(t,(t,o)=>n.add(t,o)),yield++ft/ct;return(o.coding||j)(n,o.clusters)};let at=yield*lt(ot);if(nt>0){const t=ot,n=z(H,0,y),o=yield*lt(n);o.ct<=at.ct?at=o:ot=t}const ut=Array.from({length:R?1:2+v+q},()=>null),ht=t=>ut[R?0:t]||(ut[R?0:t]=new V(4096)),yt=new Uint32Array(ut.length);let wt=0;const dt=t=>{t=R?0:t;const n=Math.ceil(ut[t].ot/8);wt+=n-yt[t],yt[t]=n,s(wt)},Mt=ht(0);Mt.write(1,0);const pt=(t,n)=>{const o=t*$,r=n*$,e=Math.min($,i-o),s=Math.min($,c-r),f=new Int32Array(e*s);for(let t=0;t<s;t++)for(let n=0;n<e;n++)f[t*e+n]=h[4*((r+t)*i+o+n)+3];return{w:e,h:s,data:f}};for(let t=0;t<3;t++)Mt.write(16,e(x[t].quant[0]/Y[t]/(2040*w)*128));Mt.write(2,3),Mt.write(16,57343),Mt.write(2,1),Mt.write(5,0),Mt.write(1,0),Mt.write(4,0),Mt.write(4,ot.thresholds.length);for(const t of ot.thresholds)Mt.t([[4,0],[8,16],[16,272],[32,65808]],n(t));Mt.write(4,0),Mt.write(4,0),U(Mt,ot.map),Mt.write(1,0),Mt.write(2,0),Mt.write(16,0),Mt.write(16,0),Mt.write(8,128),Mt.write(8,128),Mt.write(1,0),h&&B(Mt,[R?pt(0,0):{w:0,h:0,data:new Int32Array(0)}],st),dt(0);for(let n=0;n<v;n++){const o=ht(1+n),e=n%G*256,s=256*(n/G|0),i=Math.min(256,C-e),c=Math.min(256,O-s);o.write(2,0),B(o,[1,0,2].map(t=>{const n=i>>N(t),o=c>>_(t),r=new Int32Array(n*o),f=Y[t],l=Q[t];for(let i=0;i<o;i++)for(let o=0;o<n;o++){const c=Z(t,(e>>N(t))+o,(s>>_(t))+i);r[i*n+o]=c<0?0:x[t].coeffs[c]*f+l}return{w:n,h:o,data:r}}),st);const f=i*c,l=r(f);l&&o.write(l,f-1);const a=i+7>>3,u=c+7>>3,h=new Int32Array(2*f).fill(M-1,f);if(t.quantFields)for(let n=0;n<c;n++)for(let o=0;o<i;o++)h[f+n*i+o]=t.quantFields[(s+n)*C+e+o]-1;B(o,[{w:a,h:u,data:new Int32Array(a*u)},{w:a,h:u,data:new Int32Array(a*u)},{w:f,h:2,data:h},{w:i,h:c,data:new Int32Array(f)}],M>1?st:0),dt(1+n),yield++ft/ct}const At=ht(1+v);At.write(1,0),At.write(3,7),At.write(16,e(M/(2040*w))),B(At,[0,1,2].map(t=>{const n=new Int32Array(64),o=x[t].quant;for(let t=0;t<8;t++)for(let r=0;r<8;r++)n[8*r+t]=o[8*t+r];return{w:8,h:8,data:n}}),st);for(let t=1;t<17;t++)At.write(3,0);if(q>1&&At.write(r(q),0),o.orders){At.t([[0,95],[0,19],[0,0],[13,0]],1);const t=[];for(const n of g){const r=Array.from({length:64},(t,n)=>n),e=o.orders[n].map(t=>{const n=r.indexOf(t);return r.splice(n,1),n});let s=64;for(;s>1&&!e[s-1];)s--;t.push(s-1,...e.slice(1,s))}const n=p(0),r=new Uint32Array(64);for(const o of t)b(n,o,r);const e=d(r);I(At,{L:new Uint8Array(8),J:[{config:n,code:e}]});for(const o of t)m(At,e,n,o)}else At.write(2,2);at.writeHistograms?at.writeHistograms(At):I(At,{L:at.L,J:at.J}),dt(1+v);for(let t=0;t<q;t++){const n=ht(2+v+t);it(t,(t,o)=>at.write(n,t,o)),at.flush&&at.flush(n),h&&!R&&B(n,[pt(t%P,Math.floor(t/P))],st),dt(2+v+t),yield++ft/ct}return a(rt,function(t){return t.map(t=>t?t.finish():new Uint8Array(0))}(ut))}function*Z(t,n,o){if(n<3&&!o)return yield*R(t);let r=o;try{const o=R(t);let e,s;for(;!(e=o.next()).done;)if(s=yield e.value/2,s&&r&&e.value<1)return o.return(),r;if((!r||e.value.length<r.length)&&(r=e.value),s||n<3)return r;const i=n<4?1:3,c=R(t,{clusters:{maxClusters:32,newClusterCost:160}});for(;!(e=c.next()).done;)if(s=yield.5+e.value/(2*i),s&&e.value<1)return c.return(),r;if(e.value.length<r.length&&(r=e.value),s||n<4)return r;const f=function*(t){const n=Ut.map(t=>(7&t)<<3|t>>3),o=t.map(()=>new Uint32Array(64)),r=t.reduce((t,n)=>t+n.coeffs.length,0);let e=0;for(let s=0;s<t.length;s++){const{coeffs:i}=t[s],c=o[s];for(let t=0;t<i.length;t+=65536){const o=Math.min(t+65536,i.length);for(let r=t;r<o;r+=64)for(let t=1;t<64;t++)i[r+n[t]]&&c[t]++;if(e+=o-t,yield e/r)return null}}return o.map(t=>[0,...Array.from({length:63},(t,n)=>n+1).sort((n,o)=>Math.floor(t[o]/8)-Math.floor(t[n]/8)||n-o)])}(t.components);for(;!(e=f.next()).done;)if(yield.5+(1+e.value)/6)return f.return(),r;const l=R(t,{orders:e.value});for(;!(e=l.next()).done;)if(s=yield.5+(2+e.value)/6,s&&e.value<1)return l.return(),r;return e.value.length<r.length?e.value:r}catch(t){if(!r||(!(t instanceof RangeError)||t.code)&&"JXL_SIZE"!==t.code)throw t;return r}}function D(t,n,o,r){return function(t){let n;for(;!(n=t.next()).done;);return n.value}(Y(t,n,o,r))}function Y(t,n,o,r){return F(t,n,o,r,Z)}const Q=Object.freeze({bytes:16777216,pixels:24e6,edge:16384}),H=Object.freeze({bytes:16777216,pixels:4e7,edge:16384}),K=[1];for(let t=1;t<=32;t++)K.push(2*K[t-1]);class V{constructor(t=4096){this.bytes=new Uint8Array(t),this.at=0,this.Mt=0,this.pending=0}write(t,n){if(!(n>=0&&n<K[t]))throw new Error("bit write out of range: "+t+" bits, "+n);let o=this.Mt+n*(1<<this.pending),r=this.pending+t;this.at+5>=this.bytes.length&&this.grow();const e=this.bytes;for(;r>=8;)e[this.at++]=255&o,o=Math.floor(o/256),r-=8;this.Mt=o,this.pending=r}t(t,n){for(let o=0;o<4;o++){const[r,e]=t[o];if(n>=e&&n-e<K[r])return this.write(2,o),void(r&&this.write(r,n-e))}throw new Error("U32 value out of range: "+n)}o(){this.pending&&(this.at+1>=this.bytes.length&&this.grow(),this.bytes[this.at++]=this.Mt,this.Mt=0,this.pending=0)}get ot(){return 8*this.at+this.pending}grow(t=0){const n=Q.bytes+64;if(this.at+t+16>n)throw Object.assign(new Error("The encoded picture exceeds 16 MiB."),{code:"JXL_SIZE"});const o=new Uint8Array(Math.min(n,Math.max(2*this.bytes.length,this.at+t+16)));o.set(this.bytes.subarray(0,this.at)),this.bytes=o}append(t){if(this.at+t.at+8>=this.bytes.length&&this.grow(t.at+8),this.pending)for(let n=0;n<t.at;n++)this.write(8,t.bytes[n]);else this.bytes.set(t.bytes.subarray(0,t.at),this.at),this.at+=t.at;t.pending&&this.write(t.pending,t.Mt)}finish(){const t=this.at+(this.pending?1:0),n=this.bytes.slice(0,t);return this.pending&&(n[this.at]=this.Mt),n}}const W=(t,n)=>Object.assign(new Error(n),{code:t}),$=256,tt=[1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15],nt=[2,4,3,2,2,4],ot=[0,7,3,2,1,15],rt=[0,0,0],et=3,st=5,it=p(4),ct=Object.freeze({X:224,minLength:7,N:it}),ft=p(0),lt=Float64Array.of(.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.4903926402016152,.4157348061512726,.27778511650980114,.09754516100806417,-.0975451610080641,-.277785116509801,-.4157348061512727,-.4903926402016152,.46193976625564337,.19134171618254492,-.19134171618254486,-.46193976625564337,-.4619397662556434,-.19134171618254517,.191341716182545,.46193976625564326,.4157348061512726,-.0975451610080641,-.4903926402016152,-.2777851165098011,.2777851165098009,.4903926402016152,.09754516100806439,-.41573480615127256,.3535533905932738,-.35355339059327373,-.35355339059327384,.3535533905932737,.35355339059327384,-.35355339059327334,-.35355339059327356,.3535533905932733,.27778511650980114,-.4903926402016152,.09754516100806415,.4157348061512728,-.41573480615127256,-.09754516100806401,.4903926402016153,-.27778511650980076,.19134171618254492,-.4619397662556434,.46193976625564326,-.19134171618254495,-.19134171618254528,.46193976625564337,-.4619397662556432,.19134171618254478,.09754516100806417,-.2777851165098011,.4157348061512728,-.4903926402016153,.4903926402016152,-.4157348061512725,.27778511650980076,-.09754516100806429),at=Float64Array.from({length:64},(t,n)=>{const o=.26236426446749106*Math.max(0,5*Math.sqrt((7&n)*(7&n)+(n>>3)*(n>>3))/Math.sqrt(98)-1);let r=1,e=1;for(let t=1;t<30;t++)e+=r=r*o/t;return e}),ut=[4,4,4,4,3,2,6,8],ht=[0,.125,.25,.5,.25,.25,.25,.25],yt=[.9299455010825141,.945349926692846,.9500648966626563],wt=10.5*H.pixels,dt=(t,n)=>Math.abs(t)<2?t*yt[n]:t-.145/t,Mt=(t,n,o)=>{const r=t+1.402*o,e=t-.344136286*n-.714136286*o,s=t+1.772*n;return r*r+e*e+s*s},pt=[p(0),p(1),p(2),p(3),p(4),p(4,1,1),p(5,1,1),p(2,0,1),p(3,0,1)],At=p(4,1,1);class gt{constructor(t){this.et=t,this.small=new Uint32Array(64*t),this.At=Array.from({length:t},()=>null),this.st=new Float64Array(t)}add(t,n){if(this.st[t]++,n<64)return void this.small[64*t+n]++;const o=this.At[t]||(this.At[t]=new Map);o.set(n,(o.get(n)||0)+1)}it(t,n,o=64){const r=new Uint32Array(o);for(const o of t){const t=64*o;for(let o=0;o<64;o++)this.small[t+o]&&(r[q(n,o)]+=this.small[t+o]);const e=this.At[o];if(e)for(const[t,o]of e)r[q(n,t)]+=o}return r}ft(t,n){let r=v(this.it(t,n));for(const e of t){const t=64*e;for(let e=n.S;e<64;e++)this.small[t+e]&&(r+=this.small[t+e]*(o(e)-n.U-n.I));const s=this.At[e];if(s)for(const[t,e]of s)r+=e*(o(t)-n.U-n.I)}return r}}const bt=[0,0,0],mt=[1];for(let t=1;t<32;t++)mt.push(mt[t-1]/2);const Ut=[0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63],It=13,xt=[0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30],St=[0,0,31,62,62,93,93,93,93,123,123,123,123,152,152,152,152,152,152,152,152,180,180,180,180,180,180,180,180,180,180,180,180,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206],Et=Ut.map(t=>(7&t)<<3|t>>3),Lt=(t,n,o)=>2*(St[t]+xt[n])+o;export{H as LIMITS,D as encodePhoto,Y as encodePhotoSteps};
1
+ /*! Rapier JXL 2.2.0 | MIT License Copyright (c) 2026 rapier.website Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2
+ function*t(t,n,o){let r,e;for(;!(r=t.next(e)).done;)e=yield ot(r.value,t=>(n+t)/o);return r.value}function n(t){return t>=0?2*t:2*-t-1}function o(t){return 31-Math.clz32(t)}function r(t){return t<=1?0:32-Math.clz32(t-1)}function e(t){if(0===t)return 0;const n=t<0?32768:0;if(!((t=Math.abs(t))<65520))throw new Error("half float out of range: "+t);let o=0,r=t;for(;r>=2;)r/=2,o++;for(;r<1;)r*=2,o--;o<-14?(r=16384*t,o=-15):r-=1;let e=Math.round(1024*r);return 1024===e&&(e=0,o++),n|o+15<<10|e}function s(t){if(t>W.bytes)throw rt("JXL_SIZE","The encoded picture exceeds 16 MiB.")}function i(t){try{return t()}catch(t){if(t instanceof RangeError&&!t.code)throw rt("JXL_MEMORY","Not enough memory for this picture.");throw t}}function c(t,n){t.t([[9,1],[13,1],[18,1],[30,1]],n)}function f(t,n,o,r,e,{xyb:s=!1,orientation:i=1,colorSpace:f}={}){t.write(16,2815),t.write(1,0),c(t,o),t.write(3,0),c(t,n),t.write(1,0);const l=1!==i;t.write(1,l?1:0),l&&t.write(6,i-1),t.write(4,8),e?t.write(3,5):t.write(2,0),t.write(1,s?1:0),3===r&&"display-p3"===f?t.write(21,903568):3===r?t.write(1,1):t.write(15,14100),l&&t.write(1,1),t.write(2,0),t.write(1,1),t.o()}function l(t,n){t.write(n?7:5,0),t.write(11,1)}function*a(t,n,o,r){if(t.pooled){const n=yield t;return n?(n.results.forEach((t,n)=>r(n,t)),n.hurried):null}let e=!1;for(let r=0;r<n;r++)if(o(r),e=yield t.at(r),e&&t.stop(r))return null;return e}function u(t,n){const o=n.map(t=>t.length);!function(t,n){t.write(1,0),t.o();for(const o of n)t.t([[10,0],[14,1024],[22,17408],[30,4211712]],o);t.o()}(t,o);const r=t.finish(),e=r.length+o.reduce((t,n)=>t+n,0);s(e);const i=new Uint8Array(e);i.set(r);let c=r.length;for(const t of n)i.set(t,c),c+=t.length;return i}function h(t,n){const o=new Uint8Array(t.length),r=[];for(let n=0;n<t.length;n++)t[n]>0&&r.push(n);if(!r.length)return o;if(1===r.length)return o[r[0]]=1,o;for(let e=1;;e*=2){const s=r.map(n=>({w:Math.max(t[n],e),i:n,l:null,r:null})).sort((t,n)=>t.w-n.w||t.i-n.i),i=[];let c=0,f=0;const l=()=>c<s.length&&(f>=i.length||s[c].w<=i[f].w)?s[c++]:i[f++];for(;s.length-c+(i.length-f)>1;){const t=l(),n=l();i.push({w:t.w+n.w,i:-1,l:t,r:n})}const a=[[l(),0]];let u=0;for(;a.length;){const[t,n]=a.pop();t.i>=0?(o[t.i]=n,n>u&&(u=n)):a.push([t.l,n+1],[t.r,n+1])}if(u<=n)return o}}function y(t,n,o,r,e,s){const i=[];for(;i.push(r&e),r>>=s;)r--;for(let r=i.length-1;r>=0;r--)t.push(o),n.push(i[r])}function w(t,n){let o=0;for(let r=0;r<n;r++)o=o<<1|1&t,t>>=1;return o}function d(t){const n=new Uint32Array(17),o=new Uint32Array(17),r=new Uint16Array(t.length);for(const o of t)n[o]++;n[0]=0;for(let t=1,r=0;t<=16;t++)r=r+n[t-1]<<1,o[t]=r;for(let n=0;n<t.length;n++)t[n]&&(r[n]=w(o[t[n]]++,t[n]));return r}function p(t){const n=[];for(let o=0;o<t.length;o++)t[o]>0&&n.push(o);const o=n.length,r=n[o-1]+1||1,e=o<=4?new Uint8Array(r):h(t,15).subarray(0,r);let s=0;if(o<=4){n.sort((n,o)=>t[o]-t[n]||n-o),s=4===o&&t[n[0]]>t[n[2]]+t[n[3]]?1:0;const r=o<2?[0]:2===o?[1,1]:3===o?[1,2,2]:s?[1,2,3,3]:[2,2,2,2];n.forEach((t,n)=>{e[t]=r[n]}),n.sort((t,n)=>e[t]-e[n]||t-n)}return{u:r,p:e,M:d(e),A:o&&o<=4?n:null,m:s}}function M(t,n){if(n.u<=1)return;if(n.A){const r=o(n.u-1)+1;t.write(2,1),t.write(2,n.A.length-1);for(const o of n.A)t.write(r,o);return void(4===n.A.length&&t.write(1,n.m))}const r=n.p,e=[],s=[];let i=r.length-1;for(;i>0&&!r[i];)i--;let c=8;for(let t=0;t<=i;){const n=r[t];let o=1;for(;t+o<=i&&r[t+o]===n;)o++;let f=o;if(n&&n!==c&&(e.push(n),s.push(0),f--,c=n),f<3)for(let t=0;t<f;t++)e.push(n),s.push(0);else y(e,s,n?16:17,f-3,n?3:7,n?2:3);t+=o}const f=new Uint32Array(18);for(const t of e)f[t]++;let l=0;for(const t of f)t&&l++;1===l&&(f[e[0]?0:1]=f[e[0]]);const a=h(f,5),u=d(a);let w=18;for(;w>0&&!a[it[w-1]];)w--;t.write(2,0);for(let n=0;n<w;n++){const o=a[it[n]];t.write(ct[o],ft[o])}for(let n=0;n<e.length;n++){const o=e[n];t.write(a[o],u[o]),16===o?t.write(2,s[n]):17===o&&t.write(3,s[n])}}function A(t,n=0,o=0){return{split:t,U:n,I:o,S:1<<t}}function g(t,n,o=15){t.write(r(o+1),n.split),n.split!==o&&(t.write(r(n.split+1),n.U),t.write(r(n.split-n.U+1),n.I))}function b(t,n,r){if(n<t.S)return r[0]=n,r[1]=0,void(r[2]=0);const e=o(n),s=n-(1<<e),i=e-t.U-t.I;r[0]=t.S+(e-t.split<<t.U+t.I|s>>e-t.U<<t.I|s&(1<<t.I)-1),r[1]=i,r[2]=n>>t.I&(1<<i)-1}function m(t,n,o,r=0){b(t,n,lt),o[r+lt[0]]++}function U(t,n,o,r,e=0){b(o,r,lt);const s=e+lt[0];t.write(n.p[s],n.M[s]),lt[1]&&t.write(lt[1],lt[2])}function I(t,n){let o=0;for(const t of n)o=Math.max(o,t);const e=o?r(o+1):0;if(e<=3){if(t.write(1,1),t.write(2,e),e)for(const o of n)t.write(e,o);return}t.write(1,0),t.write(1,0);const s=A(8),i=A(4),c=n.length>=64,f=new Uint32Array(c?257:o+1),l=[];for(let t=0;t<n.length;){let o=1;for(;c&&t+o<n.length&&n[t+o]===n[t];)o++;if(o>=8)l.push([n[t],o-1]),f[n[t]]++,m(i,o-1-7,f,224),t+=o;else{for(let r=0;r<o;r++)l.push([n[t],0]),f[n[t]]++;t+=o}}const a=p(f);if(!c){x(t,{L:new Uint8Array(1),J:[{config:s,code:a}]});for(const[n]of l)U(t,a,s,n);return}const u=new Uint32Array(1);u[0]=1,x(t,{T:{X:224,minLength:7,N:i},L:new Uint8Array([1,0]),J:[{config:A(0),code:p(u)},{config:s,code:a}]});for(const[n,o]of l)U(t,a,s,n),o&&U(t,a,i,o-7,224)}function x(t,{T:n=null,L:r,J:e}){t.write(1,n?1:0),n&&(t.t([[0,224],[0,512],[0,4096],[15,8]],n.X),t.t([[0,3],[0,4],[2,5],[8,9]],n.minLength),g(t,n.N,8)),r.length>1&&I(t,r),t.write(1,1);for(const n of e)g(t,n.config,15);for(const n of e){const r=n.code.u-1;if(r){const n=o(r);t.write(1,1),t.write(4,n),t.write(n,r-(1<<n))}else t.write(1,0)}for(const n of e)M(t,n.code)}function S(t,n=0,o=1){return{_:t,offset:n,C:o,context:-1}}function E(t){return function(t,n){const o=(r,e)=>{if(r===e)return n?t[r].O:t[r];const s=r+e>>1;return function(t,n,o,r){return{P:t,q:n,left:o,right:r}}(n,n?t[s].F:s,o(s+1,e),o(r,s))};return o(0,t.length-1)}(t,0)}function L(t,o){const r=[o],e=[],s=[];for(const t of r){if(t.left){e.push(t.P+1,n(t.q)),r.push(t.left,t.right);continue}t.context=s.length,s.push(t);const o=1===t.C?0:31-Math.clz32(t.C&-t.C);e.push(0,t._,n(t.offset),o,(t.C>>o)-1)}const i=new Uint32Array(64);for(const t of e)m(wt,t,i);const c=p(i);x(t,{L:new Uint8Array(6),J:[{config:wt,code:c}]});for(const n of e)U(t,c,wt,n);return s}function J(t,n){const o=[[3,0],[6,8],[10,72],[13,1096]];if("rct"===n.type)t.write(2,0),t.t(o,n.G),t.t([[0,6],[2,0],[4,2],[6,10]],n.j??6);else if("palette"===n.type)t.write(2,1),t.t(o,n.G),t.t([[0,1],[0,3],[0,4],[13,1]],n.k),t.t([[8,0],[10,256],[12,1280],[16,5376]],n.B),t.t([[0,0],[8,1],[10,257],[16,1281]],n.R??0),t.write(4,n._??0);else{if("squeeze"!==n.type)throw new Error("unknown transform "+n.type);{t.write(2,2);const r=n.Z??[];t.t([[0,0],[4,1],[6,9],[8,41]],r.length);for(const n of r)t.write(1,n.D?1:0),t.write(1,n.Y?1:0),t.t(o,n.G),t.t([[0,1],[0,2],[0,3],[4,4]],n.k)}}}function T(t,{H:n=!0,K:o=[]}={}){t.write(1,n?1:0),t.write(1,1),t.t([[0,0],[0,1],[4,2],[8,18]],o.length);for(const n of o)J(t,n)}function X(t,n,o,r=t=>t.context,e=()=>wt){const s=new Uint8Array(n.length+1);for(const t of n)s[t.context]=r(t)+1;const i=new Uint32Array(2);i[1]=1;const c=[{config:wt,code:p(i)}],f=Math.max(...s);for(let t=0;t<f;t++)c.push({config:e(t),code:p(o[t])});return x(t,{T:yt,L:s,J:c}),c}function N(t,o,r,e,s,i,c=!1){if(et.channel?.(t,o,r,e,s,i,c))return;const f=i._,l=i.offset,a=i.C,u=i.config||wt,h=ht;let y=0;const w=(n,r=u,e=0)=>{t?U(t,o,r,n,e):c&&!e?o[n]++:m(r,n,o,c?o.length-33:e)},d=()=>{if(y){if(y>=8)w(0),w(y-7-1,h,224);else for(let t=0;t<y;t++)w(0);y=0}},p=(t,o)=>{const e=r[t];let s;1===a?s=e-o-l:(s=Math.round((e-o-l)/a),r[t]=o+l+s*a),0!==s?(d(),w(n(s))):y++};for(let t=0,n=0;t<s;t++)for(let o=0;o<e;o++,n++){let s;if(0===f)s=0;else{const i=o?r[n-1]:t?r[n-e]:0,c=t?r[n-e]:i;if(1===f)s=i;else if(2===f)s=c;else if(3===f)s=(i+c)/2|0;else{const l=i+c-(o&&t?r[n-e-1]:i);if(5===f){const t=i<c?i:c,n=i<c?c:i;s=l<t?t:l>n?n:l}else{if(4!==f)throw new Error("predictor "+f+" is not coded here");s=Math.abs(l-i)<Math.abs(l-c)?i:c}}}p(n,s)}d()}function _(t){const n=t.length-33,r=[0,0,0];let e,s;for(const i of dt){const c=new Uint32Array(257);let f=0;for(let o=0;o<n;o++)t[o]&&(b(i,o,r),c[r[0]]+=t[o],f+=t[o]*r[1]);for(let o=0;o<33;o++)c[224+o]=t[n+o],f+=t[n+o]*Math.max(0,o-12);const l=p(c),a=new nt(128);g(a,i),M(a,l);let u=a.V+f+(1===l.u?1:5+o(l.u-1));for(let t=0;t<c.length;t++)c[t]&&(u+=c[t]*l.p[t]);const h={config:i,W:c,$:u,extra:f};e||(e=h),(!s||u<s.$)&&(s=h)}return[e,s]}function v(t,n,o,{palette:r=!0}={}){const e=n*o;let s=!0,i=!0;for(let n=0,o=0;o<e&&(255===t[n+3]||(s=!1,i))&&(t[n]===t[n+1]&&t[n]===t[n+2]||(i=!1,s));o++,n+=4);const c=i?1:3,f=!s,l=c+(f?1:0),a=n=>pt(t,n,i,f),u=new Map;let h=null;for(let t=0,n=0;r&&n<e;n++,t+=4){const n=a(t);if(0!==n&&!u.has(n)&&(u.set(n,1),u.size>=2048))break}if(r&&u.size<2048){const t=[...u.keys()],n=(t,n)=>t>>>8*n&255,o=t=>(.299*n(t,0)+.587*n(t,1)+.114*n(t,2)+.01)*(4===l?n(t,3):1);t.sort((t,n)=>o(t)-o(n)),h={colours:[0,...t],byte:n}}return{colour:c,alpha:f,channels:l,palette:h}}function C({channels:t,alpha:n,palette:o},r){const e=t-(n?1:0)==1,s=o&&new Map(o.map((t,n)=>[t,n]));return(i,c,f,l,a,u,h)=>{if(r&&!o&&t>=3)r.fill(i,c,f,l,a,u,h);else if(o||!et.fill?.(c,f,l,a,u,h,t,i))for(let r=0;r<h;r++){let h=4*((a+r)*f+l),y=r*u;for(let r=0;r<u;r++,h+=4,y++)if(o)i[0][y]=s.get(pt(c,h,e,n));else if(t>=3){const n=c[h],o=c[h+1],r=c[h+2],e=n-r,s=r+(e>>1),f=o-s;i[0][y]=s+(f>>1),i[1][y]=e,i[2][y]=f,4===t&&(i[3][y]=c[h+3])}else i[0][y]=c[h],2===t&&(i[1][y]=c[h+3])}}}function O(t,n){const{leaves:o,picture:r,M:e}=t,s=C(t,n),i=r.map(()=>new Int16Array(65536));return(t,n,c,f,l,a,u)=>{if(s(i,t,n,c,f,l,a),!e)return void r.forEach((t,n)=>N(null,u[t],i[n],l,a,o[t],!0));const h=u||new nt(l*a*r.length+64);return u||T(h,{H:!0,K:[]}),r.forEach((t,n)=>N(h,e[t],i[n],l,a,o[t])),u?void 0:h.finish()}}function*P(t,n,o,r,e,s,i){const{channels:c,alpha:h,palette:y}=r,w=function(t,n,o=256){const r=Math.ceil(t/o),e=Math.ceil(n/o);return{tt:r,nt:e,ot:Math.ceil(t/(8*o)),rt:Math.ceil(n/(8*o)),et:1===r&&1===e}}(n,o),d=w.tt*w.nt,A=y?2:c,g=Array.from({length:A},()=>S(ut)),b=E(g),m={channels:c,alpha:h,palette:y&&y.colours,rct:s?.type,leaves:g,picture:y?[w.et?1:0]:g.map((t,n)=>n)},U=C(m,s),I=Array.from({length:c},()=>new Int16Array(1024)),x=t=>function(t,n,o,r){const e=r%t.tt*st,s=(r/t.tt|0)*st;return[e,s,Math.min(st,n-e),Math.min(st,o-s)]}(w,n,o,t);let J=null;if(y){const t=y.colours.length;J=new Int16Array(t*c),y.colours.forEach((n,o)=>{for(let r=0;r<c;r++)J[r*t+o]=y.byte(n,r)})}if(!y){const r=t=>{const n=p(t),o=new nt(128);M(o,n);let r=o.V;for(let o=0;o<t.length;o++)t[o]&&(r+=t[o]*(n.p[o]+Math.max(0,o<224?o-1:o-236)));return r},e=Math.min(n,32),s=Math.min(o,32),i=[ut,at].map(t=>({_:t,W:g.map(()=>new Uint32Array(257))}));for(const r of[0,.5,1]){U(I,t,n,Math.floor((n-e)*r),Math.floor((o-s)*r),e,s);for(const t of i)for(let n=0;n<c;n++)N(null,t.W[n],I[n],e,s,S(t._))}g.forEach((t,n)=>{const o=i.map(t=>r(t.W[n])),e=o[1]<o[0]?1:0;t._=i[e]._})}const v=y?[{type:"palette",G:0,k:c,B:y.colours.length}]:c>=3&&0!==s?.type?[{type:"rct",G:0,j:s?.type??6}]:[];let P=g.map(()=>new Uint32Array(33+(y?4096:1024)));J&&N(null,P[0],J,y.colours.length,c,g[0],!0);const q=O(m,s);yield*a({pooled:i,kind:"plan",setup:{...m,sizes:P.map(t=>t.length)},at:t=>(t+1)/(2*d),stop:()=>!1},d,o=>q(t,n,...x(o),P),(t,n)=>function(t,n){t.forEach((t,o)=>{const r=n[o];for(let n=0;n<t.length;n++)t[n]+=r[n]})}(P,n));const F=P.map(_),G=F.reduce((t,n)=>t+n[0].$-n[1].$,0)>27*(w.et?1:d+1)+8?1:0;g.forEach((t,n)=>{t.config=F[n][G].config}),P=F.map(t=>t[G].W);const j=new nt(256);f(j,n,o,r.colour,r.alpha,{colorSpace:e}),function(t,{alpha:n,shift:o=1}){t.write(9,8),n&&t.write(2,0),t.write(2,o),l(t,n)}(j,{alpha:r.alpha});const k=new nt(4096);k.write(1,1),k.write(1,1);const z=X(k,L(k,b),P,t=>g.indexOf(t),t=>g[t].config),B={...m,M:g.map((t,n)=>z[n+1]?.code)},R=O(B,s);T(k,{H:!0,K:v}),J&&N(k,B.M[0],J,y.colours.length,c,g[0]);const Z=[];if(w.et)R(t,n,0,0,n,o,k),yield 1,Z.push(k.finish());else{Z.push(k.finish());for(let t=0;t<w.ot*w.rt+1;t++)Z.push(new Uint8Array(0));const o=Z.length,r=(t,n)=>{Z[o+t]=n};yield*a({pooled:i,kind:"plan",setup:B,at:t=>(d+t+1)/(2*d),stop:()=>!1},d,o=>r(o,R(t,n,...x(o))),r)}return u(j,Z)}function q(t,n,o,r){let e=0;return e+=t[n]*Mt[r],e+=t[n+o]*Mt[r+1],e+=t[n+2*o]*Mt[r+2],e+=t[n+3*o]*Mt[r+3],e+=t[n+4*o]*Mt[r+4],e+=t[n+5*o]*Mt[r+5],e+=t[n+6*o]*Mt[r+6],e+=t[n+7*o]*Mt[r+7],e}function F(t,n,o){const r=new Float64Array(192),e=new Float64Array(64),s=new Float64Array(192);return(i,c)=>{for(let e=0;e<8;e++)for(let s=0;s<8;s++){const f=4*(Math.min(o-1,8*c+e)*n+Math.min(n-1,8*i+s)),l=t[f],a=t[f+1],u=t[f+2],h=8*e+s;r[h]=.299*l+.587*a+.114*u-128,r[64+h]=-.168735892*l-.331264108*a+.5*u,r[128+h]=.5*l-.418687589*a-.081312411*u}for(let t=0;t<3;t++){for(let n=0;n<8;n++)for(let o=0;o<8;o++)e[8*n+o]=q(r,64*t+8*n,1,8*o);for(let n=0;n<8;n++)for(let o=0;o<8;o++)s[64*t+8*n+o]=q(e,o,8,8*n)}return s}}function*G(t,n,o,r,e){const s=Math.ceil(n/8),i=Math.ceil(o/8),c=r>=30?.1+.09*(100-r):53/3e3*r*r-1.15*r+25,f=[0,1,2].map(t=>({h:1,v:1,stride:s,rows:i,quant:Int32Array.from(At,(n,o)=>Math.max(1,Math.round(16*c*(t?18:10)*(o?n:.25)))),coeffs:new Int16Array(s*i*64)})),l=F(t,n,o),a=(t,n)=>{for(let o=t;o<n;o++)for(let t=0;t<s;t++){const n=l(t,o),r=64*(o*s+t);for(let t=0;t<3;t++)for(let o=0;o<64;o++)f[t].coeffs[r+o]=Math.round(16*n[64*t+o]/f[t].quant[o])}};for(let t=0;t<i;t+=32)a(t,Math.min(i,t+32)),yield Math.min(i,t+32)/i;let u=null;for(let n=3;n<t.length;n+=4)if(255!==t[n]){u=t;break}return{width:n,height:o,components:f,quantScale:16,ycbcr:!0,orientation:1,alpha:u,colorSpace:e}}function j(n,o,r,c,f){const{quality:l,colorSpace:a}=function(t={},n=100){if(null===t||"object"!=typeof t)throw rt("JXL_INPUT","Options are an object: {quality, colorSpace}.");if(void 0!==t.quality&&(n=t.quality),"number"!=typeof n||!Number.isFinite(n)||n<1||n>100)throw rt("JXL_INPUT","Quality is a number from 1 to 100.");const o=void 0===t.colorSpace?"srgb":t.colorSpace;if("srgb"!==o&&"display-p3"!==o)throw rt("JXL_INPUT","The colour space is srgb or display-p3.");return{quality:n,colorSpace:o}}(c,90),u=function(t={}){if(null===t||"object"!=typeof t)throw rt("JXL_INPUT","Options are an object.");const n=void 0===t.effort?1:t.effort;if(!Number.isInteger(n)||n<1||n>9)throw rt("JXL_INPUT","Effort is a whole number from 1 to 9.");return n}(c);return function(t,n,o,r){if(function(t,n,o=W){if(!Number.isInteger(t)||!Number.isInteger(n)||t<1||n<1)throw rt("JXL_INPUT","A picture is at least one pixel wide and high, in whole pixels.");if(t>o.edge||n>o.edge)throw rt("JXL_DIMENSIONS","A picture is at most "+o.edge+" pixels on a side.");if(t*n>o.pixels)throw rt("JXL_DIMENSIONS","A picture is at most "+o.pixels.toLocaleString("en-US")+" pixels.")}(n,o,r),!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw rt("JXL_INPUT","Pixels are a Uint8Array or Uint8ClampedArray of RGBA bytes.");if(t.length!==n*o*4)throw rt("JXL_INPUT","Pixels are width * height * 4 bytes: straight (not premultiplied) RGBA, row by row.")}(n,o,r,$),function(t){const n=function*(){let o,r;for(;!(o=i(()=>t.next(n.hurry))).done;)yield r=o.value;return r<1&&(yield 1),n.bytes=(s((e=o.value).length),e);var e}();return n.bytes=null,n.hurry=!1,n}(function*(n,o,r,s,i,c,f){if(s>=100)return yield*function*(n,o,r,{shape:e=v(n,o,r),colorSpace:s,rct:i,pooled:c}={}){let f,l;const a=e.palette?[e,{...e,palette:null}]:[e];for(let e=0;e<a.length;e++)try{const l=yield*t(P(n,o,r,a[e],s,i,c),e,a.length);(!f||l.length<f.length)&&(f=l)}catch(t){if("JXL_SIZE"!==t.code)throw t;l=t}if(!f)throw l;return f}(n,o,r,{colorSpace:i});if(c<5)return yield*t(f(yield*t(G(n,o,r,s,i),0,2),c),1,2);const l=yield*t(G(n,o,r,s,i),0,4);let a=yield*t(f(l,4),1,4);if(yield.5)return a;try{const o=yield*t(function*(t,n,o=0){const{width:r,height:s,components:i,quantScale:c}=n,f=i[0].stride,l=i[0].rows,a=f*l,u=gt.length;if(t.byteLength+i.reduce((t,n)=>t+n.coeffs.byteLength,0)+Math.max(a*(10*u+2)+o,7*$.bytes)>Ut)return null;const h=new Float64Array(a*u),y=new Uint16Array(a*u),w=F(t,r,s),d=i.map(t=>t.quant),p=i.map(t=>t.coeffs),M=gt.map(t=>d.map(n=>Float64Array.from(n,n=>n*function(t){const n=e(t);let o=1+(1023&n)/1024,r=(n>>10)-15;for(;r<0;)o/=2,r++;for(;r>0;)o*=2,r--;return o}(4/(2040*c))*8*255/t))),A=new Int16Array(192),g=new Float64Array(3),b=new Int32Array(6),m=new Float64Array(6),U=new Float64Array(6);let I=0,x=0;const S=(t,n,o)=>{let r=0,e=0;const s=bt[o]*d[0][1]*d[0][1]/(c*c);for(let i=1;i<64;i++){if(!o){for(let r=0;r<3;r++){const s=p[r][64*n+i];g[r]=It(s,r)*M[o][r][i]-t[64*r+i],s&&(e+=2+2*(32-Math.clz32(Math.abs(s))))}r+=xt(g[0],g[1],g[2]);continue}for(let n=0;n<3;n++){const r=t[64*n+i],e=M[o][n][i],s=Math.floor(r/e);for(let t=0;t<2;t++){const o=s+t;b[2*n+t]=o,U[2*n+t]=o?2+2*(32-Math.clz32(Math.abs(o))):0,m[2*n+t]=o<-32768||o>32767?1/0:It(o,n)*e-r}}let c=0,f=1/0,l=0;for(let t=0;t<8;t++){const n=xt(m[1&t],m[2+(t>>1&1)],m[4+(t>>2)]),o=n+s*(U[1&t]+U[2+(t>>1&1)]+U[4+(t>>2)]);o<f&&(f=o,c=t,l=n)}if(f===1/0)return{error:1/0,rate:65535};r+=l;for(let t=0;t<3;t++){const n=b[2*t+(c>>t&1)];A[64*t+i]=n,n&&(e+=2+2*(32-Math.clz32(Math.abs(n))))}}return{error:r,rate:e}};for(let t=0;t<l;t++)for(let n=0;n<f;n++){const o=t*f+n,r=w(n,t);for(let t=0;t<u;t++){const n=S(r,o,t),e=o*u+t;h[e]=n.error,y[e]=n.rate,t||(I+=n.error,x+=n.rate)}if(((o+1)%1024==0||o+1===a)&&(yield(o+1)/(3*a)))return null}const E=new Uint8Array(a);let L=0;const J=function*(t,n){let o=0,r=0;for(let e=0;e<a;e++){const s=e*u;let i=0,c=h[s]+t*y[s];for(let n=1;n<u;n++){const o=h[s+n]+t*y[s+n];o<c&&(c=o,i=n)}if(o+=h[s+i],r+=y[s+i],n&&(E[e]=i),((e+1)%1024==0||e+1===a)&&(yield 1/3+(L+(e+1)/a)/147))return null}return L++,{error:o,rate:r}};let T=0,X=Math.max(1,I/Math.max(1,x));for(let t=0;t<24;t++){const t=yield*J(X,!1);if(!t)return null;if(t.error>I)break;X*=2}for(let t=0;t<24;t++){const t=(T+X)/2,n=yield*J(t,!1);if(!n)return null;n.error<=I?T=t:X=t}const N=yield*J(T,!0);if(!N||N.error>I||N.rate>=x||!E.some(t=>t))return null;const _=new Uint8Array(a);for(let t=0;t<l;t++)for(let n=0;n<f;n++){const o=t*f+n,r=E[o];if(_[o]=gt[r],r){S(w(n,t),o,r);for(let t=0;t<3;t++)for(let n=1;n<64;n++)p[t][64*o+n]=A[64*t+n]}if(((o+1)%1024==0||o+1===a)&&(yield 2/3+(o+1)/(3*a)))return null}return{...n,quantFieldBase:4,quantFields:_,reconstructionError:{baseline:I,candidate:N.error}}}(n,l,a.byteLength),2,4);o&&(a=yield*t(f(o,4,a),3,4))}catch(t){if((!(t instanceof RangeError)||t.code)&&"JXL_SIZE"!==t.code)throw t}return a}(n,o,r,l,a,u,f))}function k(t,n){return b(t,n,Jt),Jt[0]}function z(t){let n=0;for(t>=2&&t<4294967296&&(n=31-Math.clz32(t),t*=Tt[n]);t>=1.4142135623730951;)t/=2,n++;for(;t<.7071067811865476;)t*=2,n--;const o=(t-1)/(t+1),r=o*o;let e=o,s=o;for(let t=3;t<30;t+=2)s+=(e*=r)/t;return n+2.885390081777927*s}function B(t){let n=0,o=0;for(const o of t)n+=o;for(const r of t)r&&(o+=r*z(n/r));return o}function R(t,{maxClusters:n=48,newClusterCost:o=320}={}){const r=[];for(let n=0;n<t.st;n++)t.it[n]>0&&r.push(n);r.sort((n,o)=>t.it[o]-t.it[n]);const e=[];for(const s of r){const r=t.ct([s],Et),i=B(r);let c=-1,f=1/0;for(let t=0;t<e.length;t++){const n=e[t],o=new Uint32Array(64);for(let t=0;t<64;t++)o[t]=n.W[t]+r[t];const s=B(o)-n.$-i;s<f&&(f=s,c=t)}if(c<0||e.length<n&&f>o)e.push({st:[s],W:r,$:i});else{const t=e[c];t.st.push(s);for(let n=0;n<64;n++)t.W[n]+=r[n];t.$=B(t.W)}}e.length||e.push({st:[],W:new Uint32Array(64),$:0});const s=new Uint8Array(t.st);let i=2*t.st;const c=e.map((n,o)=>{for(const t of n.st)s[t]=o;let r=St[0],e=1/0;for(const o of St){const s=t.ft(n.st,o);s<e&&(e=s,r=o)}const c=p(t.ct(n.st,r,128));return i+=e+3*c.u+40,{config:r,code:c}});return{L:s,J:c,write:(t,n,o)=>{const r=c[s[n]];U(t,r.code,r.config,o)},$:i}}function Z(t,n="JXL_JPEG"){return Object.assign(new Error("JPEG: "+t),{code:n})}function D(t,n,o){const r=[];if(n>0){const o=new Uint32Array(2048);let e=0;for(const n of t)o[Math.min(2047,Math.max(0,n+1024))]++,e++;let s=0,i=e/(n+1);for(let t=0;t<2048&&r.length<n;t++)s+=o[t],s>i&&(r.push(t-1025),i=e*(r.length+1)/(n+1))}const e=r.length+1,s=new Uint8Array(39*e);for(let t=0;t<e;t++)for(let n=0;n<Nt;n++)s[(0+n)*e+t]=t,s[(13+n)*e+t]=o?e:e+(t>>1),s[(26+n)*e+t]=o?e:e+(e-1>>1)+1+(t>>1);let i=0;for(const t of s)i=Math.max(i,t+1);return{thresholds:r,lt:e,map:s,ut:i,ht:t=>{let n=0;for(const o of r)t>o&&n++;return n},yt:(t,n)=>s[(t<2?1^t:2)*Nt*e+n],wt:(t,n)=>(Math.min(t,64)<8?Math.min(t,64):4+(Math.min(t,64)>>1))*i+n,dt:t=>37*i+458*t,st:495*i}}function Y(t,n,o){const r=n.map(()=>S(o)),e=r.map(()=>new Uint32Array(257));n.forEach((t,n)=>N(null,e[n],t.data,t.w,t.h,r[n])),T(t,{H:!1,K:[]});const s=L(t,E(r)),i=X(t,s,e,t=>r.indexOf(t));n.forEach((n,o)=>N(t,i[o+1].code,n.data,n.w,n.h,r[o]))}function*Q(t,o={}){const{width:i,height:c,components:a,alpha:h}=t,y=1===a.length,w=t.quantScale||1;let d=t.quantFieldBase||1;for(;d/(2040*w)<1/16384;)d*=2;const M=t.ycbcr||y,g=y?[0,0,0]:M?[1,0,2]:[0,1,2],b=g.map(t=>a[t]),S=o.orders?g.map(t=>o.orders[t].map(t=>Ct[t])):[Ct,Ct,Ct],E=t=>1===t?0:2===t?1:-1,L=b.map(t=>E(t.h)),J=b.map(t=>E(t.v));if(L.includes(-1)||J.includes(-1))throw Z("sampling factors other than one or two");const T=Math.max(...L),X=Math.max(...J),N=t=>T-L[t],_=t=>X-J[t];if(!M&&(T||X))throw Z("an RGB JPEG with subsampling");const v=Math.ceil(i/(8<<T))<<T,C=Math.ceil(c/(8<<X))<<X,O=Math.ceil(i/st),P=Math.ceil(c/st),q=O*P,F=Math.ceil(v/256),G=F*Math.ceil(C/256),j=1===q,k=(t,n,o)=>{const r=b[t];return y&&1!==t?-1:64*(o*r.stride+n)},z=t=>{let n=1024;for(;t%n;)n>>=1;return n},B=b.map(t=>M?1:t.quant[0]/z(t.quant[0])),Q=b.map(t=>M?0:1024/z(t.quant[0])),H=new Int32Array(v*C);for(let t=0;t<C;t++)for(let n=0;n<v;n++)H[t*v+n]=b[1].coeffs[k(1,n,t)]*B[1]+Q[1];const K=b[1].quant,V=(K[8]+K[16]+K[24]+K[32]+K[40])/w,W=v*C,$=W<256?0:Math.max(1,Math.min(7,r(W)-r(V)-7));let tt=D(H,$,y);const ot=new nt(256);if(f(ot,i,c,y?1:3,!!h,{orientation:t.orientation,colorSpace:t.colorSpace}),ot.write(1,0),ot.write(2,0),ot.write(1,0),ot.write(2,2),ot.write(8,111),ot.write(1,M?1:0),M)for(let t=0;t<3;t++)ot.write(2,0===L[t]&&0===J[t]?0:1===L[t]&&1===J[t]?1:1===L[t]?2:3);ot.write(2,0),h&&ot.write(2,0),l(ot,h);const rt=[0,1,2].map(()=>new Int32Array(1024)),et=(t,o)=>{const r=t%O*32,e=32*(t/O|0),s=Math.min(32,v-r),i=Math.min(32,C-e);for(let t=0;t<i;t++)for(let i=0;i<s;i++)for(const s of[1,0,2]){const c=N(s),f=_(s),l=i>>c,a=t>>f;if(l<<c!==i||a<<f!==t)continue;const u=k(s,(r>>c)+l,(e>>f)+a),h=b[s].coeffs;let y=0;if(u>=0)for(let t=1;t<64;t++)h[u+t]&&y++;const w=rt[s],d=0===l?0===a?32:w[32*(a-1)]:0===a?w[32*a+l-1]:w[32*(a-1)+l]+w[32*a+l-1]+1>>1;w[32*a+l]=y;const p=tt.yt(s,tt.ht(H[(e+t)*v+r+i]));o(tt.wt(d,p),y);const M=tt.dt(p);let A=y>4?0:1,g=y;for(let t=1;t<64&&g;t++){const r=h[u+S[s][t]];o(M+Ot(g,t,A),n(r)),A=r?1:0,g-=A}}},it=($>0?3:2)*q+G;let ct=0;const ft=function*(t){tt=t;const n=new Lt(t.st);for(let t=0;t<q;t++)et(t,(t,o)=>n.add(t,o)),yield++ct/it;return(o.coding||R)(n,o.clusters)};let lt=yield*ft(tt);if($>0){const t=tt,n=D(H,0,y),o=yield*ft(n);o.$<=lt.$?lt=o:tt=t}const at=Array.from({length:j?1:2+G+q},()=>null),ht=t=>at[j?0:t]||(at[j?0:t]=new nt(4096)),yt=new Uint32Array(at.length);let wt=0;const dt=t=>{t=j?0:t;const n=Math.ceil(at[t].V/8);wt+=n-yt[t],yt[t]=n,s(wt)},pt=ht(0);pt.write(1,0);const Mt=(t,n)=>{const o=t*st,r=n*st,e=Math.min(st,i-o),s=Math.min(st,c-r),f=new Int32Array(e*s);for(let t=0;t<s;t++)for(let n=0;n<e;n++)f[t*e+n]=h[4*((r+t)*i+o+n)+3];return{w:e,h:s,data:f}};for(let t=0;t<3;t++)pt.write(16,e(b[t].quant[0]/B[t]/(2040*w)*128));pt.write(2,3),pt.write(16,57343),pt.write(2,1),pt.write(5,0),pt.write(1,0),pt.write(4,0),pt.write(4,tt.thresholds.length);for(const t of tt.thresholds)pt.t([[4,0],[8,16],[16,272],[32,65808]],n(t));pt.write(4,0),pt.write(4,0),I(pt,tt.map),pt.write(1,0),pt.write(2,0),pt.write(16,0),pt.write(16,0),pt.write(8,128),pt.write(8,128),pt.write(1,0),h&&Y(pt,[j?Mt(0,0):{w:0,h:0,data:new Int32Array(0)}],ut),dt(0);for(let n=0;n<G;n++){const o=ht(1+n),e=n%F*256,s=256*(n/F|0),i=Math.min(256,v-e),c=Math.min(256,C-s);o.write(2,0),Y(o,[1,0,2].map(t=>{const n=i>>N(t),o=c>>_(t),r=new Int32Array(n*o),f=B[t],l=Q[t];for(let i=0;i<o;i++)for(let o=0;o<n;o++){const c=k(t,(e>>N(t))+o,(s>>_(t))+i);r[i*n+o]=c<0?0:b[t].coeffs[c]*f+l}return{w:n,h:o,data:r}}),ut);const f=i*c,l=r(f);l&&o.write(l,f-1);const a=i+7>>3,u=c+7>>3,h=new Int32Array(2*f).fill(d-1,f);if(t.quantFields)for(let n=0;n<c;n++)for(let o=0;o<i;o++)h[f+n*i+o]=t.quantFields[(s+n)*v+e+o]-1;Y(o,[{w:a,h:u,data:new Int32Array(a*u)},{w:a,h:u,data:new Int32Array(a*u)},{w:f,h:2,data:h},{w:i,h:c,data:new Int32Array(f)}],d>1?ut:0),dt(1+n),yield++ct/it}const At=ht(1+G);At.write(1,0),At.write(3,7),At.write(16,e(d/(2040*w))),Y(At,[0,1,2].map(t=>{const n=new Int32Array(64),o=b[t].quant;for(let t=0;t<8;t++)for(let r=0;r<8;r++)n[8*r+t]=o[8*t+r];return{w:8,h:8,data:n}}),ut);for(let t=1;t<17;t++)At.write(3,0);if(q>1&&At.write(r(q),0),o.orders){At.t([[0,95],[0,19],[0,0],[13,0]],1);const t=[];for(const n of g){const r=Array.from({length:64},(t,n)=>n),e=o.orders[n].map(t=>{const n=r.indexOf(t);return r.splice(n,1),n});let s=64;for(;s>1&&!e[s-1];)s--;t.push(s-1,...e.slice(1,s))}const n=A(0),r=new Uint32Array(64);for(const o of t)m(n,o,r);const e=p(r);x(At,{L:new Uint8Array(8),J:[{config:n,code:e}]});for(const o of t)U(At,e,n,o)}else At.write(2,2);lt.writeHistograms?lt.writeHistograms(At):x(At,{L:lt.L,J:lt.J}),dt(1+G);for(let t=0;t<q;t++){const n=ht(2+G+t);et(t,(t,o)=>lt.write(n,t,o)),lt.flush&&lt.flush(n),h&&!j&&Y(n,[Mt(t%O,Math.floor(t/O))],ut),dt(2+G+t),yield++ct/it}return u(ot,function(t){return t.map(t=>t?t.finish():new Uint8Array(0))}(at))}function*H(t,n,o){if(n<3&&!o)return yield*Q(t);let r=o;try{const o=Q(t);let e,s;for(;!(e=o.next()).done;)if(s=yield e.value/2,s&&r&&e.value<1)return o.return(),r;if((!r||e.value.length<r.length)&&(r=e.value),s||n<3)return r;const i=n<4?1:3,c=Q(t,{clusters:{maxClusters:32,newClusterCost:160}});for(;!(e=c.next()).done;)if(s=yield.5+e.value/(2*i),s&&e.value<1)return c.return(),r;if(e.value.length<r.length&&(r=e.value),s||n<4)return r;const f=function*(t){const n=Xt.map(t=>(7&t)<<3|t>>3),o=t.map(()=>new Uint32Array(64)),r=t.reduce((t,n)=>t+n.coeffs.length,0);let e=0;for(let s=0;s<t.length;s++){const{coeffs:i}=t[s],c=o[s];for(let t=0;t<i.length;t+=65536){const o=Math.min(t+65536,i.length);for(let r=t;r<o;r+=64)for(let t=1;t<64;t++)i[r+n[t]]&&c[t]++;if(e+=o-t,yield e/r)return null}}return o.map(t=>[0,...Array.from({length:63},(t,n)=>n+1).sort((n,o)=>Math.floor(t[o]/8)-Math.floor(t[n]/8)||n-o)])}(t.components);for(;!(e=f.next()).done;)if(yield.5+(1+e.value)/6)return f.return(),r;const l=Q(t,{orders:e.value});for(;!(e=l.next()).done;)if(s=yield.5+(2+e.value)/6,s&&e.value<1)return l.return(),r;return e.value.length<r.length?e.value:r}catch(t){if(!r||(!(t instanceof RangeError)||t.code)&&"JXL_SIZE"!==t.code)throw t;return r}}function K(t,n,o,r){return function(t){let n;for(;!(n=t.next()).done;);return n.value}(V(t,n,o,r))}function V(t,n,o,r){return j(t,n,o,r,H)}const W=Object.freeze({bytes:16777216,pixels:24e6,edge:16384}),$=Object.freeze({bytes:16777216,pixels:4e7,edge:16384}),tt=[1];for(let t=1;t<=32;t++)tt.push(2*tt[t-1]);class nt{constructor(t=4096){this.bytes=new Uint8Array(t),this.at=0,this.Mt=0,this.pending=0}write(t,n){if(!(n>=0&&n<tt[t]))throw new Error("bit write out of range: "+t+" bits, "+n);let o=this.Mt+n*(1<<this.pending),r=this.pending+t;this.at+5>=this.bytes.length&&this.grow();const e=this.bytes;for(;r>=8;)e[this.at++]=255&o,o=Math.floor(o/256),r-=8;this.Mt=o,this.pending=r}t(t,n){for(let o=0;o<4;o++){const[r,e]=t[o];if(n>=e&&n-e<tt[r])return this.write(2,o),void(r&&this.write(r,n-e))}throw new Error("U32 value out of range: "+n)}o(){this.pending&&(this.at+1>=this.bytes.length&&this.grow(),this.bytes[this.at++]=this.Mt,this.Mt=0,this.pending=0)}get V(){return 8*this.at+this.pending}grow(t=0){const n=W.bytes+64;if(this.at+t+16>n)throw Object.assign(new Error("The encoded picture exceeds 16 MiB."),{code:"JXL_SIZE"});const o=new Uint8Array(Math.min(n,Math.max(2*this.bytes.length,this.at+t+16)));o.set(this.bytes.subarray(0,this.at)),this.bytes=o}append(t){if(this.at+t.at+8>=this.bytes.length&&this.grow(t.at+8),this.pending)for(let n=0;n<t.at;n++)this.write(8,t.bytes[n]);else this.bytes.set(t.bytes.subarray(0,t.at),this.at),this.at+=t.at;t.pending&&this.write(t.pending,t.Mt)}finish(){const t=this.at+(this.pending?1:0),n=this.bytes.slice(0,t);return this.pending&&(n[this.at]=this.Mt),n}}const ot=(t,n)=>"number"==typeof t?n(t):{...t,at:o=>n(t.at(o))},rt=(t,n)=>Object.assign(new Error(n),{code:t}),et={channel:null,weighted:null,fill:null},st=256,it=[1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15],ct=[2,4,3,2,2,4],ft=[0,7,3,2,1,15],lt=[0,0,0],at=3,ut=5,ht=A(4),yt=Object.freeze({X:224,minLength:7,N:ht}),wt=A(0),dt=[A(0),A(4),A(4,1,1),A(3,0,1)],pt=(t,n,o,r)=>o?r?t[n]+256*t[n+3]:t[n]:t[n]+256*t[n+1]+65536*t[n+2]+(r?16777216*t[n+3]:0),Mt=Float64Array.of(.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.3535533905932738,.4903926402016152,.4157348061512726,.27778511650980114,.09754516100806417,-.0975451610080641,-.277785116509801,-.4157348061512727,-.4903926402016152,.46193976625564337,.19134171618254492,-.19134171618254486,-.46193976625564337,-.4619397662556434,-.19134171618254517,.191341716182545,.46193976625564326,.4157348061512726,-.0975451610080641,-.4903926402016152,-.2777851165098011,.2777851165098009,.4903926402016152,.09754516100806439,-.41573480615127256,.3535533905932738,-.35355339059327373,-.35355339059327384,.3535533905932737,.35355339059327384,-.35355339059327334,-.35355339059327356,.3535533905932733,.27778511650980114,-.4903926402016152,.09754516100806415,.4157348061512728,-.41573480615127256,-.09754516100806401,.4903926402016153,-.27778511650980076,.19134171618254492,-.4619397662556434,.46193976625564326,-.19134171618254495,-.19134171618254528,.46193976625564337,-.4619397662556432,.19134171618254478,.09754516100806417,-.2777851165098011,.4157348061512728,-.4903926402016153,.4903926402016152,-.4157348061512725,.27778511650980076,-.09754516100806429),At=Float64Array.from({length:64},(t,n)=>{const o=.26236426446749106*Math.max(0,5*Math.sqrt((7&n)*(7&n)+(n>>3)*(n>>3))/Math.sqrt(98)-1);let r=1,e=1;for(let t=1;t<30;t++)e+=r=r*o/t;return e}),gt=[4,4,4,4,3,2,6,8],bt=[0,.125,.25,.5,.25,.25,.25,.25],mt=[.9299455010825141,.945349926692846,.9500648966626563],Ut=10.5*$.pixels,It=(t,n)=>Math.abs(t)<2?t*mt[n]:t-.145/t,xt=(t,n,o)=>{const r=t+1.402*o,e=t-.344136286*n-.714136286*o,s=t+1.772*n;return r*r+e*e+s*s},St=[A(0),A(1),A(2),A(3),A(4),A(4,1,1),A(5,1,1),A(2,0,1),A(3,0,1)],Et=A(4,1,1);class Lt{constructor(t){this.st=t,this.small=new Uint32Array(64*t),this.At=Array.from({length:t},()=>null),this.it=new Float64Array(t)}add(t,n){if(this.it[t]++,n<64)return void this.small[64*t+n]++;const o=this.At[t]||(this.At[t]=new Map);o.set(n,(o.get(n)||0)+1)}ct(t,n,o=64){const r=new Uint32Array(o);for(const o of t){const t=64*o;for(let o=0;o<64;o++)this.small[t+o]&&(r[k(n,o)]+=this.small[t+o]);const e=this.At[o];if(e)for(const[t,o]of e)r[k(n,t)]+=o}return r}ft(t,n){let r=B(this.ct(t,n));for(const e of t){const t=64*e;for(let e=n.S;e<64;e++)this.small[t+e]&&(r+=this.small[t+e]*(o(e)-n.U-n.I));const s=this.At[e];if(s)for(const[t,e]of s)r+=e*(o(t)-n.U-n.I)}return r}}const Jt=[0,0,0],Tt=[1];for(let t=1;t<32;t++)Tt.push(Tt[t-1]/2);const Xt=[0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63],Nt=13,_t=[0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30],vt=[0,0,31,62,62,93,93,93,93,123,123,123,123,152,152,152,152,152,152,152,152,180,180,180,180,180,180,180,180,180,180,180,180,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206],Ct=Xt.map(t=>(7&t)<<3|t>>3),Ot=(t,n,o)=>2*(vt[t]+_t[n])+o;export{$ as LIMITS,K as encodePhoto,V as encodePhotoSteps};
package/pool.mjs ADDED
@@ -0,0 +1,136 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Every core: the effort door's exact work over a pool of workers, the same bytes as one thread for any number of them.
3
+ // A frame's groups are coded independently once its global choices are made, and every pass of the door over its
4
+ // groups (the plan's counting and writing, the weighted search's, the local trees') is a function of the pass's setup
5
+ // and the group's pixels alone (frame.mjs, groupPass). So each worker is given its groups' pixels once, by transfer, and
6
+ // keeps them for every pass of the picture; a pass sends its setup and then group numbers; this thread, which has every
7
+ // pixel, codes groups too while it waits. The counts come back per group and are added in group order, the sections
8
+ // are placed in group order, and every choice between passes (predictors, codes, trees, which plan, which stream) stays
9
+ // in this thread. Only the time changes.
10
+ //
11
+ // The workers are the caller's: `spawn()` returns a Worker (postMessage, onmessage, onerror, terminate) whose script
12
+ // hands every message to `servePool` and posts back what it answers, with its transfer list. The pool ends its workers
13
+ // when the job ends or is left. A worker that cannot start or fails leaves its groups to this thread, which runs the
14
+ // same functions on the same pixels: the bytes stand. A picture of one group, or a lossy one, never starts a worker.
15
+ import {groupLayout, groupRect} from './frame.mjs';
16
+ import {planGroup} from './lossless.mjs';
17
+ import {colourTransform} from './rct-search.mjs';
18
+ import {localGroup} from './local.mjs';
19
+ import {searchGroup, effortJob} from './effort-job.mjs';
20
+ import {guard, answer} from './admit.mjs';
21
+
22
+ const WORK = {plan: setup => planGroup(setup, setup.rct === undefined ? undefined : colourTransform(setup.rct, setup.channels)), search: searchGroup, local: localGroup};
23
+ // A group's result: its counts (fresh, the pass's `sizes`), or its section.
24
+ const work = (group, setup, rgba, stride, rect) => { const counts = setup.sizes?.map(n => new Uint32Array(n)); return group(rgba, stride, ...rect, counts) || counts; };
25
+
26
+ // A worker's side. Its tiles: {rgba, w, h} by group; the pass it is working.
27
+ let tiles = [], current = null;
28
+ export function servePool(message) {
29
+ if (message.pool === 'tile') { tiles[message.g] = message; return null; }
30
+ if (message.pool === 'pass') { current = {...message, group: WORK[message.kind](message.setup)}; return null; }
31
+ const {g} = message, {rgba, w, h} = tiles[g];
32
+ try {
33
+ const result = work(current.group, current.setup, rgba, w, [0, 0, w, h]);
34
+ return [{pool: 'done', id: current.id, g, result}, (Array.isArray(result) ? result : [result]).map(a => a.buffer)];
35
+ } catch (error) { return [{pool: 'done', id: current.id, g, error: {name: error.name, code: error.code, message: error.message}}, []]; }
36
+ }
37
+
38
+ // The effort door's encodeSteps (the same options, admitted at once) as an async job: `for await (const done of job)`,
39
+ // `job.hurry` and `job.bytes` as the steps' job; leaving the loop ends the workers. `workers` is how many to start.
40
+ export function encodePool(data, width, height, options, {spawn, workers = 4} = {}) {
41
+ const steps = effortJob(data, width, height, options, true), layout = groupLayout(width, height), groups = layout.groupsX * layout.groupsY;
42
+ let members = null, failed = false, live = 0, serial = 0, ready = [], wake = () => {}, last = 0;
43
+ const end = () => { if (members) for (const worker of members) worker.terminate(); members = []; };
44
+ const fail = () => { failed = true; end(); wake(); };
45
+ // Every message to a worker goes through here: a send that throws (a pixel buffer that cannot be transferred, a
46
+ // worker that is gone) is a failure of the pool like any other, and the groups come back to this thread.
47
+ const send = (worker, message, transfer = []) => {
48
+ if (failed) return false;
49
+ try { worker.postMessage(message, transfer); return true; } catch { fail(); return false; }
50
+ };
51
+ // The workers, and each one's groups' pixels.
52
+ const start = () => {
53
+ members = [];
54
+ try {
55
+ for (let k = 0; k < Math.min(workers, groups); k++) {
56
+ const worker = spawn();
57
+ members.push(worker);
58
+ worker.onmessage = ({data: message}) => { worker.up = true; if (message.id === live) { worker.flight--; ready.push(message); worker.feed(); wake(); } };
59
+ worker.onerror = worker.onmessageerror = event => { event?.preventDefault?.(); if (members.includes(worker)) fail(); };
60
+ }
61
+ } catch { fail(); return; }
62
+ for (let g = 0; g < groups; g++) {
63
+ const [x0, y0, w, h] = groupRect(layout, width, height, g), rgba = new Uint8Array(w * h * 4);
64
+ for (let y = 0; y < h; y++) rgba.set(data.subarray(((y0 + y) * width + x0) * 4, ((y0 + y) * width + x0 + w) * 4), y * w * 4);
65
+ if (!send(members[g % members.length], {pool: 'tile', g, w, h, rgba}, [rgba.buffer])) return;
66
+ }
67
+ };
68
+ // A turn of the event loop, so that the workers' answers come in between this thread's own groups: a channel's
69
+ // message in a browser, which queues behind them, and setImmediate where there is one (Node drains a port's messages
70
+ // in one go, so a channel there would starve the workers' ports).
71
+ let channel;
72
+ const turn = () => new Promise(resolve => {
73
+ if (typeof setImmediate === 'function') { setImmediate(resolve); return; }
74
+ channel ||= new MessageChannel(); channel.port1.onmessage = resolve; channel.port2.postMessage(0);
75
+ });
76
+ // One pass: every group's result, or null when a hurry ended it, or the error a group's work threw. A worker is sent
77
+ // a group at a time until it first answers (it may still be starting), then kept two ahead. This thread is not idle:
78
+ // it takes the last unsent group of the longest queue, else a group sent to a worker that has not answered yet, and
79
+ // only waits when every group left is with a working worker. A group answered twice counts once: it is the same.
80
+ async function* pass({kind, setup, at, stop}) {
81
+ if (!members) start();
82
+ const id = live = ++serial, waiting = new Set(Array.from({length: groups}, (_, g) => g)), results = [];
83
+ const queues = members.map((_, k) => [...waiting].filter(g => g % members.length === k));
84
+ ready = [];
85
+ for (const [k, worker] of members.entries()) {
86
+ worker.flight = 0;
87
+ worker.feed = () => { while (worker.flight < (worker.up ? 2 : 1) && queues[k].length && send(worker, {pool: 'task', g: queues[k][0]})) { worker.flight++; queues[k].shift(); } };
88
+ if (!send(worker, {pool: 'pass', id, kind, setup})) break;
89
+ worker.feed();
90
+ if (failed) break;
91
+ }
92
+ const steal = () => {
93
+ if (failed) return waiting.values().next().value;
94
+ let k = -1;
95
+ queues.forEach((queue, i) => { if (queue.length && (k < 0 || queue.length > queues[k].length)) k = i; });
96
+ if (k >= 0) return queues[k].pop();
97
+ for (const g of waiting) if (!members[g % members.length].up) return g;
98
+ };
99
+ let local, hurried = false;
100
+ while (waiting.size) {
101
+ let done = ready.shift();
102
+ if (!done) {
103
+ const g = steal();
104
+ if (g === undefined) { await new Promise(resolve => { wake = resolve; }); continue; }
105
+ local ||= WORK[kind](setup);
106
+ try { done = {g, result: work(local, setup, data, width, groupRect(layout, width, height, g))}; } catch (error) { live = 0; return error; }
107
+ await turn();
108
+ }
109
+ if (!waiting.has(done.g)) continue;
110
+ if (done.error) { live = 0; return Object.assign(new (done.error.name === 'RangeError' ? RangeError : Error)(done.error.message), done.error.code ? {code: done.error.code} : {}); }
111
+ waiting.delete(done.g); results[done.g] = done.result;
112
+ const g = groups - waiting.size - 1;
113
+ yield last = at(g);
114
+ hurried = it.hurry;
115
+ if (hurried && stop(g)) { live = 0; return null; }
116
+ }
117
+ live = 0;
118
+ return {results, hurried};
119
+ }
120
+ const it = (async function* () {
121
+ let step, reply;
122
+ try {
123
+ // The workers start, and take their pixels, while this thread inspects the picture.
124
+ if (!layout.single && (options?.quality ?? 100) >= 100) start();
125
+ while (!(step = guard(() => reply instanceof Error ? steps.throw(reply) : steps.next(reply))).done) {
126
+ if (typeof step.value === 'number') { yield last = step.value; reply = it.hurry; }
127
+ else reply = yield* pass(step.value);
128
+ }
129
+ } finally { live = -1; end(); channel?.port1.close(); }
130
+ // A candidate given up (the stream limit, or memory for a search) ends early.
131
+ if (last < 1) yield 1;
132
+ return it.bytes = answer(step.value);
133
+ })();
134
+ it.bytes = null; it.hurry = false;
135
+ return it;
136
+ }
@@ -1,2 +1,2 @@
1
- /*! Rapier JXL 2.1.0 | MIT License Copyright (c) 2026 rapier.website Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2
- function*t(t,n,o){let e,r;for(;!(e=t.next(r)).done;)r=yield(n+e.value)/o;return e.value}function n(t){return t>=0?2*t:2*-t-1}function o(t){return 31-Math.clz32(t)}function e(t){return t<=1?0:32-Math.clz32(t-1)}function r(t){if(t>j.bytes)throw k("JXL_SIZE","The encoded picture exceeds 16 MiB.")}function i(t){try{return t()}catch(t){if(t instanceof RangeError&&!t.code)throw k("JXL_MEMORY","Not enough memory for this picture.");throw t}}function s(t,n){t.t([[9,1],[13,1],[18,1],[30,1]],n)}function c(t,n,o,e,r,{xyb:i=!1,orientation:c=1,colorSpace:f}={}){t.write(16,2815),t.write(1,0),s(t,o),t.write(3,0),s(t,n),t.write(1,0);const l=1!==c;t.write(1,l?1:0),l&&t.write(6,c-1),t.write(4,8),r?t.write(3,5):t.write(2,0),t.write(1,i?1:0),3===e&&"display-p3"===f?t.write(21,903568):3===e?t.write(1,1):t.write(15,14100),l&&t.write(1,1),t.write(2,0),t.write(1,1),t.o()}function f(t,{alpha:n,shift:o=1}){t.write(9,8),n&&t.write(2,0),t.write(2,o),function(t,n){t.write(n?7:5,0),t.write(11,1)}(t,n)}function l(t,n,o=256){const e=Math.ceil(t/o),r=Math.ceil(n/o);return{i:e,u:r,p:Math.ceil(t/(8*o)),m:Math.ceil(n/(8*o)),M:1===e&&1===r}}function a(t,n){const o=n.map(t=>t.length);!function(t,n){t.write(1,0),t.o();for(const o of n)t.t([[10,0],[14,1024],[22,17408],[30,4211712]],o);t.o()}(t,o);const e=t.finish(),i=e.length+o.reduce((t,n)=>t+n,0);r(i);const s=new Uint8Array(i);s.set(e);let c=e.length;for(const t of n)s.set(t,c),c+=t.length;return s}function u(t,n){const o=new Uint8Array(t.length),e=[];for(let n=0;n<t.length;n++)t[n]>0&&e.push(n);if(!e.length)return o;if(1===e.length)return o[e[0]]=1,o;for(let r=1;;r*=2){const i=e.map(n=>({w:Math.max(t[n],r),A:n,l:null,r:null})).sort((t,n)=>t.w-n.w||t.A-n.A),s=[];let c=0,f=0;const l=()=>c<i.length&&(f>=s.length||i[c].w<=s[f].w)?i[c++]:s[f++];for(;i.length-c+(s.length-f)>1;){const t=l(),n=l();s.push({w:t.w+n.w,A:-1,l:t,r:n})}const a=[[l(),0]];let u=0;for(;a.length;){const[t,n]=a.pop();t.A>=0?(o[t.A]=n,n>u&&(u=n)):a.push([t.l,n+1],[t.r,n+1])}if(u<=n)return o}}function h(t,n,o,e,r,i){const s=[];for(;s.push(e&r),e>>=i;)e--;for(let e=s.length-1;e>=0;e--)t.push(o),n.push(s[e])}function p(t,n){let o=0;for(let e=0;e<n;e++)o=o<<1|1&t,t>>=1;return o}function y(t){const n=new Uint32Array(17),o=new Uint32Array(17),e=new Uint16Array(t.length);for(const o of t)n[o]++;n[0]=0;for(let t=1,e=0;t<=16;t++)e=e+n[t-1]<<1,o[t]=e;for(let n=0;n<t.length;n++)t[n]&&(e[n]=p(o[t[n]]++,t[n]));return e}function w(t){const n=[];for(let o=0;o<t.length;o++)t[o]>0&&n.push(o);const o=n.length,e=n[o-1]+1||1,r=o<=4?new Uint8Array(e):u(t,15).subarray(0,e);let i=0;if(o<=4){n.sort((n,o)=>t[o]-t[n]||n-o),i=4===o&&t[n[0]]>t[n[2]]+t[n[3]]?1:0;const e=o<2?[0]:2===o?[1,1]:3===o?[1,2,2]:i?[1,2,3,3]:[2,2,2,2];n.forEach((t,n)=>{r[t]=e[n]}),n.sort((t,n)=>r[t]-r[n]||t-n)}return{U:e,S:r,I:y(r),C:o&&o<=4?n:null,T:i}}function d(t,n){if(n.U<=1)return;if(n.C){const e=o(n.U-1)+1;t.write(2,1),t.write(2,n.C.length-1);for(const o of n.C)t.write(e,o);return void(4===n.C.length&&t.write(1,n.T))}const e=n.S,r=[],i=[];let s=e.length-1;for(;s>0&&!e[s];)s--;let c=8;for(let t=0;t<=s;){const n=e[t];let o=1;for(;t+o<=s&&e[t+o]===n;)o++;let f=o;if(n&&n!==c&&(r.push(n),i.push(0),f--,c=n),f<3)for(let t=0;t<f;t++)r.push(n),i.push(0);else h(r,i,n?16:17,f-3,n?3:7,n?2:3);t+=o}const f=new Uint32Array(18);for(const t of r)f[t]++;let l=0;for(const t of f)t&&l++;1===l&&(f[r[0]?0:1]=f[r[0]]);const a=u(f,5),p=y(a);let w=18;for(;w>0&&!a[Y[w-1]];)w--;t.write(2,0);for(let n=0;n<w;n++){const o=a[Y[n]];t.write(D[o],Q[o])}for(let n=0;n<r.length;n++){const o=r[n];t.write(a[o],p[o]),16===o?t.write(2,i[n]):17===o&&t.write(3,i[n])}}function g(t,n=0,o=0){return{split:t,L:n,X:o,v:1<<t}}function m(t,n,o=15){t.write(e(o+1),n.split),n.split!==o&&(t.write(e(n.split+1),n.L),t.write(e(n.split-n.L+1),n.X))}function M(t,n,e){if(n<t.v)return e[0]=n,e[1]=0,void(e[2]=0);const r=o(n),i=n-(1<<r),s=r-t.L-t.X;e[0]=t.v+(r-t.split<<t.L+t.X|i>>r-t.L<<t.X|i&(1<<t.X)-1),e[1]=s,e[2]=n>>t.X&(1<<s)-1}function b(t,n,o,e=0){M(t,n,F),o[e+F[0]]++}function A(t,n,o,e,r=0){M(o,e,F);const i=r+F[0];t.write(n.S[i],n.I[i]),F[1]&&t.write(F[1],F[2])}function U(t,{N:n=null,P:r,J:i}){t.write(1,n?1:0),n&&(t.t([[0,224],[0,512],[0,4096],[15,8]],n._),t.t([[0,3],[0,4],[2,5],[8,9]],n.minLength),m(t,n.q,8)),r.length>1&&function(t,n){let o=0;for(const t of n)o=Math.max(o,t);const r=o?e(o+1):0;if(r<=3){if(t.write(1,1),t.write(2,r),r)for(const o of n)t.write(r,o);return}t.write(1,0),t.write(1,0);const i=g(8),s=g(4),c=n.length>=64,f=new Uint32Array(c?257:o+1),l=[];for(let t=0;t<n.length;){let o=1;for(;c&&t+o<n.length&&n[t+o]===n[t];)o++;if(o>=8)l.push([n[t],o-1]),f[n[t]]++,b(s,o-1-7,f,224),t+=o;else{for(let e=0;e<o;e++)l.push([n[t],0]),f[n[t]]++;t+=o}}const a=w(f);if(!c){U(t,{P:new Uint8Array(1),J:[{config:i,code:a}]});for(const[n]of l)A(t,a,i,n);return}const u=new Uint32Array(1);u[0]=1,U(t,{N:{_:224,minLength:7,q:s},P:new Uint8Array([1,0]),J:[{config:g(0),code:w(u)},{config:i,code:a}]});for(const[n,o]of l)A(t,a,i,n),o&&A(t,a,s,o-7,224)}(t,r),t.write(1,1);for(const n of i)m(t,n.config,15);for(const n of i){const e=n.code.U-1;if(e){const n=o(e);t.write(1,1),t.write(4,n),t.write(n,e-(1<<n))}else t.write(1,0)}for(const n of i)d(t,n.code)}function S(t,n=0,o=1){return{G:t,offset:n,O:o,context:-1}}function I(t,n){const o=(e,r)=>{if(e===r)return n?t[e].j:t[e];const i=e+r>>1;return function(t,n,o,e){return{B:t,R:n,left:o,right:e}}(n,n?t[i].k:i,o(i+1,r),o(e,i))};return o(0,t.length-1)}function x(t){return I(t,0)}function C(t,o){const e=[o],r=[],i=[];for(const t of e){if(t.left){r.push(t.B+1,n(t.R)),e.push(t.left,t.right);continue}t.context=i.length,i.push(t);const o=1===t.O?0:31-Math.clz32(t.O&-t.O);r.push(0,t.G,n(t.offset),o,(t.O>>o)-1)}const s=new Uint32Array(64);for(const t of r)b($,t,s);const c=w(s);U(t,{P:new Uint8Array(6),J:[{config:$,code:c}]});for(const n of r)A(t,c,$,n);return i}function T(t,n){const o=[[3,0],[6,8],[10,72],[13,1096]];if("rct"===n.type)t.write(2,0),t.t(o,n.Z),t.t([[0,6],[2,0],[4,2],[6,10]],n.Y??6);else if("palette"===n.type)t.write(2,1),t.t(o,n.Z),t.t([[0,1],[0,3],[0,4],[13,1]],n.D),t.t([[8,0],[10,256],[12,1280],[16,5376]],n.F),t.t([[0,0],[8,1],[10,257],[16,1281]],n.H??0),t.write(4,n.G??0);else{if("squeeze"!==n.type)throw new Error("unknown transform "+n.type);{t.write(2,2);const e=n.K??[];t.t([[0,0],[4,1],[6,9],[8,41]],e.length);for(const n of e)t.write(1,n.V?1:0),t.write(1,n.W?1:0),t.t(o,n.Z),t.t([[0,1],[0,2],[0,3],[4,4]],n.D)}}}function E(t,{$:n=!0,tt:o=[]}={}){t.write(1,n?1:0),t.write(1,1),t.t([[0,0],[0,1],[4,2],[8,18]],o.length);for(const n of o)T(t,n)}function L(t,n,o,e=t=>t.context){const r=new Uint8Array(n.length+1);for(const t of n)r[t.context]=e(t)+1;const i=new Uint32Array(2);i[1]=1;const s=[{config:$,code:w(i)}],c=Math.max(...r);for(let t=0;t<c;t++)s.push({config:$,code:w(o[t])});return U(t,{N:W,P:r,J:s}),s}function X(t,o,e,r,i,s){const c=s.G,f=s.offset,l=s.O,a=$,u=V;let h=0;const p=(n,e=a,r=0)=>{t?A(t,o,e,n,r):b(e,n,o,r)},y=()=>{if(h){if(h>=8)p(0),p(h-7-1,u,224);else for(let t=0;t<h;t++)p(0);h=0}},w=(t,o)=>{const r=e[t];let i;1===l?i=r-o-f:(i=Math.round((r-o-f)/l),e[t]=o+f+i*l),0!==i?(y(),p(n(i))):h++};for(let t=0,n=0;t<i;t++)for(let o=0;o<r;o++,n++){let i;if(0===c)i=0;else{const s=o?e[n-1]:t?e[n-r]:0,f=t?e[n-r]:s;if(1===c)i=s;else if(2===c)i=f;else if(3===c)i=(s+f)/2|0;else{const l=s+f-(o&&t?e[n-r-1]:s);if(5===c){const t=s<f?s:f,n=s<f?f:s;i=l<t?t:l>n?n:l}else{if(4!==c)throw new Error("predictor "+c+" is not coded here");i=Math.abs(l-s)<Math.abs(l-f)?s:f}}}w(n,i)}y()}function v(t,n,o,{palette:e=!0}={}){const r=n*o;let i=!0,s=!0;for(let n=0,o=0;o<r&&(255===t[n+3]||(i=!1,s))&&(t[n]===t[n+1]&&t[n]===t[n+2]||(s=!1,i));o++,n+=4);const c=s?1:3,f=!i,l=c+(f?1:0),a=n=>s?f?t[n]+256*t[n+3]:t[n]:t[n]+256*t[n+1]+65536*t[n+2]+(f?16777216*t[n+3]:0),u=new Map;let h=null;for(let t=0,n=0;e&&n<r;n++,t+=4){const n=a(t);if(0!==n&&!u.has(n)&&(u.set(n,1),u.size>=2048))break}if(e&&u.size<2048){const t=[...u.keys()],n=(t,n)=>t>>>8*n&255,o=t=>(.299*n(t,0)+.587*n(t,1)+.114*n(t,2)+.01)*(4===l?n(t,3):1);t.sort((t,n)=>o(t)-o(n));const e=new Map([[0,0]]);t.forEach((t,n)=>e.set(t,n+1)),h={colours:[0,...t],index:e,key:a,byte:n}}return{colour:c,alpha:f,channels:l,palette:h}}function*N(n,o,e,{shape:r=v(n,o,e),colorSpace:i}={}){let s,c;const f=r.palette?[r,{...r,palette:null}]:[r];for(let r=0;r<f.length;r++)try{const c=yield*t(P(n,o,e,f[r],i),r,f.length);(!s||c.length<s.length)&&(s=c)}catch(t){if("JXL_SIZE"!==t.code)throw t;c=t}if(!s)throw c;return s}function*P(t,n,o,e,r){const{channels:i,palette:s}=e,u=l(n,o),h=s?2:i,p=Array.from({length:h},()=>S(K)),y=x(p),g=Array.from({length:h},()=>new Int16Array(65536)),m=(o,e,r,c)=>{for(let f=0;f<c;f++){let c=4*((e+f)*n+o),l=f*r;for(let n=0;n<r;n++,c+=4,l++)if(s)g[0][l]=s.index.get(s.key(c));else if(i>=3){const n=t[c],o=t[c+1],e=t[c+2],r=n-e,s=e+(r>>1),f=o-s;g[0][l]=s+(f>>1),g[1][l]=r,g[2][l]=f,4===i&&(g[3][l]=t[c+3])}else g[0][l]=t[c],2===i&&(g[1][l]=t[c+3])}};let M=null;if(s){const t=s.colours.length;M=new Int16Array(t*i),s.colours.forEach((n,o)=>{for(let e=0;e<i;e++)M[e*t+o]=s.byte(n,e)})}const b=t=>p[s?u.M?1:0:t],A=s?1:i,U=u.i*u.u,I=2*U,T=(t,e)=>{const r=t%u.i*Z,i=(t/u.i|0)*Z,s=Math.min(Z,n-r),c=Math.min(Z,o-i);m(r,i,s,c),e(s,c)};let v=0;if(!s){const t=t=>{const n=w(t),o=new R(128);d(o,n);let e=o.nt;for(let o=0;o<t.length;o++)t[o]&&(e+=t[o]*(n.S[o]+Math.max(0,o<224?o-1:o-236)));return e},e=Math.min(n,32),r=Math.min(o,32),s=[K,H].map(t=>({G:t,ot:p.map(()=>new Uint32Array(257))}));for(const t of[0,.5,1]){m(Math.floor((n-e)*t),Math.floor((o-r)*t),e,r);for(const t of s)for(let n=0;n<i;n++)X(null,t.ot[n],g[n],e,r,S(t.G))}p.forEach((n,o)=>{const e=s.map(n=>t(n.ot[o])),r=e[1]<e[0]?1:0;n.G=s[r].G})}const N=s?[{type:"palette",Z:0,D:i,F:s.colours.length}]:i>=3?[{type:"rct",Z:0,Y:6}]:[],P=p.map(()=>new Uint32Array(257)),J=t=>P[p.indexOf(t)];M&&X(null,J(p[0]),M,s.colours.length,i,p[0]);for(let t=0;t<U;t++)T(t,(t,n)=>{for(let o=0;o<A;o++)X(null,J(b(o)),g[o],t,n,b(o))}),yield++v/I;const _=new R(256);c(_,n,o,e.colour,e.alpha,{colorSpace:r}),f(_,{alpha:e.alpha});const z=new R(4096);z.write(1,1),z.write(1,1);const q=C(z,y),G=L(z,q,P,t=>p.indexOf(t)),O=t=>G[p.indexOf(t)+1].code;E(z,{$:!0,tt:N}),M&&X(z,O(p[0]),M,s.colours.length,i,p[0]);const j=[];if(u.M)T(0,(t,n)=>{for(let o=0;o<A;o++)X(z,O(b(o)),g[o],t,n,b(o))}),yield 1,j.push(z.finish());else{j.push(z.finish());for(let t=0;t<u.p*u.m+1;t++)j.push(new Uint8Array(0));for(let t=0;t<U;t++)T(t,(t,n)=>{const o=new R(t*n*A+64);E(o,{$:!0,tt:[]});for(let e=0;e<A;e++)X(o,O(b(e)),g[e],t,n,b(e));j.push(o.finish())}),yield++v/I}return a(_,j)}function J(t,n,o){const e=t>=n&&n>=o?1:t<=n&&n<=o?-1:0;if(!e)return 0;let r=(4*(t*=e)-3*(o*=e)-(n*=e)+6)/12|0;return r-(1&r)>2*(t-n)&&(r=2*(t-n)+1),r+(1&r)>2*(n-o)&&(r=2*(n-o)),e*r}function _(t,n){const{w:o,h:e,data:r}=t,i=n?o:e,s=i+1>>1,c=i-s,f=n?s:o,l=n?e:s,a=n?c:o,u=n?e:c,h=new Int16Array(f*l),p=new Int16Array(a*u),y=n?1:o;for(let t=0;t<l;t++)for(let e=0;e<f;e++){const s=n?e:t,l=n?t*o+2*e:2*t*o+e;if(s===c){h[t*f+e]=r[l];continue}const u=r[l],w=r[l+y],d=tt(u,w),g=s+1<c?tt(r[l+2*y],r[l+3*y]):1&i?r[l+2*y]:d;h[t*f+e]=d,p[t*a+e]=u-w-J(s?r[l-y]:d,d,g)}const w=(o,e,r)=>({w:e,h:r,et:t.et+ +n,rt:t.rt+!n,data:o});return[w(h,f,l),w(p,a,u)]}function z(t){const n=[],o=t.length;let e=t[0].w,r=t[0].h;for(o>2&&t[1].w===e&&t[1].h===r&&(n.push({V:!0,W:!1,Z:1,D:2}),n.push({V:!1,W:!1,Z:1,D:2})),!(e>r)&&r>8&&(n.push({V:!1,W:!0,Z:0,D:o}),r=r+1>>1);e>8||r>8;)e>8&&(n.push({V:!0,W:!0,Z:0,D:o}),e=e+1>>1),r>8&&(n.push({V:!1,W:!0,Z:0,D:o}),r=r+1>>1);return n}function*q(t,n,o,{quality:e=90,shape:r=v(t,n,o,{palette:!1}),colorSpace:i}={}){const s=function(t){return t>=100?0:t>=30?.1+.09*(100-t):53/3e3*t*t-1.15*t+25}(e);if(!(s>0))throw new Error("lossy encoding needs a quality below 100");const{colour:u,alpha:h,channels:p}=r,y=n*o,w=Array.from({length:p},()=>new Int16Array(y));for(let n=0,o=0;o<y;o++,n+=4){if(3===u){const e=t[n],r=t[n+1],i=t[n+2],s=e-i,c=i+(s>>1),f=r-c;w[0][o]=c+(f>>1),w[1][o]=s,w[2][o]=f}else w[0][o]=t[n];h&&(w[p-1][o]=t[n+3])}const d=w.map((t,e)=>({w:n,h:o,et:0,rt:0,data:t,component:3===u?e:0===e?0:3})),g=1===n&&o>nt&&3===u,m=g?z(d).filter(t=>!t.V):1!==n&&1!==o||3!==u?[]:z(d),M=function(t,n=z(t)){const o=t.map(t=>({...t,level:0,it:!1}));for(const t of n){const n=t.Z+t.D-1,e=t.W?n+1:o.length;for(let r=t.Z;r<=n;r++){const[n,i]=_(o[r],t.V),s=o[r].level+1;o[r]={...n,level:s,it:o[r].it,component:o[r].component},o.splice(e+(r-t.Z),0,{...i,level:s,it:!0,component:o[r].component})}}return o}(d,m.length?m:void 0),b=t=>t.it?0:K,A=t=>function(t,n,o,e){let r=Math.min(16,n+o);if(r>0&&r--,3===t)return 1;const i=.25*function(t){let n=1;for(let o=0;o<24;o++)n=(4*n+t/(n*n*n*n))/5;return t*n}(e),s=1<<r,c=1===t||2===t?.35*i*Math.max(.5,1024/s):.35*i*1.1*(163.84/s);return Math.max(1,Math.floor(c))}(t.component,t.et+(g&&t.component>0&&t.component<3?1:0),t.rt,s),U=[...3===u?[{type:"rct",Z:0,Y:6}]:[],{type:"squeeze",K:m}],T=l(n,o,nt),N=T.p*T.m,P=T.i*T.u;let J=0;for(;J<M.length&&M[J].w<=nt&&M[J].h<=nt;)J++;const q=(t,n,o,e)=>{const r=n>>t.et,i=o>>t.rt;return{x:r,y:i,w:Math.min(t.w,r+(e>>t.et))-r,h:Math.min(t.h,i+(e>>t.rt))-i}},G=[{index:0,k:0,st:[]}];for(let t=0;t<J;t++)G[0].st.push({c:t,rect:{x:0,y:0,w:M[t].w,h:M[t].h}});if(!T.M){for(let t=0;t<N;t++){const n=t%T.p,o=t/T.p|0,e={index:1+t,k:1+N+t,st:[]};for(let t=J;t<M.length;t++){const r=M[t];if(Math.min(r.et,r.rt)<3)continue;const i=q(r,n*ot,o*ot,ot);i.w>0&&i.h>0&&e.st.push({c:t,rect:i})}G.push(e)}for(let t=0;t<P;t++){const n=t%T.i,o=t/T.i|0,e={index:2+N+t,k:1+3*N+17+t,st:[]};for(let t=J;t<M.length;t++){const r=M[t];if(Math.min(r.et,r.rt)>2)continue;const i=q(r,n*nt,o*nt,nt);i.w>0&&i.h>0&&e.st.push({c:t,rect:i})}G.push(e)}}for(const t of G)for(const n of t.st){const t=M[n.c];n.ct=S(b(t),0,A(t)),n.ct.channel=n.c}const O=G.filter(t=>t.st.length),j=1===O.length?x(O[0].st.map(t=>t.ct)):function(t){return I(t,1)}(O.map(t=>({k:t.k,j:x(t.st.map(t=>t.ct))}))),B=new Int16Array(1048576),k=t=>{const n=M[t.c],o=t.rect;if(o.w===n.w&&o.h===n.h)return n.data;for(let t=0;t<o.h;t++)B.set(n.data.subarray((o.y+t)*n.w+o.x,(o.y+t)*n.w+o.x+o.w),t*o.w);return B},Z=[...new Set(G.flatMap(t=>t.st.map(t=>t.c)))].sort((t,n)=>t-n),Y=new Map(Z.map((t,n)=>[t,n])),D=Z.map(()=>new Uint32Array(257)),Q=1+2*G.length;let F=1;yield F/Q;for(const t of G){for(const n of t.st)X(null,D[Y.get(n.c)],k(n),n.rect.w,n.rect.h,n.ct);yield++F/Q}const H=new R(256);c(H,n,o,u,h,{colorSpace:i}),f(H,{alpha:h,shift:n>256||o>256?3:1});const V=Array.from({length:T.M?1:2+N+P},()=>null),W=V[0]=new R(65536);W.write(1,1),W.write(1,1);const $=L(W,C(W,j),D,t=>Y.get(t.channel));E(W,{$:!0,tt:U});for(const t of G){let n=V[t.index];n||(n=V[t.index]=new R(4096),t.st.length&&E(n,{$:!0,tt:[]}));for(const o of t.st)X(n,$[Y.get(o.c)+1].code,k(o),o.rect.w,o.rect.h,o.ct);yield++F/Q}return a(H,function(t){return t.map(t=>t?t.finish():new Uint8Array(0))}(V))}function G(t,n,o,e){return function(t){let n;for(;!(n=t.next()).done;);return n.value}(O(t,n,o,e))}function O(n,o,e,s){const{quality:c,colorSpace:f}=function(t={},n=100){if(null===t||"object"!=typeof t)throw k("JXL_INPUT","Options are an object: {quality, colorSpace}.");if(void 0!==t.quality&&(n=t.quality),"number"!=typeof n||!Number.isFinite(n)||n<1||n>100)throw k("JXL_INPUT","Quality is a number from 1 to 100.");const o=void 0===t.colorSpace?"srgb":t.colorSpace;if("srgb"!==o&&"display-p3"!==o)throw k("JXL_INPUT","The colour space is srgb or display-p3.");return{quality:n,colorSpace:o}}(s);return function(t,n,o,e){if(function(t,n,o=j){if(!Number.isInteger(t)||!Number.isInteger(n)||t<1||n<1)throw k("JXL_INPUT","A picture is at least one pixel wide and high, in whole pixels.");if(t>o.edge||n>o.edge)throw k("JXL_DIMENSIONS","A picture is at most "+o.edge+" pixels on a side.");if(t*n>o.pixels)throw k("JXL_DIMENSIONS","A picture is at most "+o.pixels.toLocaleString("en-US")+" pixels.")}(n,o,e),!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw k("JXL_INPUT","Pixels are a Uint8Array or Uint8ClampedArray of RGBA bytes.");if(t.length!==n*o*4)throw k("JXL_INPUT","Pixels are width * height * 4 bytes: straight (not premultiplied) RGBA, row by row.")}(n,o,e),function(t){const n=function*(){let o,e;for(;!(o=i(()=>t.next(n.hurry))).done;)yield e=o.value;return e<1&&(yield 1),n.bytes=(r((s=o.value).length),s);var s}();return n.bytes=null,n.hurry=!1,n}(function*(n,o,e,r,i){const s=v(n,o,e);if(r>=100)return yield*N(n,o,e,{shape:s,colorSpace:i});if(!s.palette)return yield*q(n,o,e,{quality:r,shape:s,colorSpace:i});const c=yield*t(N(n,o,e,{shape:s,colorSpace:i}),0,2);let f;try{f=yield*t(q(n,o,e,{quality:r,shape:s,colorSpace:i}),1,2)}catch(t){if("JXL_SIZE"!==t.code&&(!(t instanceof RangeError)||t.code))throw t;f=c}return c.length<=f.length?c:f}(n,o,e,c,f))}const j=Object.freeze({bytes:16777216,pixels:24e6,edge:16384}),B=[1];for(let t=1;t<=32;t++)B.push(2*B[t-1]);class R{constructor(t=4096){this.bytes=new Uint8Array(t),this.at=0,this.ft=0,this.pending=0}write(t,n){if(!(n>=0&&n<B[t]))throw new Error("bit write out of range: "+t+" bits, "+n);let o=this.ft+n*(1<<this.pending),e=this.pending+t;this.at+5>=this.bytes.length&&this.grow();const r=this.bytes;for(;e>=8;)r[this.at++]=255&o,o=Math.floor(o/256),e-=8;this.ft=o,this.pending=e}t(t,n){for(let o=0;o<4;o++){const[e,r]=t[o];if(n>=r&&n-r<B[e])return this.write(2,o),void(e&&this.write(e,n-r))}throw new Error("U32 value out of range: "+n)}o(){this.pending&&(this.at+1>=this.bytes.length&&this.grow(),this.bytes[this.at++]=this.ft,this.ft=0,this.pending=0)}get nt(){return 8*this.at+this.pending}grow(t=0){const n=j.bytes+64;if(this.at+t+16>n)throw Object.assign(new Error("The encoded picture exceeds 16 MiB."),{code:"JXL_SIZE"});const o=new Uint8Array(Math.min(n,Math.max(2*this.bytes.length,this.at+t+16)));o.set(this.bytes.subarray(0,this.at)),this.bytes=o}append(t){if(this.at+t.at+8>=this.bytes.length&&this.grow(t.at+8),this.pending)for(let n=0;n<t.at;n++)this.write(8,t.bytes[n]);else this.bytes.set(t.bytes.subarray(0,t.at),this.at),this.at+=t.at;t.pending&&this.write(t.pending,t.ft)}finish(){const t=this.at+(this.pending?1:0),n=this.bytes.slice(0,t);return this.pending&&(n[this.at]=this.ft),n}}const k=(t,n)=>Object.assign(new Error(n),{code:t}),Z=256,Y=[1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15],D=[2,4,3,2,2,4],Q=[0,7,3,2,1,15],F=[0,0,0],H=3,K=5,V=g(4),W=Object.freeze({_:224,minLength:7,q:V}),$=g(0),tt=(t,n)=>t+n+(t>n?1:0)>>1,nt=1024,ot=8192;export{j as LIMITS,G as encode,O as encodeSteps};
1
+ /*! Rapier JXL 2.2.0 | MIT License Copyright (c) 2026 rapier.website Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2
+ const t={channel:null,weighted:null,fill:null},n=Object.freeze({bytes:16777216,pixels:24e6,edge:16384}),o=[1];for(let t=1;t<=32;t++)o.push(2*o[t-1]);class e{constructor(t=4096){this.bytes=new Uint8Array(t),this.at=0,this.t=0,this.pending=0}write(t,n){if(!(n>=0&&n<o[t]))throw new Error("bit write out of range: "+t+" bits, "+n);let e=this.t+n*(1<<this.pending),r=this.pending+t;this.at+5>=this.bytes.length&&this.grow();const i=this.bytes;for(;r>=8;)i[this.at++]=255&e,e=Math.floor(e/256),r-=8;this.t=e,this.pending=r}o(t,n){for(let e=0;e<4;e++){const[r,i]=t[e];if(n>=i&&n-i<o[r])return this.write(2,e),void(r&&this.write(r,n-i))}throw new Error("U32 value out of range: "+n)}i(){this.pending&&(this.at+1>=this.bytes.length&&this.grow(),this.bytes[this.at++]=this.t,this.t=0,this.pending=0)}get u(){return 8*this.at+this.pending}grow(t=0){const o=n.bytes+64;if(this.at+t+16>o)throw Object.assign(new Error("The encoded picture exceeds 16 MiB."),{code:"JXL_SIZE"});const e=new Uint8Array(Math.min(o,Math.max(2*this.bytes.length,this.at+t+16)));e.set(this.bytes.subarray(0,this.at)),this.bytes=e}append(t){if(this.at+t.at+8>=this.bytes.length&&this.grow(t.at+8),this.pending)for(let n=0;n<t.at;n++)this.write(8,t.bytes[n]);else this.bytes.set(t.bytes.subarray(0,t.at),this.at),this.at+=t.at;t.pending&&this.write(t.pending,t.t)}finish(){const t=this.at+(this.pending?1:0),n=this.bytes.slice(0,t);return this.pending&&(n[this.at]=this.t),n}}function*r(t,n,o){let e,r;for(;!(e=t.next(r)).done;)r=yield i(e.value,t=>(n+t)/o);return e.value}const i=(t,n)=>"number"==typeof t?n(t):{...t,at:o=>n(t.at(o))};function s(t){return t>=0?2*t:2*-t-1}function c(t){return 31-Math.clz32(t)}function f(t){return t<=1?0:32-Math.clz32(t-1)}const l=(t,n)=>Object.assign(new Error(n),{code:t});function a(t){if(t>n.bytes)throw l("JXL_SIZE","The encoded picture exceeds 16 MiB.")}function u(t){try{return t()}catch(t){if(t instanceof RangeError&&!t.code)throw l("JXL_MEMORY","Not enough memory for this picture.");throw t}}const h=256;function p(t,n){t.o([[9,1],[13,1],[18,1],[30,1]],n)}function y(t,n,o,e,r,{xyb:i=!1,orientation:s=1,colorSpace:c}={}){t.write(16,2815),t.write(1,0),p(t,o),t.write(3,0),p(t,n),t.write(1,0);const f=1!==s;t.write(1,f?1:0),f&&t.write(6,s-1),t.write(4,8),r?t.write(3,5):t.write(2,0),t.write(1,i?1:0),3===e&&"display-p3"===c?t.write(21,903568):3===e?t.write(1,1):t.write(15,14100),f&&t.write(1,1),t.write(2,0),t.write(1,1),t.i()}function w(t,{alpha:n,shift:o=1}){t.write(9,8),n&&t.write(2,0),t.write(2,o),function(t,n){t.write(n?7:5,0),t.write(11,1)}(t,n)}function d(t,n,o=256){const e=Math.ceil(t/o),r=Math.ceil(n/o);return{p:e,m:r,M:Math.ceil(t/(8*o)),A:Math.ceil(n/(8*o)),U:1===e&&1===r}}function*g(t,n,o,e){if(t.pooled){const n=yield t;return n?(n.results.forEach((t,n)=>e(n,t)),n.hurried):null}let r=!1;for(let e=0;e<n;e++)if(o(e),r=yield t.at(e),r&&t.stop(e))return null;return r}function m(t,n){const o=n.map(t=>t.length);!function(t,n){t.write(1,0),t.i();for(const o of n)t.o([[10,0],[14,1024],[22,17408],[30,4211712]],o);t.i()}(t,o);const e=t.finish(),r=e.length+o.reduce((t,n)=>t+n,0);a(r);const i=new Uint8Array(r);i.set(e);let s=e.length;for(const t of n)i.set(t,s),s+=t.length;return i}const b=[1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15],M=[2,4,3,2,2,4],A=[0,7,3,2,1,15];function U(t,n){const o=new Uint8Array(t.length),e=[];for(let n=0;n<t.length;n++)t[n]>0&&e.push(n);if(!e.length)return o;if(1===e.length)return o[e[0]]=1,o;for(let r=1;;r*=2){const i=e.map(n=>({w:Math.max(t[n],r),S:n,l:null,r:null})).sort((t,n)=>t.w-n.w||t.S-n.S),s=[];let c=0,f=0;const l=()=>c<i.length&&(f>=s.length||i[c].w<=s[f].w)?i[c++]:s[f++];for(;i.length-c+(s.length-f)>1;){const t=l(),n=l();s.push({w:t.w+n.w,S:-1,l:t,r:n})}const a=[[l(),0]];let u=0;for(;a.length;){const[t,n]=a.pop();t.S>=0?(o[t.S]=n,n>u&&(u=n)):a.push([t.l,n+1],[t.r,n+1])}if(u<=n)return o}}function S(t,n,o,e,r,i){const s=[];for(;s.push(e&r),e>>=i;)e--;for(let e=s.length-1;e>=0;e--)t.push(o),n.push(s[e])}function I(t,n){let o=0;for(let e=0;e<n;e++)o=o<<1|1&t,t>>=1;return o}function x(t){const n=new Uint32Array(17),o=new Uint32Array(17),e=new Uint16Array(t.length);for(const o of t)n[o]++;n[0]=0;for(let t=1,e=0;t<=16;t++)e=e+n[t-1]<<1,o[t]=e;for(let n=0;n<t.length;n++)t[n]&&(e[n]=I(o[t[n]]++,t[n]));return e}function C(t){const n=[];for(let o=0;o<t.length;o++)t[o]>0&&n.push(o);const o=n.length,e=n[o-1]+1||1,r=o<=4?new Uint8Array(e):U(t,15).subarray(0,e);let i=0;if(o<=4){n.sort((n,o)=>t[o]-t[n]||n-o),i=4===o&&t[n[0]]>t[n[2]]+t[n[3]]?1:0;const e=o<2?[0]:2===o?[1,1]:3===o?[1,2,2]:i?[1,2,3,3]:[2,2,2,2];n.forEach((t,n)=>{r[t]=e[n]}),n.sort((t,n)=>r[t]-r[n]||t-n)}return{I:e,C:r,T:x(r),v:o&&o<=4?n:null,L:i}}function T(t,n){if(n.I<=1)return;if(n.v){const o=c(n.I-1)+1;t.write(2,1),t.write(2,n.v.length-1);for(const e of n.v)t.write(o,e);return void(4===n.v.length&&t.write(1,n.L))}const o=n.C,e=[],r=[];let i=o.length-1;for(;i>0&&!o[i];)i--;let s=8;for(let t=0;t<=i;){const n=o[t];let c=1;for(;t+c<=i&&o[t+c]===n;)c++;let f=c;if(n&&n!==s&&(e.push(n),r.push(0),f--,s=n),f<3)for(let t=0;t<f;t++)e.push(n),r.push(0);else S(e,r,n?16:17,f-3,n?3:7,n?2:3);t+=c}const f=new Uint32Array(18);for(const t of e)f[t]++;let l=0;for(const t of f)t&&l++;1===l&&(f[e[0]?0:1]=f[e[0]]);const a=U(f,5),u=x(a);let h=18;for(;h>0&&!a[b[h-1]];)h--;t.write(2,0);for(let n=0;n<h;n++){const o=a[b[n]];t.write(M[o],A[o])}for(let n=0;n<e.length;n++){const o=e[n];t.write(a[o],u[o]),16===o?t.write(2,r[n]):17===o&&t.write(3,r[n])}}function v(t,n=0,o=0){return{split:t,X:n,N:o,P:1<<t}}function E(t,n,o=15){t.write(f(o+1),n.split),n.split!==o&&(t.write(f(n.split+1),n.X),t.write(f(n.split-n.X+1),n.N))}function L(t,n,o){if(n<t.P)return o[0]=n,o[1]=0,void(o[2]=0);const e=c(n),r=n-(1<<e),i=e-t.X-t.N;o[0]=t.P+(e-t.split<<t.X+t.N|r>>e-t.X<<t.N|r&(1<<t.N)-1),o[1]=i,o[2]=n>>t.N&(1<<i)-1}function X(t,n,o,e=0){L(t,n,N),o[e+N[0]]++}const N=[0,0,0];function P(t,n,o,e,r=0){L(o,e,N);const i=r+N[0];t.write(n.C[i],n.T[i]),N[1]&&t.write(N[1],N[2])}function z(t,{J:n=null,_:o,q:e}){t.write(1,n?1:0),n&&(t.o([[0,224],[0,512],[0,4096],[15,8]],n.G),t.o([[0,3],[0,4],[2,5],[8,9]],n.minLength),E(t,n.O,8)),o.length>1&&function(t,n){let o=0;for(const t of n)o=Math.max(o,t);const e=o?f(o+1):0;if(e<=3){if(t.write(1,1),t.write(2,e),e)for(const o of n)t.write(e,o);return}t.write(1,0),t.write(1,0);const r=v(8),i=v(4),s=n.length>=64,c=new Uint32Array(s?257:o+1),l=[];for(let t=0;t<n.length;){let o=1;for(;s&&t+o<n.length&&n[t+o]===n[t];)o++;if(o>=8)l.push([n[t],o-1]),c[n[t]]++,X(i,o-1-7,c,224),t+=o;else{for(let e=0;e<o;e++)l.push([n[t],0]),c[n[t]]++;t+=o}}const a=C(c);if(!s){z(t,{_:new Uint8Array(1),q:[{config:r,code:a}]});for(const[n]of l)P(t,a,r,n);return}const u=new Uint32Array(1);u[0]=1,z(t,{J:{G:224,minLength:7,O:i},_:new Uint8Array([1,0]),q:[{config:v(0),code:C(u)},{config:r,code:a}]});for(const[n,o]of l)P(t,a,r,n),o&&P(t,a,i,o-7,224)}(t,o),t.write(1,1);for(const n of e)E(t,n.config,15);for(const n of e){const o=n.code.I-1;if(o){const n=c(o);t.write(1,1),t.write(4,n),t.write(n,o-(1<<n))}else t.write(1,0)}for(const n of e)T(t,n.code)}const J=3,_=5,q=v(4),G=Object.freeze({G:224,minLength:7,O:q}),O=v(0);function j(t,n=0,o=1){return{j:t,offset:n,k:o,context:-1}}function k(t,n){const o=(e,r)=>{if(e===r)return n?t[e].B:t[e];const i=e+r>>1;return function(t,n,o,e){return{R:t,Z:n,left:o,right:e}}(n,n?t[i].Y:i,o(i+1,r),o(e,i))};return o(0,t.length-1)}function B(t){return k(t,0)}function R(t,n){const o=[n],e=[],r=[];for(const t of o){if(t.left){e.push(t.R+1,s(t.Z)),o.push(t.left,t.right);continue}t.context=r.length,r.push(t);const n=1===t.k?0:31-Math.clz32(t.k&-t.k);e.push(0,t.j,s(t.offset),n,(t.k>>n)-1)}const i=new Uint32Array(64);for(const t of e)X(O,t,i);const c=C(i);z(t,{_:new Uint8Array(6),q:[{config:O,code:c}]});for(const n of e)P(t,c,O,n);return r}function Z(t,n){const o=[[3,0],[6,8],[10,72],[13,1096]];if("rct"===n.type)t.write(2,0),t.o(o,n.D),t.o([[0,6],[2,0],[4,2],[6,10]],n.F??6);else if("palette"===n.type)t.write(2,1),t.o(o,n.D),t.o([[0,1],[0,3],[0,4],[13,1]],n.H),t.o([[8,0],[10,256],[12,1280],[16,5376]],n.K),t.o([[0,0],[8,1],[10,257],[16,1281]],n.V??0),t.write(4,n.j??0);else{if("squeeze"!==n.type)throw new Error("unknown transform "+n.type);{t.write(2,2);const e=n.W??[];t.o([[0,0],[4,1],[6,9],[8,41]],e.length);for(const n of e)t.write(1,n.$?1:0),t.write(1,n.tt?1:0),t.o(o,n.D),t.o([[0,1],[0,2],[0,3],[4,4]],n.H)}}}function Y(t,{nt:n=!0,ot:o=[]}={}){t.write(1,n?1:0),t.write(1,1),t.o([[0,0],[0,1],[4,2],[8,18]],o.length);for(const n of o)Z(t,n)}function D(t,n,o,e=t=>t.context,r=()=>O){const i=new Uint8Array(n.length+1);for(const t of n)i[t.context]=e(t)+1;const s=new Uint32Array(2);s[1]=1;const c=[{config:O,code:C(s)}],f=Math.max(...i);for(let t=0;t<f;t++)c.push({config:r(t),code:C(o[t])});return z(t,{J:G,_:i,q:c}),c}function Q(n,o,e,r,i,c,f=!1){if(t.channel?.(n,o,e,r,i,c,f))return;const l=c.j,a=c.offset,u=c.k,h=c.config||O,p=q;let y=0;const w=(t,e=h,r=0)=>{n?P(n,o,e,t,r):f&&!r?o[t]++:X(e,t,o,f?o.length-33:r)},d=()=>{if(y){if(y>=8)w(0),w(y-7-1,p,224);else for(let t=0;t<y;t++)w(0);y=0}},g=(t,n)=>{const o=e[t];let r;1===u?r=o-n-a:(r=Math.round((o-n-a)/u),e[t]=n+a+r*u),0!==r?(d(),w(s(r))):y++};for(let t=0,n=0;t<i;t++)for(let o=0;o<r;o++,n++){let i;if(0===l)i=0;else{const s=o?e[n-1]:t?e[n-r]:0,c=t?e[n-r]:s;if(1===l)i=s;else if(2===l)i=c;else if(3===l)i=(s+c)/2|0;else{const f=s+c-(o&&t?e[n-r-1]:s);if(5===l){const t=s<c?s:c,n=s<c?c:s;i=f<t?t:f>n?n:f}else{if(4!==l)throw new Error("predictor "+l+" is not coded here");i=Math.abs(f-s)<Math.abs(f-c)?s:c}}}g(n,i)}d()}const F=[v(0),v(4),v(4,1,1),v(3,0,1)];function H(t){const n=t.length-33,o=[0,0,0];let r,i;for(const s of F){const f=new Uint32Array(257);let l=0;for(let e=0;e<n;e++)t[e]&&(L(s,e,o),f[o[0]]+=t[e],l+=t[e]*o[1]);for(let o=0;o<33;o++)f[224+o]=t[n+o],l+=t[n+o]*Math.max(0,o-12);const a=C(f),u=new e(128);E(u,s),T(u,a);let h=u.u+l+(1===a.I?1:5+c(a.I-1));for(let t=0;t<f.length;t++)f[t]&&(h+=f[t]*a.C[t]);const p={config:s,et:f,rt:h,extra:l};r||(r=p),(!i||h<i.rt)&&(i=p)}return[r,i]}const K=(t,n,o,e)=>o?e?t[n]+256*t[n+3]:t[n]:t[n]+256*t[n+1]+65536*t[n+2]+(e?16777216*t[n+3]:0);function V(t,n,o,{palette:e=!0}={}){const r=n*o;let i=!0,s=!0;for(let n=0,o=0;o<r&&(255===t[n+3]||(i=!1,s))&&(t[n]===t[n+1]&&t[n]===t[n+2]||(s=!1,i));o++,n+=4);const c=s?1:3,f=!i,l=c+(f?1:0),a=n=>K(t,n,s,f),u=new Map;let h=null;for(let t=0,n=0;e&&n<r;n++,t+=4){const n=a(t);if(0!==n&&!u.has(n)&&(u.set(n,1),u.size>=2048))break}if(e&&u.size<2048){const t=[...u.keys()],n=(t,n)=>t>>>8*n&255,o=t=>(.299*n(t,0)+.587*n(t,1)+.114*n(t,2)+.01)*(4===l?n(t,3):1);t.sort((t,n)=>o(t)-o(n)),h={colours:[0,...t],byte:n}}return{colour:c,alpha:f,channels:l,palette:h}}function W({channels:n,alpha:o,palette:e},r){const i=n-(o?1:0)==1,s=e&&new Map(e.map((t,n)=>[t,n]));return(c,f,l,a,u,h,p)=>{if(r&&!e&&n>=3)r.fill(c,f,l,a,u,h,p);else if(e||!t.fill?.(f,l,a,u,h,p,n,c))for(let t=0;t<p;t++){let r=4*((u+t)*l+a),p=t*h;for(let t=0;t<h;t++,r+=4,p++)if(e)c[0][p]=s.get(K(f,r,i,o));else if(n>=3){const t=f[r],o=f[r+1],e=f[r+2],i=t-e,s=e+(i>>1),l=o-s;c[0][p]=s+(l>>1),c[1][p]=i,c[2][p]=l,4===n&&(c[3][p]=f[r+3])}else c[0][p]=f[r],2===n&&(c[1][p]=f[r+3])}}}function $(t,n){const{leaves:o,picture:r,T:i}=t,s=W(t,n),c=r.map(()=>new Int16Array(65536));return(t,n,f,l,a,u,h)=>{if(s(c,t,n,f,l,a,u),!i)return void r.forEach((t,n)=>Q(null,h[t],c[n],a,u,o[t],!0));const p=h||new e(a*u*r.length+64);return h||Y(p,{nt:!0,ot:[]}),r.forEach((t,n)=>Q(p,i[t],c[n],a,u,o[t])),h?void 0:p.finish()}}function*tt(t,n,o,{shape:e=V(t,n,o),colorSpace:i,rct:s,pooled:c}={}){let f,l;const a=e.palette?[e,{...e,palette:null}]:[e];for(let e=0;e<a.length;e++)try{const l=yield*r(nt(t,n,o,a[e],i,s,c),e,a.length);(!f||l.length<f.length)&&(f=l)}catch(t){if("JXL_SIZE"!==t.code)throw t;l=t}if(!f)throw l;return f}function*nt(t,n,o,r,i,s,c){const{channels:f,alpha:l,palette:a}=r,u=d(n,o),p=u.p*u.m,b=a?2:f,M=Array.from({length:b},()=>j(_)),A=B(M),U={channels:f,alpha:l,palette:a&&a.colours,rct:s?.type,leaves:M,picture:a?[u.U?1:0]:M.map((t,n)=>n)},S=W(U,s),I=Array.from({length:f},()=>new Int16Array(1024)),x=t=>function(t,n,o,e){const r=e%t.p*h,i=(e/t.p|0)*h;return[r,i,Math.min(h,n-r),Math.min(h,o-i)]}(u,n,o,t);let v=null;if(a){const t=a.colours.length;v=new Int16Array(t*f),a.colours.forEach((n,o)=>{for(let e=0;e<f;e++)v[e*t+o]=a.byte(n,e)})}if(!a){const r=t=>{const n=C(t),o=new e(128);T(o,n);let r=o.u;for(let o=0;o<t.length;o++)t[o]&&(r+=t[o]*(n.C[o]+Math.max(0,o<224?o-1:o-236)));return r},i=Math.min(n,32),s=Math.min(o,32),c=[_,J].map(t=>({j:t,et:M.map(()=>new Uint32Array(257))}));for(const e of[0,.5,1]){S(I,t,n,Math.floor((n-i)*e),Math.floor((o-s)*e),i,s);for(const t of c)for(let n=0;n<f;n++)Q(null,t.et[n],I[n],i,s,j(t.j))}M.forEach((t,n)=>{const o=c.map(t=>r(t.et[n])),e=o[1]<o[0]?1:0;t.j=c[e].j})}const E=a?[{type:"palette",D:0,H:f,K:a.colours.length}]:f>=3&&0!==s?.type?[{type:"rct",D:0,F:s?.type??6}]:[];let L=M.map(()=>new Uint32Array(33+(a?4096:1024)));v&&Q(null,L[0],v,a.colours.length,f,M[0],!0);const X=$(U,s);yield*g({pooled:c,kind:"plan",setup:{...U,sizes:L.map(t=>t.length)},at:t=>(t+1)/(2*p),stop:()=>!1},p,o=>X(t,n,...x(o),L),(t,n)=>function(t,n){t.forEach((t,o)=>{const e=n[o];for(let n=0;n<t.length;n++)t[n]+=e[n]})}(L,n));const N=L.map(H),P=N.reduce((t,n)=>t+n[0].rt-n[1].rt,0)>27*(u.U?1:p+1)+8?1:0;M.forEach((t,n)=>{t.config=N[n][P].config}),L=N.map(t=>t[P].et);const z=new e(256);y(z,n,o,r.colour,r.alpha,{colorSpace:i}),w(z,{alpha:r.alpha});const q=new e(4096);q.write(1,1),q.write(1,1);const G=D(q,R(q,A),L,t=>M.indexOf(t),t=>M[t].config),O={...U,T:M.map((t,n)=>G[n+1]?.code)},k=$(O,s);Y(q,{nt:!0,ot:E}),v&&Q(q,O.T[0],v,a.colours.length,f,M[0]);const Z=[];if(u.U)k(t,n,0,0,n,o,q),yield 1,Z.push(q.finish());else{Z.push(q.finish());for(let t=0;t<u.M*u.A+1;t++)Z.push(new Uint8Array(0));const o=Z.length,e=(t,n)=>{Z[o+t]=n};yield*g({pooled:c,kind:"plan",setup:O,at:t=>(p+t+1)/(2*p),stop:()=>!1},p,o=>e(o,k(t,n,...x(o))),e)}return m(z,Z)}const ot=(t,n)=>t+n+(t>n?1:0)>>1;function et(t,n,o){const e=t>=n&&n>=o?1:t<=n&&n<=o?-1:0;if(!e)return 0;let r=(4*(t*=e)-3*(o*=e)-(n*=e)+6)/12|0;return r-(1&r)>2*(t-n)&&(r=2*(t-n)+1),r+(1&r)>2*(n-o)&&(r=2*(n-o)),e*r}function rt(t,n){const{w:o,h:e,data:r}=t,i=n?o:e,s=i+1>>1,c=i-s,f=n?s:o,l=n?e:s,a=n?c:o,u=n?e:c,h=new Int16Array(f*l),p=new Int16Array(a*u),y=n?1:o;for(let t=0;t<l;t++)for(let e=0;e<f;e++){const s=n?e:t,l=n?t*o+2*e:2*t*o+e;if(s===c){h[t*f+e]=r[l];continue}const u=r[l],w=r[l+y],d=ot(u,w),g=s+1<c?ot(r[l+2*y],r[l+3*y]):1&i?r[l+2*y]:d;h[t*f+e]=d,p[t*a+e]=u-w-et(s?r[l-y]:d,d,g)}const w=(o,e,r)=>({w:e,h:r,it:t.it+ +n,st:t.st+!n,data:o});return[w(h,f,l),w(p,a,u)]}function it(t){const n=[],o=t.length;let e=t[0].w,r=t[0].h;for(o>2&&t[1].w===e&&t[1].h===r&&(n.push({$:!0,tt:!1,D:1,H:2}),n.push({$:!1,tt:!1,D:1,H:2})),!(e>r)&&r>8&&(n.push({$:!1,tt:!0,D:0,H:o}),r=r+1>>1);e>8||r>8;)e>8&&(n.push({$:!0,tt:!0,D:0,H:o}),e=e+1>>1),r>8&&(n.push({$:!1,tt:!0,D:0,H:o}),r=r+1>>1);return n}const st=1024,ct=8192;function*ft(t,n,o,{quality:r=90,shape:i=V(t,n,o,{palette:!1}),colorSpace:s}={}){const c=function(t){return t>=100?0:t>=30?.1+.09*(100-t):53/3e3*t*t-1.15*t+25}(r);if(!(c>0))throw new Error("lossy encoding needs a quality below 100");const{colour:f,alpha:l,channels:a}=i,u=n*o,h=Array.from({length:a},()=>new Int16Array(u));for(let n=0,o=0;o<u;o++,n+=4){if(3===f){const e=t[n],r=t[n+1],i=t[n+2],s=e-i,c=i+(s>>1),f=r-c;h[0][o]=c+(f>>1),h[1][o]=s,h[2][o]=f}else h[0][o]=t[n];l&&(h[a-1][o]=t[n+3])}const p=h.map((t,e)=>({w:n,h:o,it:0,st:0,data:t,component:3===f?e:0===e?0:3})),g=1===n&&o>st&&3===f,b=g?it(p).filter(t=>!t.$):1!==n&&1!==o||3!==f?[]:it(p),M=function(t,n=it(t)){const o=t.map(t=>({...t,level:0,ct:!1}));for(const t of n){const n=t.D+t.H-1,e=t.tt?n+1:o.length;for(let r=t.D;r<=n;r++){const[n,i]=rt(o[r],t.$),s=o[r].level+1;o[r]={...n,level:s,ct:o[r].ct,component:o[r].component},o.splice(e+(r-t.D),0,{...i,level:s,ct:!0,component:o[r].component})}}return o}(p,b.length?b:void 0),A=t=>t.ct?0:_,U=t=>function(t,n,o,e){let r=Math.min(16,n+o);if(r>0&&r--,3===t)return 1;const i=.25*function(t){let n=1;for(let o=0;o<24;o++)n=(4*n+t/(n*n*n*n))/5;return t*n}(e),s=1<<r,c=1===t||2===t?.35*i*Math.max(.5,1024/s):.35*i*1.1*(163.84/s);return Math.max(1,Math.floor(c))}(t.component,t.it+(g&&t.component>0&&t.component<3?1:0),t.st,c),S=[...3===f?[{type:"rct",D:0,F:6}]:[],{type:"squeeze",W:b}],I=d(n,o,st),x=I.M*I.A,C=I.p*I.m;let T=0;for(;T<M.length&&M[T].w<=st&&M[T].h<=st;)T++;const v=(t,n,o,e)=>{const r=n>>t.it,i=o>>t.st;return{x:r,y:i,w:Math.min(t.w,r+(e>>t.it))-r,h:Math.min(t.h,i+(e>>t.st))-i}},E=[{index:0,Y:0,ft:[]}];for(let t=0;t<T;t++)E[0].ft.push({c:t,rect:{x:0,y:0,w:M[t].w,h:M[t].h}});if(!I.U){for(let t=0;t<x;t++){const n=t%I.M,o=t/I.M|0,e={index:1+t,Y:1+x+t,ft:[]};for(let t=T;t<M.length;t++){const r=M[t];if(Math.min(r.it,r.st)<3)continue;const i=v(r,n*ct,o*ct,ct);i.w>0&&i.h>0&&e.ft.push({c:t,rect:i})}E.push(e)}for(let t=0;t<C;t++){const n=t%I.p,o=t/I.p|0,e={index:2+x+t,Y:1+3*x+17+t,ft:[]};for(let t=T;t<M.length;t++){const r=M[t];if(Math.min(r.it,r.st)>2)continue;const i=v(r,n*st,o*st,st);i.w>0&&i.h>0&&e.ft.push({c:t,rect:i})}E.push(e)}}for(const t of E)for(const n of t.ft){const t=M[n.c];n.lt=j(A(t),0,U(t)),n.lt.channel=n.c}const L=E.filter(t=>t.ft.length),X=1===L.length?B(L[0].ft.map(t=>t.lt)):function(t){return k(t,1)}(L.map(t=>({Y:t.Y,B:B(t.ft.map(t=>t.lt))}))),N=new Int16Array(1048576),P=t=>{const n=M[t.c],o=t.rect;if(o.w===n.w&&o.h===n.h)return n.data;for(let t=0;t<o.h;t++)N.set(n.data.subarray((o.y+t)*n.w+o.x,(o.y+t)*n.w+o.x+o.w),t*o.w);return N},z=[...new Set(E.flatMap(t=>t.ft.map(t=>t.c)))].sort((t,n)=>t-n),J=new Map(z.map((t,n)=>[t,n])),q=z.map(()=>new Uint32Array(257)),G=1+2*E.length;let O=1;yield O/G;for(const t of E){for(const n of t.ft)Q(null,q[J.get(n.c)],P(n),n.rect.w,n.rect.h,n.lt);yield++O/G}const Z=new e(256);y(Z,n,o,f,l,{colorSpace:s}),w(Z,{alpha:l,shift:n>256||o>256?3:1});const F=Array.from({length:I.U?1:2+x+C},()=>null),H=F[0]=new e(65536);H.write(1,1),H.write(1,1);const K=D(H,R(H,X),q,t=>J.get(t.channel));Y(H,{nt:!0,ot:S});for(const t of E){let n=F[t.index];n||(n=F[t.index]=new e(4096),t.ft.length&&Y(n,{nt:!0,ot:[]}));for(const o of t.ft)Q(n,K[J.get(o.c)+1].code,P(o),o.rect.w,o.rect.h,o.lt);yield++O/G}return m(Z,function(t){return t.map(t=>t?t.finish():new Uint8Array(0))}(F))}function lt(t,n,o,e){return function(t){let n;for(;!(n=t.next()).done;);return n.value}(at(t,n,o,e))}function at(t,o,e,i){const{quality:s,colorSpace:c}=function(t={},n=100){if(null===t||"object"!=typeof t)throw l("JXL_INPUT","Options are an object: {quality, colorSpace}.");if(void 0!==t.quality&&(n=t.quality),"number"!=typeof n||!Number.isFinite(n)||n<1||n>100)throw l("JXL_INPUT","Quality is a number from 1 to 100.");const o=void 0===t.colorSpace?"srgb":t.colorSpace;if("srgb"!==o&&"display-p3"!==o)throw l("JXL_INPUT","The colour space is srgb or display-p3.");return{quality:n,colorSpace:o}}(i);return function(t,o,e,r){if(function(t,o,e=n){if(!Number.isInteger(t)||!Number.isInteger(o)||t<1||o<1)throw l("JXL_INPUT","A picture is at least one pixel wide and high, in whole pixels.");if(t>e.edge||o>e.edge)throw l("JXL_DIMENSIONS","A picture is at most "+e.edge+" pixels on a side.");if(t*o>e.pixels)throw l("JXL_DIMENSIONS","A picture is at most "+e.pixels.toLocaleString("en-US")+" pixels.")}(o,e,r),!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw l("JXL_INPUT","Pixels are a Uint8Array or Uint8ClampedArray of RGBA bytes.");if(t.length!==o*e*4)throw l("JXL_INPUT","Pixels are width * height * 4 bytes: straight (not premultiplied) RGBA, row by row.")}(t,o,e),function(t){const n=function*(){let o,e;for(;!(o=u(()=>t.next(n.hurry))).done;)yield e=o.value;return e<1&&(yield 1),n.bytes=function(t){return a(t.length),t}(o.value)}();return n.bytes=null,n.hurry=!1,n}(function*(t,n,o,e,i){const s=V(t,n,o);if(e>=100)return yield*tt(t,n,o,{shape:s,colorSpace:i});if(!s.palette)return yield*ft(t,n,o,{quality:e,shape:s,colorSpace:i});const c=yield*r(tt(t,n,o,{shape:s,colorSpace:i}),0,2);let f;try{f=yield*r(ft(t,n,o,{quality:e,shape:s,colorSpace:i}),1,2)}catch(t){if("JXL_SIZE"!==t.code&&(!(t instanceof RangeError)||t.code))throw t;f=c}return c.length<=f.length?c:f}(t,o,e,s,c))}export{n as LIMITS,lt as encode,at as encodeSteps};
package/rct-search.mjs ADDED
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Optional lossless colour-transform search. Samples rank the 42 reversible transforms; only a complete
3
+ // candidate can displace an earlier stream. The page's effort-3 path does not pay for this higher rung.
4
+ import {BitWriter} from './bits.mjs';
5
+ import {leaf, codeChannel, writeTransform} from './modular.mjs';
6
+ import {losslessCoding} from './lossless-coding.mjs';
7
+ import {losslessSteps} from './lossless.mjs';
8
+
9
+ // Transform `type` of the specification's 42 (a permutation, then one of seven), filling planes as planeFill does.
10
+ export function colourTransform(type, channels) {
11
+ const permutation = Math.floor(type / 7), custom = type % 7;
12
+ const a = permutation % 3, b = (permutation + 1 + Math.floor(permutation / 3)) % 3;
13
+ const c = (permutation + 2 - Math.floor(permutation / 3)) % 3;
14
+ return {type, fill(planes, rgba, stride, x0, y0, w, h) {
15
+ for (let y = 0; y < h; y++) for (let x = 0, at = y * w, i = ((y0 + y) * stride + x0) * 4; x < w; x++, at++, i += 4) {
16
+ const first = rgba[i + a], second = rgba[i + b], third = rgba[i + c];
17
+ if (custom === 6) {
18
+ const co = first - third, tmp = third + (co >> 1), cg = second - tmp;
19
+ planes[0][at] = tmp + (cg >> 1); planes[1][at] = co; planes[2][at] = cg;
20
+ } else {
21
+ planes[0][at] = first;
22
+ planes[1][at] = second - ((custom >> 1) === 1 ? first : (custom >> 1) === 2 ? (first + third) >> 1 : 0);
23
+ planes[2][at] = third - (custom & 1 ? first : 0);
24
+ }
25
+ if (channels === 4) planes[3][at] = rgba[i + 3];
26
+ }
27
+ }};
28
+ }
29
+
30
+ export function* rctSearchSteps(rgba, width, height, shape, colorSpace, pooled) {
31
+ if (shape.colour !== 3 || width * height < 4096) return null;
32
+ const sw = Math.min(width, 32), sh = Math.min(height, 32);
33
+ const planes = Array.from({length: shape.channels}, () => new Int16Array(sw * sh));
34
+ const types = [6, ...Array.from({length: 42}, (_, i) => i).filter(i => i !== 6)];
35
+ let best;
36
+ for (let k = 0; k < types.length; k++) {
37
+ const rct = colourTransform(types[k], shape.channels);
38
+ const candidates = [5, 3].map(predictor => ({predictor, freqs: Array.from({length: 3}, () => new Uint32Array(1057))}));
39
+ for (let sample = 0; sample < 3; sample++) {
40
+ rct.fill(planes, rgba, width, Math.floor((width - sw) * sample / 2), Math.floor((height - sh) * sample / 2), sw, sh);
41
+ for (const candidate of candidates) for (let c = 0; c < 3; c++) codeChannel(null, candidate.freqs[c], planes[c], sw, sh, leaf(candidate.predictor), true);
42
+ }
43
+ const w = new BitWriter(32);
44
+ if (rct.type) writeTransform(w, {type: 'rct', beginC: 0, rctType: rct.type});
45
+ let bits = w.bitLength;
46
+ for (let c = 0; c < 3; c++) bits += Math.min(...candidates.map(p => losslessCoding(p.freqs[c])[1].bits));
47
+ if (!best || bits < best.bits) best = {rct, bits};
48
+ if (yield (k + 1) / (4 * types.length)) return null;
49
+ }
50
+ if (best.rct.type === 6) return null;
51
+ const plan = losslessSteps(rgba, width, height, {shape: {...shape, palette: null}, colorSpace, rct: best.rct, pooled});
52
+ let step, reply;
53
+ while (!(step = plan.next(reply)).done) {
54
+ // The final group is already complete: finish assembly and retain it even when the caller hurries there. A pooled
55
+ // pass ends at a hurry anywhere before that.
56
+ const done = step.value, inner = typeof done === 'number';
57
+ reply = yield inner ? 0.25 + 0.75 * done : {...done, at: g => 0.25 + 0.75 * done.at(g), stop: g => done.at(g) < 1};
58
+ if (inner ? reply && done < 1 : !reply) return null;
59
+ }
60
+ return step.value;
61
+ }