Skip to content

Commit d833d49

Browse files
committed
refactor: separatley handling div/mul
1 parent e58569c commit d833d49

File tree

2 files changed

+115
-75
lines changed

2 files changed

+115
-75
lines changed

float-pigment-forest/tests/custom/css_aspect_ratio.rs

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,21 @@ pub fn aspect_ratio_in_block_width_fixed() {
313313
child.set_aspect_ratio(Some(2. / 1.));
314314
container.append_child(convert_node_ref_to_ptr(child));
315315

316+
let child2 = as_ref(Node::new_ptr());
317+
child2.set_width(DefLength::Points(Len::from_f32(100.)));
318+
child2.set_height(DefLength::Auto);
319+
child2.set_aspect_ratio(Some(0.5 / 1.));
320+
container.append_child(convert_node_ref_to_ptr(child2));
321+
316322
root.layout(
317323
OptionSize::new(OptionNum::some(Len::from_f32(400.)), OptionNum::none()),
318324
Size::new(Len::from_f32(0.), Len::from_f32(0.)),
319325
);
320326

321327
assert_eq!(child.layout_position().width, 100.);
322328
assert_eq!(child.layout_position().height, 50.);
329+
assert_eq!(child2.layout_position().width, 100.);
330+
assert_eq!(child2.layout_position().height, 200.);
323331
}
324332
}
325333

@@ -338,13 +346,21 @@ pub fn aspect_ratio_in_block_height_fixed() {
338346
child.set_aspect_ratio(Some(2. / 1.));
339347
container.append_child(convert_node_ref_to_ptr(child));
340348

349+
let child2 = as_ref(Node::new_ptr());
350+
child2.set_width(DefLength::Auto);
351+
child2.set_height(DefLength::Points(Len::from_f32(200.)));
352+
child2.set_aspect_ratio(Some(0.5 / 1.));
353+
container.append_child(convert_node_ref_to_ptr(child2));
354+
341355
root.layout(
342356
OptionSize::new(OptionNum::some(Len::from_f32(400.)), OptionNum::none()),
343357
Size::new(Len::from_f32(0.), Len::from_f32(0.)),
344358
);
345359

346360
assert_eq!(child.layout_position().width, 200.);
347361
assert_eq!(child.layout_position().height, 100.);
362+
assert_eq!(child2.layout_position().width, 100.);
363+
assert_eq!(child2.layout_position().height, 200.);
348364
}
349365
}
350366

@@ -360,9 +376,20 @@ pub fn aspect_ratio_in_parent_block_cross_size_fixed() {
360376

361377
let child = as_ref(Node::new_ptr());
362378
child.set_width(DefLength::Auto);
363-
child.set_aspect_ratio(Some(1. / 1.));
379+
child.set_aspect_ratio(Some(2. / 1.));
364380
container.append_child(convert_node_ref_to_ptr(child));
365381

382+
let container2 = as_ref(Node::new_ptr());
383+
container2.set_width(DefLength::Auto);
384+
container2.set_height(DefLength::Points(Len::from_f32(300.)));
385+
container2.set_writing_mode(WritingMode::VerticalLr);
386+
root.append_child(convert_node_ref_to_ptr(container2));
387+
388+
let child2 = as_ref(Node::new_ptr());
389+
child2.set_width(DefLength::Auto);
390+
child2.set_aspect_ratio(Some(0.5 / 1.));
391+
container2.append_child(convert_node_ref_to_ptr(child2));
392+
366393
root.layout(
367394
OptionSize::new(OptionNum::some(Len::from_f32(400.)), OptionNum::none()),
368395
Size::new(Len::from_f32(0.), Len::from_f32(0.)),
@@ -381,7 +408,9 @@ pub fn aspect_ratio_in_parent_block_cross_size_fixed() {
381408
);
382409

383410
assert_eq!(child.layout_position().width, 300.);
384-
assert_eq!(child.layout_position().height, 300.);
411+
assert_eq!(child.layout_position().height, 150.);
412+
assert_eq!(child2.layout_position().width, 150.);
413+
assert_eq!(child2.layout_position().height, 300.);
385414
}
386415
}
387416

@@ -398,7 +427,7 @@ pub fn aspect_ratio_with_min_width_constraint() {
398427
child.set_width(DefLength::Auto);
399428
child.set_height(DefLength::Auto);
400429
child.set_min_width(DefLength::Points(Len::from_f32(400.)));
401-
child.set_aspect_ratio(Some(1. / 1.));
430+
child.set_aspect_ratio(Some(2. / 1.));
402431
container.append_child(convert_node_ref_to_ptr(child));
403432

404433
root.layout(
@@ -419,7 +448,7 @@ pub fn aspect_ratio_with_min_width_constraint() {
419448
);
420449

421450
assert_eq!(child.layout_position().width, 400.);
422-
assert_eq!(child.layout_position().height, 400.);
451+
assert_eq!(child.layout_position().height, 200.);
423452
}
424453
}
425454

@@ -436,7 +465,7 @@ pub fn aspect_ratio_with_max_width_constraint() {
436465
child.set_width(DefLength::Auto);
437466
child.set_height(DefLength::Auto);
438467
child.set_max_width(DefLength::Points(Len::from_f32(80.)));
439-
child.set_aspect_ratio(Some(1. / 1.));
468+
child.set_aspect_ratio(Some(2. / 1.));
440469
container.append_child(convert_node_ref_to_ptr(child));
441470

442471
root.layout(
@@ -457,7 +486,7 @@ pub fn aspect_ratio_with_max_width_constraint() {
457486
);
458487

459488
assert_eq!(child.layout_position().width, 80.);
460-
assert_eq!(child.layout_position().height, 80.);
489+
assert_eq!(child.layout_position().height, 40.);
461490
}
462491
}
463492

@@ -516,7 +545,7 @@ pub fn aspect_ratio_block_size_with_box_sizing() {
516545
child.set_padding_left(DefLength::Points(Len::from_f32(30.)));
517546
child.set_border_left(DefLength::Points(Len::from_f32(20.)));
518547
child.set_box_sizing(BoxSizing::BorderBox);
519-
child.set_aspect_ratio(Some(1. / 1.));
548+
child.set_aspect_ratio(Some(2. / 1.));
520549
container.append_child(convert_node_ref_to_ptr(child));
521550

522551
let child2 = as_ref(Node::new_ptr());
@@ -526,7 +555,7 @@ pub fn aspect_ratio_block_size_with_box_sizing() {
526555
child2.set_padding_left(DefLength::Points(Len::from_f32(30.)));
527556
child2.set_border_left(DefLength::Points(Len::from_f32(20.)));
528557
child2.set_box_sizing(BoxSizing::PaddingBox);
529-
child2.set_aspect_ratio(Some(1. / 1.));
558+
child2.set_aspect_ratio(Some(2. / 1.));
530559
container.append_child(convert_node_ref_to_ptr(child2));
531560

532561
let child3 = as_ref(Node::new_ptr());
@@ -535,7 +564,7 @@ pub fn aspect_ratio_block_size_with_box_sizing() {
535564
child3.set_width(DefLength::Points(Len::from_f32(50.)));
536565
child3.set_padding_left(DefLength::Points(Len::from_f32(30.)));
537566
child3.set_border_left(DefLength::Points(Len::from_f32(20.)));
538-
child3.set_aspect_ratio(Some(1. / 1.));
567+
child3.set_aspect_ratio(Some(2. / 1.));
539568
container.append_child(convert_node_ref_to_ptr(child3));
540569

541570
root.layout(
@@ -556,11 +585,11 @@ pub fn aspect_ratio_block_size_with_box_sizing() {
556585
);
557586

558587
assert_eq!(child.layout_position().width, 50.);
559-
assert_eq!(child.layout_position().height, 50.);
588+
assert_eq!(child.layout_position().height, 25.);
560589
assert_eq!(child2.layout_position().width, 80.);
561-
assert_eq!(child2.layout_position().height, 50.);
590+
assert_eq!(child2.layout_position().height, 25.);
562591
assert_eq!(child3.layout_position().width, 100.);
563-
assert_eq!(child3.layout_position().height, 50.);
592+
assert_eq!(child3.layout_position().height, 25.);
564593
}
565594
}
566595

@@ -581,7 +610,7 @@ pub fn aspect_ratio_block_size_with_box_sizing_and_writing_mode() {
581610
child.set_padding_top(DefLength::Points(Len::from_f32(30.)));
582611
child.set_border_top(DefLength::Points(Len::from_f32(20.)));
583612
child.set_box_sizing(BoxSizing::BorderBox);
584-
child.set_aspect_ratio(Some(1. / 1.));
613+
child.set_aspect_ratio(Some(2. / 1.));
585614
container.append_child(convert_node_ref_to_ptr(child));
586615

587616
let child2 = as_ref(Node::new_ptr());
@@ -591,7 +620,7 @@ pub fn aspect_ratio_block_size_with_box_sizing_and_writing_mode() {
591620
child2.set_padding_top(DefLength::Points(Len::from_f32(30.)));
592621
child2.set_border_top(DefLength::Points(Len::from_f32(20.)));
593622
child2.set_box_sizing(BoxSizing::PaddingBox);
594-
child2.set_aspect_ratio(Some(1. / 1.));
623+
child2.set_aspect_ratio(Some(2. / 1.));
595624
container.append_child(convert_node_ref_to_ptr(child2));
596625

597626
let child3 = as_ref(Node::new_ptr());
@@ -600,7 +629,7 @@ pub fn aspect_ratio_block_size_with_box_sizing_and_writing_mode() {
600629
child3.set_height(DefLength::Points(Len::from_f32(50.)));
601630
child3.set_padding_top(DefLength::Points(Len::from_f32(30.)));
602631
child3.set_border_top(DefLength::Points(Len::from_f32(20.)));
603-
child3.set_aspect_ratio(Some(1. / 1.));
632+
child3.set_aspect_ratio(Some(2. / 1.));
604633
container.append_child(convert_node_ref_to_ptr(child3));
605634

606635
root.layout(
@@ -620,11 +649,11 @@ pub fn aspect_ratio_block_size_with_box_sizing_and_writing_mode() {
620649
)
621650
);
622651

623-
assert_eq!(child.layout_position().width, 50.);
652+
assert_eq!(child.layout_position().width, 100.);
624653
assert_eq!(child.layout_position().height, 50.);
625-
assert_eq!(child2.layout_position().width, 50.);
654+
assert_eq!(child2.layout_position().width, 100.);
626655
assert_eq!(child2.layout_position().height, 80.);
627-
assert_eq!(child3.layout_position().width, 50.);
656+
assert_eq!(child3.layout_position().width, 100.);
628657
assert_eq!(child3.layout_position().height, 100.);
629658
}
630659
}

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

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -365,21 +365,19 @@ impl<T: LayoutTreeNode> Flow<T> for LayoutUnit<T> {
365365
let has_aspect_ratio = aspect_ratio.is_some() && aspect_ratio.unwrap() > 0.;
366366
if css_size.width.is_none() ^ css_size.height.is_none() && has_aspect_ratio {
367367
if css_size.height.is_none() {
368-
css_size.height = OptionNum::some(resolve_block_size_from_aspect_ratio(
369-
AxisDirection::Vertical,
368+
css_size.height = OptionNum::some(resolve_height_from_aspect_ratio(
370369
child_border,
371370
child_padding_border,
372-
aspect_ratio.unwrap(),
373371
&child_node.style().box_sizing(),
372+
aspect_ratio.unwrap(),
374373
css_size.width.val().unwrap(),
375374
))
376375
} else {
377-
css_size.width = OptionNum::some(resolve_block_size_from_aspect_ratio(
378-
AxisDirection::Horizontal,
376+
css_size.width = OptionNum::some(resolve_width_from_aspect_ratio(
379377
child_border,
380378
child_padding_border,
381-
aspect_ratio.unwrap(),
382379
&child_node.style().box_sizing(),
380+
aspect_ratio.unwrap(),
383381
css_size.height.val().unwrap(),
384382
))
385383
}
@@ -418,14 +416,26 @@ impl<T: LayoutTreeNode> Flow<T> for LayoutUnit<T> {
418416
css_size.set_cross_size(axis_info.dir, stretched_cross_size);
419417
css_size.set_main_size(
420418
axis_info.dir,
421-
OptionNum::some(resolve_block_size_from_aspect_ratio(
422-
axis_info.dir,
423-
child_border,
424-
child_padding_border,
425-
aspect_ratio.unwrap(),
426-
&child_node.style().box_sizing(),
427-
stretched_cross_size.or_zero(),
428-
)),
419+
match axis_info.dir {
420+
AxisDirection::Horizontal => {
421+
OptionNum::some(resolve_width_from_aspect_ratio(
422+
child_border,
423+
child_padding_border,
424+
&child_node.style().box_sizing(),
425+
aspect_ratio.unwrap(),
426+
stretched_cross_size.or_zero(),
427+
))
428+
}
429+
AxisDirection::Vertical => {
430+
OptionNum::some(resolve_height_from_aspect_ratio(
431+
child_border,
432+
child_padding_border,
433+
&child_node.style().box_sizing(),
434+
aspect_ratio.unwrap(),
435+
stretched_cross_size.or_zero(),
436+
))
437+
}
438+
},
429439
);
430440
}
431441
}
@@ -814,12 +824,11 @@ pub(crate) fn transfer_min_max_size<L: LengthNum>(
814824
let mut transfer_limit = min_max_limit.clone();
815825

816826
if min_max_limit.min_cross_size(main_dir).is_positive() {
817-
let min_main_size = resolve_block_size_from_aspect_ratio(
818-
main_dir,
827+
let min_main_size = resolve_height_from_aspect_ratio(
819828
border,
820829
padding_border,
821-
ratio,
822830
&box_sizing,
831+
ratio,
823832
min_max_limit.min_cross_size(main_dir),
824833
)
825834
.maybe_max(css_size.height)
@@ -828,12 +837,11 @@ pub(crate) fn transfer_min_max_size<L: LengthNum>(
828837
}
829838

830839
if min_max_limit.max_cross_size(main_dir).is_some() {
831-
let mut max_main_size = resolve_block_size_from_aspect_ratio(
832-
main_dir,
840+
let mut max_main_size = resolve_height_from_aspect_ratio(
833841
border,
834842
padding_border,
835-
ratio,
836843
&box_sizing,
844+
ratio,
837845
min_max_limit.max_cross_size(main_dir).or_zero(),
838846
)
839847
.maybe_min(css_size.height)
@@ -848,49 +856,52 @@ pub(crate) fn transfer_min_max_size<L: LengthNum>(
848856
transfer_limit
849857
}
850858

851-
// third_party/blink/renderer/core/layout/length_utils.cc#BlockSizeFromAspectRatio
852859
#[inline]
853-
pub(crate) fn resolve_block_size_from_aspect_ratio<L: LengthNum>(
854-
main_dir: AxisDirection,
860+
pub(crate) fn resolve_width_from_aspect_ratio<L: LengthNum>(
855861
border: Edge<L>,
856862
padding_border: Edge<L>,
863+
box_sizing: &BoxSizing,
857864
ratio: f32,
865+
determining_size: L,
866+
) -> L {
867+
let (dependent_padding_border, determining_padding_border) =
868+
(padding_border.horizontal(), padding_border.vertical());
869+
let (dependent_border, determining_border) = (border.horizontal(), border.vertical());
870+
match box_sizing {
871+
BoxSizing::BorderBox => dependent_padding_border.max(determining_size.mul_f32(ratio)),
872+
BoxSizing::PaddingBox => {
873+
(determining_size - determining_padding_border + determining_border).mul_f32(ratio)
874+
+ dependent_padding_border
875+
- dependent_border
876+
}
877+
BoxSizing::ContentBox => {
878+
(determining_size - determining_padding_border).mul_f32(ratio)
879+
+ dependent_padding_border
880+
}
881+
}
882+
}
883+
884+
#[inline]
885+
pub(crate) fn resolve_height_from_aspect_ratio<L: LengthNum>(
886+
border: Edge<L>,
887+
padding_border: Edge<L>,
858888
box_sizing: &BoxSizing,
859-
inline_size: L,
889+
ratio: f32,
890+
determining_size: L,
860891
) -> L {
861-
// (block, inline)
862-
let (block_padding_border, inline_padding_border) = match main_dir {
863-
AxisDirection::Vertical => (padding_border.vertical(), padding_border.horizontal()),
864-
AxisDirection::Horizontal => (padding_border.horizontal(), padding_border.vertical()),
865-
};
866-
let (block_border, inline_border) = match main_dir {
867-
AxisDirection::Vertical => (border.vertical(), border.horizontal()),
868-
AxisDirection::Horizontal => (border.horizontal(), border.vertical()),
869-
};
892+
let (dependent_padding_border, determining_padding_border) =
893+
(padding_border.vertical(), padding_border.horizontal());
894+
let (dependent_border, determining_border) = (border.vertical(), border.horizontal());
870895
match box_sizing {
871-
BoxSizing::BorderBox => match main_dir {
872-
AxisDirection::Vertical => block_padding_border.max(inline_size.div_f32(ratio)),
873-
AxisDirection::Horizontal => block_padding_border.max(inline_size.mul_f32(ratio)),
874-
},
875-
BoxSizing::PaddingBox => match main_dir {
876-
AxisDirection::Vertical => {
877-
(inline_size - inline_padding_border + inline_border).div_f32(ratio)
878-
+ block_padding_border
879-
- block_border
880-
}
881-
AxisDirection::Horizontal => {
882-
(inline_size - inline_padding_border + inline_border).mul_f32(ratio)
883-
+ block_padding_border
884-
- block_border
885-
}
886-
},
887-
BoxSizing::ContentBox => match main_dir {
888-
AxisDirection::Vertical => {
889-
(inline_size - inline_padding_border).div_f32(ratio) + block_padding_border
890-
}
891-
AxisDirection::Horizontal => {
892-
(inline_size - inline_padding_border).mul_f32(ratio) + block_padding_border
893-
}
894-
},
896+
BoxSizing::BorderBox => dependent_padding_border.max(determining_size.div_f32(ratio)),
897+
BoxSizing::PaddingBox => {
898+
(determining_size - determining_padding_border + determining_border).div_f32(ratio)
899+
+ dependent_padding_border
900+
- dependent_border
901+
}
902+
BoxSizing::ContentBox => {
903+
(determining_size - determining_padding_border).div_f32(ratio)
904+
+ dependent_padding_border
905+
}
895906
}
896907
}

0 commit comments

Comments
 (0)