pub struct LayoutTreeBuilder { /* private fields */ }Expand description
Incrementally builds a LayoutTree from a StyledDom.
Usage: create via LayoutTreeBuilder::new, call process_node
on the root DOM node, then call build to produce the final
SoA-split LayoutTree. During process_node, anonymous boxes are generated
as required by CSS 2.2 §9.2.1.1 (inline wrappers) and §17.2.1 (table fixup).
Implementations§
Source§impl LayoutTreeBuilder
impl LayoutTreeBuilder
pub const fn new(viewport_size: LogicalSize) -> Self
pub fn get(&self, index: usize) -> Option<&LayoutNode>
pub fn get_mut(&mut self, index: usize) -> Option<&mut LayoutNode>
Sourcepub fn create_anonymous_node(
&mut self,
parent: usize,
anon_type: AnonymousBoxType,
fc: FormattingContext,
) -> usize
pub fn create_anonymous_node( &mut self, parent: usize, anon_type: AnonymousBoxType, fc: FormattingContext, ) -> usize
CSS 2.2 Section 17.2.1 - Anonymous box generation: “In this process, inline-level boxes are wrapped in anonymous boxes as needed to satisfy the constraints of the table model.”
Helper to create an anonymous node in the tree. Anonymous boxes don’t have a corresponding DOM node and are used to enforce the CSS box model structure (e.g., wrapping inline content in blocks, or creating missing table structural elements).
Sourcepub fn create_marker_pseudo_element(
&mut self,
styled_dom: &StyledDom,
list_item_dom_id: NodeId,
list_item_idx: usize,
) -> usize
pub fn create_marker_pseudo_element( &mut self, styled_dom: &StyledDom, list_item_dom_id: NodeId, list_item_idx: usize, ) -> usize
Creates a ::marker pseudo-element as the first child of a list-item.
Per CSS Lists Module Level 3, Section 3.1:
“For elements with display: list-item, user agents must generate a
::marker pseudo-element as the first child of the principal box.”
The ::marker references the same DOM node as its parent list-item,
but is marked as a pseudo-element for proper counter resolution and styling.
Sourcepub fn blockify_node_display(
&mut self,
styled_dom: &StyledDom,
dom_id: NodeId,
node_idx: usize,
parent_idx: Option<usize>,
)
pub fn blockify_node_display( &mut self, styled_dom: &StyledDom, dom_id: NodeId, node_idx: usize, parent_idx: Option<usize>, )
Apply CSS Display 3 §2.7/§2.8 blockification to a freshly-created node: a flex/grid item (or root / abs-pos / floated box) whose specified display is inline-level computes to its block-level equivalent.
process_node (the full tree build) does this inline, but the INCREMENTAL
tree builder (cache.rs reconcile → create_node_from_dom) bypassed it.
Without it, a replaced inline flex item — e.g. an <img> canvas with
flex-grow: 1 (AzulPaint) — stayed inline, so its flex-grow was ignored
and it was laid out 300×0 (the replaced-element default width, 0 height).
Must be called AFTER the node is created and AFTER its parent’s
formatting context is known (the build is top-down, so the parent exists).
pub fn create_node_from_dom( &mut self, styled_dom: &StyledDom, dom_id: NodeId, parent: Option<usize>, debug_messages: &mut Option<Vec<LayoutDebugMessage>>, ) -> usize
pub fn clone_node_from_old( &mut self, old_node: &LayoutNode, parent: Option<usize>, ) -> usize
pub fn build(self, root_idx: usize) -> LayoutTree
Trait Implementations§
Auto Trait Implementations§
impl Freeze for LayoutTreeBuilder
impl RefUnwindSafe for LayoutTreeBuilder
impl Send for LayoutTreeBuilder
impl Sync for LayoutTreeBuilder
impl Unpin for LayoutTreeBuilder
impl UnsafeUnpin for LayoutTreeBuilder
impl UnwindSafe for LayoutTreeBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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