use crate::widgets::image::ImageSource;
pub fn get_intrinsic_size(source: &ImageSource) -> Option<(f32, f32)> {
let (width, height) = match source {
ImageSource::Path(path) => image::ImageReader::open(path)
.ok()?
.with_guessed_format()
.ok()?
.into_dimensions()
.ok()?,
ImageSource::Bytes(bytes) => image::ImageReader::new(std::io::Cursor::new(&bytes[..]))
.with_guessed_format()
.ok()?
.into_dimensions()
.ok()?,
ImageSource::Rgba { width, height, .. } => (*width, *height),
ImageSource::SvgPath(_) | ImageSource::SvgBytes(_) => {
return parse_svg(source).map(|tree| svg_size(&tree));
}
};
Some((width as f32, height as f32))
}
#[cfg(feature = "svg")]
pub(crate) type SvgTree = resvg::usvg::Tree;
#[cfg(not(feature = "svg"))]
pub(crate) enum SvgTree {}
#[cfg(feature = "svg")]
pub(crate) fn parse_svg(source: &ImageSource) -> Option<SvgTree> {
let read;
let bytes = match source {
ImageSource::SvgPath(path) => {
read = std::fs::read(path).ok()?;
&read[..]
}
ImageSource::SvgBytes(bytes) => &bytes[..],
_ => return None,
};
SvgTree::from_data(bytes, &resvg::usvg::Options::default()).ok()
}
#[cfg(not(feature = "svg"))]
pub(crate) fn parse_svg(_source: &ImageSource) -> Option<SvgTree> {
log::warn!("SVG image used but the `svg` feature is disabled");
None
}
pub(crate) fn svg_size(tree: &SvgTree) -> (f32, f32) {
#[cfg(feature = "svg")]
{
let size = tree.size();
(size.width(), size.height())
}
#[cfg(not(feature = "svg"))]
match *tree {}
}