Skip to content

Commit 6767986

Browse files
committed
feat: improve inline-block measure interface
1 parent 55f7e5f commit 6767986

File tree

4 files changed

+46
-51
lines changed

4 files changed

+46
-51
lines changed

float-pigment-forest/src/layout/layout_impl.rs

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use float_pigment_css::{
88
},
99
};
1010
use float_pigment_layout::{
11-
DefLength, Edge, EdgeOption, InlineMeasure, InlineUnit, LayoutNode, LayoutStyle,
12-
LayoutTreeNode, LayoutTreeVisitor, MeasureResult, OptionNum, OptionSize, Point, Size, Vector,
11+
DefLength, Edge, EdgeOption, InlineMeasure, InlineUnit, InlineUnitMetadata, LayoutNode, LayoutStyle, LayoutTreeNode, LayoutTreeVisitor, MeasureResult, OptionNum, OptionSize, Point, Size, Vector
1312
};
1413

1514
use crate::{convert_node_ref_to_ptr, Length};
@@ -240,22 +239,8 @@ impl LayoutTreeNode for Node {
240239
min: Size<Self::Length>,
241240
max: Size<Self::Length>,
242241
max_content: OptionSize<Self::Length>,
243-
) -> Self::InlineUnit {
244-
let measure_res = self.measure_block_size(env, req_size, min, max, max_content, false);
245-
let size = measure_res.size;
246-
LayoutInlineUnit {
247-
offset: Point::zero(),
248-
size,
249-
first_baseline_ascent: Vector::new(
250-
measure_res.first_baseline_ascent.x,
251-
measure_res.first_baseline_ascent.y,
252-
),
253-
last_baseline_ascent: Vector::new(
254-
measure_res.last_baseline_ascent.x,
255-
measure_res.last_baseline_ascent.y,
256-
),
257-
is_inline_block: false,
258-
}
242+
) -> MeasureResult<Self::Length> {
243+
self.measure_block_size(env, req_size, min, max, max_content, false)
259244
}
260245
}
261246

@@ -290,7 +275,6 @@ pub struct LayoutInlineUnit {
290275
size: Size<Len>,
291276
first_baseline_ascent: Vector<Len>,
292277
last_baseline_ascent: Vector<Len>,
293-
is_inline_block: bool,
294278
}
295279

296280
impl LayoutInlineUnit {
@@ -304,26 +288,16 @@ impl LayoutInlineUnit {
304288
},
305289
)
306290
}
307-
fn adjust_inline_size(&mut self, padding_border: Edge<Len>) {
308-
if self.is_inline_block {
309-
return;
310-
}
311-
self.size.height += padding_border.vertical();
312-
self.size.width += padding_border.horizontal();
313-
self.first_baseline_ascent.y += padding_border.top;
314-
self.last_baseline_ascent.y += padding_border.top;
315-
}
316291
}
317292

318293
impl InlineUnit<Node> for LayoutInlineUnit {
319294
type Env = Env;
320-
fn inline_block(_env: &mut Env, _node: &Node, size: Size<Len>, baseline_ascent: Len) -> Self {
295+
fn new(_env: &mut Env, _node: &Node, res: MeasureResult<Len>) -> Self {
321296
Self {
322297
offset: Point::zero(),
323-
size,
324-
first_baseline_ascent: Vector::new(Len::zero(), baseline_ascent),
325-
last_baseline_ascent: Vector::new(Len::zero(), baseline_ascent),
326-
is_inline_block: true,
298+
size: res.size,
299+
first_baseline_ascent: res.first_baseline_ascent,
300+
last_baseline_ascent: res.last_baseline_ascent,
327301
}
328302
}
329303
}
@@ -399,7 +373,7 @@ impl InlineMeasure<Node> for LayoutInlineMeasure {
399373
fn block_size(
400374
_env: &mut Env,
401375
block_node: &Node,
402-
inline_nodes: Vec<(LayoutInlineUnit, EdgeOption<Len>, Edge<Len>)>,
376+
inline_nodes: Vec<InlineUnitMetadata<Node>>,
403377
req_size: OptionSize<Len>,
404378
_max_content_with_max_size: OptionSize<Len>,
405379
_update_position: bool,
@@ -421,10 +395,9 @@ impl InlineMeasure<Node> for LayoutInlineMeasure {
421395
if let Some(suggested_width) = suggested_width.val() {
422396
inline_nodes
423397
.into_iter()
424-
.for_each(|(mut inline_unit, margin, padding_border)| {
425-
inline_unit.adjust_inline_size(padding_border);
398+
.for_each(|InlineUnitMetadata { unit, margin }| {
426399
if (current_line.total_inline_size
427-
+ inline_unit.size.width
400+
+ unit.size.width
428401
+ margin.horizontal()
429402
> suggested_width)
430403
&& !current_line.is_empty()
@@ -434,14 +407,13 @@ impl InlineMeasure<Node> for LayoutInlineMeasure {
434407
current_line = Line::default();
435408
current_line.block_start = prev_line_block_start;
436409
}
437-
current_line.collect_inline_unit(inline_unit, margin);
410+
current_line.collect_inline_unit(unit, margin);
438411
});
439412
} else {
440413
inline_nodes
441414
.into_iter()
442-
.for_each(|(mut inline_unit, margin, padding_border)| {
443-
inline_unit.adjust_inline_size(padding_border);
444-
current_line.collect_inline_unit(inline_unit, margin);
415+
.for_each(|InlineUnitMetadata { unit, margin }| {
416+
current_line.collect_inline_unit(unit, margin);
445417
});
446418
}
447419
if !current_line.is_empty() {

float-pigment-layout/src/algo/flow.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -568,14 +568,17 @@ impl<T: LayoutTreeNode> Flow<T> for LayoutUnit<T> {
568568
parent_is_block: true,
569569
},
570570
);
571-
T::InlineUnit::inline_block(
571+
T::InlineUnit::new(
572572
env,
573573
child_node,
574-
*child_res.size,
575-
child_res.last_baseline_ascent.main_axis(axis_info.dir),
574+
MeasureResult {
575+
size: *child_res.size,
576+
first_baseline_ascent: child_res.first_baseline_ascent,
577+
last_baseline_ascent: child_res.last_baseline_ascent,
578+
},
576579
)
577580
};
578-
(unit, child_margin, child_padding_border)
581+
InlineUnitMetadata { unit, margin: child_margin }
579582
})
580583
.collect();
581584
let (block_size, positions) = T::InlineMeasure::block_size(

float-pigment-layout/src/lib.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ pub trait LayoutTreeNode: Sized {
168168
min: Size<Self::Length>,
169169
max: Size<Self::Length>,
170170
max_content: OptionSize<Self::Length>,
171-
) -> Self::InlineUnit;
171+
) -> MeasureResult<Self::Length>;
172172

173173
/// A notifier that the layout size of itself (or any node in the subtree) has been re-evaluated.
174174
///
@@ -380,7 +380,7 @@ pub trait InlineMeasure<T: LayoutTreeNode> {
380380
fn block_size(
381381
env: &mut Self::Env,
382382
block_node: &T,
383-
inline_nodes: Vec<(Self::InlineUnit, EdgeOption<T::Length>, Edge<T::Length>)>,
383+
inline_nodes: Vec<InlineUnitMetadata<T>>,
384384
req_size: OptionSize<T::Length>,
385385
max_content_with_max_size: OptionSize<T::Length>,
386386
update_position: bool,
@@ -390,17 +390,24 @@ pub trait InlineMeasure<T: LayoutTreeNode> {
390390
);
391391
}
392392

393+
/// Inline unit with some metadata.
394+
#[allow(missing_docs)]
395+
#[derive(Debug)]
396+
pub struct InlineUnitMetadata<T: LayoutTreeNode> {
397+
pub unit: T::InlineUnit,
398+
pub margin: EdgeOption<T::Length>,
399+
}
400+
393401
/// A helper type as the inline form of a tree node.
394402
pub trait InlineUnit<T: LayoutTreeNode> {
395403
/// Some custom environment data.
396404
type Env;
397405

398406
/// Construct from a tree node with specified size and baseline information.
399-
fn inline_block(
407+
fn new(
400408
env: &mut Self::Env,
401409
node: &T,
402-
size: Size<T::Length>,
403-
baseline_ascent: T::Length,
410+
result: MeasureResult<T::Length>,
404411
) -> Self;
405412
}
406413

float-pigment-layout/src/unit.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ impl<T: LayoutTreeNode> LayoutUnit<T> {
617617
self.css_border_box_size(node, parent_inner_size, border, padding_border);
618618
let min_max_limit =
619619
self.normalized_min_max_limit(node, parent_inner_size, border, padding_border);
620-
let ret = node.measure_inline_unit(
620+
let r = node.measure_inline_unit(
621621
env,
622622
OptionSize::new(
623623
req_size.width - padding_border.horizontal(),
@@ -638,6 +638,19 @@ impl<T: LayoutTreeNode> LayoutUnit<T> {
638638
max_content.height - padding_border.vertical(),
639639
),
640640
);
641+
let size = Size::new(
642+
r.size.width + padding_border.horizontal(),
643+
r.size.height + padding_border.vertical(),
644+
);
645+
let first_baseline_ascent =
646+
r.first_baseline_ascent + Vector::new(padding_border.left, padding_border.top);
647+
let last_baseline_ascent =
648+
r.last_baseline_ascent + Vector::new(padding_border.left, padding_border.top);
649+
let ret = T::InlineUnit::new(
650+
env,
651+
node,
652+
MeasureResult { size, first_baseline_ascent, last_baseline_ascent },
653+
);
641654
Some(ret)
642655
} else {
643656
None

0 commit comments

Comments
 (0)