Skip to main content

DirtyRegion

Struct DirtyRegion 

Source
pub struct DirtyRegion {
    pub rect: Rect,
    pub timestamp: Instant,
    pub priority: u8,
    pub component_id: Option<String>,
}
Expand description

Represents a dirty region that needs re-rendering.

Dirty regions are rectangular areas marked for update due to content changes. The system automatically merges overlapping or adjacent regions to optimize rendering performance and reduce the number of draw calls.

§Invariants

  • rect.width > 0 && rect.height > 0 - region must have positive area
  • priority <= 255 - priority is bounded by u8
  • timestamp reflects when the region was created

§Memory Layout

Designed to be memory-efficient with total size of ~40 bytes including optional component ID string.

Fields§

§rect: Rect

The rectangular area that needs updating

§timestamp: Instant

When this region was marked dirty

§priority: u8

Priority of this update (higher = more urgent)

§component_id: Option<String>

Optional component ID that owns this region

Implementations§

Source§

impl DirtyRegion

Source

pub fn new(rect: Rect) -> Self

Create a new dirty region

Source

pub fn with_priority(rect: Rect, priority: u8) -> Self

Create a dirty region with priority

Source

pub fn with_component(rect: Rect, component_id: String) -> Self

Create a dirty region with component ID

Source

pub fn intersects(&self, other: &Rect) -> bool

Check if this region intersects with another rectangle.

Uses the separating axis theorem: two rectangles intersect if and only if they overlap on both the X and Y axes.

§Algorithm

Two rectangles DON’T intersect if:

  • Rectangle A is completely to the left of B, OR
  • Rectangle A is completely to the right of B, OR
  • Rectangle A is completely above B, OR
  • Rectangle A is completely below B
§Time Complexity

O(1) - constant time with 4 comparisons

§Example
use hojicha_rendering::differential::DirtyRegion;
use ratatui::layout::Rect;

let region = DirtyRegion::new(Rect::new(0, 0, 10, 10));
assert!(region.intersects(&Rect::new(5, 5, 10, 10)));  // overlapping
assert!(!region.intersects(&Rect::new(20, 20, 10, 10))); // separate
Source

pub fn try_merge(&mut self, other: &DirtyRegion) -> bool

Merge with another dirty region if they overlap or are adjacent.

This implements the core region coalescing algorithm that reduces the number of separate render operations by combining nearby regions.

§Algorithm
  1. Check if regions intersect or are adjacent
  2. If mergeable, compute bounding rectangle
  3. Update metadata (priority, timestamp, component_id)
  4. Validate the resulting region
§Merge Policy
  • Priority: Takes the maximum of both priorities
  • Timestamp: Takes the more recent timestamp
  • Component ID: Clears if components differ (becomes generic region)
§Returns

true if merge occurred, false if regions are not mergeable.

§Time Complexity

O(1) - constant time arithmetic operations

§Panics

In debug builds, panics if the resulting region would have zero area or if coordinate arithmetic would overflow.

Trait Implementations§

Source§

impl Clone for DirtyRegion

Source§

fn clone(&self) -> DirtyRegion

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DirtyRegion

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for DirtyRegion

Source§

fn eq(&self, other: &DirtyRegion) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for DirtyRegion

Source§

impl StructuralPartialEq for DirtyRegion

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.