use std::sync::Arc;
use crate::{bitmap::Bitmap, error::CreationError, string::UlString, Library, Rect};
pub struct ImageSource {
lib: Arc<Library>,
internal: ul_sys::ULImageSource,
}
impl ImageSource {
pub fn create_from_texture(
lib: Arc<Library>,
width: u32,
height: u32,
texture_id: u32,
rect: Rect<f32>,
bitmap: Option<Bitmap>,
) -> Result<ImageSource, CreationError> {
let internal = unsafe {
lib.ultralight().ulCreateImageSourceFromTexture(
width,
height,
texture_id,
ul_sys::ULRect {
left: rect.left,
top: rect.top,
right: rect.right,
bottom: rect.bottom,
},
bitmap.map(|b| b.to_ul()).unwrap_or(std::ptr::null_mut()),
)
};
if internal.is_null() {
Err(CreationError::NullReference)
} else {
Ok(Self { lib, internal })
}
}
pub fn create_from_bitmap(
lib: Arc<Library>,
bitmap: Bitmap,
) -> Result<ImageSource, CreationError> {
let internal = unsafe {
lib.ultralight()
.ulCreateImageSourceFromBitmap(bitmap.to_ul())
};
if internal.is_null() {
Err(CreationError::NullReference)
} else {
Ok(Self { lib, internal })
}
}
pub fn invalidate(&self) {
unsafe {
self.lib.ultralight().ulImageSourceInvalidate(self.internal);
}
}
}
impl Drop for ImageSource {
fn drop(&mut self) {
unsafe {
self.lib.ultralight().ulDestroyImageSource(self.internal);
}
}
}
pub mod image_source_provider {
use crate::Library;
use std::sync::Arc;
pub fn add_image_source(
id: &str,
image_source: &super::ImageSource,
) -> Result<(), super::CreationError> {
unsafe {
let id_str = super::UlString::from_str(image_source.lib.clone(), id)?;
image_source
.lib
.ultralight()
.ulImageSourceProviderAddImageSource(id_str.to_ul(), image_source.internal);
}
Ok(())
}
pub fn remove_image_source(lib: &Arc<Library>, id: &str) -> Result<(), super::CreationError> {
unsafe {
let id_str = super::UlString::from_str(lib.clone(), id)?;
lib.ultralight()
.ulImageSourceProviderRemoveImageSource(id_str.to_ul());
}
Ok(())
}
}