This repository shows how to create and use shared library in Rust.
It exports some functions from image crate. use_lib example loads and uses them.
To use this library you need to import and call just one function functions().
Returned structure contains pointers to all useful functions of this library.
/// Contains functions provided by library. Allow to import just `functions()` function and get all
/// functionality of library through this struct. `size` field contain size of this struct.
/// It helps to avoid versioning and some other errors.
#[repr(C)]
pub struct FunctionsBlock {
size: usize,
open_image: OpenImageFn,
save_image: SaveImageFn,
destroy_image: DestroyImageFn,
blur_image: BlurImageFn,
mirror_image: MirrorImageFn,
}
/// Returns all functions of this library.
#[no_mangle]
pub extern "C" fn functions() -> FunctionsBlock {...}
/// Loads image from file function type.
type OpenImageFn = unsafe extern "C" fn(RawPath, *mut ImageHandle) -> ImageError;
/// Saves image to file function type.
type SaveImageFn = unsafe extern "C" fn(RawPath, ImageHandle) -> ImageError;
/// Destroys image function type.
type DestroyImageFn = unsafe extern "C" fn(ImageHandle);
/// Performs a Gaussian blur on the supplied image function type.
type BlurImageFn = unsafe extern "C" fn(ImageHandle, f32) -> ImageHandle;
/// Flips image horizontally function type.
type MirrorImageFn = unsafe extern "C" fn(ImageHandle);
/// Incapsulate raw pointer to image.
#[repr(transparent)]
struct ImageHandle(*mut c_void);
/// Contain pointer to null-terminated UTF-8 path.
#[repr(transparent)]
struct RawPath(*const c_char);
/// Error codes for image oprerations.
#[repr(C)]
enum ImageError {
NoError = 0,
Io,
Decoding,
Encoding,
Parameter,
Unsupported,
}