use std::os::raw::*;
use std::ptr;
cfg_if! {
if #[cfg(feature = "1_1")] {
pub const WEBP_DECODER_ABI_VERSION: c_int = 0x0209;
} else if #[cfg(feature = "0_5")] {
pub const WEBP_DECODER_ABI_VERSION: c_int = 0x0208;
} else {
pub const WEBP_DECODER_ABI_VERSION: c_int = 0x0203;
}
}
#[cfg(feature = "extern-types")]
#[cfg_attr(feature = "__doc_cfg", doc(cfg(all())))]
unsafe extern "C" {
pub type WebPIDecoder;
}
#[cfg(not(feature = "extern-types"))]
#[cfg_attr(feature = "__doc_cfg", doc(cfg(all())))]
#[repr(C)]
pub struct WebPIDecoder(c_void);
#[allow(non_camel_case_types)]
pub type WEBP_CSP_MODE = u32;
pub const MODE_RGB: WEBP_CSP_MODE = 0;
pub const MODE_RGBA: WEBP_CSP_MODE = 1;
pub const MODE_BGR: WEBP_CSP_MODE = 2;
pub const MODE_BGRA: WEBP_CSP_MODE = 3;
pub const MODE_ARGB: WEBP_CSP_MODE = 4;
pub const MODE_RGBA_4444: WEBP_CSP_MODE = 5;
pub const MODE_RGB_565: WEBP_CSP_MODE = 6;
#[allow(non_upper_case_globals)]
pub const MODE_rgbA: WEBP_CSP_MODE = 7;
#[allow(non_upper_case_globals)]
pub const MODE_bgrA: WEBP_CSP_MODE = 8;
#[allow(non_upper_case_globals)]
pub const MODE_Argb: WEBP_CSP_MODE = 9;
#[allow(non_upper_case_globals)]
pub const MODE_rgbA_4444: WEBP_CSP_MODE = 10;
pub const MODE_YUV: WEBP_CSP_MODE = 11;
pub const MODE_YUVA: WEBP_CSP_MODE = 12;
pub const MODE_LAST: WEBP_CSP_MODE = 13;
#[allow(non_snake_case)]
#[inline]
pub extern "C" fn WebPIsPremultipliedMode(mode: WEBP_CSP_MODE) -> c_int {
(mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb || mode == MODE_rgbA_4444) as c_int
}
#[allow(non_snake_case)]
#[inline]
pub extern "C" fn WebPIsAlphaMode(mode: WEBP_CSP_MODE) -> c_int {
(mode == MODE_RGBA
|| mode == MODE_BGRA
|| mode == MODE_ARGB
|| mode == MODE_RGBA_4444
|| mode == MODE_YUVA
|| WebPIsPremultipliedMode(mode) != 0) as c_int
}
#[allow(non_snake_case)]
#[inline]
pub extern "C" fn WebPIsRGBMode(mode: WEBP_CSP_MODE) -> c_int {
(mode < MODE_YUV) as c_int
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPRGBABuffer {
pub rgba: *mut u8,
pub stride: c_int,
pub size: usize,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPYUVABuffer {
pub y: *mut u8,
pub u: *mut u8,
pub v: *mut u8,
pub a: *mut u8,
pub y_stride: c_int,
pub u_stride: c_int,
pub v_stride: c_int,
pub a_stride: c_int,
pub y_size: usize,
pub u_size: usize,
pub v_size: usize,
pub a_size: usize,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPDecBuffer {
pub colorspace: WEBP_CSP_MODE,
pub width: c_int,
pub height: c_int,
pub is_external_memory: c_int,
pub u: __WebPDecBufferUnion,
pub pad: [u32; 4],
#[doc(hidden)]
pub private_memory: *mut u8,
}
#[allow(non_snake_case)]
#[repr(C)]
#[derive(Clone, Copy)]
pub union __WebPDecBufferUnion {
pub RGBA: WebPRGBABuffer,
pub YUVA: WebPYUVABuffer,
}
impl std::fmt::Debug for __WebPDecBufferUnion {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str("<union>")
}
}
#[allow(non_camel_case_types)]
pub type VP8StatusCode = u32;
pub const VP8_STATUS_OK: VP8StatusCode = 0;
pub const VP8_STATUS_OUT_OF_MEMORY: VP8StatusCode = 1;
pub const VP8_STATUS_INVALID_PARAM: VP8StatusCode = 2;
pub const VP8_STATUS_BITSTREAM_ERROR: VP8StatusCode = 3;
pub const VP8_STATUS_UNSUPPORTED_FEATURE: VP8StatusCode = 4;
pub const VP8_STATUS_SUSPENDED: VP8StatusCode = 5;
pub const VP8_STATUS_USER_ABORT: VP8StatusCode = 6;
pub const VP8_STATUS_NOT_ENOUGH_DATA: VP8StatusCode = 7;
#[allow(non_snake_case)]
#[inline]
pub unsafe extern "C" fn WebPIDecGetYUV(
idec: *const WebPIDecoder,
last_y: *mut c_int,
u: *mut *mut u8,
v: *mut *mut u8,
width: *mut c_int,
height: *mut c_int,
stride: *mut c_int,
uv_stride: *mut c_int,
) -> *mut u8 {
unsafe {
WebPIDecGetYUVA(
idec,
last_y,
u,
v,
ptr::null_mut(),
width,
height,
stride,
uv_stride,
ptr::null_mut(),
)
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPBitstreamFeatures {
pub width: c_int,
pub height: c_int,
pub has_alpha: c_int,
pub has_animation: c_int,
pub format: c_int,
#[cfg(not(feature = "0_5"))]
#[deprecated(note = "Removed as of libwebp 0.5.0")]
pub no_incremental_decoding: c_int,
#[cfg(not(feature = "0_5"))]
#[deprecated(note = "Removed as of libwebp 0.5.0")]
pub rotate: c_int,
#[cfg(not(feature = "0_5"))]
#[deprecated(note = "Removed as of libwebp 0.5.0")]
pub uv_sampling: c_int,
#[cfg(not(feature = "0_5"))]
#[doc(hidden)]
pub pad: [u32; 2],
#[cfg(feature = "0_5")]
#[doc(hidden)]
pub pad: [u32; 5],
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPDecoderOptions {
pub bypass_filtering: c_int,
pub no_fancy_upsampling: c_int,
pub use_cropping: c_int,
pub crop_left: c_int,
pub crop_top: c_int,
pub crop_width: c_int,
pub crop_height: c_int,
pub use_scaling: c_int,
pub scaled_width: c_int,
pub scaled_height: c_int,
pub use_threads: c_int,
pub dithering_strength: c_int,
#[cfg(feature = "0_5")]
pub flip: c_int,
#[cfg(feature = "0_5")]
pub alpha_dithering_strength: c_int,
#[cfg(not(feature = "0_5"))]
#[deprecated(note = "Removed as of libwebp 0.5.0")]
pub force_rotation: c_int,
#[cfg(not(feature = "0_5"))]
#[deprecated(note = "Removed as of libwebp 0.5.0")]
pub no_enhancement: c_int,
#[doc(hidden)]
pub pad: [u32; 5],
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct WebPDecoderConfig {
pub input: WebPBitstreamFeatures,
pub output: WebPDecBuffer,
pub options: WebPDecoderOptions,
}
unsafe extern "C" {
pub fn WebPGetDecoderVersion() -> c_int;
#[must_use]
pub fn WebPGetInfo(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> c_int;
#[must_use]
pub fn WebPDecodeRGBA(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeARGB(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeBGRA(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeRGB(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeBGR(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeYUV(
data: *const u8,
data_size: usize,
width: *mut c_int,
height: *mut c_int,
u: *mut *mut u8,
v: *mut *mut u8,
stride: *mut c_int,
uv_stride: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeRGBAInto(
data: *const u8,
data_size: usize,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeARGBInto(
data: *const u8,
data_size: usize,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeBGRAInto(
data: *const u8,
data_size: usize,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeRGBInto(
data: *const u8,
data_size: usize,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeBGRInto(
data: *const u8,
data_size: usize,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut u8;
#[must_use]
pub fn WebPDecodeYUVInto(
data: *const u8,
data_size: usize,
luma: *mut u8,
luma_size: usize,
luma_stride: c_int,
u: *mut u8,
u_size: usize,
u_stride: c_int,
v: *mut u8,
v_size: usize,
v_stride: c_int,
) -> *mut u8;
#[doc(hidden)]
#[must_use]
pub fn WebPInitDecBufferInternal(_: *mut WebPDecBuffer, _: c_int) -> c_int;
pub fn WebPFreeDecBuffer(buffer: *mut WebPDecBuffer);
#[must_use]
pub fn WebPINewDecoder(output_buffer: *mut WebPDecBuffer) -> *mut WebPIDecoder;
#[must_use]
pub fn WebPINewRGB(
csp: WEBP_CSP_MODE,
output_buffer: *mut u8,
output_buffer_size: usize,
output_stride: c_int,
) -> *mut WebPIDecoder;
#[must_use]
pub fn WebPINewYUVA(
luma: *mut u8,
luma_size: usize,
luma_stride: c_int,
u: *mut u8,
u_size: usize,
u_stride: c_int,
v: *mut u8,
v_size: usize,
v_stride: c_int,
a: *mut u8,
a_size: usize,
a_stride: c_int,
) -> *mut WebPIDecoder;
#[must_use]
pub fn WebPINewYUV(
luma: *mut u8,
luma_size: usize,
luma_stride: c_int,
u: *mut u8,
u_size: usize,
u_stride: c_int,
v: *mut u8,
v_size: usize,
v_stride: c_int,
) -> *mut WebPIDecoder;
pub fn WebPIDelete(idec: *mut WebPIDecoder);
pub fn WebPIAppend(idec: *mut WebPIDecoder, data: *const u8, data_size: usize)
-> VP8StatusCode;
pub fn WebPIUpdate(idec: *mut WebPIDecoder, data: *const u8, data_size: usize)
-> VP8StatusCode;
#[must_use]
pub fn WebPIDecGetRGB(
idec: *const WebPIDecoder,
last_y: *mut c_int,
width: *mut c_int,
height: *mut c_int,
stride: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPIDecGetYUVA(
idec: *const WebPIDecoder,
last_y: *mut c_int,
u: *mut *mut u8,
v: *mut *mut u8,
a: *mut *mut u8,
width: *mut c_int,
height: *mut c_int,
stride: *mut c_int,
uv_stride: *mut c_int,
a_stride: *mut c_int,
) -> *mut u8;
#[must_use]
pub fn WebPIDecodedArea(
idec: *const WebPIDecoder,
left: *mut c_int,
top: *mut c_int,
width: *mut c_int,
height: *mut c_int,
) -> *const WebPDecBuffer;
#[doc(hidden)]
pub fn WebPGetFeaturesInternal(
_: *const u8,
_: usize,
_: *mut WebPBitstreamFeatures,
_: c_int,
) -> VP8StatusCode;
#[doc(hidden)]
#[must_use]
pub fn WebPInitDecoderConfigInternal(_: *mut WebPDecoderConfig, _: c_int) -> c_int;
#[must_use]
pub fn WebPIDecode(
data: *const u8,
data_size: usize,
config: *mut WebPDecoderConfig,
) -> *mut WebPIDecoder;
pub fn WebPDecode(
data: *const u8,
data_size: usize,
config: *mut WebPDecoderConfig,
) -> VP8StatusCode;
}
#[allow(non_snake_case)]
#[must_use]
#[inline]
pub unsafe extern "C" fn WebPInitDecBuffer(buffer: *mut WebPDecBuffer) -> c_int {
unsafe { WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION) }
}
#[allow(non_snake_case)]
#[inline]
pub unsafe extern "C" fn WebPGetFeatures(
data: *const u8,
data_size: usize,
features: *mut WebPBitstreamFeatures,
) -> VP8StatusCode {
unsafe { WebPGetFeaturesInternal(data, data_size, features, WEBP_DECODER_ABI_VERSION) }
}
#[allow(non_snake_case)]
#[must_use]
#[inline]
pub unsafe extern "C" fn WebPInitDecoderConfig(config: *mut WebPDecoderConfig) -> c_int {
unsafe { WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION) }
}