diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index 17b08c1..a76d2dc 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -2107,8 +2107,7 @@ dependencies = [ [[package]] name = "vello" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc44dd4eb9af6a41551b9a82c93d068bd832693d6f78ab118ad19780d8e1202e" +source = "git+https://github.com/linebender/vello?branch=image_sampling#d3d7e51855fa2cf4c63553417b9328f7cd7b6373" dependencies = [ "bytemuck", "futures-intrusive", @@ -2127,8 +2126,7 @@ dependencies = [ [[package]] name = "vello_encoding" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8110c14702a4e17f9200f6e3c4fe05dda5a22bf031ae4feafed4a61429f66fb2" +source = "git+https://github.com/linebender/vello?branch=image_sampling#d3d7e51855fa2cf4c63553417b9328f7cd7b6373" dependencies = [ "bytemuck", "guillotiere", @@ -2140,8 +2138,7 @@ dependencies = [ [[package]] name = "vello_shaders" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cad02d6f29f2212a6ee382a8fec6f9977d0cceefacf07f8e361607ffe3988d" +source = "git+https://github.com/linebender/vello?branch=image_sampling#d3d7e51855fa2cf4c63553417b9328f7cd7b6373" dependencies = [ "bytemuck", "naga", diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index efe997d..402d63d 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -40,7 +40,7 @@ ipc-channel = "0.18.3" winit = "0.30" pollster = "0.3" -vello = "0.3" +vello = { git = "https://github.com/linebender/vello", branch = "image_sampling" } parley = "0.2" fastrace = { version = "0.7", features = ["enable"] } diff --git a/src/rust/src/vello_device/default.rs b/src/rust/src/vello_device/default.rs index 7b13cb6..0aaf0d7 100644 --- a/src/rust/src/vello_device/default.rs +++ b/src/rust/src/vello_device/default.rs @@ -259,29 +259,14 @@ impl DeviceDriver for VelloGraphicsDevice { let scale = (size.0 / pixels.0 as f64, size.1 / pixels.1 as f64); - // when the pixel is small enough, it's not a problem, but if it's - // large, this needs a tweak. - let with_extended_edge = scale.0 > 1.0 || scale.1 > 1.0; - - #[cfg(debug_assertions)] - { - savvy::r_eprintln!("with_extended_edge : {with_extended_edge}"); - } - - let image = convert_to_image( - raster, - pixels.0 as usize, - pixels.1 as usize, - alpha, - with_extended_edge, - ); + let image = convert_to_image(raster, pixels.0 as usize, pixels.1 as usize, alpha); let window_height = VELLO_APP_PROXY.height.load(Ordering::Relaxed) as f64; let pos = (pos.0, window_height - (pos.1 + size.1)); // change to top-left corner VELLO_APP_PROXY .scene - .draw_raster(&image, scale, pos.into(), angle, with_extended_edge); + .draw_raster(&image, scale, pos.into(), angle); } // TODO diff --git a/src/rust/vellogd-shared/src/winit_app/mod.rs b/src/rust/vellogd-shared/src/winit_app/mod.rs index 951adae..50a1411 100644 --- a/src/rust/vellogd-shared/src/winit_app/mod.rs +++ b/src/rust/vellogd-shared/src/winit_app/mod.rs @@ -206,31 +206,13 @@ impl SceneDrawer { scale: (f64, f64), pos: kurbo::Vec2, // top left corner angle: f64, - with_extended_edge: bool, ) { let transform = kurbo::Affine::scale_non_uniform(scale.0, scale.1) .then_translate(pos) .then_rotate(-angle.to_radians()); let scene = &mut self.inner.lock().unwrap(); - let (brush_transform, width, height) = if with_extended_edge { - // draw largely and clip the edge - ( - Some(kurbo::Affine::translate((0.5, 0.5))), - image.width as f64 - 1.0, - image.height as f64 - 1.0, - ) - } else { - (None, image.width as f64, image.height as f64) - }; - - scene.fill( - peniko::Fill::NonZero, - transform, - image, - brush_transform, - &kurbo::Rect::new(0.0, 0.0, width, height), - ); + scene.draw_image(image, transform); self.needs_redraw.store(true, Ordering::Relaxed); } @@ -312,39 +294,13 @@ impl SceneDrawer { // be drawn after the raster() Graphics API call. There's no // guarantee that this still exists on R's memory at the time. // So, this needs to be kept on Rust's memory. -pub fn convert_to_image( - raster: &[u8], - width: usize, - height: usize, - alpha: u8, - with_extended_edge: bool, -) -> peniko::Image { - let (raster_owned, width, height) = if !with_extended_edge { - (raster.to_vec(), width as u32, height as u32) - } else { - let extended_width = width + 1; - let extended_height = height + 1; - let mut raster_owned = Vec::with_capacity(extended_width * extended_height); - for (i, row) in raster.chunks(width * 4).enumerate() { - raster_owned.extend_from_slice(row); - // copy the last pixel - let last_pixel = &row[(width * 4 - 4)..(width * 4)]; - raster_owned.extend_from_slice(last_pixel); - // fill the last line - if i == height - 1 { - raster_owned.extend_from_slice(row); - raster_owned.extend_from_slice(last_pixel); - } - } - (raster_owned, extended_width as u32, extended_height as u32) - }; - - let raster_blob = peniko::Blob::new(Arc::new(raster_owned)); +pub fn convert_to_image(raster: &[u8], width: usize, height: usize, alpha: u8) -> peniko::Image { + let raster_blob = peniko::Blob::new(Arc::new(raster.to_vec())); peniko::Image { data: raster_blob, format: peniko::Format::Rgba8, - width, - height, + width: width as u32, + height: height as u32, extend: peniko::Extend::Pad, alpha, }