use crate::bindings;
use crate::bindings::{VipsArrayDouble, VipsArrayImage, VipsArrayInt};
use crate::error::Error;
use crate::Result;
use crate::VipsImage;
use std::ffi::c_void;
use std::ffi::CString;
pub(crate) struct VipsArrayIntWrapper {
pub ctx: *mut VipsArrayInt,
}
pub(crate) struct VipsArrayDoubleWrapper {
pub ctx: *mut VipsArrayDouble,
}
pub(crate) struct VipsArrayImageWrapper {
pub ctx: *mut VipsArrayImage,
}
impl Drop for VipsArrayIntWrapper {
fn drop(&mut self) {
unsafe {
bindings::vips_area_unref(self.ctx as *mut bindings::VipsArea);
}
}
}
impl Drop for VipsArrayDoubleWrapper {
fn drop(&mut self) {
unsafe {
bindings::vips_area_unref(self.ctx as *mut bindings::VipsArea);
}
}
}
impl Drop for VipsArrayImageWrapper {
fn drop(&mut self) {
unsafe {
bindings::vips_area_unref(self.ctx as *mut bindings::VipsArea);
}
}
}
impl From<&[i32]> for VipsArrayIntWrapper {
#[inline]
fn from(array: &[i32]) -> Self {
VipsArrayIntWrapper {
ctx: unsafe {
bindings::vips_array_int_new(
array.as_ptr(),
array.len() as i32,
)
},
}
}
}
impl From<&[f64]> for VipsArrayDoubleWrapper {
#[inline]
fn from(array: &[f64]) -> Self {
VipsArrayDoubleWrapper {
ctx: unsafe {
bindings::vips_array_double_new(
array.as_ptr(),
array.len() as i32,
)
},
}
}
}
impl From<&[VipsImage]> for VipsArrayImageWrapper {
#[inline]
fn from(array: &[VipsImage]) -> Self {
let len = array.len() as i32;
let as_vips = array
.iter()
.map(|v| v.ctx)
.collect::<Vec<_>>()
.as_mut_ptr();
VipsArrayImageWrapper {
ctx: unsafe {
bindings::vips_array_image_new(
as_vips,
len,
)
},
}
}
}
#[inline]
pub fn result<T>(res: i32, output: T, error: Error) -> Result<T> {
if res == 0 {
Ok(output)
} else {
Err(error)
}
}
#[inline]
pub(crate) fn new_c_string(string: &str) -> Result<CString> {
CString::new(string).map_err(|_| Error::InitializationError("Error initializing C string."))
}
#[inline]
pub(crate) unsafe fn new_byte_array(buf: *mut c_void, size: u64) -> Vec<u8> {
Vec::from_raw_parts(
buf as *mut u8,
size as usize,
size as usize,
)
}
#[inline]
pub unsafe fn new_int_array(array: *mut i32, size: u64) -> Vec<i32> {
Vec::from(
std::slice::from_raw_parts(
array as *mut i32,
size as usize,
),
)
}
#[inline]
pub unsafe fn new_double_array(array: *mut f64, size: u64) -> Vec<f64> {
Vec::from(
std::slice::from_raw_parts(
array as *mut f64,
size as usize,
),
)
}