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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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" },
|
||||
|
||||
@@ -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()),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -182,6 +182,7 @@ include = [
|
||||
"BorderSpacing",
|
||||
"BorderRadius",
|
||||
"ColorScheme",
|
||||
"ColumnCount",
|
||||
"NonNegativeLengthOrNumberRect",
|
||||
"Perspective",
|
||||
"ZIndex",
|
||||
|
||||
Reference in New Issue
Block a user