diff options
author | 2023-06-10 13:18:42 -0700 | |
---|---|---|
committer | 2023-07-12 08:59:07 +0200 | |
commit | af386fd0a3de432337ee9cdaa4d3661e98bd4105 (patch) | |
tree | bffedaee67922de5f4825ad640643de5883acb19 /tiny_skia/src/vector.rs | |
parent | 9f2be29a286d435b3d1daa8025a74063c50713cb (diff) | |
download | iced-af386fd0a3de432337ee9cdaa4d3661e98bd4105.tar.gz iced-af386fd0a3de432337ee9cdaa4d3661e98bd4105.tar.bz2 iced-af386fd0a3de432337ee9cdaa4d3661e98bd4105.zip |
Upgrade resvg to 0.34 and tiny_skia to 0.10
Diffstat (limited to 'tiny_skia/src/vector.rs')
-rw-r--r-- | tiny_skia/src/vector.rs | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/tiny_skia/src/vector.rs b/tiny_skia/src/vector.rs index a3f3c2e3..194fc52d 100644 --- a/tiny_skia/src/vector.rs +++ b/tiny_skia/src/vector.rs @@ -1,6 +1,7 @@ use crate::core::svg::{Data, Handle}; use crate::core::{Color, Rectangle, Size}; +use bytemuck::cast; use resvg::usvg; use rustc_hash::{FxHashMap, FxHashSet}; @@ -130,30 +131,41 @@ impl Cache { let mut image = tiny_skia::Pixmap::new(size.width, size.height)?; - resvg::render( - tree, - if size.width > size.height { - resvg::FitTo::Width(size.width) - } else { - resvg::FitTo::Height(size.height) - }, - tiny_skia::Transform::default(), - image.as_mut(), - )?; + let tree_size = tree.size.to_int_size(); + let target_size; + if size.width > size.height { + target_size = tree_size.scale_to_width(size.width); + } else { + target_size = tree_size.scale_to_height(size.height); + } + let transform; + if let Some(target_size) = target_size { + let tree_size = tree_size.to_size(); + let target_size = target_size.to_size(); + transform = tiny_skia::Transform::from_scale( + target_size.width() / tree_size.width(), + target_size.height() / tree_size.height(), + ); + } else { + transform = tiny_skia::Transform::default(); + } + + resvg::Tree::from_usvg(tree).render(transform, &mut image.as_mut()); if let Some([r, g, b, _]) = key.color { // Apply color filter for pixel in bytemuck::cast_slice_mut::<u8, u32>(image.data_mut()) { - *pixel = tiny_skia::ColorU8::from_rgba( - b, - g, - r, - (*pixel >> 24) as u8, - ) - .premultiply() - .get(); + *pixel = cast( + tiny_skia::ColorU8::from_rgba( + b, + g, + r, + (*pixel >> 24) as u8, + ) + .premultiply(), + ); } } else { // Swap R and B channels for `softbuffer` presentation |