| # basisu_py/wasm/wasm_encoder.py | |
| import wasmtime | |
| import ctypes | |
| from ..constants import BasisTexFormat, BasisQuality, BasisEffort, BasisFlags | |
| class BasisuWasmEncoder: | |
| def __init__(self, wasm_path): | |
| self.wasm_path = wasm_path | |
| self.engine = None | |
| self.store = None | |
| self.memory = None | |
| self.exports = None | |
| # ------------------------------------------------------ | |
| # Initialize WASM + WASI | |
| # ------------------------------------------------------ | |
| def _init_engine(self): | |
| self.engine = wasmtime.Engine() | |
| self.store = wasmtime.Store(self.engine) | |
| wasi = wasmtime.WasiConfig() | |
| wasi.argv = ["basisu-wasm"] | |
| wasi.inherit_stdout() | |
| wasi.inherit_stderr() | |
| self.store.set_wasi(wasi) | |
| def load(self): | |
| self._init_engine() | |
| module = wasmtime.Module.from_file(self.engine, self.wasm_path) | |
| linker = wasmtime.Linker(self.engine) | |
| linker.define_wasi() | |
| instance = linker.instantiate(self.store, module) | |
| self.exports = instance.exports(self.store) | |
| self.memory = self.exports["memory"] | |
| # Initialize if present | |
| if "bu_init" in self.exports: | |
| self.exports["bu_init"](self.store) | |
| print("[WASM Encoder] Loaded:", self.wasm_path) | |
| # ------------------------------------------------------ | |
| # Access raw linear memory buffer | |
| # ------------------------------------------------------ | |
| def _buf(self): | |
| raw_ptr = self.memory.data_ptr(self.store) | |
| size = self.memory.data_len(self.store) | |
| addr = ctypes.addressof(raw_ptr.contents) | |
| return (ctypes.c_ubyte * size).from_address(addr) | |
| # ------------------------------------------------------ | |
| # Version | |
| # ------------------------------------------------------ | |
| def get_version(self): | |
| return self.exports["bu_get_version"](self.store) | |
| # ------------------------------------------------------ | |
| # Memory alloc/free | |
| # ------------------------------------------------------ | |
| def alloc(self, size): | |
| return self.exports["bu_alloc"](self.store, size) | |
| def free(self, ptr): | |
| self.exports["bu_free"](self.store, ptr) | |
| # ------------------------------------------------------ | |
| # Params | |
| # ------------------------------------------------------ | |
| def new_params(self): | |
| return self.exports["bu_new_comp_params"](self.store) | |
| def delete_params(self, params): | |
| return self.exports["bu_delete_comp_params"](self.store, params) | |
| # ------------------------------------------------------ | |
| # Image input | |
| # ------------------------------------------------------ | |
| def set_image_rgba32(self, params, index, ptr, w, h, pitch): | |
| return self.exports["bu_comp_params_set_image_rgba32"]( | |
| self.store, params, index, ptr, w, h, pitch | |
| ) | |
| def set_image_float_rgba(self, params, index, ptr, w, h, pitch): | |
| return self.exports["bu_comp_params_set_image_float_rgba"]( | |
| self.store, params, index, ptr, w, h, pitch | |
| ) | |
| # ------------------------------------------------------ | |
| # Compression | |
| # ------------------------------------------------------ | |
| def compress(self, params, fmt, quality, effort, flags, rdo): | |
| return bool(self.exports["bu_compress_texture"]( | |
| self.store, params, fmt, quality, effort, flags, rdo | |
| )) | |
| # ------------------------------------------------------ | |
| # Output blob | |
| # ------------------------------------------------------ | |
| def get_comp_data_size(self, params): | |
| return self.exports["bu_comp_params_get_comp_data_size"](self.store, params) | |
| def get_comp_data_ofs(self, params): | |
| return self.exports["bu_comp_params_get_comp_data_ofs"](self.store, params) | |
| # ------------------------------------------------------ | |
| # Raw memory I/O | |
| # ------------------------------------------------------ | |
| def write_bytes(self, ptr, data): | |
| buf = self._buf() | |
| buf[ptr:ptr + len(data)] = data | |
| def read_bytes(self, ptr, size): | |
| buf = self._buf() | |
| return bytes(buf[ptr:ptr + size]) | |
| # NEW unified names: | |
| def write_memory(self, ptr, data): | |
| self.write_bytes(ptr, data) | |
| def read_memory(self, ptr, size): | |
| return self.read_bytes(ptr, size) |