Bug 1909761 Part 3 - Use IntrinsicSizeInput for AddInlineMinISize() and AddInlinePrefISize(). r=dholbert
Another preparation patch in order to pass down a percentage basis when computing intrinsic size. Differential Revision: https://phabricator.services.mozilla.com/D219522
This commit is contained in:
@@ -53,9 +53,9 @@ class BRFrame final : public nsIFrame {
|
||||
void Reflow(nsPresContext* aPresContext, ReflowOutput& aMetrics,
|
||||
const ReflowInput& aReflowInput,
|
||||
nsReflowStatus& aStatus) override;
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
|
||||
Maybe<nscoord> GetNaturalBaselineBOffset(
|
||||
@@ -165,7 +165,7 @@ void BRFrame::Reflow(nsPresContext* aPresContext, ReflowOutput& aMetrics,
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void BRFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void BRFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
if (!GetParent()->Style()->ShouldSuppressLineBreak()) {
|
||||
aData->ForceBreak();
|
||||
@@ -173,7 +173,7 @@ void BRFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void BRFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void BRFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
if (!GetParent()->Style()->ShouldSuppressLineBreak()) {
|
||||
// Match the 1 appunit width assigned in the Reflow method above
|
||||
|
||||
@@ -883,7 +883,8 @@ nscoord nsBlockFrame::MinISize(const IntrinsicSizeInput& aInput) {
|
||||
nsIFrame* kid = line->mFirstChild;
|
||||
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
|
||||
++i, kid = kid->GetNextSibling()) {
|
||||
kid->AddInlineMinISize(aInput.mContext, &data);
|
||||
const IntrinsicSizeInput kidInput(aInput.mContext);
|
||||
kid->AddInlineMinISize(kidInput, &data);
|
||||
if (whiteSpaceCanWrap && data.mTrailingWhitespace) {
|
||||
data.OptionallyBreak();
|
||||
}
|
||||
@@ -965,7 +966,8 @@ nscoord nsBlockFrame::PrefISize(const IntrinsicSizeInput& aInput) {
|
||||
nsIFrame* kid = line->mFirstChild;
|
||||
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
|
||||
++i, kid = kid->GetNextSibling()) {
|
||||
kid->AddInlinePrefISize(aInput.mContext, &data);
|
||||
const IntrinsicSizeInput kidInput(aInput.mContext);
|
||||
kid->AddInlinePrefISize(kidInput, &data);
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
@@ -1022,6 +1024,7 @@ nsresult nsBlockFrame::GetPrefWidthTightBounds(gfxContext* aRenderingContext,
|
||||
data.mLine = &line;
|
||||
data.SetLineContainer(curFrame);
|
||||
nsIFrame* kid = line->mFirstChild;
|
||||
const IntrinsicSizeInput kidInput(aRenderingContext);
|
||||
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
|
||||
++i, kid = kid->GetNextSibling()) {
|
||||
rv = kid->GetPrefWidthTightBounds(aRenderingContext, &childX,
|
||||
@@ -1029,7 +1032,7 @@ nsresult nsBlockFrame::GetPrefWidthTightBounds(gfxContext* aRenderingContext,
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
*aX = std::min(*aX, data.mCurrentLine + childX);
|
||||
*aXMost = std::max(*aXMost, data.mCurrentLine + childXMost);
|
||||
kid->AddInlinePrefISize(aRenderingContext, &data);
|
||||
kid->AddInlinePrefISize(kidInput, &data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -788,21 +788,23 @@ void nsContainerFrame::SyncFrameViewAfterReflow(nsPresContext* aPresContext,
|
||||
}
|
||||
}
|
||||
|
||||
void nsContainerFrame::DoInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsContainerFrame::DoInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
auto handleChildren = [aRenderingContext](auto frame, auto data) {
|
||||
auto handleChildren = [&](auto frame, auto data) {
|
||||
for (nsIFrame* kid : frame->mFrames) {
|
||||
kid->AddInlineMinISize(aRenderingContext, data);
|
||||
const IntrinsicSizeInput kidInput(aInput.mContext);
|
||||
kid->AddInlineMinISize(kidInput, data);
|
||||
}
|
||||
};
|
||||
DoInlineIntrinsicISize(aData, handleChildren);
|
||||
}
|
||||
|
||||
void nsContainerFrame::DoInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsContainerFrame::DoInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
auto handleChildren = [aRenderingContext](auto frame, auto data) {
|
||||
auto handleChildren = [&](auto frame, auto data) {
|
||||
for (nsIFrame* kid : frame->mFrames) {
|
||||
kid->AddInlinePrefISize(aRenderingContext, data);
|
||||
const IntrinsicSizeInput kidInput(aInput.mContext);
|
||||
kid->AddInlinePrefISize(kidInput, data);
|
||||
}
|
||||
};
|
||||
DoInlineIntrinsicISize(aData, handleChildren);
|
||||
|
||||
@@ -210,9 +210,9 @@ class nsContainerFrame : public nsSplittableFrame {
|
||||
template <typename ISizeData, typename F>
|
||||
void DoInlineIntrinsicISize(ISizeData* aData, F& aHandleChildren);
|
||||
|
||||
void DoInlineMinISize(gfxContext* aRenderingContext,
|
||||
void DoInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData);
|
||||
void DoInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void DoInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData);
|
||||
|
||||
/**
|
||||
|
||||
@@ -109,23 +109,23 @@ nsresult nsFirstLetterFrame::GetChildFrameContainingOffset(
|
||||
// Needed for non-floating first-letter frames and for the continuations
|
||||
// following the first-letter that we also use nsFirstLetterFrame for.
|
||||
/* virtual */
|
||||
void nsFirstLetterFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsFirstLetterFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
DoInlineMinISize(aRenderingContext, aData);
|
||||
DoInlineMinISize(aInput, aData);
|
||||
}
|
||||
|
||||
// Needed for non-floating first-letter frames and for the continuations
|
||||
// following the first-letter that we also use nsFirstLetterFrame for.
|
||||
/* virtual */
|
||||
void nsFirstLetterFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsFirstLetterFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
DoInlinePrefISize(aRenderingContext, aData);
|
||||
DoInlinePrefISize(aInput, aData);
|
||||
}
|
||||
|
||||
// Needed for floating first-letter frames.
|
||||
nscoord nsFirstLetterFrame::IntrinsicISize(const IntrinsicSizeInput& aInput,
|
||||
IntrinsicISizeType aType) {
|
||||
return IntrinsicISizeFromInline(aInput.mContext, aType);
|
||||
return IntrinsicISizeFromInline(aInput, aType);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
|
||||
@@ -38,9 +38,9 @@ class nsFirstLetterFrame : public nsContainerFrame {
|
||||
nscoord IntrinsicISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
mozilla::IntrinsicISizeType aType) final;
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) final;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) final;
|
||||
|
||||
SizeComputationResult ComputeSize(
|
||||
|
||||
@@ -6013,18 +6013,18 @@ void nsIFrame::MarkSubtreeDirty() {
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsIFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsIFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
nscoord isize = nsLayoutUtils::IntrinsicForContainer(
|
||||
aRenderingContext, this, IntrinsicISizeType::MinISize);
|
||||
aInput.mContext, this, IntrinsicISizeType::MinISize);
|
||||
aData->DefaultAddInlineMinISize(this, isize);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsIFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsIFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
nsIFrame::InlinePrefISizeData* aData) {
|
||||
nscoord isize = nsLayoutUtils::IntrinsicForContainer(
|
||||
aRenderingContext, this, IntrinsicISizeType::PrefISize);
|
||||
aInput.mContext, this, IntrinsicISizeType::PrefISize);
|
||||
aData->DefaultAddInlinePrefISize(isize);
|
||||
}
|
||||
|
||||
@@ -6740,20 +6740,20 @@ nscoord nsIFrame::ShrinkISizeToFit(const IntrinsicSizeInput& aInput,
|
||||
return result;
|
||||
}
|
||||
|
||||
nscoord nsIFrame::IntrinsicISizeFromInline(gfxContext* aContext,
|
||||
nscoord nsIFrame::IntrinsicISizeFromInline(const IntrinsicSizeInput& aInput,
|
||||
IntrinsicISizeType aType) {
|
||||
MOZ_ASSERT(!IsContainerForFontSizeInflation(),
|
||||
"Should not be a container for font size inflation!");
|
||||
|
||||
if (aType == IntrinsicISizeType::MinISize) {
|
||||
InlineMinISizeData data;
|
||||
AddInlineMinISize(aContext, &data);
|
||||
AddInlineMinISize(aInput, &data);
|
||||
data.ForceBreak();
|
||||
return data.mPrevLines;
|
||||
}
|
||||
|
||||
InlinePrefISizeData data;
|
||||
AddInlinePrefISize(aContext, &data);
|
||||
AddInlinePrefISize(aInput, &data);
|
||||
data.ForceBreak();
|
||||
return data.mPrevLines;
|
||||
}
|
||||
|
||||
@@ -2743,7 +2743,7 @@ class nsIFrame : public nsQueryFrame {
|
||||
* line breaking can inherit the default implementation on nsIFrame,
|
||||
* which calls |GetMinISize|.
|
||||
*/
|
||||
virtual void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
virtual void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData);
|
||||
|
||||
/**
|
||||
@@ -2756,7 +2756,7 @@ class nsIFrame : public nsQueryFrame {
|
||||
* except that this fills in an |InlinePrefISizeData| structure
|
||||
* based on using all *mandatory* breakpoints within the frame.
|
||||
*/
|
||||
virtual void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
virtual void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData);
|
||||
|
||||
/**
|
||||
@@ -2915,7 +2915,7 @@ class nsIFrame : public nsQueryFrame {
|
||||
* intrinsic inline size in terms of AddInlineMinISize() and
|
||||
* AddInlinePrefISize().
|
||||
*/
|
||||
nscoord IntrinsicISizeFromInline(gfxContext* aContext,
|
||||
nscoord IntrinsicISizeFromInline(const mozilla::IntrinsicSizeInput& aInput,
|
||||
mozilla::IntrinsicISizeType aType);
|
||||
|
||||
public:
|
||||
|
||||
@@ -2847,10 +2847,10 @@ static bool IsInAutoWidthTableCellForQuirk(nsIFrame* aFrame) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void nsImageFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsImageFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
nscoord isize = nsLayoutUtils::IntrinsicForContainer(
|
||||
aRenderingContext, this, IntrinsicISizeType::MinISize);
|
||||
aInput.mContext, this, IntrinsicISizeType::MinISize);
|
||||
bool canBreak = !IsInAutoWidthTableCellForQuirk(this);
|
||||
aData->DefaultAddInlineMinISize(this, isize, canBreak);
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ class nsImageFrame : public nsAtomicContainerFrame, public nsIReflowCallback {
|
||||
nsImageMap* GetImageMap();
|
||||
nsImageMap* GetExistingImageMap() const { return mImageMap; }
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) final;
|
||||
|
||||
void DisconnectMap();
|
||||
|
||||
@@ -223,15 +223,15 @@ void nsInlineFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||
// Reflow methods
|
||||
|
||||
/* virtual */
|
||||
void nsInlineFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsInlineFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
DoInlineMinISize(aRenderingContext, aData);
|
||||
DoInlineMinISize(aInput, aData);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsInlineFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsInlineFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
DoInlinePrefISize(aRenderingContext, aData);
|
||||
DoInlinePrefISize(aInput, aData);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
|
||||
@@ -61,9 +61,9 @@ class nsInlineFrame : public nsContainerFrame {
|
||||
|
||||
void StealFrame(nsIFrame* aChild) override;
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
SizeComputationResult ComputeSize(
|
||||
gfxContext* aRenderingContext, mozilla::WritingMode aWM,
|
||||
|
||||
@@ -46,7 +46,7 @@ NS_QUERYFRAME_TAIL_INHERITING(nsIFrame)
|
||||
#endif
|
||||
|
||||
/* virtual */
|
||||
void nsPlaceholderFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsPlaceholderFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
// Override AddInlineMinISize so that *nothing* happens. In
|
||||
// particular, we don't want to zero out |aData->mTrailingWhitespace|,
|
||||
@@ -54,16 +54,12 @@ void nsPlaceholderFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
// whitespace, and we don't want to set aData->mSkipWhitespace to
|
||||
// false.
|
||||
|
||||
// ...but push floats onto the list
|
||||
if (mOutOfFlowFrame->IsFloating()) {
|
||||
const nscoord floatISize = nsLayoutUtils::IntrinsicForContainer(
|
||||
aRenderingContext, mOutOfFlowFrame, IntrinsicISizeType::MinISize);
|
||||
aData->mFloats.EmplaceBack(mOutOfFlowFrame, floatISize);
|
||||
}
|
||||
// ...but push floats onto aData's list.
|
||||
AddFloatToIntrinsicISizeData(aInput, IntrinsicISizeType::MinISize, aData);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsPlaceholderFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsPlaceholderFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
// Override AddInlinePrefISize so that *nothing* happens. In
|
||||
// particular, we don't want to zero out |aData->mTrailingWhitespace|,
|
||||
@@ -71,10 +67,16 @@ void nsPlaceholderFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
// whitespace, and we don't want to set aData->mSkipWhitespace to
|
||||
// false.
|
||||
|
||||
// ...but push floats onto the list
|
||||
// ...but push floats onto aData's list.
|
||||
AddFloatToIntrinsicISizeData(aInput, IntrinsicISizeType::PrefISize, aData);
|
||||
}
|
||||
|
||||
void nsPlaceholderFrame::AddFloatToIntrinsicISizeData(
|
||||
const IntrinsicSizeInput& aInput, IntrinsicISizeType aType,
|
||||
InlineIntrinsicISizeData* aData) const {
|
||||
if (mOutOfFlowFrame->IsFloating()) {
|
||||
const nscoord floatISize = nsLayoutUtils::IntrinsicForContainer(
|
||||
aRenderingContext, mOutOfFlowFrame, IntrinsicISizeType::PrefISize);
|
||||
aInput.mContext, mOutOfFlowFrame, aType);
|
||||
aData->mFloats.EmplaceBack(mOutOfFlowFrame, floatISize);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,10 +92,9 @@ class nsPlaceholderFrame final : public nsIFrame {
|
||||
mOutOfFlowFrame = aFrame;
|
||||
}
|
||||
|
||||
// nsIFrame overrides
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
|
||||
void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize,
|
||||
@@ -181,6 +180,11 @@ class nsPlaceholderFrame final : public nsIFrame {
|
||||
}
|
||||
|
||||
protected:
|
||||
// A helper to implement AddInlineMinISize() and AddInlinePrefISize().
|
||||
void AddFloatToIntrinsicISizeData(const mozilla::IntrinsicSizeInput& aInput,
|
||||
mozilla::IntrinsicISizeType aType,
|
||||
InlineIntrinsicISizeData* aData) const;
|
||||
|
||||
nsIFrame* mOutOfFlowFrame;
|
||||
};
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ static void GetIsLineBreakAllowed(nsIFrame* aFrame, bool aIsLineBreakable,
|
||||
* happens across the boundary of those frames.
|
||||
*/
|
||||
static nscoord CalculateColumnPrefISize(
|
||||
gfxContext* aRenderingContext, const RubyColumnEnumerator& aEnumerator,
|
||||
const IntrinsicSizeInput& aInput, const RubyColumnEnumerator& aEnumerator,
|
||||
nsIFrame::InlineIntrinsicISizeData* aBaseISizeData) {
|
||||
nscoord max = 0;
|
||||
uint32_t levelCount = aEnumerator.GetLevelCount();
|
||||
@@ -143,7 +143,7 @@ static nscoord CalculateColumnPrefISize(
|
||||
// ruby text container frame.
|
||||
data.SetLineContainer(frame->GetParent());
|
||||
}
|
||||
frame->AddInlinePrefISize(aRenderingContext, &data);
|
||||
frame->AddInlinePrefISize(aInput, &data);
|
||||
MOZ_ASSERT(data.mPrevLines == 0, "Shouldn't have prev lines");
|
||||
max = std::max(max, data.mCurrentLine);
|
||||
if (i == 0) {
|
||||
@@ -159,8 +159,8 @@ static nscoord CalculateColumnPrefISize(
|
||||
// computing min isize of ruby frame, which may cause problem.
|
||||
// See bug 1134945.
|
||||
/* virtual */
|
||||
void nsRubyBaseContainerFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
InlineMinISizeData* aData) {
|
||||
void nsRubyBaseContainerFrame::AddInlineMinISize(
|
||||
const IntrinsicSizeInput& aInput, InlineMinISizeData* aData) {
|
||||
AutoRubyTextContainerArray textContainers(this);
|
||||
|
||||
for (uint32_t i = 0, iend = textContainers.Length(); i < iend; i++) {
|
||||
@@ -171,7 +171,7 @@ void nsRubyBaseContainerFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
data.SetLineContainer(aData->LineContainer());
|
||||
data.mSkipWhitespace = aData->mSkipWhitespace;
|
||||
data.mTrailingWhitespace = aData->mTrailingWhitespace;
|
||||
AddInlinePrefISize(aRenderingContext, &data);
|
||||
AddInlinePrefISize(aInput, &data);
|
||||
aData->mCurrentLine += data.mCurrentLine;
|
||||
if (data.mCurrentLine > 0) {
|
||||
aData->mAtStartOfLine = false;
|
||||
@@ -194,15 +194,14 @@ void nsRubyBaseContainerFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
nsIFrame* baseFrame = enumerator.GetFrameAtLevel(0);
|
||||
if (baseFrame) {
|
||||
gfxBreakPriority breakPriority = LineBreakBefore(
|
||||
baseFrame, aRenderingContext->GetDrawTarget(), nullptr, nullptr);
|
||||
baseFrame, aInput.mContext->GetDrawTarget(), nullptr, nullptr);
|
||||
if (breakPriority != gfxBreakPriority::eNoBreak) {
|
||||
aData->OptionallyBreak();
|
||||
}
|
||||
}
|
||||
}
|
||||
firstFrame = false;
|
||||
nscoord isize =
|
||||
CalculateColumnPrefISize(aRenderingContext, enumerator, aData);
|
||||
nscoord isize = CalculateColumnPrefISize(aInput, enumerator, aData);
|
||||
aData->mCurrentLine += isize;
|
||||
if (isize > 0) {
|
||||
aData->mAtStartOfLine = false;
|
||||
@@ -212,23 +211,24 @@ void nsRubyBaseContainerFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsRubyBaseContainerFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
InlinePrefISizeData* aData) {
|
||||
void nsRubyBaseContainerFrame::AddInlinePrefISize(
|
||||
const IntrinsicSizeInput& aInput, InlinePrefISizeData* aData) {
|
||||
AutoRubyTextContainerArray textContainers(this);
|
||||
const IntrinsicSizeInput input(aInput.mContext);
|
||||
|
||||
nscoord sum = 0;
|
||||
for (nsIFrame* frame = this; frame; frame = frame->GetNextInFlow()) {
|
||||
RubyColumnEnumerator enumerator(
|
||||
static_cast<nsRubyBaseContainerFrame*>(frame), textContainers);
|
||||
for (; !enumerator.AtEnd(); enumerator.Next()) {
|
||||
sum += CalculateColumnPrefISize(aRenderingContext, enumerator, aData);
|
||||
sum += CalculateColumnPrefISize(input, enumerator, aData);
|
||||
}
|
||||
}
|
||||
for (uint32_t i = 0, iend = textContainers.Length(); i < iend; i++) {
|
||||
if (textContainers[i]->IsSpanContainer()) {
|
||||
nsIFrame* frame = textContainers[i]->PrincipalChildList().FirstChild();
|
||||
InlinePrefISizeData data;
|
||||
frame->AddInlinePrefISize(aRenderingContext, &data);
|
||||
frame->AddInlinePrefISize(input, &data);
|
||||
MOZ_ASSERT(data.mPrevLines == 0, "Shouldn't have prev lines");
|
||||
sum = std::max(sum, data.mCurrentLine);
|
||||
}
|
||||
|
||||
@@ -29,9 +29,9 @@ class nsRubyBaseContainerFrame final : public nsContainerFrame {
|
||||
NS_DECL_QUERYFRAME
|
||||
|
||||
bool CanContinueTextRun() const override;
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
SizeComputationResult ComputeSize(
|
||||
gfxContext* aRenderingContext, mozilla::WritingMode aWM,
|
||||
|
||||
@@ -51,24 +51,26 @@ nsresult nsRubyFrame::GetFrameName(nsAString& aResult) const {
|
||||
#endif
|
||||
|
||||
/* virtual */
|
||||
void nsRubyFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsRubyFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
auto handleChildren = [aRenderingContext](auto frame, auto data) {
|
||||
auto handleChildren = [&](auto frame, auto data) {
|
||||
const IntrinsicSizeInput input(aInput.mContext);
|
||||
for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd();
|
||||
e.Next()) {
|
||||
e.GetBaseContainer()->AddInlineMinISize(aRenderingContext, data);
|
||||
e.GetBaseContainer()->AddInlineMinISize(input, data);
|
||||
}
|
||||
};
|
||||
DoInlineIntrinsicISize(aData, handleChildren);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void nsRubyFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsRubyFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
auto handleChildren = [aRenderingContext](auto frame, auto data) {
|
||||
auto handleChildren = [&](auto frame, auto data) {
|
||||
const IntrinsicSizeInput input(aInput.mContext);
|
||||
for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd();
|
||||
e.Next()) {
|
||||
e.GetBaseContainer()->AddInlinePrefISize(aRenderingContext, data);
|
||||
e.GetBaseContainer()->AddInlinePrefISize(input, data);
|
||||
}
|
||||
};
|
||||
DoInlineIntrinsicISize(aData, handleChildren);
|
||||
|
||||
@@ -28,9 +28,9 @@ class nsRubyFrame final : public nsInlineFrame {
|
||||
NS_DECL_FRAMEARENA_HELPERS(nsRubyFrame)
|
||||
NS_DECL_QUERYFRAME
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize,
|
||||
const ReflowInput& aReflowInput,
|
||||
|
||||
@@ -4275,11 +4275,11 @@ class nsContinuingTextFrame final : public nsTextFrame {
|
||||
return mFirstContinuation;
|
||||
};
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) final {
|
||||
// Do nothing, since the first-in-flow accounts for everything.
|
||||
}
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) final {
|
||||
// Do nothing, since the first-in-flow accounts for everything.
|
||||
}
|
||||
@@ -4404,7 +4404,7 @@ nsIFrame* nsContinuingTextFrame::FirstInFlow() const {
|
||||
|
||||
nscoord nsTextFrame::IntrinsicISize(const IntrinsicSizeInput& aInput,
|
||||
IntrinsicISizeType aType) {
|
||||
return IntrinsicISizeFromInline(aInput.mContext, aType);
|
||||
return IntrinsicISizeFromInline(aInput, aType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
@@ -8863,7 +8863,7 @@ static bool IsUnreflowedLetterFrame(nsIFrame* aFrame) {
|
||||
// XXX Need to do something here to avoid incremental reflow bugs due to
|
||||
// first-line changing min-width
|
||||
/* virtual */
|
||||
void nsTextFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void nsTextFrame::AddInlineMinISize(const IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) {
|
||||
// Check if this textframe belongs to a first-letter frame that has not yet
|
||||
// been reflowed; if so, we need to deal with splitting off a continuation
|
||||
@@ -8902,7 +8902,7 @@ void nsTextFrame::AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
}
|
||||
|
||||
// This will process all the text frames that share the same textrun as f.
|
||||
f->AddInlineMinISizeForFlow(aRenderingContext, aData, trtype);
|
||||
f->AddInlineMinISizeForFlow(aInput.mContext, aData, trtype);
|
||||
lastTextRun = f->GetTextRun(trtype);
|
||||
}
|
||||
}
|
||||
@@ -9030,7 +9030,7 @@ void nsTextFrame::AddInlinePrefISizeForFlow(gfxContext* aRenderingContext,
|
||||
// XXX Need to do something here to avoid incremental reflow bugs due to
|
||||
// first-line and first-letter changing pref-width
|
||||
/* virtual */
|
||||
void nsTextFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void nsTextFrame::AddInlinePrefISize(const IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) {
|
||||
float inflation = nsLayoutUtils::FontSizeInflationFor(this);
|
||||
TextRunType trtype = (inflation == 1.0f) ? eNotInflated : eInflated;
|
||||
@@ -9062,7 +9062,7 @@ void nsTextFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
}
|
||||
|
||||
// This will process all the text frames that share the same textrun as f.
|
||||
f->AddInlinePrefISizeForFlow(aRenderingContext, aData, trtype);
|
||||
f->AddInlinePrefISizeForFlow(aInput.mContext, aData, trtype);
|
||||
lastTextRun = f->GetTextRun(trtype);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,9 +397,9 @@ class nsTextFrame : public nsIFrame {
|
||||
nscoord IntrinsicISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
mozilla::IntrinsicISizeType aType) final;
|
||||
|
||||
void AddInlineMinISize(gfxContext* aRenderingContext,
|
||||
void AddInlineMinISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlineMinISizeData* aData) override;
|
||||
void AddInlinePrefISize(gfxContext* aRenderingContext,
|
||||
void AddInlinePrefISize(const mozilla::IntrinsicSizeInput& aInput,
|
||||
InlinePrefISizeData* aData) override;
|
||||
SizeComputationResult ComputeSize(
|
||||
gfxContext* aRenderingContext, mozilla::WritingMode aWM,
|
||||
|
||||
Reference in New Issue
Block a user