Bug 1343516 - make overridden methods 'const' and 'final' for nsTextFrame's PropertyProvider.
Make some methods 'const' and some variables 'mutable', so we could let all the
overridden methods stay const.
We also need to make the pass-in parameter of gfxFontGroup's GetHyphenWidth const.
Note that the comment of GetHyphenWidth seem outdated, so I fixed it as well.
MozReview-Commit-ID: 9eropKaGTJP
--- a/gfx/thebes/gfxTextRun.cpp
+++ b/gfx/thebes/gfxTextRun.cpp
@@ -2182,17 +2182,17 @@ gfxFontGroup::MakeHyphenTextRun(DrawTarg
}
static const uint8_t dash = '-';
return MakeTextRun(&dash, 1, aDrawTarget, aAppUnitsPerDevUnit,
gfxFontGroup::TEXT_IS_PERSISTENT, nullptr);
}
gfxFloat
-gfxFontGroup::GetHyphenWidth(gfxTextRun::PropertyProvider *aProvider)
+gfxFontGroup::GetHyphenWidth(const gfxTextRun::PropertyProvider *aProvider)
{
if (mHyphenWidth < 0) {
RefPtr<DrawTarget> dt(aProvider->GetDrawTarget());
if (dt) {
RefPtr<gfxTextRun>
hyphRun(MakeHyphenTextRun(dt,
aProvider->GetAppUnitsPerDevUnit()));
mHyphenWidth = hyphRun.get() ? hyphRun->GetAdvanceWidth() : 0;
--- a/gfx/thebes/gfxTextRun.h
+++ b/gfx/thebes/gfxTextRun.h
@@ -845,23 +845,18 @@ public:
gfxMissingFontRecorder *aMFR)
{
gfxTextRunFactory::Parameters params = {
aRefDrawTarget, nullptr, nullptr, nullptr, 0, aAppUnitsPerDevUnit
};
return MakeTextRun(aString, aLength, ¶ms, aFlags, aMFR);
}
- /**
- * Get the (possibly-cached) width of the hyphen character.
- * The aCtx and aAppUnitsPerDevUnit parameters will be used only if
- * needed to initialize the cached hyphen width; otherwise they are
- * ignored.
- */
- gfxFloat GetHyphenWidth(gfxTextRun::PropertyProvider* aProvider);
+ // Get the (possibly-cached) width of the hyphen character.
+ gfxFloat GetHyphenWidth(const gfxTextRun::PropertyProvider* aProvider);
/**
* Make a text run representing a single hyphen character.
* This will use U+2010 HYPHEN if available in the first font,
* otherwise fall back to U+002D HYPHEN-MINUS.
* The caller is responsible for deleting the returned text run
* when no longer required.
*/
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -3153,100 +3153,100 @@ public:
NS_ASSERTION(mTextRun, "Textrun not initialized!");
}
// Call this after construction if you're not going to reflow the text
void InitializeForDisplay(bool aTrimAfter);
void InitializeForMeasure();
- virtual void GetSpacing(Range aRange, Spacing* aSpacing);
- virtual gfxFloat GetHyphenWidth();
- virtual void GetHyphenationBreaks(Range aRange, HyphenType* aBreakBefore);
- virtual StyleHyphens GetHyphensOption() {
+ void GetSpacing(Range aRange, Spacing* aSpacing) const final;
+ gfxFloat GetHyphenWidth() const final;
+ void GetHyphenationBreaks(Range aRange, HyphenType* aBreakBefore) const final;
+ StyleHyphens GetHyphensOption() const final {
return mTextStyle->mHyphens;
}
- virtual already_AddRefed<DrawTarget> GetDrawTarget() {
+ already_AddRefed<DrawTarget> GetDrawTarget() const final {
return CreateReferenceDrawTarget(GetFrame());
}
- virtual uint32_t GetAppUnitsPerDevUnit() {
+ uint32_t GetAppUnitsPerDevUnit() const final {
return mTextRun->GetAppUnitsPerDevUnit();
}
- void GetSpacingInternal(Range aRange, Spacing* aSpacing, bool aIgnoreTabs);
+ void GetSpacingInternal(Range aRange, Spacing* aSpacing, bool aIgnoreTabs) const;
/**
* Compute the justification information in given DOM range, return
* justification info and assignments if requested.
*/
JustificationInfo ComputeJustification(
Range aRange, nsTArray<JustificationAssignment>* aAssignments = nullptr);
- nsTextFrame* GetFrame() { return mFrame; }
+ nsTextFrame* GetFrame() const { return mFrame; }
// This may not be equal to the frame offset/length in because we may have
// adjusted for whitespace trimming according to the state bits set in the frame
// (for the static provider)
const gfxSkipCharsIterator& GetStart() const { return mStart; }
// May return INT32_MAX if that was given to the constructor
uint32_t GetOriginalLength() const {
NS_ASSERTION(mLength != INT32_MAX, "Length not known");
return mLength;
}
- const nsTextFragment* GetFragment() { return mFrag; }
-
- gfxFontGroup* GetFontGroup() {
+ const nsTextFragment* GetFragment() const { return mFrag; }
+
+ gfxFontGroup* GetFontGroup() const {
if (!mFontGroup)
InitFontGroupAndFontMetrics();
return mFontGroup;
}
- nsFontMetrics* GetFontMetrics() {
+ nsFontMetrics* GetFontMetrics() const {
if (!mFontMetrics)
InitFontGroupAndFontMetrics();
return mFontMetrics;
}
- void CalcTabWidths(Range aTransformedRange, gfxFloat aTabWidth);
-
- const gfxSkipCharsIterator& GetEndHint() { return mTempIterator; }
+ void CalcTabWidths(Range aTransformedRange, gfxFloat aTabWidth) const;
+
+ const gfxSkipCharsIterator& GetEndHint() const { return mTempIterator; }
protected:
void SetupJustificationSpacing(bool aPostReflow);
- void InitFontGroupAndFontMetrics() {
+ void InitFontGroupAndFontMetrics() const {
float inflation = (mWhichTextRun == nsTextFrame::eInflated)
? mFrame->GetFontSizeInflation() : 1.0f;
mFontGroup = GetFontGroupForFrame(mFrame, inflation,
getter_AddRefs(mFontMetrics));
}
RefPtr<gfxTextRun> mTextRun;
- gfxFontGroup* mFontGroup;
- RefPtr<nsFontMetrics> mFontMetrics;
+ mutable gfxFontGroup* mFontGroup;
+ mutable RefPtr<nsFontMetrics> mFontMetrics;
const nsStyleText* mTextStyle;
const nsTextFragment* mFrag;
nsIFrame* mLineContainer;
nsTextFrame* mFrame;
gfxSkipCharsIterator mStart; // Offset in original and transformed string
gfxSkipCharsIterator mTempIterator;
// Either null, or pointing to the frame's TabWidthProperty.
- TabWidthStore* mTabWidths;
+ mutable TabWidthStore* mTabWidths;
// How far we've done tab-width calculation; this is ONLY valid when
// mTabWidths is nullptr (otherwise rely on mTabWidths->mLimit instead).
// It's a DOM offset relative to the current frame's offset.
- uint32_t mTabWidthsAnalyzedLimit;
+ mutable uint32_t mTabWidthsAnalyzedLimit;
int32_t mLength; // DOM string length, may be INT32_MAX
gfxFloat mWordSpacing; // space for each whitespace char
gfxFloat mLetterSpacing; // space for each letter
- gfxFloat mHyphenWidth;
- gfxFloat mOffsetFromBlockOriginForTabs;
+ mutable gfxFloat mHyphenWidth;
+ mutable gfxFloat mOffsetFromBlockOriginForTabs;
// The values in mJustificationSpacings corresponds to unskipped
// characters start from mJustificationArrayStart.
uint32_t mJustificationArrayStart;
nsTArray<Spacing> mJustificationSpacings;
bool mReflowing;
nsTextFrame::TextRunType mWhichTextRun;
@@ -3372,17 +3372,17 @@ PropertyProvider::ComputeJustification(
if (aAssignments) {
*aAssignments = Move(assignments);
}
return info;
}
// aStart, aLength in transformed string offsets
void
-PropertyProvider::GetSpacing(Range aRange, Spacing* aSpacing)
+PropertyProvider::GetSpacing(Range aRange, Spacing* aSpacing) const
{
GetSpacingInternal(aRange, aSpacing,
(mTextRun->GetFlags() & nsTextFrameUtils::TEXT_HAS_TAB) == 0);
}
static bool
CanAddSpacingAfter(const gfxTextRun* aTextRun, uint32_t aOffset)
{
@@ -3411,17 +3411,17 @@ ComputeTabWidthAppUnits(nsIFrame* aFrame
NS_round(GetFirstFontMetrics(aTextRun->GetFontGroup(),
aTextRun->IsVertical()).spaceWidth *
aTextRun->GetAppUnitsPerDevUnit());
return spaces * spaceWidthAppUnits;
}
void
PropertyProvider::GetSpacingInternal(Range aRange, Spacing* aSpacing,
- bool aIgnoreTabs)
+ bool aIgnoreTabs) const
{
NS_PRECONDITION(IsInBounds(mStart, mLength, aRange), "Range out of bounds");
uint32_t index;
for (index = 0; index < aRange.Length(); ++index) {
aSpacing[index].mBefore = 0.0;
aSpacing[index].mAfter = 0.0;
}
@@ -3501,17 +3501,17 @@ AdvanceToNextTab(gfxFloat aX, nsIFrame*
// 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 ceil((aX + 1) / aTabWidth) * aTabWidth;
}
void
-PropertyProvider::CalcTabWidths(Range aRange, gfxFloat aTabWidth)
+PropertyProvider::CalcTabWidths(Range aRange, gfxFloat aTabWidth) const
{
MOZ_ASSERT(aTabWidth > 0);
if (!mTabWidths) {
if (mReflowing && !mLineContainer) {
// Intrinsic width computation does its own tab processing. We
// just don't do anything here.
return;
@@ -3583,17 +3583,17 @@ PropertyProvider::CalcTabWidths(Range aR
// Delete any stale property that may be left on the frame
mFrame->Properties().Delete(TabWidthProperty());
mTabWidthsAnalyzedLimit = std::max(mTabWidthsAnalyzedLimit,
aRange.end - startOffset);
}
}
gfxFloat
-PropertyProvider::GetHyphenWidth()
+PropertyProvider::GetHyphenWidth() const
{
if (mHyphenWidth < 0) {
mHyphenWidth = GetFontGroup()->GetHyphenWidth(this);
}
return mHyphenWidth + mLetterSpacing;
}
static inline bool
@@ -3602,17 +3602,17 @@ IS_HYPHEN(char16_t u)
return (u == char16_t('-') ||
u == 0x058A || // ARMENIAN HYPHEN
u == 0x2010 || // HYPHEN
u == 0x2012 || // FIGURE DASH
u == 0x2013); // EN DASH
}
void
-PropertyProvider::GetHyphenationBreaks(Range aRange, HyphenType* aBreakBefore)
+PropertyProvider::GetHyphenationBreaks(Range aRange, HyphenType* aBreakBefore) const
{
NS_PRECONDITION(IsInBounds(mStart, mLength, aRange), "Range out of bounds");
NS_PRECONDITION(mLength != INT32_MAX, "Can't call this with undefined length");
if (!mTextStyle->WhiteSpaceCanWrap(mFrame) ||
mTextStyle->mHyphens == StyleHyphens::None)
{
memset(aBreakBefore, static_cast<uint8_t>(HyphenType::None),