1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use crate::{SourceImage, Size, Result, Error};
use nsvg::{image::{imageops, RgbaImage, FilterType}, SvgImage};
pub fn linear(source: &SourceImage, size: Size) -> Result<RgbaImage> {
match source {
SourceImage::Bitmap(bit) => Ok(imageops::resize(bit, size, size, FilterType::Triangle)),
SourceImage::Svg(svg) => svg_linear(svg, size)
}
}
pub fn nearest_neighbor(source: &SourceImage, size: Size) -> Result<RgbaImage> {
match source {
SourceImage::Bitmap(bit) => Ok(imageops::resize(bit, size, size, FilterType::Nearest)),
SourceImage::Svg(svg) => svg_linear(svg, size)
}
}
pub fn cubic(source: &SourceImage, size: Size) -> Result<RgbaImage> {
match source {
SourceImage::Bitmap(bit) => Ok(imageops::resize(bit, size, size, FilterType::Lanczos3)),
SourceImage::Svg(svg) => svg_linear(svg, size)
}
}
fn svg_linear(svg: &SvgImage, size: u32) -> Result<RgbaImage> {
match svg.rasterize((size as f32) / svg.width()) {
Ok(raster) => Ok(imageops::resize(&raster, raster.width(), size, FilterType::Triangle)),
Err(err) => Err(Error::Nsvg(err))
}
}