Skip to main content

TextLayout

Struct TextLayout 

Source
pub struct TextLayout {
    pub text: String,
    pub content_widths: Option<CachedContentWidths>,
    pub layout: Layout<TextBrush>,
    pub laid_out_at: Option<f32>,
}

Fields§

§text: String§content_widths: Option<CachedContentWidths>§layout: Layout<TextBrush>§laid_out_at: Option<f32>

The width the lines were last broken at by a layout pass, in device pixels.

Measuring re-breaks the same layout at trial widths and stores the result back on the node, so the state left behind belongs to whichever pass ran last, and that is often a max-content measurement rather than the layout. Non-atomic inline elements read their geometry straight out of this layout, so they then report boxes from a line that is not on screen: measured on a live transcript as a block 713px wide and three lines tall sitting over a single line 1,742px wide, with its <code> and <strong> boxes up to 987px outside the pane.

Recording it lets a measuring pass put the lines back where layout left them.

Implementations§

Source§

impl TextLayout

Source

pub fn new() -> Self

Source

pub fn content_widths(&mut self) -> ContentWidths

The layout’s min-content and max-content widths, recomputed only when the inputs to that computation have actually changed.

WHY this is cached: Layout::calculate_content_widths walks every shaped cluster in the layout, and block layout asks for the content widths two or three times per pass (once under a min-content constraint, once under max-content, then again for the definite measure), so the same scan is repeated over the same data.

WHY it is safe: the result is a pure function of exactly two things, the shaped runs and the current width of each inline box.

The shaped runs only change when the inline layout is rebuilt, and every rebuild goes through build_inline_layout_into, which clears this cache. Damage propagation clears it too, in the same places it clears the Taffy layout cache, so a text edit or a style change affecting font, size, weight, letter/word spacing or white-space collapsing always re-measures.

The inline box widths are the reason this cannot be a plain one-shot cache: they are re-measured on every pass, and an inline box legitimately measures differently under a min-content constraint than under a max-content one, so the same shaped text can yield different content widths from one call to the next. Rather than guess which constraint a cached entry belongs to, we record the box widths the entry was computed from and reuse it only when they are bit-for-bit identical. A layout containing no inline boxes, which is the common case and where the scan cost is concentrated, therefore hits the cache on every pass after the first.

Trait Implementations§

Source§

impl Clone for TextLayout

Source§

fn clone(&self) -> TextLayout

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for TextLayout

Source§

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

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

impl Default for TextLayout

Source§

fn default() -> TextLayout

Returns the “default value” for a type. Read more

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<T> ErasedDestructor for T
where T: 'static,

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> MaybeBoxed<Box<T>> for T

Source§

fn maybe_boxed(self) -> Box<T>

Convert
Source§

impl<T> MaybeBoxed<T> for T

Source§

fn maybe_boxed(self) -> T

Convert
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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 = !

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.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,