summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorathenian200 <athenian200@outlook.com>2020-10-25 14:27:17 -0500
committerMoonchild <moonchild@palemoon.org>2020-11-18 10:51:34 +0000
commit90309c01a811c7e05baf6d95a2fde2bdd4cdeaf5 (patch)
tree84b8abb32db043127cfe6b65ad424b491ab65301
parent4de0e9c68d3f1a04d5d6c236d5f06fff7244c074 (diff)
downloaduxp-90309c01a811c7e05baf6d95a2fde2bdd4cdeaf5.tar.gz
Issue #1673 - Part 3: Bring minimum tab advance up to spec.
This provides a clearer rule for the minimum tab advance that brings us to alignment with the spec and both major browsers.
-rw-r--r--layout/generic/nsTextFrame.cpp41
1 files changed, 30 insertions, 11 deletions
diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
index 83e50ca430..a93c71b289 100644
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -1718,6 +1718,16 @@ GetSpaceWidthAppUnits(const gfxTextRun* aTextRun)
return spaceWidthAppUnits;
}
+static gfxFloat
+GetMinTabAdvanceAppUnits(const gfxTextRun* aTextRun)
+{
+ gfxFloat chWidthAppUnits =
+ NS_round(GetFirstFontMetrics(aTextRun->GetFontGroup(),
+ aTextRun->IsVertical()).zeroOrAveCharWidth *
+ aTextRun->GetAppUnitsPerDevUnit());
+ return 0.5 * chWidthAppUnits;
+}
+
static nscoord
LetterSpacing(nsIFrame* aFrame, const nsStyleText* aStyleText = nullptr)
{
@@ -3092,6 +3102,7 @@ public:
mLength(aLength),
mWordSpacing(WordSpacing(aFrame, mTextRun, aTextStyle)),
mLetterSpacing(LetterSpacing(aFrame, aTextStyle)),
+ mMinTabAdvance(-1.0),
mHyphenWidth(-1),
mOffsetFromBlockOriginForTabs(aOffsetFromBlockOriginForTabs),
mReflowing(true),
@@ -3116,6 +3127,7 @@ public:
mLength(aFrame->GetContentLength()),
mWordSpacing(WordSpacing(aFrame, mTextRun)),
mLetterSpacing(LetterSpacing(aFrame)),
+ mMinTabAdvance(-1.0),
mHyphenWidth(-1),
mOffsetFromBlockOriginForTabs(0),
mReflowing(false),
@@ -3180,6 +3192,13 @@ public:
void CalcTabWidths(Range aTransformedRange, gfxFloat aTabWidth);
+ gfxFloat MinTabAdvance() {
+ if (mMinTabAdvance < 0.0) {
+ mMinTabAdvance = GetMinTabAdvanceAppUnits(mTextRun);
+ }
+ return mMinTabAdvance;
+ }
+
const gfxSkipCharsIterator& GetEndHint() { return mTempIterator; }
protected:
@@ -3212,6 +3231,7 @@ protected:
int32_t mLength; // DOM string length, may be INT32_MAX
gfxFloat mWordSpacing; // space for each whitespace char
gfxFloat mLetterSpacing; // space for each letter
+ gfxFloat mMinTabAdvance; // min advance for <tab> char
gfxFloat mHyphenWidth;
gfxFloat mOffsetFromBlockOriginForTabs;
@@ -3467,14 +3487,13 @@ PropertyProvider::GetSpacingInternal(Range aRange, Spacing* aSpacing,
// aX and the result are in whole appunits.
static gfxFloat
-AdvanceToNextTab(gfxFloat aX, nsIFrame* aFrame,
- gfxTextRun* aTextRun, gfxFloat aTabWidth)
+AdvanceToNextTab(gfxFloat aX, nsIFrame* aFrame, gfxTextRun* aTextRun,
+ gfxFloat aTabWidth, gfxFloat aMinAdvance)
{
- // Advance aX to the next multiple of *aCachedTabWidth. We must advance
- // by at least 1 appunit.
- // XXX should we make this 1 CSS pixel?
- return NS_round((aX + 1) / aTabWidth) * aTabWidth;
+ // Advance aX to the next multiple of aTabWidth. We must advance
+ // by at least aMinAdvance.
+ return ceil((aX + aMinAdvance) / aTabWidth) * aTabWidth;
}
void
@@ -3537,7 +3556,7 @@ PropertyProvider::CalcTabWidths(Range aRange, gfxFloat aTabWidth)
mFrame->SetProperty(TabWidthProperty(), mTabWidths);
}
double nextTab = AdvanceToNextTab(mOffsetFromBlockOriginForTabs,
- mFrame, mTextRun, aTabWidth);
+ mFrame, mTextRun, aTabWidth, MinTabAdvance());
mTabWidths->mWidths.AppendElement(TabWidth(i - startOffset,
NSToIntRound(nextTab - mOffsetFromBlockOriginForTabs)));
mOffsetFromBlockOriginForTabs = nextTab;
@@ -8335,8 +8354,8 @@ nsTextFrame::AddInlineMinISizeForFlow(nsRenderingContext *aRenderingContext,
tabWidth = ComputeTabWidthAppUnits(this, textRun);
}
gfxFloat afterTab =
- AdvanceToNextTab(aData->mCurrentLine, this,
- textRun, tabWidth);
+ AdvanceToNextTab(aData->mCurrentLine, this, textRun, tabWidth,
+ provider.MinTabAdvance());
aData->mCurrentLine = nscoord(afterTab + spacing.mAfter);
wordStart = i + 1;
} else if (i < flowEndInTextRun ||
@@ -8497,8 +8516,8 @@ nsTextFrame::AddInlinePrefISizeForFlow(nsRenderingContext *aRenderingContext,
tabWidth = ComputeTabWidthAppUnits(this, textRun);
}
gfxFloat afterTab =
- AdvanceToNextTab(aData->mCurrentLine, this,
- textRun, tabWidth);
+ AdvanceToNextTab(aData->mCurrentLine, this, textRun, tabWidth,
+ provider.MinTabAdvance());
aData->mCurrentLine = nscoord(afterTab + spacing.mAfter);
lineStart = i + 1;
} else if (preformattedNewline) {