Bug 1899187 - Use cbindgen for column-count. r=firefox-style-system-reviewers,layout-reviewers,boris

Differential Revision: https://phabricator.services.mozilla.com/D211784
This commit is contained in:
Emilio Cobos Álvarez
2024-05-28 09:37:23 +00:00
parent 903d05f498
commit 5f86f91a61
12 changed files with 35 additions and 68 deletions

View File

@@ -172,14 +172,15 @@ nscoord ColumnSetWrapperFrame::GetMinISize(gfxContext* aRenderingContext) {
// size, either. Just use 0 because we're size-contained.
iSize = 0;
} else {
MOZ_ASSERT(colStyle->mColumnCount != nsStyleColumn::kColumnCountAuto,
MOZ_ASSERT(!colStyle->mColumnCount.IsAuto(),
"column-count and column-width can't both be auto!");
// As available inline size reduces to zero, we still have mColumnCount
// columns, so compute our minimum intrinsic size based on N zero-width
// columns, with specified gap size between them.
const nscoord colGap =
ColumnUtils::GetColumnGap(this, NS_UNCONSTRAINEDSIZE);
iSize = ColumnUtils::IntrinsicISize(colStyle->mColumnCount, colGap, 0);
iSize = ColumnUtils::IntrinsicISize(colStyle->mColumnCount.AsInteger(),
colGap, 0);
}
} else {
for (nsIFrame* f : PrincipalChildList()) {
@@ -205,16 +206,15 @@ nscoord ColumnSetWrapperFrame::GetPrefISize(gfxContext* aRenderingContext) {
colISize =
ColumnUtils::ClampUsedColumnWidth(colStyle->mColumnWidth.AsLength());
} else {
MOZ_ASSERT(colStyle->mColumnCount != nsStyleColumn::kColumnCountAuto,
MOZ_ASSERT(!colStyle->mColumnCount.IsAuto(),
"column-count and column-width can't both be auto!");
colISize = 0;
}
// If column-count is auto, assume one column.
const uint32_t numColumns =
colStyle->mColumnCount == nsStyleColumn::kColumnCountAuto
? 1
: colStyle->mColumnCount;
const uint32_t numColumns = colStyle->mColumnCount.IsAuto()
? 1
: colStyle->mColumnCount.AsInteger();
const nscoord colGap =
ColumnUtils::GetColumnGap(this, NS_UNCONSTRAINEDSIZE);
iSize = ColumnUtils::IntrinsicISize(numColumns, colGap, colISize);

View File

@@ -96,6 +96,9 @@ bool nsDisplayColumnRule::CreateWebRenderCommands(
return true;
}
// The maximum number of columns we support.
static constexpr int32_t kMaxColumnCount = 1000;
/**
* Tracking issues:
*
@@ -271,7 +274,10 @@ nsColumnSetFrame::ReflowConfig nsColumnSetFrame::ChooseColumnStrategy(
nscoord colBSize = aReflowInput.AvailableBSize();
nscoord colGap =
ColumnUtils::GetColumnGap(this, aReflowInput.ComputedISize());
int32_t numColumns = colStyle->mColumnCount;
int32_t numColumns =
colStyle->mColumnCount.IsAuto()
? 0
: std::min(colStyle->mColumnCount.AsInteger(), kMaxColumnCount);
// If column-fill is set to 'balance' or we have a column-span sibling, then
// we want to balance the columns.
@@ -304,7 +310,7 @@ nsColumnSetFrame::ReflowConfig nsColumnSetFrame::ChooseColumnStrategy(
// This expression uses truncated rounding, which is what we
// want
int32_t maxColumns =
std::min(nscoord(nsStyleColumn::kMaxColumnCount),
std::min(nscoord(kMaxColumnCount),
(availContentISize + colGap) / (colGap + colISize));
numColumns = std::max(1, std::min(numColumns, maxColumns));
}
@@ -333,8 +339,7 @@ nsColumnSetFrame::ReflowConfig nsColumnSetFrame::ChooseColumnStrategy(
if (colGap + colISize > 0) {
numColumns = (availContentISize + colGap) / (colGap + colISize);
// The number of columns should never exceed kMaxColumnCount.
numColumns =
std::min(nscoord(nsStyleColumn::kMaxColumnCount), numColumns);
numColumns = std::min(kMaxColumnCount, numColumns);
}
if (numColumns <= 0) {
numColumns = 1;
@@ -424,13 +429,14 @@ nscoord nsColumnSetFrame::GetMinISize(gfxContext* aRenderingContext) {
// of the child's min-width with any specified column width.
iSize = std::min(iSize, colISize);
} else {
NS_ASSERTION(colStyle->mColumnCount > 0,
NS_ASSERTION(!colStyle->mColumnCount.IsAuto(),
"column-count and column-width can't both be auto");
// As available width reduces to zero, we still have mColumnCount columns,
// so compute our minimum size based on the number of columns and their gaps
// and minimum per-column size.
nscoord colGap = ColumnUtils::GetColumnGap(this, NS_UNCONSTRAINEDSIZE);
iSize = ColumnUtils::IntrinsicISize(colStyle->mColumnCount, colGap, iSize);
iSize = ColumnUtils::IntrinsicISize(colStyle->mColumnCount.AsInteger(),
colGap, iSize);
}
// XXX count forced column breaks here? Maybe we should return the child's
// min-width times the minimum number of columns.
@@ -459,9 +465,7 @@ nscoord nsColumnSetFrame::GetPrefISize(gfxContext* aRenderingContext) {
// If column-count is auto, assume one column.
uint32_t numColumns =
colStyle->mColumnCount == nsStyleColumn::kColumnCountAuto
? 1
: colStyle->mColumnCount;
colStyle->mColumnCount.IsAuto() ? 1 : colStyle->mColumnCount.AsInteger();
nscoord colGap = ColumnUtils::GetColumnGap(this, NS_UNCONSTRAINEDSIZE);
return ColumnUtils::IntrinsicISize(numColumns, colGap, colISize);
}

View File

@@ -597,6 +597,7 @@ cbindgen-types = [
{ gecko = "StyleForcedColorAdjust", servo = "crate::values::computed::ForcedColorAdjust" },
{ gecko = "StyleScrollbarGutter", servo = "crate::values::computed::ScrollbarGutter" },
{ gecko = "StyleHyphenateCharacter", servo = "crate::values::computed::HyphenateCharacter" },
{ gecko = "StyleColumnCount", servo = "crate::values::computed::ColumnCount" },
{ gecko = "StyleContentVisibility", servo = "crate::values::computed::ContentVisibility" },
{ gecko = "StyleContainIntrinsicSize", servo = "crate::values::computed::ContainIntrinsicSize" },
{ gecko = "StyleFontStyle", servo = "crate::values::computed::font::FontStyle" },

View File

@@ -699,8 +699,6 @@ nsChangeHint nsStyleXUL::CalcDifference(const nsStyleXUL& aNewData) const {
// --------------------
// nsStyleColumn
//
/* static */ const uint32_t nsStyleColumn::kMaxColumnCount;
/* static */ const uint32_t nsStyleColumn::kColumnCountAuto;
nsStyleColumn::nsStyleColumn()
: mColumnWidth(LengthOrAuto::Auto()),

View File

@@ -1814,25 +1814,18 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleColumn {
STYLE_STRUCT(nsStyleColumn)
nsStyleColumn();
// This is the maximum number of columns we can process. It's used in
// nsColumnSetFrame.
static const uint32_t kMaxColumnCount = 1000;
// This represents the value of column-count: auto.
static const uint32_t kColumnCountAuto = 0;
uint32_t mColumnCount = kColumnCountAuto;
mozilla::StyleColumnCount mColumnCount = mozilla::StyleColumnCount::Auto();
mozilla::NonNegativeLengthOrAuto mColumnWidth;
mozilla::StyleColor mColumnRuleColor;
mozilla::StyleBorderStyle mColumnRuleStyle; // StyleborderStyle::*
mozilla::StyleBorderStyle mColumnRuleStyle;
mozilla::StyleColumnFill mColumnFill = mozilla::StyleColumnFill::Balance;
mozilla::StyleColumnSpan mColumnSpan = mozilla::StyleColumnSpan::None;
nscoord GetColumnRuleWidth() const { return mActualColumnRuleWidth; }
bool IsColumnContainerStyle() const {
return mColumnCount != kColumnCountAuto || !mColumnWidth.IsAuto();
return !mColumnCount.IsAuto() || !mColumnWidth.IsAuto();
}
bool IsColumnSpanStyle() const {

View File

@@ -33,11 +33,10 @@ use crate::rule_tree::StrongRuleNode;
use crate::selector_parser::PseudoElement;
use servo_arc::{Arc, UniqueArc};
use std::mem::{forget, MaybeUninit, ManuallyDrop};
use std::{cmp, ops, ptr};
use std::{ops, ptr};
use crate::values;
use crate::values::computed::{BorderStyle, Time, Zoom};
use crate::values::computed::font::FontSize;
use crate::values::generics::column::ColumnCount;
pub mod style_structs {
@@ -1386,33 +1385,7 @@ mask-mode mask-repeat mask-clip mask-origin mask-composite mask-position-x mask-
</%self:impl_trait>
<%self:impl_trait style_struct_name="Column"
skip_longhands="column-count column-rule-width column-rule-style">
#[allow(unused_unsafe)]
pub fn set_column_count(&mut self, v: longhands::column_count::computed_value::T) {
use crate::gecko_bindings::structs::{nsStyleColumn_kColumnCountAuto, nsStyleColumn_kMaxColumnCount};
self.mColumnCount = match v {
ColumnCount::Integer(integer) => {
cmp::min(integer.0 as u32, unsafe { nsStyleColumn_kMaxColumnCount })
},
ColumnCount::Auto => nsStyleColumn_kColumnCountAuto
};
}
${impl_simple_copy('column_count', 'mColumnCount')}
pub fn clone_column_count(&self) -> longhands::column_count::computed_value::T {
use crate::gecko_bindings::structs::{nsStyleColumn_kColumnCountAuto, nsStyleColumn_kMaxColumnCount};
if self.mColumnCount != nsStyleColumn_kColumnCountAuto {
debug_assert!(self.mColumnCount >= 1 &&
self.mColumnCount <= nsStyleColumn_kMaxColumnCount);
ColumnCount::Integer((self.mColumnCount as i32).into())
} else {
ColumnCount::Auto
}
}
skip_longhands="column-rule-width column-rule-style">
pub fn set_column_rule_style(&mut self, v: longhands::column_rule_style::computed_value::T) {
self.mColumnRuleStyle = v;
// NB: This is needed to correctly handling the initial value of

View File

@@ -20,9 +20,9 @@ ${helpers.predefined_type(
${helpers.predefined_type(
"column-count",
"ColumnCount",
"computed::ColumnCount::auto()",
"computed::ColumnCount::Auto",
engines="gecko servo",
initial_specified_value="specified::ColumnCount::auto()",
initial_specified_value="specified::ColumnCount::Auto",
servo_pref="layout.columns.enabled",
animation_value_type="AnimatedColumnCount",
spec="https://drafts.csswg.org/css-multicol/#propdef-column-count",

View File

@@ -5,7 +5,7 @@
//! Computed types for the column properties.
use crate::values::computed::PositiveInteger;
use crate::values::generics::column::ColumnCount as GenericColumnCount;
use crate::values::generics::column::GenericColumnCount;
/// A computed type for `column-count` values.
pub type ColumnCount = GenericColumnCount<PositiveInteger>;

View File

@@ -22,7 +22,8 @@
ToResolvedValue,
ToShmem,
)]
pub enum ColumnCount<PositiveInteger> {
#[repr(u8)]
pub enum GenericColumnCount<PositiveInteger> {
/// A positive integer.
Integer(PositiveInteger),
/// The keyword `auto`.
@@ -30,13 +31,8 @@ pub enum ColumnCount<PositiveInteger> {
Auto,
}
pub use self::GenericColumnCount as ColumnCount;
impl<I> ColumnCount<I> {
/// Returns `auto`.
#[inline]
pub fn auto() -> Self {
ColumnCount::Auto
}
/// Returns whether this value is `auto`.
#[inline]
pub fn is_auto(self) -> bool {

View File

@@ -97,6 +97,7 @@ impl<T: Zero> Zero for NonNegative<T> {
ToResolvedValue,
ToShmem,
)]
#[repr(transparent)]
pub struct GreaterThanOrEqualToOne<T>(pub T);
/// A wrapper of values between zero and one.

View File

@@ -4,7 +4,7 @@
//! Specified types for the column properties.
use crate::values::generics::column::ColumnCount as GenericColumnCount;
use crate::values::generics::column::GenericColumnCount;
use crate::values::specified::PositiveInteger;
/// A specified type for `column-count` values.

View File

@@ -182,6 +182,7 @@ include = [
"BorderSpacing",
"BorderRadius",
"ColorScheme",
"ColumnCount",
"NonNegativeLengthOrNumberRect",
"Perspective",
"ZIndex",