use crate::style::{AlignContent, AlignContentKeyword, AlignmentSafety};
pub(crate) fn apply_alignment_fallback(
free_space: f32,
num_items: usize,
alignment_mode: AlignContent,
) -> AlignContentKeyword {
let mut keyword = alignment_mode.keyword;
let mut is_safe = matches!(alignment_mode.safety, AlignmentSafety::Safe);
if num_items <= 1 || free_space <= 0.0 {
(keyword, is_safe) = match keyword {
AlignContentKeyword::Stretch | AlignContentKeyword::SpaceBetween => (AlignContentKeyword::FlexStart, true),
AlignContentKeyword::SpaceAround | AlignContentKeyword::SpaceEvenly => (AlignContentKeyword::Center, true),
other => (other, is_safe),
};
}
if free_space <= 0.0 && is_safe {
keyword = AlignContentKeyword::Start;
}
keyword
}
pub(crate) fn compute_alignment_offset(
free_space: f32,
num_items: usize,
gap: f32,
alignment_mode: AlignContentKeyword,
layout_is_flex_reversed: bool,
is_first: bool,
) -> f32 {
if is_first {
match alignment_mode {
AlignContentKeyword::Start => 0.0,
AlignContentKeyword::FlexStart => {
if layout_is_flex_reversed {
free_space
} else {
0.0
}
}
AlignContentKeyword::End => free_space,
AlignContentKeyword::FlexEnd => {
if layout_is_flex_reversed {
0.0
} else {
free_space
}
}
AlignContentKeyword::Center => free_space / 2.0,
AlignContentKeyword::Stretch => 0.0,
AlignContentKeyword::SpaceBetween => 0.0,
AlignContentKeyword::SpaceAround => {
if free_space >= 0.0 {
(free_space / num_items as f32) / 2.0
} else {
free_space / 2.0
}
}
AlignContentKeyword::SpaceEvenly => {
if free_space >= 0.0 {
free_space / (num_items + 1) as f32
} else {
free_space / 2.0
}
}
}
} else {
let free_space = free_space.max(0.0);
gap + match alignment_mode {
AlignContentKeyword::Start
| AlignContentKeyword::FlexStart
| AlignContentKeyword::End
| AlignContentKeyword::FlexEnd
| AlignContentKeyword::Center
| AlignContentKeyword::Stretch => 0.0,
AlignContentKeyword::SpaceBetween => free_space / (num_items - 1) as f32,
AlignContentKeyword::SpaceAround => free_space / num_items as f32,
AlignContentKeyword::SpaceEvenly => free_space / (num_items + 1) as f32,
}
}
}