A javascript IO library for the Valve Texture Format.
vtf-js is a platform-independent library for reading and authoring Vtfs. The library supports encoding and decoding VTF versions 7.1 - 7.6, including Strata compressed Vtfs. This library provides full control over a file's resources and image data by default (see VCollection), however most aspects of the conversion process can be automated with the provided methods.
The following formats are supported by default.
RGBA8888BGRA8888BGRX8888ABGR8888ARGB8888RGB888BGR888RGB565BGR565IA88UV88A8I8P81DXT1DXT3DXT5R32FRGB323232FRGBA16161616RGBA16161616F2RGBA32323232F
While vtf-js should work mostly out of the box, there are several things that this package needs help with: DXT encoding, and Strata Deflate/ZSTD compression.
vtf-js includes a DXT decoder by default. Unfortunately, native encoding is not supported at this time. To enable this functionality, the vtf-js/addons/squish module can be used to register the libsquish-js library for encoding/decoding.
Support for Deflate decompression is provided by default using the standard Compression Streams API, however this compression interface is limited in functionality, and a compression level of -1 is enforced when encoding due to technical limitations.
To add external compression support, import one of vtf-js/addons/compress/node or vtf-js/addons/compress/fflate to choose a compression interface, or manually register compression/decompression methods by calling setCompressionMethod from vtf-js/utils.
// import { ... } from 'vtf-js';
// For node (using built-in zlib bindings)
// import 'vtf-js/addons/compress/node';
// For web (using fflate)
import 'vtf-js/addons/compress/fflate';import { Vtf, VFormats, VFilters, VCollection, VImageData } from 'vtf-js';
// See "Additional Setup" section for info about this import.
import 'vtf-js/addons/squish';
const image = new VImageData(/* ... */);
// Use -1 to infer the mipmap count from the image size.
const frames = VCollection.fromFrames([image], { mips: -1 });
frames.generateMips(VFilters.NICE);
const vtf = new Vtf(frames, { version: 4, format: VFormats.DXT5 });
vtf.computeReflectivity();
vtf.computeThumb();
const out = await vtf.encode();import { Vtf } from 'vtf-js';
// ...
const vtf = await Vtf.decode(inputBuffer);
const slice = vtf.body.getImage(
0, // Mipmap
0, // Frame
0, // Face
0 // Slice
);
// The image's data may be a uint8, uint16, or float32 array depending on the format.
// The convert method normalizes the image into the desired format.
const data = slice.convert(Uint8Array);import { Vtf, VFormats } from 'vtf-js';
// ...
const vtf = await Vtf.decode(inbuffer);
vtf.format = VFormats.RGB565;
vtf.version = 6;
vtf.compression_level = 4;
const out = await vtf.encode();