mirror of
https://github.com/BinomialLLC/basis_universal.git
synced 2026-08-31 23:48:15 +00:00
130 lines
5.7 KiB
JavaScript
130 lines
5.7 KiB
JavaScript
// encode_dto_apply.js
|
|
//
|
|
// applyEncodeDTO(encoder, dto): applies an encode DTO (built by buildEncodeDTO in
|
|
// index.html) to a BasisEncoder instance, in the SAME ORDER as the legacy inline
|
|
// encode path; the caller then calls encoder.encode().
|
|
//
|
|
// PURE: depends only on (encoder, dto) -- no Module, no DOM. That's why it can run
|
|
// unchanged on the main thread (non-worker DTO path) AND inside the encode worker
|
|
// (which importScripts() this file). All enum values in dto are already ints.
|
|
//
|
|
// Loaded on the page via <script src> and in the worker via importScripts(), so it
|
|
// is the single source of truth for both modes (no duplication / drift).
|
|
|
|
function applyEncodeDTO(encoder, dto)
|
|
{
|
|
// container / threading
|
|
encoder.controlThreading(dto.multithreaded, dto.numWorkerThreads);
|
|
encoder.setCreateKTX2File(dto.createKTX2);
|
|
encoder.setKTX2UASTCSupercompression(dto.ktx2UASTCSupercompression);
|
|
|
|
// color / transfer
|
|
encoder.setPerceptual(dto.sRGB);
|
|
if (!dto.isHDRSourceFile)
|
|
encoder.setKTX2AndBasisSRGBTransferFunc(dto.sRGB);
|
|
encoder.setMipSRGB(dto.sRGB);
|
|
|
|
// source image (the DTO normalized the 3 legacy cases into one shape:
|
|
// pre-decoded RGBA has real dims; raw file bytes use 0,0 + an img_type)
|
|
const s = dto.source;
|
|
if (s.isHDRTarget)
|
|
encoder.setSliceSourceImageHDR(0, s.bytes, s.width, s.height, s.imgType, s.convertLDRToLinear, s.nitMultiplier);
|
|
else
|
|
encoder.setSliceSourceImage(0, s.bytes, s.width, s.height, s.imgType);
|
|
|
|
encoder.setFormatMode(dto.formatMode);
|
|
encoder.setRec2020(dto.rec2020);
|
|
encoder.setDebug(dto.debug);
|
|
encoder.setComputeStats(dto.computeStats);
|
|
encoder.setPrintStats(dto.printStats);
|
|
encoder.setStatusOutput(true);
|
|
|
|
// low-level codec opts -- run when the unified checkbox is OFF (legacy).
|
|
// NOTE this can run even for XUBC7 (when checkbox is off); applyUnified then
|
|
// overrides quality/effort afterward, exactly as the legacy path does.
|
|
if (dto.lowLevelOptsEnabled)
|
|
{
|
|
encoder.setUASTCHDRQualityLevel(dto.uastcHDRQuality);
|
|
encoder.setASTC_HDR_6x6_Level(dto.astcHDR6x6Level);
|
|
encoder.setLambda(dto.astc6x6Lambda);
|
|
|
|
// three-way quality branch (mirrors legacy): XUBC7 defers to the unified
|
|
// call (no setQualityLevel here); XUASTC uses DCT; everything else ETC1S.
|
|
if (dto.isXUBC7Target)
|
|
{
|
|
// intentionally nothing -- applyUnified handles XUBC7 quality/effort
|
|
}
|
|
else if (dto.isXUASTCLDRTarget)
|
|
{
|
|
if (dto.xuastcDCTQuality < 100)
|
|
{
|
|
encoder.setQualityLevel(dto.xuastcDCTQuality);
|
|
encoder.setXUASTCLDRUseDCT(true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
encoder.setQualityLevel(dto.etc1sQuality);
|
|
}
|
|
|
|
encoder.setXUASTCLDRUseLossySupercompression(dto.xuastcLossySupercompression);
|
|
encoder.setASTCOrXUASTCLDREffortLevel(dto.astcXuastcEffortLevel);
|
|
encoder.setRDOUASTC(dto.rdoUASTC);
|
|
encoder.setRDOUASTCQualityScalar(dto.rdoUASTCQualityScalar);
|
|
encoder.setPackUASTCFlags(dto.packUASTCFlags);
|
|
encoder.setETC1SCompressionLevel(dto.etc1sCompLevel);
|
|
}
|
|
|
|
// always-applied opts (available even when the unified path is used)
|
|
for (let i = 0; i < 6; i++)
|
|
encoder.setXUASTCLDRBoundedRDOParam(i, dto.xuastcBoundedRDO[i]);
|
|
|
|
encoder.setXUASTCLDRForceDisableRGBDualPlane(dto.xuastcDisableRGBDualPlane);
|
|
encoder.setXUASTCLDRForceDisableSubsets(dto.xuastcDisableSubsets);
|
|
encoder.setXUASTCLDRUseBlurring(dto.xuastcUseBlur);
|
|
encoder.setXUASTCLDRSelectCompressor(dto.xuastcSelectCompressor);
|
|
encoder.setXUASTCLDRHeavySubsetUsage(dto.xuastcHeavySubsetUsage);
|
|
encoder.setXUASTCLDRSharpenMode(dto.xuastcSharpenMode);
|
|
encoder.setXUASTCLDRSharpenAmount(dto.xuastcSharpenAmount);
|
|
encoder.setXUASTCLDRDeblockingMode(dto.xuastcDeblockingMode);
|
|
encoder.setXUASTCLDRNumDeblockingPasses(dto.xuastcNumDeblockingPasses);
|
|
encoder.setASTCOrXUASTCLDRWeights(dto.weights[0], dto.weights[1], dto.weights[2], dto.weights[3]);
|
|
encoder.setSwizzle(dto.swizzle[0], dto.swizzle[1], dto.swizzle[2], dto.swizzle[3]);
|
|
encoder.setXUASTCLDRSyntax(dto.xuastcSyntax);
|
|
encoder.setXUBC7RDOLevel(dto.xubc7RDOLevel);
|
|
encoder.setXUBC7NumStripes(dto.xubc7NumStripes);
|
|
encoder.setXUBC7Encoder(dto.xubc7Encoder);
|
|
encoder.setXUBC7BC7EScalarLevel(dto.xubc7BC7EScalarLevel);
|
|
|
|
// mipmaps
|
|
encoder.setMipGen(dto.mipGen);
|
|
encoder.setMipFilter(dto.mipFilter);
|
|
encoder.setMipScale(dto.mipScale);
|
|
encoder.setMipSmallestDimension(dto.mipSmallestDim);
|
|
encoder.setMipRenormalize(dto.mipRenormalize);
|
|
encoder.setMipWrapping(dto.mipWrapping);
|
|
encoder.setYFlip(dto.yFlip);
|
|
|
|
// unified quality/effort LAST -- it intentionally overrides some of the
|
|
// codec-specific low-level options set above (matches the legacy path)
|
|
if (dto.applyUnified)
|
|
encoder.setFormatModeAndQualityEffort(dto.formatMode, dto.unifiedQuality, dto.unifiedEffort, true);
|
|
}
|
|
|
|
// applyDDSEncodeDTO(encoder, dto): applies ONLY the DDS-export-specific options on top of a
|
|
// BasisEncoder that has ALREADY had applyEncodeDTO() run on it. The caller then calls
|
|
// encoder.encodeToDDS(buffer). Used by the DDS-export path (worker 'encodeDDS' message).
|
|
//
|
|
// PURE: depends only on (encoder, dto) -- no Module, no DOM (same contract as applyEncodeDTO).
|
|
//
|
|
// Everything DDS shares with KTX2 (source image, sRGB transfer func, perceptual, channel weights,
|
|
// mips, etc.) was already set by applyEncodeDTO() and is consumed by encodeToDDS()/build_dds()
|
|
// unchanged -- so we only set the genuinely NEW things here: the output format + BC7 packer knobs.
|
|
function applyDDSEncodeDTO(encoder, dto)
|
|
{
|
|
encoder.setDDSFormatEnum(dto.ddsFormat);
|
|
encoder.setDDSBC7Encoder(dto.ddsBC7Encoder);
|
|
encoder.setDDSBC7FLevel(dto.ddsBC7FLevel);
|
|
encoder.setDDSBC7EScalarLevel(dto.ddsBC7EScalarLevel);
|
|
}
|