img-rs 2.27.0

safe bindings for stb_image
Documentation
fn main() {
    internal::run();
}

#[cfg(not(feature = "internal-bindgen-on-build"))]
mod internal {
    pub fn run() {
        let out = std::path::PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
        std::fs::remove_dir_all(&out).unwrap();
        std::fs::create_dir(&out).unwrap();

        cc::Build::new()
            .file("src/bridge.c")
            .include("src")
            .compile("bridge");
    }
}

#[cfg(feature = "internal-bindgen-on-build")]
mod internal {
    pub fn run() {
        bindgen::Builder::default()
            .header("src/stb_image.h")
            .layout_tests(false)
            .prepend_enum_name(true)
            .disable_name_namespacing()
            .generate_comments(false)
            .allowlist_function("^(stbi).*")
            .allowlist_type("^(stbi).*")
            .allowlist_var("^(stbi).*")
            .blocklist_item(".*(from_file).*")
            .ctypes_prefix("cty")
            .allowlist_recursively(false)
            .generate_inline_functions(true)
            .rust_target(bindgen::RustTarget::Nightly)
            .use_core()
            .size_t_is_usize(true)
            .clang_args([
                "-x",
                "c++",
                "-std=c++17",
                "-fno-inline-functions",
                "-Ifpng\\src\\",
            ])
            .generate()
            .expect("unable to generate bindings")
            .write_to_file("src/stb_image.rs")
            .expect("couldn't write bindings in `src/stb_image.rs`");
    }
}