1const I=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],U=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],g=[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],B=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],O=[0,1,2,3,4,5,6,7,8,9,10,11],P=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],z=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],F=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],_=[0,1,2,3,4,5,6,7,8,9,10,11],N=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],T=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];class M{constructor(){Object.defineProperty(this,"buffer",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"bitBuffer",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"bitCount",{enumerable:!0,configurable:!0,writable:!0,value:0})}writeBits(e,n){for(this.bitBuffer=this.bitBuffer<<n|e,this.bitCount+=n;this.bitCount>=8;){this.bitCount-=8;const s=this.bitBuffer>>this.bitCount&255;this.buffer.push(s),s===255&&this.buffer.push(0)}}flush(){if(this.bitCount>0){const e=this.bitBuffer<<8-this.bitCount&255;this.buffer.push(e),e===255&&this.buffer.push(0)}this.bitBuffer=0,this.bitCount=0}getBytes(){return new Uint8Array(this.buffer)}}class q{constructor(e={}){Object.defineProperty(this,"quality",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"progressive",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"luminanceQuantTable",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"chrominanceQuantTable",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"dcLuminanceHuffman",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"acLuminanceHuffman",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dcChrominanceHuffman",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"acChrominanceHuffman",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.quality=Math.max(1,Math.min(100,e.quality??85)),this.progressive=e.progressive??!1,this.initQuantizationTables(),this.initHuffmanTables()}initQuantizationTables(){const e=this.quality<50?5e3/this.quality:200-this.quality*2;for(let n=0;n<64;n++){let s=Math.floor((I[n]*e+50)/100),t=Math.floor((U[n]*e+50)/100);s=Math.max(1,Math.min(255,s)),t=Math.max(1,Math.min(255,t)),this.luminanceQuantTable[n]=s,this.chrominanceQuantTable[n]=t}}initHuffmanTables(){this.dcLuminanceHuffman=this.buildHuffmanTable(B,O),this.acLuminanceHuffman=this.buildHuffmanTable(P,z),this.dcChrominanceHuffman=this.buildHuffmanTable(F,_),this.acChrominanceHuffman=this.buildHuffmanTable(N,T)}buildHuffmanTable(e,n){const s=new Uint32Array(256),t=new Uint8Array(256);let c=0,i=0;for(let x=1;x<=16;x++){for(let o=0;o<e[x];o++){const f=n[i];s[f]=c,t[f]=x,c++,i++}c<<=1}return{codes:s,sizes:t}}encode(e,n,s,t=72,c=72){const i=[];if(i.push(255,216),this.writeAPP0(i,t,c),this.writeDQT(i),this.progressive?this.writeSOF2(i,e,n):this.writeSOF0(i,e,n),this.writeDHT(i),this.progressive)this.encodeProgressive(i,e,n,s);else{this.writeSOS(i);const x=this.encodeScan(e,n,s);for(let o=0;o<x.length;o++)i.push(x[o])}return i.push(255,217),new Uint8Array(i)}writeAPP0(e,n,s){e.push(255,224),e.push(0,16),e.push(74,70,73,70,0),e.push(1,1),e.push(1),e.push(n>>8&255,n&255),e.push(s>>8&255,s&255),e.push(0,0)}writeDQT(e){e.push(255,219),e.push(0,67),e.push(0);for(let n=0;n<64;n++)e.push(this.luminanceQuantTable[g[n]]);e.push(255,219),e.push(0,67),e.push(1);for(let n=0;n<64;n++)e.push(this.chrominanceQuantTable[g[n]])}writeSOF0(e,n,s){e.push(255,192),e.push(0,17),e.push(8),e.push(s>>8&255,s&255),e.push(n>>8&255,n&255),e.push(3),e.push(1),e.push(17),e.push(0),e.push(2),e.push(17),e.push(1),e.push(3),e.push(17),e.push(1)}writeSOF2(e,n,s){e.push(255,194),e.push(0,17),e.push(8),e.push(s>>8&255,s&255),e.push(n>>8&255,n&255),e.push(3),e.push(1),e.push(17),e.push(0),e.push(2),e.push(17),e.push(1),e.push(3),e.push(17),e.push(1)}writeDHT(e){this.writeHuffmanTable(e,0,B,O),this.writeHuffmanTable(e,16,P,z),this.writeHuffmanTable(e,1,F,_),this.writeHuffmanTable(e,17,N,T)}writeHuffmanTable(e,n,s,t){e.push(255,196);let c=19;for(let x=1;x<=16;x++)c+=s[x];e.push(c>>8&255,c&255),e.push(n);for(let x=1;x<=16;
1x++)e.push(s[x]);let i=0;for(let x=1;x<=16;x++)for(let o=0;o<s[x];o++)e.push(t[i++])}writeSOS(e){e.push(255,218),e.push(0,12),e.push(3),e.push(1),e.push(0),e.push(2),e.push(17),e.push(3),e.push(17),e.push(0),e.push(63),e.push(0)}writeProgressiveSOS(e,n,s,t,c,i){e.push(255,218);const x=6+n.length*2;e.push(x>>8&255,x&255),e.push(n.length);for(const o of n)e.push(o),o===1?e.push(0):e.push(17);e.push(s),e.push(t),e.push(c<<4|i)}encodeProgressive(e,n,s,t){const c=Math.ceil(n/8),i=Math.ceil(s/8),x=[],o=[],f=[];for(let a=0;a<i;a++)for(let d=0;d<c;d++){const C=new Float32Array(64),A=new Float32Array(64),y=new Float32Array(64);for(let m=0;m<8;m++)for(let u=0;u<8;u++){const b=d*8+u,S=a*8+m;if(b<n&&S<s){const D=(S*n+b)*4,p=t[D],v=t[D+1],H=t[D+2],Q=.299*p+.587*v+.114*H,L=-.168736*p-.331264*v+.5*H+128,E=.5*p-.418688*v-.081312*H+128;C[m*8+u]=Q-128,A[m*8+u]=L-128,y[m*8+u]=E-128}}x.push(this.dctAndQuantize(C,this.luminanceQuantTable)),o.push(this.dctAndQuantize(A,this.chrominanceQuantTable)),f.push(this.dctAndQuantize(y,this.chrominanceQuantTable))}this.writeProgressiveSOS(e,[1,2,3],0,0,0,0);const r=this.encodeProgressiveDCScan(x,o,f);for(let a=0;a<r.length;a++)e.push(r[a]);this.writeProgressiveSOS(e,[1],1,63,0,0);const h=this.encodeProgressiveACScanSingle(x,this.acLuminanceHuffman);for(let a=0;a<h.length;a++)e.push(h[a]);this.writeProgressiveSOS(e,[2],1,63,0,0);const l=this.encodeProgressiveACScanSingle(o,this.acChrominanceHuffman);for(let a=0;a<l.length;a++)e.push(l[a]);this.writeProgressiveSOS(e,[3],1,63,0,0);const w=this.encodeProgressiveACScanSingle(f,this.acChrominanceHuffman);for(let a=0;a<w.length;a++)e.push(w[a])}dctAndQuantize(e,n){const s=this.performDCT2D(e),t=new Int32Array(64);for(let c=0;c<64;c++)t[c]=Math.round(s[c]/n[c]);return t}performDCT2D(e){const n=new Float32Array(64);for(let s=0;s<8;s++)for(let t=0;t<8;t++){let c=0;for(let i=0;i<8;i++)for(let x=0;x<8;x++){const o=t===0?1/Math.sqrt(2):1,f=s===0?1/Math.sqrt(2):1;c+=e[i*8+x]*Math.cos((2*x+1)*t*Math.PI/16)*Math.cos((2*i+1)*s*Math.PI/16)*o*f}n[s*8+t]=c/4}return n}encodeProgressiveDCScan(e,n,s){const t=new M;let c=0,i=0,x=0;for(let o=0;o<e.length;o++)c=this.encodeOnlyDC(e[o][0],c,this.dcLuminanceHuffman,t),i=this.encodeOnlyDC(n[o][0],i,this.dcChrominanceHuffman,t),x=this.encodeOnlyDC(s[o][0],x,this.dcChrominanceHuffman,t);return t.flush(),Array.from(t.getBytes())}encodeProgressiveACScanSingle(e,n){const s=new M;for(let t=0;t<e.length;t++)this.encodeOnlyAC(e[t],n,s);return s.flush(),Array.from(s.getBytes())}encodeOnlyDC(e,n,s,t){const c=e-n,i=Math.max(-2047,Math.min(2047,c)),x=Math.abs(i);let o=0;if(x>0&&(o=Math.floor(Math.log2(x))+1),t.writeBits(s.codes[o],s.sizes[o]),o>0){const f=i<0?i+(1<<o)-1:i;t.writeBits(f,o)}return e}encodeOnlyAC(e,n,s){let t=0;for(let c=1;c<64;c++){const i=e[g[c]],x=Math.max(-1023,Math.min(1023,i));if(x===0)t++,t===16&&(s.writeBits(n.codes[240],n.sizes[240]),t=0);else{for(;t>=16;)s.writeBits(n.codes[240],n.sizes[240]),t-=16;const o=Math.abs(x),f=Math.floor(Math.log2(o))+1,r=t<<4|f;s.writeBits(n.codes[r],n.sizes[r]);const h=x<0?x+(1<<f)-1:x;s.writeBits(h,f),t=0}}t>0&&s.writeBits(n.codes[0],n.sizes[0])}encodeScan(e,n,s){const t=new M;let c=0,i=0,x=0;const o=Math.ceil(e/8),f=Math.ceil(n/8);for(let r=0;r<f;r++)for(let h=0;h<o;h++){const l=new Float32Array(64),w=new Float32Array(64),a=new Float32Array(64);for(let d=0;d<8;d++)for(let C=0;C<8;C++){const A=h*8+C,y=r*8+d;if(A<e&&y<n){const m=(y*e+A)*4,u=s[m],b=s[m+1],S=s[m+2],D=.299*u+.587*b+.114*S,p=-.168736*u-.331264*b+.5*S+128,v=.5*u-.418688*b-.081312*S+128;l[d*8+C]=D-128,w[d*8+C]=p-128,a[d*8+C]=v-128}}c=this.encodeBlock(l,this.luminanceQuantTable,c,this.dcLuminanceHuffman,this.acLuminanceHuffman,t),i=this.encodeBlock(w,this.chrominanceQuantTable,i,this.dcChrominanceHuffman,this.acChrominanceHuffman,t),x=this.encodeBlock(a,this.chrominanceQuantTable,x,this.dcChrominanceHuffman,this.acChrominanceHuffman,t)}return t.flush(),Array.from(t.getBytes())}encodeBlock(e,n,s,t,c,i){this.forwardDCT(e);const x=new Int32Array(64);for(let f=0;f<64;f++){const r=g[f];x[f]=Math.round(e[r]/n[r])}const o=x[0]-s;return this.encodeDC(o,t,i),this.encodeAC(x,c,i),x[0]}forwardDCT(e){const n=new Float32Array(64);for(let s=0;s<8;s++){const t=s*8;for(let c=0;c<8;c++){let i=0;for(let o=0;o<8;o++)i+=e[t+o]*Math.cos((2*o+1)*c*Math.PI/16);const x=c===0?1/Math.sqrt(2):1;n[t+c]=.5*x*i}}for(let s=0;s<8;s++)for(let t=0;t<8;t++){let c=0;for(let x=0;x<8;x++)c+=n[x*8+s]*Math.cos((2*x+1)*t*Math.PI/16);const i=t===0?1/Math.sqrt(2):1;e[t*8+s]=.5*i*c}}encodeDC(e,n,s){const c=Math.max(-2047,Math.min(2047,e)),i=Math.abs(c);let x=0;if(i>
10&&(x=Math.floor(Math.log2(i))+1),s.writeBits(n.codes[x],n.sizes[x]),x>0){const o=c<0?c+(1<<x)-1:c;s.writeBits(o,x)}}encodeAC(e,n,s){let t=0;for(let c=1;c<64;c++){const i=e[c];if(i===0)t++;else{for(;t>=16;)s.writeBits(n.codes[240],n.sizes[240]),t-=16;const x=1023,o=Math.max(-x,Math.min(x,i)),f=Math.abs(o),r=Math.floor(Math.log2(f))+1,h=t<<4|r;s.writeBits(n.codes[h],n.sizes[h]);const l=o<0?o+(1<<r)-1:o;s.writeBits(l,r),t=0}}t>0&&s.writeBits(n.codes[0],n.sizes[0])}encodeFromCoefficients(e,n){const s=[],{width:t,height:c,components:i,quantizationTables:x,isProgressive:o}=e;if(s.push(255,216),this.writeAPP0(s,72,72),this.writeDQTFromCoeffs(s,x),o?this.writeSOF2FromCoeffs(s,t,c,i):this.writeSOF0FromCoeffs(s,t,c,i),this.writeDHT(s),o)this.encodeProgressiveFromCoeffs(s,e);else{this.writeSOS(s);const f=this.encodeScanFromCoeffs(e);for(let r=0;r<f.length;r++)s.push(f[r])}return s.push(255,217),new Uint8Array(s)}writeDQTFromCoeffs(e,n){for(let s=0;s<n.length;s++){const t=n[s];if(t){e.push(255,219),e.push(0,67),e.push(s);for(let c=0;c<64;c++)e.push(t[g[c]]??1)}}}writeSOF0FromCoeffs(e,n,s,t){const c=t.length,i=8+c*3;e.push(255,192),e.push(i>>8&255,i&255),e.push(8),e.push(s>>8&255,s&255),e.push(n>>8&255,n&255),e.push(c);for(const x of t)e.push(x.id),e.push(x.h<<4|x.v),e.push(x.qTable)}writeSOF2FromCoeffs(e,n,s,t){const c=t.length,i=8+c*3;e.push(255,194),e.push(i>>8&255,i&255),e.push(8),e.push(s>>8&255,s&255),e.push(n>>8&255,n&255),e.push(c);for(const x of t)e.push(x.id),e.push(x.h<<4|x.v),e.push(x.qTable)}encodeScanFromCoeffs(e){const n=new M,{components:s}=e,t=new Map;for(const x of s)t.set(x.id,0);const c=e.mcuHeight,i=e.mcuWidth;for(let x=0;x<c;x++)for(let o=0;o<i;o++)for(const f of s)for(let r=0;r<f.v;r++)for(let h=0;h<f.h;h++){const l=x*f.v+r,w=o*f.h+h;if(l<f.blocks.length&&w<f.blocks[0].length){const a=f.blocks[l][w],d=new Int32Array(64);for(let b=0;b<64;b++)d[b]=a[g[b]];const C=t.get(f.id)??0,A=f.id===1?this.dcLuminanceHuffman:this.dcChrominanceHuffman,y=f.id===1?this.acLuminanceHuffman:this.acChrominanceHuffman,m=a[0],u=m-C;this.encodeDC(u,A,n),t.set(f.id,m),this.encodeACFromCoeffs(a,y,n)}}return n.flush(),Array.from(n.getBytes())}encodeACFromCoeffs(e,n,s){let t=0;for(let c=1;c<64;c++){const i=e[g[c]];if(i===0)t++;else{for(;t>=16;)s.writeBits(n.codes[240],n.sizes[240]),t-=16;const x=1023,o=Math.max(-x,Math.min(x,i)),f=Math.abs(o),r=Math.floor(Math.log2(f))+1,h=t<<4|r;s.writeBits(n.codes[h],n.sizes[h]);const l=o<0?o+(1<<r)-1:o;s.writeBits(l,r),t=0}}t>0&&s.writeBits(n.codes[0],n.sizes[0])}encodeProgressiveFromCoeffs(e,n){const{components:s}=n,t=new Map;for(const i of s){const x=[];for(const o of i.blocks)for(const f of o)x.push(f);t.set(i.id,x)}this.writeProgressiveSOS(e,s.map(i=>i.id),0,0,0,0);const c=this.encodeProgressiveDCScanFromCoeffs(t,s);for(let i=0;i<c.length;i++)e.push(c[i]);for(const i of s){this.writeProgressiveSOS(e,[i.id],1,63,0,0);const x=t.get(i.id)??[],o=i.id===1?this.acLuminanceHuffman:this.acChrominanceHuffman,f=this.encodeProgressiveACScanFromCoeffs(x,o);for(let r=0;r<f.length;r++)e.push(f[r])}}encodeProgressiveDCScanFromCoeffs(e,n){const s=new M,t=new Map;for(const i of n)t.set(i.id,0);const c=e.get(n[0].id)?.length??0;for(let i=0;i<c;i++)for(const x of n){const o=e.get(x.id);if(!o||i>=o.length)continue;const r=o[i][0],h=t.get(x.id)??0,l=x.id===1?this.dcLuminanceHuffman:this.dcChrominanceHuffman;this.encodeOnlyDC(r,h,l,s),t.set(x.id,r)}return s.flush(),Array.from(s.getBytes())}encodeProgressiveACScanFromCoeffs(e,n){const s=new M;for(const t of e)this.encodeOnlyACFromCoeffs(t,n,s);return s.flush(),Array.from(s.getBytes())}encodeOnlyACFromCoeffs(e,n,s){let t=0;for(let c=1;c<64;c++){const i=e[g[c]],x=Math.max(-1023,Math.min(1023,i));if(x===0)t++,t===16&&(s.writeBits(n.codes[240],n.sizes[240]),t=0);else{for(;t>=16;)s.writeBits(n.codes[240],n.sizes[240]),t-=16;const o=Math.abs(x),f=Math.floor(Math.log2(o))+1,r=t<<4|f;s.writeBits(n.codes[r],n.sizes[r]);const h=x<0?x+(1<<f)-1:x;s.writeBits(h,f),t=0}}t>0&&s.writeBits(n.codes[0],n.sizes[0])}}export{q as JPEGEncoder};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.