@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.31 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{getBasisEncoder as e}from"../../../../libs/basisu/BasisUEncoder.js";import{TextureFormat as t}from"../../../../libs/basisu/TextureFormat.js";import{getDXTEncoder as n}from"../../../../libs/dxtEncoder/DXTEncoder.js";import{CompressedTextureFormat as r}from"../../../webgl/enums.js";let s,a,l=null,i=null;class o{constructor(e,t){this.internalFormat=e,this.compressedTexture=t}}async function c(e){const t=m(e.data,e.flipped);if(e.hasS3TC){i||await f();const n=new Uint8Array(t.length);i?.encode(new Uint8Array(t),e.width,e.height,n);const r=R(n,!0),s=[n.buffer];return{result:new o(r?.internalFormat??null,r?.textureData??null),transferList:s}}if(e.hasETC){l||await u();const n=await h(t,e.width,e.height,e.hasMipmap),r=n?await d(n):null,s=r?.compressedTexture?.levels.map((e=>e.buffer))||[];return{result:new o(r?.internalFormat??null,r?.compressedTexture??null),transferList:s}}return{result:new o(null,null)}}async function u(){l||(l=await(s??=e()))}async function f(){i||(i=await(a??=n()))}async function h(e,t,n,r,s=255,a=0,i=!1,o=!1){if(!l)return null;const c=new l.BasisEncoder;c.setPerceptual(!o),c.setCheckForAlpha(!0),c.setForceAlpha(!1),c.setRenormalize(o),c.setMipGen(r),c.setMipSRGB(!o),c.setCreateKTX2File(!0),c.setKTX2SRGBTransferFunc(!o),c.setQualityLevel(s),c.setCompressionLevel(a);const u=new Uint8Array(e.byteLength);c.setSliceSourceImage(0,new Uint8Array(e),t,n,i);const f=c.encode(u),h=new Uint8Array(u.buffer,0,f),d=new l.KTX2File(new Uint8Array(h));return d.isValid()?(c.delete(),h):(d.close(),d.delete(),c.delete(),null)}async function d(e){if(!l)return new o(null,null);const n=new l.KTX2File(new Uint8Array(e));n.startTranscoding();const[s,a]=n.getHasAlpha()?[t.ETC2_RGBA,r.COMPRESSED_RGBA8_ETC2_EAC]:[t.ETC1_RGB,r.COMPRESSED_RGB8_ETC2],i=n.getLevels(),c=[];for(let t=0;t<i;t++)c.push(new Uint8Array(n.getImageTranscodedSizeInBytes(t,0,0,s))),n.transcodeImage(c[t],t,0,0,s,0,-1,-1);return n.close(),n.delete(),{internalFormat:a,compressedTexture:{type:"compressed",levels:c}}}function m(e,t=!1){const n=new OffscreenCanvas(e.width,e.height),r=n.getContext("2d");t&&r.scale(1,-1),r.drawImage(e,0,t?-e.height:0);return r.getImageData(0,0,n.width,n.height).data}const w=31,T=1,p=2,C=3,E=4,y=7,A=21,g=131072;function S(e){return e.charCodeAt(0)+(e.charCodeAt(1)<<8)+(e.charCodeAt(2)<<16)+(e.charCodeAt(3)<<24)}const _=S("DXT1"),b=S("DXT3"),D=S("DXT5");function R(e,t){const n=new Int32Array(e.buffer,e.byteOffset,w);let s,a;switch(n[A]){case _:s=8,a=r.COMPRESSED_RGB_S3TC_DXT1_EXT;break;case b:s=16,a=r.COMPRESSED_RGBA_S3TC_DXT3_EXT;break;case D:s=16,a=r.COMPRESSED_RGBA_S3TC_DXT5_EXT;break;default:return null}let l=1,i=n[E],o=n[C];(3&i||3&o)&&(i=i+3&-4,o=o+3&-4);const c=i,u=o;let f,h;n[p]&g&&!1!==t&&(l=Math.max(1,n[y]));let d=e.byteOffset+n[T]+4;const m=[];for(let r=0;r<l;++r)h=(i+3>>2)*(o+3>>2)*s,f=new Uint8Array(e.buffer,d,h),m.push(f),d+=h,i=Math.max(1,i>>1),o=Math.max(1,o>>1);return{textureData:{type:"compressed",levels:m},internalFormat:a,width:c,height:u}}export{o as TextureCompressionWorkerOutput,c as compress,h as compressRGBADataToKTX2,d as createTextureDataKTX2,u as initializeBasisEncoder,f as initializeDXTEncoder};