use crate::marks::value::{EncodingValue, ImageAlign, ImageBaseline};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ImageMark {
pub name: String,
pub clip: bool,
pub len: u32,
pub aspect: bool,
pub smooth: bool,
pub image: EncodingValue<RgbaImage>,
pub x: EncodingValue<f32>,
pub y: EncodingValue<f32>,
pub width: EncodingValue<f32>,
pub height: EncodingValue<f32>,
pub align: EncodingValue<ImageAlign>,
pub baseline: EncodingValue<ImageBaseline>,
pub indices: Option<Vec<usize>>,
pub zindex: Option<i32>,
}
impl ImageMark {
pub fn image_iter(&self) -> Box<dyn Iterator<Item = &RgbaImage> + '_> {
self.image.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn x_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
self.x.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn y_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
self.y.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn width_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
self.width.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn height_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
self.height
.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn align_iter(&self) -> Box<dyn Iterator<Item = &ImageAlign> + '_> {
self.align.as_iter(self.len as usize, self.indices.as_ref())
}
pub fn baseline_iter(&self) -> Box<dyn Iterator<Item = &ImageBaseline> + '_> {
self.baseline
.as_iter(self.len as usize, self.indices.as_ref())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RgbaImage {
pub width: u32,
pub height: u32,
pub data: Vec<u8>,
}
impl RgbaImage {
pub fn to_image(&self) -> Option<image::RgbaImage> {
image::RgbaImage::from_raw(self.width, self.height, self.data.clone())
}
pub fn from_image(img: &image::RgbaImage) -> Self {
Self {
width: img.width(),
height: img.height(),
data: img.to_vec(),
}
}
}