diff --git a/src/damage.rs b/src/damage.rs index 39d877ae..5abd1de2 100644 --- a/src/damage.rs +++ b/src/damage.rs @@ -160,7 +160,7 @@ impl DamageVisualizer { let entries = &*self.entries.borrow(); let decay = self.decay.get(); let base_color = self.color.get(); - let mut used = Region::empty(); + let mut used = Region::default(); let dx = -cursor_rect.x1(); let dy = -cursor_rect.y1(); let decay_millis = decay.as_millis() as u64 as f32; @@ -168,12 +168,12 @@ impl DamageVisualizer { let srgb = &self.color_manager.srgb_srgb().linear; for entry in entries.iter().rev() { let region = Region::new(entry.rect); - let region = region.subtract(&used); + let region = region.subtract_cow(&used); if region.is_not_empty() { let age = (now - entry.time).as_millis() as u64 as f32 / decay_millis; let color = base_color * (1.0 - age); renderer.fill_boxes2(region.rects(), &color, srgb, dx, dy); - used = used.union(®ion); + used = used.union_cow(®ion).into_owned(); } } } diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 8a04ef67..e76e0c76 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -314,7 +314,7 @@ pub trait GfxFramebuffer: Debug { fn full_region(&self) -> Region { let (width, height) = self.physical_size(); - Region::new2(Rect::new_sized_unchecked(0, 0, width, height)) + Region::new(Rect::new_sized_unchecked(0, 0, width, height)) } } diff --git a/src/gfx_apis/vulkan/transfer.rs b/src/gfx_apis/vulkan/transfer.rs index 7ceb15d0..12822fff 100644 --- a/src/gfx_apis/vulkan/transfer.rs +++ b/src/gfx_apis/vulkan/transfer.rs @@ -132,7 +132,7 @@ impl VulkanShmImage { if tt == TransferType::Download { return Err(VulkanError::UndefinedContents); } - damage = Region::new2(Rect::new_sized(0, 0, img.width as _, img.height as _).unwrap()); + damage = Region::new(Rect::new_sized(0, 0, img.width as _, img.height as _).unwrap()); } let copies = &mut *data.regions.borrow_mut(); diff --git a/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs b/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs index 3dee6f7e..c19ece8f 100644 --- a/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs +++ b/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs @@ -146,7 +146,7 @@ impl ExtImageCopyCaptureFrameV1 { &staging, self.clone(), mem.clone(), - Region::new2(buffer.rect), + Region::new(buffer.rect), ); match res { Ok(d) => self.session.pending_download.set(d), diff --git a/src/ifs/wl_buffer.rs b/src/ifs/wl_buffer.rs index a7fe13e8..e53a98fb 100644 --- a/src/ifs/wl_buffer.rs +++ b/src/ifs/wl_buffer.rs @@ -240,7 +240,7 @@ impl WlBuffer { *stride, &self.client.state.cpu_worker, )?; - mem.access(|mem| tex.clone().sync_upload(mem, Region::new2(self.rect)))??; + mem.access(|mem| tex.clone().sync_upload(mem, Region::new(self.rect)))??; surface.shm_textures.front().tex.set(Some(tex)); surface.shm_textures.front().damage.clear(); } diff --git a/src/rect/region.rs b/src/rect/region.rs index 2891f195..7419130d 100644 --- a/src/rect/region.rs +++ b/src/rect/region.rs @@ -49,7 +49,7 @@ impl Region { return Self::default(); } if rects.len() == 1 { - return Self::new2(rects[0]); + return Self::new(rects[0]); } let rects = rects_to_bands(unsafe { mem::transmute::<&[Rect], &[RectRaw]>(rects) }); Self { @@ -74,6 +74,20 @@ impl Region { }) } + pub fn union_cow<'a>(self: &'a Self, other: &'a Self) -> Cow<'a, Region> { + if self.extents.is_empty() { + return Cow::Borrowed(other); + } + if other.extents.is_empty() { + return Cow::Borrowed(self); + } + let rects = union(&self.rects, &other.rects); + Cow::Owned(Self { + rects, + extents: self.extents.union(other.extents), + }) + } + pub fn subtract(self: &Rc, other: &Rc) -> Rc { if self.extents.is_empty() || other.extents.is_empty() { return self.clone(); @@ -122,7 +136,7 @@ impl Region { if rects.len() == 1 { let mut rect = rects[0]; rect.raw.tag = rect.raw.tag.constrain(); - return Self::new2(rect); + return Self::new(rect); } let rects = rects_to_bands_tagged(unsafe { mem::transmute::<&[Rect], &[RectRaw]>(rects) @@ -153,11 +167,7 @@ impl Region where T: Tag, { - pub fn new(rect: Rect) -> Rc { - Rc::new(Self::new2(rect)) - } - - pub fn new2(rect: Rect) -> Self { + pub fn new(rect: Rect) -> Self { let mut rects = SmallVec::new(); rects.push(rect.raw); Self { diff --git a/src/rect/tests.rs b/src/rect/tests.rs index 0725f472..76bde61f 100644 --- a/src/rect/tests.rs +++ b/src/rect/tests.rs @@ -8,7 +8,8 @@ fn union1() { let r1 = Region::new(Rect::new(0, 0, 10, 10).unwrap()); let r2_ = Region::new(Rect::new(5, 5, 15, 15).unwrap()); let r2 = Region::new(Rect::new(10, 10, 20, 20).unwrap()); - let r3 = r1.union(&r2).union(&r2_); + let r3 = r1.union_cow(&r2); + let r3 = r3.union_cow(&r2_); assert_eq!(r3.extents, Rect::new(0, 0, 20, 20).unwrap()); assert_eq!( &r3.rects[..], @@ -25,7 +26,7 @@ fn union1() { fn union2() { let r1 = Region::new(Rect::new(0, 0, 10, 10).unwrap()); let r2 = Region::new(Rect::new(0, 10, 10, 20).unwrap()); - let r3 = r1.union(&r2); + let r3 = r1.union_cow(&r2); assert_eq!(r3.extents, Rect::new(0, 0, 10, 20).unwrap()); assert_eq!(&r3.rects[..], &[Rect::new(0, 0, 10, 20).unwrap().raw,]); } @@ -34,7 +35,7 @@ fn union2() { fn subtract1() { let r1 = Region::new(Rect::new(0, 0, 20, 20).unwrap()); let r2 = Region::new(Rect::new(5, 5, 15, 15).unwrap()); - let r3 = r1.subtract(&r2); + let r3 = r1.subtract_cow(&r2); assert_eq!(r3.extents, Rect::new(0, 0, 20, 20).unwrap()); assert_eq!( &r3.rects[..], diff --git a/src/state.rs b/src/state.rs index e1e37dc7..421d77e9 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1302,7 +1302,7 @@ impl State { &staging, capture.clone(), mem.clone(), - Region::new2(capture.rect.at_point(0, 0)), + Region::new(capture.rect.at_point(0, 0)), ) .map_err(ShmScreencopyError::ReadPixels)?; Ok(pending) diff --git a/src/text.rs b/src/text.rs index c5fd5dd6..c9d99f82 100644 --- a/src/text.rs +++ b/src/text.rs @@ -544,7 +544,7 @@ impl CpuJob for RenderJob { &staging, data.clone(), Rc::new(rt.data), - Region::new2(Rect::new_sized_unchecked(0, 0, rt.width, rt.height)), + Region::new(Rect::new_sized_unchecked(0, 0, rt.width, rt.height)), ) .map_err(TextError::Upload); if pending.is_ok() {